
[space] Set Up

[title] Provisioning
[path] ⭐ Player Setup/

Provisioning a player consists of two steps:

::::WorkflowBlock
:::WorkflowBlockItem
# Player Registration

This enables access to BrightSign Control's free player setup and management tools.
:::

:::WorkflowBlockItem
# Setup File Assignment

The assigned Setup File configures the required player settings.
:::
::::

:::hint{type="success"}
# HELPFUL TIP

In most cases, it is best to provision new players *prior* to powering up the player for the first time. When provisioned, the player will automatically configure itself per the assigned Setup File upon first bootup.
:::

Players can be provisioned [individually](docId\:UqFxMUDz6_OwjdzjZelL4) or in [bulk (multiple players at once)](docId:0SB4SHwyEyDfrGuQJOi9Q).


[title] Welcome!
[path] /

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/i26HTnqpYA2XoE6qZQk0H_main-splash-hip-hop-highlighted.png)

::::LinkArray{contentSource="CUSTOM" itemsPerRow="2"}
:::LinkArrayItem{headerType="IMAGE" headerImage="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/pASObVKv_K4P3qVikzEfW_set-up-tile.svg"}
# [Set Up](docId\:rCuHsQUJj1ethBHvT46xi)

Guided player setup with explanations and helpful tips
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/vAzvf9mGeyd4kuCoO3Lwk_quick-setup-tile.svg"}
# [Quick Setup](docId:-GUga56hC2IJ-tLQLAAOo)

In a hurry? Set up your player as quickly as possible
:::
::::

::::LinkArray{contentSource="CUSTOM" customOrder="W7gH8jjLQFjPWlPybxsBO,_FYZ24nVmUVmb8qeAGDpy,xefvCTDl5_K1VPHx9oz8T,itBWWiWkdPfOofEIFKyit,HMdbPvFHbhr5HPccjHNBM,h9yXxLgUC5PrdhKHbT1M9,1FdvQrKbD06h-XhBQzj7f,7DHDC0Vixd0EUDZFX2eLU"}
:::LinkArrayItem{headerType="IMAGE" headerImage="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/Zdyx18HiB--kkIYyFrs4J_author-tile.svg"}
# [Author](docId:2nkIGkJlqYB3UuDXXEcNc)

Create content for players to display
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/Bhan7rEfdYv5HbO_JWRp9_manage-tile.svg"}
# [Manage](docId\:qPKH_IIO7pL8J4872tprU)

Manage and monitor players
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/S6tZZOzhDA8mnmGAtW8nQ_troubleshoot-tile.svg"}
# [Fix](docId\:Uop9paBWa5Fu1WijTGxEc)

Troubleshoot common problems
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/z9Czs92oqTbnxLnMa7ml5_developers-tile.svg"}
# [Develop](docId\:sMEWbohLdCBNknIayZun_)

APIs, BrightScript, tools, and more
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/baG23aTMhkGmiym81fKaP_hardware-tile.svg"}
# [Hardware](docId\:UYYJYeJ6qoJy1HKSbRlPu)

Player specs and accessories
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/UQnCP-UL8r0yPl5bLNBNU_releases-tile.svg"}
# [Releases](docId\:iuJsUe9mpHdWPMzR_zdg_)

Release notes and downloads
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/mBWXEk8c6d3R5xEP2G9vK_technical-tile.svg"}
# [Technical](docId\:UBP2fPr1EfE1CM-8Z-o51)

Technical references
:::

:::LinkArrayItem{headerType="IMAGE" headerImage="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/5NYcBPrpVIWTm252yCA3I_legacy-tile.svg"}
# [Legacy](docId\:i5zF53DX56wdWDFHlRot1)

Older software
:::
::::


[title] Publishing Mode
[path] ⭐ Player Setup/Setup File/

One of the most important settings in a Setup File is the **Publishing Mode** which sets the method by which content will be delivered to the player. The Publishing Mode is tightly coupled with the player's CMS (Content Management System).

# Selector

Use the tool below to quickly determine the best Publishing Mode for your player(s).

:::Iframe{iframeHeight="0" code="<!DOCTYPE html>&#xA;<html lang=&#x22;en&#x22;>&#xA;<head>&#xA;<meta charset=&#x22;UTF-8&#x22;>&#xA;<meta name=&#x22;viewport&#x22; content=&#x22;width=device-width, initial-scale=1.0&#x22;>&#xA;<title>Publishing Mode Wizard (Internet)</title>&#xA;<style>&#xA;  :root {&#xA;    --accent: #4B2E83;&#xA;    --accent-hover: #3A2266;&#xA;    --accent-tint: #f1ecf8;&#xA;    --text-main: #1a1d29;&#xA;    --text-muted: #5b6274;&#xA;    --border: #e3e5ea;&#xA;    --bg-card: #ffffff;&#xA;    --bg-page: transparent;&#xA;    --radius: 14px;&#xA;  }&#xA;&#xA;  * { box-sizing: border-box; }&#xA;&#xA;  html, body {&#xA;    margin: 0;&#xA;    padding: 0;&#xA;    background: var(--bg-page);&#xA;    font-family: -apple-system, BlinkMacSystemFont, &#x22;Segoe UI&#x22;, Roboto, Helvetica, Arial, sans-serif;&#xA;    color: var(--text-main);&#xA;  }&#xA;&#xA;  .wizard-wrap {&#xA;    display: flex;&#xA;    justify-content: center;&#xA;    align-items: flex-start;&#xA;    padding: 24px 16px;&#xA;  }&#xA;&#xA;  .wizard-card {&#xA;    position: relative;&#xA;    width: 100%;&#xA;    max-width: 560px;&#xA;    background: var(--bg-card);&#xA;    border: 1px solid var(--border);&#xA;    border-radius: var(--radius);&#xA;    box-shadow: 0 4px 20px rgba(20, 24, 40, 0.06);&#xA;    padding: 28px 32px 32px;&#xA;  }&#xA;&#xA;  /* Progress dots */&#xA;  .progress {&#xA;    display: flex;&#xA;    gap: 6px;&#xA;    margin-bottom: 20px;&#xA;  }&#xA;  .progress span {&#xA;    flex: 1;&#xA;    height: 4px;&#xA;    border-radius: 2px;&#xA;    background: var(--border);&#xA;    transition: background 0.25s ease;&#xA;  }&#xA;  .progress span.active {&#xA;    background: var(--accent);&#xA;  }&#xA;&#xA;  /* Reset button */&#xA;  .reset-btn {&#xA;    display: none;&#xA;    align-items: center;&#xA;    gap: 6px;&#xA;    background: none;&#xA;    border: none;&#xA;    color: var(--text-muted);&#xA;    font-size: 13px;&#xA;    font-weight: 500;&#xA;    cursor: pointer;&#xA;    padding: 6px 8px;&#xA;    margin: -6px -8px 14px;&#xA;    border-radius: 8px;&#xA;    transition: background 0.15s ease, color 0.15s ease;&#xA;  }&#xA;  .reset-btn:hover {&#xA;    background: #f2f3f6;&#xA;    color: var(--text-main);&#xA;  }&#xA;  .reset-btn svg {&#xA;    width: 14px;&#xA;    height: 14px;&#xA;    flex-shrink: 0;&#xA;  }&#xA;  .reset-btn.visible { display: inline-flex; }&#xA;&#xA;  #screen {&#xA;    animation: fadeIn 0.2s ease;&#xA;  }&#xA;  @keyframes fadeIn {&#xA;    from { opacity: 0; transform: translateY(4px); }&#xA;    to { opacity: 1; transform: translateY(0); }&#xA;  }&#xA;&#xA;  h2.question {&#xA;    font-size: 18px;&#xA;    line-height: 1.5;&#xA;    margin: 0 0 22px;&#xA;    font-weight: 600;&#xA;  }&#xA;&#xA;  p.result-heading {&#xA;    font-size: 16px;&#xA;    line-height: 1.6;&#xA;    margin: 0 0 18px;&#xA;    color: var(--text-main);&#xA;  }&#xA;&#xA;  p.suggestion {&#xA;    font-size: 16px;&#xA;    line-height: 1.6;&#xA;    margin: 0;&#xA;  }&#xA;  p.suggestion a {&#xA;    font-weight: 600;&#xA;  }&#xA;&#xA;  .options {&#xA;    display: flex;&#xA;    flex-direction: column;&#xA;    gap: 10px;&#xA;  }&#xA;&#xA;  .option-btn {&#xA;    display: block;&#xA;    width: 100%;&#xA;    text-align: left;&#xA;    background: #f8f9fb;&#xA;    border: 1px solid var(--border);&#xA;    border-radius: 10px;&#xA;    padding: 14px 16px;&#xA;    font-size: 15px;&#xA;    font-weight: 500;&#xA;    color: var(--text-main);&#xA;    cursor: pointer;&#xA;    transition: border-color 0.15s ease, background 0.15s ease, transform 0.1s ease;&#xA;  }&#xA;  .option-btn:hover {&#xA;    border-color: var(--accent);&#xA;    background: var(--accent-tint);&#xA;  }&#xA;  .option-btn:active {&#xA;    transform: scale(0.99);&#xA;  }&#xA;&#xA;  .link-list {&#xA;    display: flex;&#xA;    flex-direction: column;&#xA;    gap: 10px;&#xA;  }&#xA;&#xA;  .link-item {&#xA;    display: block;&#xA;    border: 1px solid var(--border);&#xA;    border-radius: 10px;&#xA;    padding: 14px 16px;&#xA;    text-decoration: none;&#xA;    color: inherit;&#xA;    transition: border-color 0.15s ease, background 0.15s ease;&#xA;  }&#xA;  .link-item:hover {&#xA;    border-color: var(--accent);&#xA;    background: var(--accent-tint);&#xA;  }&#xA;  .link-item .link-title {&#xA;    font-size: 15px;&#xA;    font-weight: 600;&#xA;    color: var(--accent);&#xA;    margin-bottom: 3px;&#xA;  }&#xA;  .link-item .link-desc {&#xA;    font-size: 13.5px;&#xA;    color: var(--text-muted);&#xA;    line-height: 1.4;&#xA;  }&#xA;&#xA;  a.inline-link {&#xA;    color: var(--accent);&#xA;    font-weight: 600;&#xA;    text-decoration: none;&#xA;  }&#xA;  a.inline-link:hover {&#xA;    text-decoration: underline;&#xA;  }&#xA;</style>&#xA;</head>&#xA;<body>&#xA;&#xA;<div class=&#x22;wizard-wrap&#x22;>&#xA;  <div class=&#x22;wizard-card&#x22;>&#xA;    <button id=&#x22;resetBtn&#x22; class=&#x22;reset-btn&#x22; onclick=&#x22;goTo('q1')&#x22;>&#xA;      <svg viewBox=&#x22;0 0 24 24&#x22; fill=&#x22;none&#x22; stroke=&#x22;currentColor&#x22; stroke-width=&#x22;2&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22;>&#xA;        <polyline points=&#x22;1 4 1 10 7 10&#x22;></polyline>&#xA;        <path d=&#x22;M3.51 15a9 9 0 1 0 2.13-9.36L1 10&#x22;></path>&#xA;      </svg>&#xA;      Reset&#xA;    </button>&#xA;    <div class=&#x22;progress&#x22; id=&#x22;progress&#x22;>&#xA;      <span></span><span></span><span></span>&#xA;    </div>&#xA;    <div id=&#x22;screen&#x22;></div>&#xA;  </div>&#xA;</div>&#xA;&#xA;<script>&#xA;  // ---- Wizard data model ----&#xA;  var screens = {&#xA;    q1: {&#xA;      step: 1,&#xA;      question: &#x22;Will the player have internet access?&#x22;,&#xA;      options: [&#xA;        { label: &#x22;Yes&#x22;, next: &#x22;q2&#x22; },&#xA;        { label: &#x22;No&#x22;, next: &#x22;q3&#x22; }&#xA;      ]&#xA;    },&#xA;    q2: {&#xA;      step: 2,&#xA;      question: &#x22;A CMS (Content Management System) manages the content that players display. Select your preferred CMS.&#x22;,&#xA;      options: [&#xA;        { label: &#x22;BrightSign CMS (Author or Author Plus)&#x22;, next: &#x22;resultBrightSignCms&#x22; },&#xA;        { label: &#x22;Non-BrightSign CMS&#x22;, next: &#x22;resultNonBrightSignCms&#x22; }&#xA;      ]&#xA;    },&#xA;    q3: {&#xA;      step: 2,&#xA;      question: &#x22;Will the player be accessible over the local network?&#x22;,&#xA;      options: [&#xA;        { label: &#x22;Yes&#x22;, next: &#x22;resultLocalNetwork&#x22; },&#xA;        { label: &#x22;No&#x22;, next: &#x22;resultStandalone&#x22; }&#xA;      ]&#xA;    },&#xA;    resultBrightSignCms: {&#xA;      step: 3,&#xA;      type: &#x22;links&#x22;,&#xA;      heading: &#x22;This player's Publishing Mode should be one of the following:&#x22;,&#xA;      links: [&#xA;        { text: &#x22;Author Plus&#x22;, href: &#x22;https://docs.brightsign.biz/publishing-mode#author-plus&#x22;, desc: &#x22;Subscription required — publish using BrightSign’s cloud&#x22; },&#xA;        { text: &#x22;Local Network&#x22;, href: &#x22;https://docs.brightsign.biz/publishing-mode#local-network&#x22;, desc: &#x22;Free — publish over the local network&#x22; },&#xA;        { text: &#x22;Web Folder&#x22;, href: &#x22;https://docs.brightsign.biz/publishing-mode#web-folder&#x22;, desc: &#x22;Free — publish to a player-accessible URL&#x22; }&#xA;      ]&#xA;    },&#xA;    resultNonBrightSignCms: {&#xA;      step: 3,&#xA;      type: &#x22;links&#x22;,&#xA;      heading: &#x22;This player's Publishing Mode should be one of the following:&#x22;,&#xA;      links: [&#xA;        { text: &#x22;Partner CMS&#x22;, href: &#x22;https://docs.brightsign.biz/publishing-mode#partner-cms&#x22;, desc: &#x22;Select from a list of BrightSign’s CMS partners&#x22; },&#xA;        { text: &#x22;CMS URL&#x22;, href: &#x22;https://docs.brightsign.biz/publishing-mode#cms-url&#x22;, desc: &#x22;Install a CMS package from a URL&#x22; }&#xA;      ]&#xA;    },&#xA;    resultLocalNetwork: {&#xA;      step: 3,&#xA;      type: &#x22;links&#x22;,&#xA;      heading: &#x22;This player's Publishing Mode should be:&#x22;,&#xA;      links: [&#xA;        { text: &#x22;Local Network&#x22;, href: &#x22;https://docs.brightsign.biz/publishing-mode#local-network&#x22;, desc: &#x22;Free — publish over the local network&#x22; }&#xA;      ]&#xA;    },&#xA;    resultStandalone: {&#xA;      step: 3,&#xA;      type: &#x22;links&#x22;,&#xA;      heading: &#x22;This player's Publishing Mode should be:&#x22;,&#xA;      links: [&#xA;        { text: &#x22;Standalone&#x22;, href: &#x22;https://docs.brightsign.biz/publishing-mode#standalone&#x22;, desc: &#x22;Free — publish manually to the player’s storage device&#x22; }&#xA;      ]&#xA;    }&#xA;  };&#xA;&#xA;  var screenEl = document.getElementById(&#x22;screen&#x22;);&#xA;  var resetBtn = document.getElementById(&#x22;resetBtn&#x22;);&#xA;  var progressEl = document.getElementById(&#x22;progress&#x22;);&#xA;&#xA;  function escapeHtml(str) {&#xA;    var div = document.createElement(&#x22;div&#x22;);&#xA;    div.textContent = str;&#xA;    return div.innerHTML;&#xA;  }&#xA;&#xA;  function renderProgress(step) {&#xA;    var dots = progressEl.children;&#xA;    for (var i = 0; i < dots.length; i++) {&#xA;      dots[i].classList.toggle(&#x22;active&#x22;, i < step);&#xA;    }&#xA;  }&#xA;&#xA;  function goTo(id) {&#xA;    var screen = screens[id];&#xA;    if (!screen) return;&#xA;&#xA;    resetBtn.classList.toggle(&#x22;visible&#x22;, id !== &#x22;q1&#x22;);&#xA;    renderProgress(screen.step);&#xA;&#xA;    var html = &#x22;&#x22;;&#xA;&#xA;    if (screen.question) {&#xA;      html += '<h2 class=&#x22;question&#x22;>' + escapeHtml(screen.question) + '</h2>';&#xA;      html += '<div class=&#x22;options&#x22;>';&#xA;      screen.options.forEach(function (opt) {&#xA;        html += '<button class=&#x22;option-btn&#x22; data-next=&#x22;' + opt.next + '&#x22;>' + escapeHtml(opt.label) + '</button>';&#xA;      });&#xA;      html += '</div>';&#xA;    } else if (screen.type === &#x22;links&#x22;) {&#xA;      html += '<p class=&#x22;result-heading&#x22;>' + escapeHtml(screen.heading) + '</p>';&#xA;      html += '<div class=&#x22;link-list&#x22;>';&#xA;      screen.links.forEach(function (link) {&#xA;        html += '<a class=&#x22;link-item&#x22; href=&#x22;' + link.href + '&#x22;>' +&#xA;          '<div class=&#x22;link-title&#x22;>' + escapeHtml(link.text) + '</div>' +&#xA;          '<div class=&#x22;link-desc&#x22;>' + escapeHtml(link.desc) + '</div>' +&#xA;          '</a>';&#xA;      });&#xA;      html += '</div>';&#xA;    } else if (screen.type === &#x22;suggestion&#x22;) {&#xA;      html += '<p class=&#x22;suggestion&#x22;>' + escapeHtml(screen.before) +&#xA;        '<a class=&#x22;inline-link&#x22; href=&#x22;' + screen.link.href + '&#x22;>' + escapeHtml(screen.link.text) + '</a>' +&#xA;        '</p>';&#xA;    }&#xA;&#xA;    screenEl.innerHTML = html;&#xA;&#xA;    var buttons = screenEl.querySelectorAll(&#x22;.option-btn&#x22;);&#xA;    buttons.forEach(function (btn) {&#xA;      btn.addEventListener(&#x22;click&#x22;, function () {&#xA;        goTo(btn.getAttribute(&#x22;data-next&#x22;));&#xA;      });&#xA;    });&#xA;  }&#xA;&#xA;  goTo(&#x22;q1&#x22;);&#xA;</script>&#xA;&#xA;</body>&#xA;</html>"}

:::

Clicking the Publishing Mode from the Selector above will bring you to the corresponding description for that Publishing Mode below.

# Standalone

<font color="#2166AE">`NO NETWORK ACCESS REQUIRED`</font> <font color="#6B21A8">`CMS: BRIGHTSIGN AUTHOR (FREE)`</font>

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/fsRUShWisWSGlXSryQZCa_image.png" size="70" width="837" height="242" isUploading="false" darkWidth="837" darkHeight="242" showCaption="false"}

- Content is manually published / copied to a storage device (typically a microSD card).
- The storage device is manually inserted into the player.

# Local Network

<font color="#2166AE">`LOCAL NETWORK ACCESS REQUIRED`</font> <font color="#6B21A8">`CMS: BRIGHTSIGN AUTHOR (FREE)`</font>

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/x8OFpiqBvurL9qShusslk_image.png" size="70" width="872" height="310" isUploading="false" darkWidth="872" darkHeight="310" showCaption="false"}

- Content is published to the player over the local network.

# Author Plus

<font color="#2166AE">`INTERNET ACCESS REQUIRED`</font> <font color="#6B21A8">`CMS: BRIGHTSIGN AUTHOR PLUS (PAID)`</font>

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/DBy9YuiVnPGKrpxSqa-_u_image.png" size="70" width="930" height="676" isUploading="false" darkWidth="930" darkHeight="676" showCaption="false"}

- Content is stored and published to players from BrightSign's cloud.
- BrightSign Author Plus is required.

# Web Folder

<font color="#2166AE">`INTERNET ACCESS REQUIRED`</font> <font color="#6B21A8">`CMS: BRIGHTSIGN AUTHOR (FREE)`</font>

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/YlJ_cb0UcBBYbMEB7Hwe4_image.png" size="70" width="878" height="680" isUploading="false" darkWidth="878" darkHeight="680" showCaption="false"}

- Content is published to a player-accessible URL. Content can be uploaded to the URL using WebDAV or FTP.
- The player downloads the content from the web folder.
- Players periodically check the web folder for content updates and when available, new content is automatically downloaded to the player.

# Partner CMS

<font color="#2166AE">`INTERNET ACCESS REQUIRED`</font>
`CMS: PARTNER CMS (PAID) VIA WEB BROWSER`

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/E2Elu3Sz11uN9VlT-1SzB_image.png" size="70" width="918" height="673" isUploading="false" darkWidth="918" darkHeight="673" showCaption="false"}

BrightSign has many partners who provide an alternative CMS for BrightSign players. You can select from a list of Partner CMSs to use for content management.

# CMS URL

<font color="#2166AE">`INTERNET ACCESS REQUIRED`</font> <font color="#0C121D">`CMS: NON-PARTNER CMS (PAID) VIA WEB BROWSER`</font>

You may also use a CMS not affiliated with BrightSign's Partner CMS program.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/fht5f3ODh7EcuKREJBITg_image.png" size="70" width="880" height="660" isUploading="false" darkWidth="880" darkHeight="660" showCaption="false"}

- A .zip file containing the setup package for the CMS is placed at a player-accessible URL.
- The player downloads the package from the URL and sets itself up for use with the CMS.



:::CtaButton{label="Next: Network Settings" docId="M_K1adTgGEI43PQx60ed4" openInNewTab="false"}

:::


[title] Tools
[path] ⭐ Player Setup/Setup File/

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/mYtEBDLk7j8By0yopOkP1_image.png)

The Services & Monitoring section of the Setup File enables access to useful player tools as described below.

# Enable Local Access to the DWS

The Diagnostic Web Server (DWS) is a built-in web service on all BrightSign players. It provides key player info, diagnostic tools, and the ability to apply OS updates and modify some player settings.

For internet-connected players, remote access (i.e., over the internet) to the DWS is available via BrightSign Control. This option specifically enables *local* access to the player's DWS (i.e., over the local network). For more info, see [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM).

# Enable Local Web Server

[Use the Local Web Server](docId\:nzYa_n1q222TpB7IUGyag)



:::CtaButton{label="Next: Default Setup File" docId="J9wsBHJjZhW01fvh_nqfn" openInNewTab="false"}

:::


[title] Author Plus Setup
[path] Untitled/

:::ExpandableHeading
# Overview

<font color="#2166AE">`INTERNET ACCESS REQUIRED`</font> <font color="#6B21A8">`CMS: BRIGHTSIGN AUTHOR PLUS (PAID)`</font>

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/DBy9YuiVnPGKrpxSqa-_u_image.png" size="70" width="930" height="676" isUploading="false" darkWidth="930" darkHeight="676" showCaption="false"}

- Content is stored and published to players from BrightSign's cloud.
- BrightSign Author Plus is required.
:::

# Add Setup File

::::WorkflowBlock
:::WorkflowBlockItem
From [BrightSign Control](https://control.brightsign.biz), create / sign in to your account, and select or create a Player Network for the player to belong to ([more info](docId\:CVBN8koVFul3DOi5bKHpl)).
:::

:::WorkflowBlockItem
Go to: **Player Setup / Setup File Library**&#x20;

Click **Add Setup File** to create a [Setup File](docId\:yDtI_hG5yGiOUIXfuK1pe).
:::

:::WorkflowBlockItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/4vVjW7iqD-2sPvM6k6YvU_image.png)

Settings are organized into the sections shown. Review the available settings and configure as necessary.

For the [Publishing Mode](docId\:rEScIigY-dJRPuZgwaA4e), select **Author Plus**.
:::

:::WorkflowBlockItem
Click **Save Setup File** to save the Setup File to the Setup File Library.
:::
::::

# Provision

Next, the player must registered and assigned the just-created Setup File. This process is known as [Provisioning](docId\:yAszd9x1YB7Uwun3OxXmP).

[title] Quick Setup
[path] /

# DO NOT Power Up the Player

::::VerticalSplit{layout="left"}
:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/WhSyWySWWlXhBOgg92z8P_hand-on-plug.svg" size="60" isUploading="false" position="center" width="262" height="226" darkWidth="262" darkHeight="226" showCaption="false"}
:::

:::VerticalSplitItem
New players will try to configure themselves upon first boot up.

Follow this guide to ensure that the player configures itself correctly upon boot up.
:::
::::

:::hint{type="info"}
This Quick Setup guide will get your player set up as quickly as possible. For a slightly more thorough explanation of the setup steps along with some helpful tips, go to [Player Setup](docId\:rCuHsQUJj1ethBHvT46xi).
:::

# Publishing Mode

The [Publishing Mode](docId\:rEScIigY-dJRPuZgwaA4e) establishes how content is delivered to the player and is an essential part of player setup. The series of questions below will help determine the appropriate Publishing Mode for your player.

:::Iframe{iframeHeight="0" code="<!DOCTYPE html>&#xA;<html lang=&#x22;en&#x22;>&#xA;<head>&#xA;<meta charset=&#x22;UTF-8&#x22;>&#xA;<meta name=&#x22;viewport&#x22; content=&#x22;width=device-width, initial-scale=1.0&#x22;>&#xA;<title>Publishing Mode Wizard (Internet)</title>&#xA;<style>&#xA;  :root {&#xA;    --accent: #4B2E83;&#xA;    --accent-hover: #3A2266;&#xA;    --accent-tint: #f1ecf8;&#xA;    --text-main: #1a1d29;&#xA;    --text-muted: #5b6274;&#xA;    --border: #e3e5ea;&#xA;    --bg-card: #ffffff;&#xA;    --bg-page: transparent;&#xA;    --radius: 14px;&#xA;  }&#xA;&#xA;  * { box-sizing: border-box; }&#xA;&#xA;  html, body {&#xA;    margin: 0;&#xA;    padding: 0;&#xA;    background: var(--bg-page);&#xA;    font-family: -apple-system, BlinkMacSystemFont, &#x22;Segoe UI&#x22;, Roboto, Helvetica, Arial, sans-serif;&#xA;    color: var(--text-main);&#xA;  }&#xA;&#xA;  .wizard-wrap {&#xA;    display: flex;&#xA;    justify-content: center;&#xA;    align-items: flex-start;&#xA;    padding: 24px 16px;&#xA;  }&#xA;&#xA;  .wizard-card {&#xA;    position: relative;&#xA;    width: 100%;&#xA;    max-width: 560px;&#xA;    background: var(--bg-card);&#xA;    border: 1px solid var(--border);&#xA;    border-radius: var(--radius);&#xA;    box-shadow: 0 4px 20px rgba(20, 24, 40, 0.06);&#xA;    padding: 28px 32px 32px;&#xA;  }&#xA;&#xA;  /* Progress dots */&#xA;  .progress {&#xA;    display: flex;&#xA;    gap: 6px;&#xA;    margin-bottom: 20px;&#xA;  }&#xA;  .progress span {&#xA;    flex: 1;&#xA;    height: 4px;&#xA;    border-radius: 2px;&#xA;    background: var(--border);&#xA;    transition: background 0.25s ease;&#xA;  }&#xA;  .progress span.active {&#xA;    background: var(--accent);&#xA;  }&#xA;&#xA;  /* Reset button */&#xA;  .reset-btn {&#xA;    display: none;&#xA;    align-items: center;&#xA;    gap: 6px;&#xA;    background: none;&#xA;    border: none;&#xA;    color: var(--text-muted);&#xA;    font-size: 13px;&#xA;    font-weight: 500;&#xA;    cursor: pointer;&#xA;    padding: 6px 8px;&#xA;    margin: -6px -8px 14px;&#xA;    border-radius: 8px;&#xA;    transition: background 0.15s ease, color 0.15s ease;&#xA;  }&#xA;  .reset-btn:hover {&#xA;    background: #f2f3f6;&#xA;    color: var(--text-main);&#xA;  }&#xA;  .reset-btn svg {&#xA;    width: 14px;&#xA;    height: 14px;&#xA;    flex-shrink: 0;&#xA;  }&#xA;  .reset-btn.visible { display: inline-flex; }&#xA;&#xA;  #screen {&#xA;    animation: fadeIn 0.2s ease;&#xA;  }&#xA;  @keyframes fadeIn {&#xA;    from { opacity: 0; transform: translateY(4px); }&#xA;    to { opacity: 1; transform: translateY(0); }&#xA;  }&#xA;&#xA;  h2.question {&#xA;    font-size: 18px;&#xA;    line-height: 1.5;&#xA;    margin: 0 0 22px;&#xA;    font-weight: 600;&#xA;  }&#xA;&#xA;  p.result-heading {&#xA;    font-size: 16px;&#xA;    line-height: 1.6;&#xA;    margin: 0 0 18px;&#xA;    color: var(--text-main);&#xA;  }&#xA;&#xA;  p.suggestion {&#xA;    font-size: 16px;&#xA;    line-height: 1.6;&#xA;    margin: 0;&#xA;  }&#xA;  p.suggestion a {&#xA;    font-weight: 600;&#xA;  }&#xA;&#xA;  .options {&#xA;    display: flex;&#xA;    flex-direction: column;&#xA;    gap: 10px;&#xA;  }&#xA;&#xA;  .option-btn {&#xA;    display: block;&#xA;    width: 100%;&#xA;    text-align: left;&#xA;    background: #f8f9fb;&#xA;    border: 1px solid var(--border);&#xA;    border-radius: 10px;&#xA;    padding: 14px 16px;&#xA;    font-size: 15px;&#xA;    font-weight: 500;&#xA;    color: var(--text-main);&#xA;    cursor: pointer;&#xA;    transition: border-color 0.15s ease, background 0.15s ease, transform 0.1s ease;&#xA;  }&#xA;  .option-btn:hover {&#xA;    border-color: var(--accent);&#xA;    background: var(--accent-tint);&#xA;  }&#xA;  .option-btn:active {&#xA;    transform: scale(0.99);&#xA;  }&#xA;&#xA;  .link-list {&#xA;    display: flex;&#xA;    flex-direction: column;&#xA;    gap: 10px;&#xA;  }&#xA;&#xA;  .link-item {&#xA;    display: block;&#xA;    border: 1px solid var(--border);&#xA;    border-radius: 10px;&#xA;    padding: 14px 16px;&#xA;    text-decoration: none;&#xA;    color: inherit;&#xA;    transition: border-color 0.15s ease, background 0.15s ease;&#xA;  }&#xA;  .link-item:hover {&#xA;    border-color: var(--accent);&#xA;    background: var(--accent-tint);&#xA;  }&#xA;  .link-item .link-title {&#xA;    font-size: 15px;&#xA;    font-weight: 600;&#xA;    color: var(--accent);&#xA;    margin-bottom: 3px;&#xA;  }&#xA;  .link-item .link-desc {&#xA;    font-size: 13.5px;&#xA;    color: var(--text-muted);&#xA;    line-height: 1.4;&#xA;  }&#xA;&#xA;  a.inline-link {&#xA;    color: var(--accent);&#xA;    font-weight: 600;&#xA;    text-decoration: none;&#xA;  }&#xA;  a.inline-link:hover {&#xA;    text-decoration: underline;&#xA;  }&#xA;</style>&#xA;</head>&#xA;<body>&#xA;&#xA;<div class=&#x22;wizard-wrap&#x22;>&#xA;  <div class=&#x22;wizard-card&#x22;>&#xA;    <button id=&#x22;resetBtn&#x22; class=&#x22;reset-btn&#x22; onclick=&#x22;goTo('q1')&#x22;>&#xA;      <svg viewBox=&#x22;0 0 24 24&#x22; fill=&#x22;none&#x22; stroke=&#x22;currentColor&#x22; stroke-width=&#x22;2&#x22; stroke-linecap=&#x22;round&#x22; stroke-linejoin=&#x22;round&#x22;>&#xA;        <polyline points=&#x22;1 4 1 10 7 10&#x22;></polyline>&#xA;        <path d=&#x22;M3.51 15a9 9 0 1 0 2.13-9.36L1 10&#x22;></path>&#xA;      </svg>&#xA;      Reset&#xA;    </button>&#xA;    <div class=&#x22;progress&#x22; id=&#x22;progress&#x22;>&#xA;      <span></span><span></span><span></span>&#xA;    </div>&#xA;    <div id=&#x22;screen&#x22;></div>&#xA;  </div>&#xA;</div>&#xA;&#xA;<script>&#xA;  // ---- Wizard data model ----&#xA;  var screens = {&#xA;    q1: {&#xA;      step: 1,&#xA;      question: &#x22;Will the player have internet access?&#x22;,&#xA;      options: [&#xA;        { label: &#x22;Yes&#x22;, next: &#x22;q2&#x22; },&#xA;        { label: &#x22;No&#x22;, next: &#x22;q3&#x22; }&#xA;      ]&#xA;    },&#xA;    q2: {&#xA;      step: 2,&#xA;      question: &#x22;A CMS (Content Management System) manages the content that players display. Select your preferred CMS.&#x22;,&#xA;      options: [&#xA;        { label: &#x22;BrightSign CMS (Author or Author Plus)&#x22;, next: &#x22;resultBrightSignCms&#x22; },&#xA;        { label: &#x22;Non-BrightSign CMS&#x22;, next: &#x22;resultNonBrightSignCms&#x22; }&#xA;      ]&#xA;    },&#xA;    q3: {&#xA;      step: 2,&#xA;      question: &#x22;Will the player be accessible over the local network?&#x22;,&#xA;      options: [&#xA;        { label: &#x22;Yes&#x22;, next: &#x22;resultLocalNetwork&#x22; },&#xA;        { label: &#x22;No&#x22;, next: &#x22;resultStandalone&#x22; }&#xA;      ]&#xA;    },&#xA;    resultBrightSignCms: {&#xA;      step: 3,&#xA;      type: &#x22;links&#x22;,&#xA;      heading: &#x22;This player's Publishing Mode should be one of the following:&#x22;,&#xA;      links: [&#xA;        { text: &#x22;Author Plus&#x22;, href: &#x22;https://docs.brightsign.biz/author-plus-setup&#x22;, desc: &#x22;Subscription required — publish using BrightSign’s cloud&#x22; },&#xA;        { text: &#x22;Local Network&#x22;, href: &#x22;https://docs.brightsign.biz/local-network-setup&#x22;, desc: &#x22;Free — publish over the local network&#x22; },&#xA;        { text: &#x22;Web Folder&#x22;, href: &#x22;https://docs.brightsign.biz/web-folder-setup&#x22;, desc: &#x22;Free — publish to a player-accessible URL&#x22; }&#xA;      ]&#xA;    },&#xA;    resultNonBrightSignCms: {&#xA;      step: 3,&#xA;      type: &#x22;links&#x22;,&#xA;      heading: &#x22;This player's Publishing Mode should be one of the following:&#x22;,&#xA;      links: [&#xA;        { text: &#x22;Partner CMS&#x22;, href: &#x22;https://docs.brightsign.biz/partner-cms-setup&#x22;, desc: &#x22;Select from a list of BrightSign’s CMS partners&#x22; },&#xA;        { text: &#x22;CMS URL&#x22;, href: &#x22;https://docs.brightsign.biz/cms-url-setup&#x22;, desc: &#x22;Install a CMS package from a URL&#x22; }&#xA;      ]&#xA;    },&#xA;    resultLocalNetwork: {&#xA;      step: 3,&#xA;      type: &#x22;links&#x22;,&#xA;      heading: &#x22;This player's Publishing Mode should be:&#x22;,&#xA;      links: [&#xA;        { text: &#x22;Local Network&#x22;, href: &#x22;https://docs.brightsign.biz/local-network-setup&#x22;, desc: &#x22;Free — publish over the local network&#x22; }&#xA;      ]&#xA;    },&#xA;    resultStandalone: {&#xA;      step: 3,&#xA;      type: &#x22;links&#x22;,&#xA;      heading: &#x22;This player's Publishing Mode should be:&#x22;,&#xA;      links: [&#xA;        { text: &#x22;Standalone&#x22;, href: &#x22;https://docs.brightsign.biz/standalone-setup&#x22;, desc: &#x22;Free — publish manually to the player’s storage device&#x22; }&#xA;      ]&#xA;    }&#xA;  };&#xA;&#xA;  var screenEl = document.getElementById(&#x22;screen&#x22;);&#xA;  var resetBtn = document.getElementById(&#x22;resetBtn&#x22;);&#xA;  var progressEl = document.getElementById(&#x22;progress&#x22;);&#xA;&#xA;  function escapeHtml(str) {&#xA;    var div = document.createElement(&#x22;div&#x22;);&#xA;    div.textContent = str;&#xA;    return div.innerHTML;&#xA;  }&#xA;&#xA;  function renderProgress(step) {&#xA;    var dots = progressEl.children;&#xA;    for (var i = 0; i < dots.length; i++) {&#xA;      dots[i].classList.toggle(&#x22;active&#x22;, i < step);&#xA;    }&#xA;  }&#xA;&#xA;  function goTo(id) {&#xA;    var screen = screens[id];&#xA;    if (!screen) return;&#xA;&#xA;    resetBtn.classList.toggle(&#x22;visible&#x22;, id !== &#x22;q1&#x22;);&#xA;    renderProgress(screen.step);&#xA;&#xA;    var html = &#x22;&#x22;;&#xA;&#xA;    if (screen.question) {&#xA;      html += '<h2 class=&#x22;question&#x22;>' + escapeHtml(screen.question) + '</h2>';&#xA;      html += '<div class=&#x22;options&#x22;>';&#xA;      screen.options.forEach(function (opt) {&#xA;        html += '<button class=&#x22;option-btn&#x22; data-next=&#x22;' + opt.next + '&#x22;>' + escapeHtml(opt.label) + '</button>';&#xA;      });&#xA;      html += '</div>';&#xA;    } else if (screen.type === &#x22;links&#x22;) {&#xA;      html += '<p class=&#x22;result-heading&#x22;>' + escapeHtml(screen.heading) + '</p>';&#xA;      html += '<div class=&#x22;link-list&#x22;>';&#xA;      screen.links.forEach(function (link) {&#xA;        html += '<a class=&#x22;link-item&#x22; href=&#x22;' + link.href + '&#x22;>' +&#xA;          '<div class=&#x22;link-title&#x22;>' + escapeHtml(link.text) + '</div>' +&#xA;          '<div class=&#x22;link-desc&#x22;>' + escapeHtml(link.desc) + '</div>' +&#xA;          '</a>';&#xA;      });&#xA;      html += '</div>';&#xA;    } else if (screen.type === &#x22;suggestion&#x22;) {&#xA;      html += '<p class=&#x22;suggestion&#x22;>' + escapeHtml(screen.before) +&#xA;        '<a class=&#x22;inline-link&#x22; href=&#x22;' + screen.link.href + '&#x22;>' + escapeHtml(screen.link.text) + '</a>' +&#xA;        '</p>';&#xA;    }&#xA;&#xA;    screenEl.innerHTML = html;&#xA;&#xA;    var buttons = screenEl.querySelectorAll(&#x22;.option-btn&#x22;);&#xA;    buttons.forEach(function (btn) {&#xA;      btn.addEventListener(&#x22;click&#x22;, function () {&#xA;        goTo(btn.getAttribute(&#x22;data-next&#x22;));&#xA;      });&#xA;    });&#xA;  }&#xA;&#xA;  goTo(&#x22;q1&#x22;);&#xA;</script>&#xA;&#xA;</body>&#xA;</html>"}

:::

Click the desired Publishing Mode to continue with player setup for that Publishing Mode.


[title] Web Folder Setup
[path] Untitled/

:::ExpandableHeading
# Overview

<font color="#2166AE">`INTERNET ACCESS REQUIRED`</font> <font color="#6B21A8">`CMS: BRIGHTSIGN AUTHOR (FREE)`</font>

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/YlJ_cb0UcBBYbMEB7Hwe4_image.png" size="70" width="878" height="680" isUploading="false" darkWidth="878" darkHeight="680" showCaption="false"}

- Content is published to a player-accessible URL. Content can be uploaded to the URL using WebDAV or FTP.
- The player downloads the content from the web folder.
- Players periodically check the web folder for content updates and when available, new content is automatically downloaded to the player.
:::

# Add Setup File

::::WorkflowBlock
:::WorkflowBlockItem
From [BrightSign Control](https://control.brightsign.biz), create / sign in to your account, and select or create a Player Network for the player to belong to ([more info](docId\:CVBN8koVFul3DOi5bKHpl)).
:::

:::WorkflowBlockItem
Go to: **Player Setup / Setup File Library**&#x20;

Click **Add Setup File** to create a [Setup File](docId\:yDtI_hG5yGiOUIXfuK1pe).
:::

:::WorkflowBlockItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/4vVjW7iqD-2sPvM6k6YvU_image.png)

Settings are organized into the sections shown. Review the available settings and configure as necessary.

For the [Publishing Mode](docId\:rEScIigY-dJRPuZgwaA4e), select **Web Folder** and enter the **Web Folder URL** and authentication info, if required.
:::

:::WorkflowBlockItem
Click **Save Setup File** to save the Setup File to the Setup File Library.
:::
::::

# Provision

Next, the player must registered and assigned the just-created Setup File. This process is known as [Provisioning](docId\:yAszd9x1YB7Uwun3OxXmP).

[title] Local Network Setup
[path] Untitled/

:::ExpandableHeading
# Overview

<font color="#2166AE">`LOCAL NETWORK ACCESS REQUIRED`</font> <font color="#6B21A8">`CMS: BRIGHTSIGN AUTHOR (FREE)`</font>

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/x8OFpiqBvurL9qShusslk_image.png" size="70" width="872" height="310" isUploading="false" darkWidth="872" darkHeight="310" showCaption="false"}

- Content is published to the player over the local network.
:::

# Add Setup File

::::WorkflowBlock
:::WorkflowBlockItem
From [BrightSign Control](https://control.brightsign.biz), create / sign in to your account, and select or create a Player Network for the player to belong to ([more info](docId\:CVBN8koVFul3DOi5bKHpl)).
:::

:::WorkflowBlockItem
Go to: **Player Setup / Setup File Library**&#x20;

Click **Add Setup File** to create a [Setup File](docId\:yDtI_hG5yGiOUIXfuK1pe).
:::

:::WorkflowBlockItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/4vVjW7iqD-2sPvM6k6YvU_image.png)

Settings are organized into the sections shown. Review the available settings and configure as necessary.

For the [Publishing Mode](docId\:rEScIigY-dJRPuZgwaA4e), select **Local Network**.
:::

:::WorkflowBlockItem
Click **Save Setup File** to save the Setup File to the Setup File Library.
:::
::::

# Provision

Next, the player must registered and assigned the just-created Setup File. This process is known as [Provisioning](docId\:yAszd9x1YB7Uwun3OxXmP).


[title] CMS
[path] ⭐ Player Setup/Setup File/

The software used to manage the content that players will display is known as a **CMS** or *Content Management System*.

While content *authoring&#x20;*&#x6D;ay be included with the CMS (as with BrightSign Author), authoring can also be done outside of the CMS (as with HTML / web-based presentations).

# CMS Options

There are three general CMS options.

|                   | **BrightSign**<br />**Author**  | **BrightSign**<br />**Author Plus** | **Partner**<br />**CMS** |
| ----------------- | ------------------------------- | ----------------------------------- | ------------------------ |
| Cost              | Free                            | Paid                                | Paid                     |
| Content storage   | Local                           | Cloud                               | Cloud                    |
| No. of players    | \< 10                           | 10+                                 | 10+                      |
| Access            | Desktop app<br />or web browser | Desktop app<br />or web browser     | Web browser              |
| Player management | BrightSign<br />Control         | BrightSign<br />Control             | BrightSign<br />Control  |



:::CtaButton{label="Next: Publishing Mode" docId="rEScIigY-dJRPuZgwaA4e" openInNewTab="false"}

:::


[title] Default Setup File
[path] ⭐ Player Setup/Setup File/

Under certain situations, players can be automatically provisioned with a **Default Setup File**. These situations are covered in the next section on [Provisioning](docId\:yAszd9x1YB7Uwun3OxXmP).

The Default Setup File can be customized. In the absence of a customized Default Setup File, one of two BrightSign Default Setup Files will be used as described below.

# Default Setup File (Custom)

The Default Setup File can be customized by renaming an existing Setup File to `Default Setup` with the exact case and spelling as shown. This Setup File will then be used as the default.

# Default Setup File (BrightSign)

If a custom Default Setup File has not been set up, one of two BrightSign Default Setup Files will be used:

- If the player's network *has* an Author Plus subscription, the Default Setup File will include the [Author Plus](docId\:rEScIigY-dJRPuZgwaA4e) Publishing Mode.
- If the player's network *does not have* an Author Plus subscription, the Default Setup File will include the [Local Network](docId\:rEScIigY-dJRPuZgwaA4e) Publishing Mode.



:::CtaButton{label="Next: Provisioning" docId="yAszd9x1YB7Uwun3OxXmP" openInNewTab="false"}

:::


[title] Setup FAQs
[path] /

# Can BrightSign Author and BrightAuthor Classic manage the same player?

No, these are separate platforms. A player can only be associated to and managed by one platform.

# Should I use BrightSign Control and/or BrightSign Author instead of my current CMS?

The free BrightSign Control is generally recommended regardless of your CMS. It offers highly useful tools for player setup and management, and works seamlessly alongside any CMS. Many of our CMS partners have already integrated or are in the process of integrating their products with BrightSign Control to provide a more unified experience within their CMS.

BrightSign Author is an authoring tool and is BrightSign's CMS. If you are using a non-BrightSign CMS, you by definition will not be using BrightSign Author as your CMS.

# Can I install both BrightSign Author and BA Classic?

Yes. Both BrightSign Author and  can be installed on the same Windows PC. However, as mentioned above, players can only be used with one app or the other.

# Can I use BrightSign Control with players on OS 7 & 8?

No. BSN.Cloud requires players to be on BrightSignOS 8 (8.0.119) or later.

# Do BrightSign Control and BrightSign Author need internet access?

BrightSign Control is accessed via a website so internet access is required.

The BrightSign Author desktop app can be used without internet access for Publishing Modes like Standalone or Local Network. For other Publishing Modes like Author Plus and Web Folder, internet access is required.

# Should I change my firewall or port-forward for BrightSign Control?

Please see [this page](docId:6MBtfGmpjWoCqOmVC0oE5) for port and URL information.

# Does Local Network work over the internet in BrightSign Author?

The [Local Network](docId\:rEScIigY-dJRPuZgwaA4e) Publishing Mode requires that the player be accessible over a local network. It does not work over the internet. This Publishing Mode supports a maximum of ten players on a local network. If more players are added, unreliable behavior may result when content is published.

For larger deployments, the [Author Plus](docId\:rEScIigY-dJRPuZgwaA4e) or [Web Folder](docId\:rEScIigY-dJRPuZgwaA4e) Publishing Modes are recommended, both of which require internet access.

# Can players access the network without a BrightSign account?

There are several ways that players can access network-based content without a BrightSign account:

- Any internet-connected BrightSign player can access RSS feeds, media RSS feeds, and Live Data, as well as send and receive commands over the internet. This is true regardless of the [Publishing Mode](docId\:rEScIigY-dJRPuZgwaA4e) .
- The [Local Network](docId\:rEScIigY-dJRPuZgwaA4e) Publishing Mode allows you to see a player on the local network in BrightSign Author under **Schedule > Type > Local Network**. From here, you can publish schedules, playlists, and other content directly to the player over the local network.
- The [Web Folder](docId\:rEScIigY-dJRPuZgwaA4e) Publishing Mode allows you to distribute content to BrightSign players remotely using a web folder on you web server. BrightSign Author can be used to upload presentations and schedules to the web folder. Web folders must be based on WebDAV; FTP is not supported.

# Can players play media files directly?

Instead of playing media files as part of a presentation, players can also play media files directly (i.e., not as part of a presentation). When the player is off, place the desired image, video, or audio files in the root folder of your player storage and then turn the player back on. These files will then play *alphabetically* as a looping playlist.

This option has significant limitations:

- There is no control over output resolution/rate
- Scheduling is not available
- There is no storage management, which will wear storage more quickly
- There is no control over image duration (always 6 seconds), transitions, or scaling
- You cannot control media playback order except for (re)naming files
- There are no checks for media compatibility which can cause poor playback and reboots

If this playback method isn't working:

1. Make sure that there isn't an *autorun.brs* or Autoplay file (*Autoplay.xml*, *Autoplay.bsp*, *Autoplay.csv*, *autoschedule.txt*) in the player storage.
2. Check that the media files are in the root folder of the player storage (for example, "SD:\\").
3. Make sure that you are using [image](docId\:gZcaQrOoR8-ZaRNrEPKN1), [video](docId\:knsFFwMTD4NswXm4BUP0I), or [audio](docId\:Hs4EUH9JcuiJcBafGShef) content that the player supports. You may need to set your PC to show file extensions to ensure that the media extensions of your content files are supported.
4. Verify that images are no larger than 1920x1080. If images are too large, they'll fail to display. 

# Can I play content from a thumb or hard drive?

Any player model with a USB port can play content from a USB thumb or hard drive. BrightSignOS versions 6.1.57 and later allow players to support storage devices up to 1TB. Earlier BrightSignOS versions let you use USB drives up to 500GB. The storage device should be formatted using FAT32 or exFAT.

You can format your drive using NTFS to play files larger than 4GB if your player doesn't support exFAT. However, this is only compatible with players configured for the [Standalone](docId\:rEScIigY-dJRPuZgwaA4e) Publishing Mode: NTFS-formatted storage cannot receive network updates (it will be read only). Furthermore, you cannot use any functions that write to the storage including Logging, Remote Screenshots, and Variables.

# Can I display HTML pages without BrightSign Author, BrightAuthor Classic, or BrightScript?

Yes, players are capable of displaying HTML pages by placing the index.html file, along with any required content files, in the root folder of the storage device. HTML presentations can be published using either the Standalone publishing mode (i.e., copying the files directly to the storage device and inserting the storage device into the player) or by uploading the files to the player's microSD card via the SD tab of the player's [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM).

Players support True Type Font files (.ttf) as well as Web Open Font files (.woff/.woff2) which can be added to the player's storage device. If no fonts are specified or provided, the player will use its default system font.

While BrightSign Author is required to create multi-zone presentations, a limited set of interactive functionality is available for HTML pages via [BrightScript-JavaScript Objects](docId\:URrXhU7L-V9ea-Zhy0JV3).

# Can I enable or disable the splash screen progress bar?

Use the linked scripts to [disable](https://www.brightsignnetwork.com/download/Scripts/autorun-disableBootScreen.zip) or [enable](https://www.brightsignnetwork.com/download/Scripts/autorun-enableBootScreen.zip) the startup progress bar. 

1. Unzip the attached file.
2. Copy the "autorun.brs" file to a microSD card or USB thumb drive.
3. Insert the card or thumb drive into the player and power it up.
4. Give the player a minute to boot up and run the script. The script will indicate on-screen that the boot screen has been enabled or disabled.


[title] Setup File
[path] ⭐ Player Setup/

A **Setup File** configures essential player settings and is required for a player to function.

:::hint{type="warning"}
If you do not create a Setup File, the **Default Setup File** will be assigned when the player is registered. For more info, see [Default Setup File](docId\:J9wsBHJjZhW01fvh_nqfn).
:::

# Setup File Library

From BrightSign Control, go to: **Player Setup / Setup File Library**

Here, you can view, edit, clone, or delete Setup Files.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/4yn_1I5CMd2wqQVMd2JEX_image.png)

# Create a Setup File

To create a new Setup File and add it to the library, click **Add a Setup File**. Here, you will be able to configure key player settings.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/4vVjW7iqD-2sPvM6k6YvU_image.png)

Setup File settings are organized into the following categories:

:::Heading{depth="3" indent="1"}
Basics
:::

:::Paragraph{listStyleType="disc" indent="2"}
Set the Setup File name, player name, player description, and time zone as shown above.
:::

:::Heading{depth="3" indent="1"}
Publishing Mode
:::

:::Paragraph{listStyleType="disc" indent="2"}
The **Publishing Mode&#x20;**&#x64;etermines how content will be delivered to the player and is dependent on your desired **CMS** (Content Management System).
:::

:::Heading{depth="3" indent="1"}
Network
:::

:::Paragraph{listStyleType="disc" indent="2"}
Configure the player's network access (e.g., Ethernet, Wi-Fi, USB-connected networking, etc.).
:::

:::Heading{depth="3" indent="1"}
Services & Monitoring
:::

:::Paragraph{listStyleType="disc" indent="2"}
Enable features like the [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM) or Local Web Server.
:::



:::CtaButton{label="Next: CMS" docId="xA-aycfLJkpinNpiUeQR7" openInNewTab="false"}

:::


[title] CMS URL Setup
[path] Untitled/

:::ExpandableHeading
# Overview

<font color="#2166AE">`INTERNET ACCESS REQUIRED`</font> <font color="#0C121D">`CMS: NON-PARTNER CMS (PAID) VIA WEB BROWSER`</font>

You may also use a CMS not affiliated with BrightSign's Partner CMS program.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/fht5f3ODh7EcuKREJBITg_image.png" size="70" width="880" height="660" isUploading="false" darkWidth="880" darkHeight="660" showCaption="false"}

- A .zip file containing the setup package for the CMS is placed at a player-accessible URL.
- The player downloads the package from the URL and sets itself up for use with the CMS.
:::

# Add Setup File

::::WorkflowBlock
:::WorkflowBlockItem
From [BrightSign Control](https://control.brightsign.biz), create / sign in to your account, and select or create a Player Network for the player to belong to ([more info](docId\:CVBN8koVFul3DOi5bKHpl)).
:::

:::WorkflowBlockItem
Go to: **Player Setup / Setup File Library**&#x20;

Click **Add Setup File** to create a [Setup File](docId\:yDtI_hG5yGiOUIXfuK1pe).
:::

:::WorkflowBlockItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/4vVjW7iqD-2sPvM6k6YvU_image.png)

Settings are organized into the sections shown. Review the available settings and configure as necessary.

For the [Publishing Mode](docId\:rEScIigY-dJRPuZgwaA4e), select **CMS URL** and enter the URL of the CMS setup package.
:::

:::WorkflowBlockItem
Click **Save Setup File** to save the Setup File to the Setup File Library.
:::
::::

# Provision

Next, the player must registered and assigned the just-created Setup File. This process is known as [Provisioning](docId\:yAszd9x1YB7Uwun3OxXmP).

[title] Player Setup
[path] /

# DO NOT Power Up the Player

::::VerticalSplit{layout="left"}
:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/WhSyWySWWlXhBOgg92z8P_hand-on-plug.svg" size="60" isUploading="false" position="center" width="262" height="226" darkWidth="262" darkHeight="226" showCaption="false"}
:::

:::VerticalSplitItem
New players will try to configure themselves upon first boot up.

Follow this guide to ensure that the player configures itself correctly upon boot up.
:::
::::

:::hint{type="info"}
This guide helps you set up your player while providing explanations and helpful tips along the way. If you are in a hurry and need your player set up as quickly as possible, see [Quick Setup](docId:-GUga56hC2IJ-tLQLAAOo).
:::

Setting up a player involves the following steps:

::::WorkflowBlock
:::WorkflowBlockItem
# Sign In

Create and/or sign in to your BrightSign account.
:::

:::WorkflowBlockItem
# Create Setup File

The **Setup File** configures key player settings and is required for players to function.
:::

:::WorkflowBlockItem
# Provision

**Register** the player and **assign a Setup File** to it.
:::
::::

Let's go through each of these steps in more detail.

:::CtaButton{label="Next: Sign In" docId="CVBN8koVFul3DOi5bKHpl" openInNewTab="false"}

:::


[title] Registration Code
[path] ⭐ Player Setup/Provisioning/Untitled/

:::hint{type="danger"}
# IMPORTANT

This method configures a single player with the [Default Setup File](docId\:J9wsBHJjZhW01fvh_nqfn).

Once provisioned, changing to another Setup File requires that the player be [reprovisioned](docId:1w4jVaZ8RyKER3J2tLnjw).

If you do not want the player to be configured with the Default Setup File, do not use this method. Follow these instructions instead:

- Provision a [single player](docId\:UqFxMUDz6_OwjdzjZelL4) with a specific Setup File
- Provision [multiple players](docId:0SB4SHwyEyDfrGuQJOi9Q) with a specific Setup File
:::

# Registration Screen

When a *non-provisioned* player boots up for the first time, it will display a Registration Code:

![This player's registration code is DZRHPQ](https://images.archbee.com/511c8QBH-VHiwWnyzIwUb/gdgJSM3e8DZ7VDVIBJKJL_microsoftteams-image-20230411-171038.png?format=webp)

# Enter Registration Code

From BrightSign Control, go to: **Player Setup / Registration**

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/1tms2zTKYEpciH8WwD3HG_image.png)

Enter the player's registration code and click "Register Player". The player will now be provisioned - it will be registered and have the Default Setup File applied.


[title] Bulk Provisioning
[path] ⭐ Player Setup/Provisioning/

Bulk Provisioning is the process of provisioning multiple players at once.

To provision multiple players, go to: **Player Setup > Provisioning**

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/T-vZK9IzE_7ZO7GxFe_Dg_image.png)

# Download Template

Click **Download Template** to download the .csv template. Template headings are as shown:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/eI9LCKRf35zQl27qyQsgB_image.png" size="70" isUploading="false" width="516" height="58" darkWidth="516" darkHeight="58" showCaption="false"}

::::ExpandableHeading
### Template Headings

**Serial No.**

The player's serial number.

**Device Name**

The desired name for the player. Make sure the name is unique to help you identify the player among your fleet.

**Setup File**

The name of the Setup File that should be applied to the player.

**Application URL (CMS URL)**

If you are setting the player up for a CMS that is not affiliated with BrightSign's partner program, enter the player-accessible URL where the .zip file containing the CMS' setup package resides.

:::hint{type="warning"}
If a player is desired to be provisioned for a CMS URL, it can be done with a Setup File where the Setup File includes the CMS URL Publishing Mode.

Alternatively, the CMS URL can be directly entered in the CSV file, negating the need for a Setup File.

If a Setup File that includes a CMS URL Publishing Mode is specified *and* a CMS URL is entered in the CSV column, the CMS URL in the Setup File will take precedence.
:::

**Description**

A brief description of the player.
::::

# Upload Template

Click **Upload Template** to upload the completed template.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/NqKV9ZL_TmI6mbyYXxirb_image.png" size="70" isUploading="false" width="898" height="448" darkWidth="898" darkHeight="448" showCaption="false"}

Upon import of the completed template, the Provisioning List will be updated to reflect the players represented in the completed template. These players are no configured and when they boot up for the first time, they will configure themselves with the specified Setup File.


[title] Sign In
[path] ⭐ Player Setup/

::::::WorkflowBlock
:::::WorkflowBlockItem
::::VerticalSplit{layout="right"}
:::VerticalSplitItem
# Sign In

Create or sign in to your account at [BrightSign Control](https://control.brightsign.biz).

Microsoft SSO (Single Sign-On) is supported. Support for other SSO providers is coming soon.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/qDa8sTo4j2mNk6JEugsII_image.png)
:::
::::
:::::

:::::WorkflowBlockItem
::::VerticalSplit{layout="right"}
:::VerticalSplitItem
# Player Network

A **player network** is a collection of players that are linked for centralized management. All players must belong to a network.

Select or create a network for the player.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/pJUXpnkuL4vATLlTp69P-_image.png)
:::
::::
:::::
::::::

:::CtaButton{label="Next: Setup File" docId="yDtI_hG5yGiOUIXfuK1pe" openInNewTab="false"}

:::


[title] Standalone Setup
[path] Untitled/

:::ExpandableHeading
# Overview

<font color="#2166AE">`NO NETWORK ACCESS REQUIRED`</font> <font color="#6B21A8">`CMS: BRIGHTSIGN AUTHOR (FREE)`</font>

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/fsRUShWisWSGlXSryQZCa_image.png" size="70" width="837" height="242" isUploading="false" darkWidth="837" darkHeight="242" showCaption="false"}

- Content is manually published / copied to a storage device (typically a microSD card).
- The storage device is manually inserted into the player.
:::

# Add Setup File

::::WorkflowBlock
:::WorkflowBlockItem
From [BrightSign Control](https://control.brightsign.biz), create / sign in to your account, and select or create a Player Network for the player to belong to ([more info](docId\:CVBN8koVFul3DOi5bKHpl)).
:::

:::WorkflowBlockItem
Go to: **Player Setup / Setup File Library**&#x20;

Click **Add Setup File** to create a [Setup File](docId\:yDtI_hG5yGiOUIXfuK1pe).
:::

:::WorkflowBlockItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/4vVjW7iqD-2sPvM6k6YvU_image.png)

Settings are organized into the sections shown. Review the available settings and configure as necessary.

For the [Publishing Mode](docId\:rEScIigY-dJRPuZgwaA4e), select **Standalone**.
:::

:::WorkflowBlockItem
Click **Save Setup File** to save the Setup File to the Setup File Library.
:::
::::

:::hint{type="warning"}
Unfortunately, BrightSign Control is currently unable to save Setup Files to a local device (e.g., your computer or a microSD card). This ability will be added soon. Until then, you must use BrightSign Author to do this.
:::

# BrightSign Author

::::WorkflowBlock
:::WorkflowBlockItem
From BrightSign Author, go to: **Admin > Setup Library**
:::

:::WorkflowBlockItem
Find the Setup File created above and click **Edit** (pencil icon).
:::

:::WorkflowBlockItem
The Setup File will appear enabling you to edit it.

Click **Save Setup** and save to a *blank* microSD card. Save the files to the top/root level of the card; do not save to a sub-folder. Click **OK**.
:::
::::

# Player Setup

- Make sure the player is **off**.
- Insert the microSD card into the player and power up the player.
- Wait until the player displays a message indicating that setup is complete.

The player is now set up for the **Standalone Publishing Mode**.


[title] Partner CMS Setup
[path] Untitled/

:::ExpandableHeading
# Overview

<font color="#2166AE">`INTERNET ACCESS REQUIRED`</font>
`CMS: PARTNER CMS (PAID) VIA WEB BROWSER`

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/E2Elu3Sz11uN9VlT-1SzB_image.png" size="70" width="918" height="673" isUploading="false" darkWidth="918" darkHeight="673" showCaption="false"}

BrightSign has many partners who provide an alternative CMS for BrightSign players. You can select from a list of Partner CMSs to use for content management.
:::

# Add Setup File

::::WorkflowBlock
:::WorkflowBlockItem
From [BrightSign Control](https://control.brightsign.biz), create / sign in to your account, and select or create a Player Network for the player to belong to ([more info](docId\:CVBN8koVFul3DOi5bKHpl)).
:::

:::WorkflowBlockItem
Go to: **Player Setup / Setup File Library**&#x20;

Click **Add Setup File** to create a [Setup File](docId\:yDtI_hG5yGiOUIXfuK1pe).
:::

:::WorkflowBlockItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/4vVjW7iqD-2sPvM6k6YvU_image.png)

Settings are organized into the sections shown. Review the available settings and configure as necessary.

For the [Publishing Mode](docId\:rEScIigY-dJRPuZgwaA4e), select **Partner CMS** and select the desired Partner CMS from the list.
:::

:::WorkflowBlockItem
Click **Save Setup File** to save the Setup File to the Setup File Library.
:::
::::

# Provision

Next, the player must registered and assigned the just-created Setup File. This process is known as [Provisioning](docId\:yAszd9x1YB7Uwun3OxXmP).

[title] Reprovisioning
[path] ⭐ Player Setup/Provisioning/

:::hint{type="warning"}
When a *provisioned* player player powers up for the first time, it will configure itself with the Setup File it was provisioned with.

After the provisioned player has powered up,*&#x20;assigning* a new Setup File to the player will *not* result in the new Setup File going into effect on the player. The player must be **reprovisioned&#x20;**&#x69;n order for the newly assigned Setup File to take effect.
:::

From BrightSign Author, go to the **Network** tab. Find the player and click the settings (gear) icon:

![image-20241218-203424.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/v3DXxxTvclkX4p84UIVv4_image-20241218-203424.png)

This accesses the player's [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM). From there, go to **Control > Reprovision Player**.

Note the actions that will occur during the Reprovision process and click **Reprovision**.

![image-20240424-184507.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/_KL03LnPKnkND4hvMZu3C_image-20240424-184507.png)

:::hint{type="warning"}
If no provisioning record exists:

- Players that are connected to the internet will default to the [Activation Code](docId:-LkcKUaB0zzcGLL5Znh04)  screen.
- Players that are not connected to the internet will fall back to [On-Player Setup](docId\:cDGHYE6qGY_IrNH5KaZx6).

To check for a provisioning record, go to **Admin > Provision** and look for an assignment in either the **Setup** or **App URL** columns.
:::

# Deleting a Provision Record

1. Go to **Admin > Provision** and delete the player from the Provision List by clicking the delete (trash can) icon.
2. Go to the **Network** tab and find the player. Click the gear icon to remotely access the player's DWS.
3. Navigate to the **Control** tab of the player’s DWS and click the **Reprovision** button which will cause the player to reboot.
   - Since no Setup File has been applied to the player, the player will boot to the [Register / Activate](docId\:OOf-RmqHqFVLhokXI8ypJ) screen.
4. After the player has rebooted, go the **Network** tab and click the delete (trashcan) icon to delete the player from the network.
   - This is more of a housecleaning step and while recommended, is not strictly necessary. If not done, the player will continue appearing in the Network tab but show an Inactive status.

:::hint{type="danger"}
For privacy / security reasons, BrightSign cannot delete player provision records and cannot provide information about the network to which players are provisioned.&#x20;

If a previously used player is purchased, make sure that the seller is able to delete the player's provision record. If the former administrator of the player network is no longer unavailable, that administrator's IT department must access the administrator's email and log in to the associated BrightSign account to delete the player's provision record.
:::

# Reprovisioning vs. Factory Reset

:::hint{type="warning"}
**IMPORTANT**

A ﻿[Factory Reset](docId\:ynCF7P2PYZo2qedF1JYim) of a player does *not* alter its provisioning record. Upon bootup after a Factory Reset, the player will automatically retrieve and apply the Setup File that was previously assigned.
:::

Key differences between reprovisioning and a [Factory Reset](docId\:ynCF7P2PYZo2qedF1JYim) are outline in this table:

| **Reprovision**                                                                                                                                                                                     | **Factory Reset**                                                                                                                                                                                        |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Clears the player storage                                                                                                                                                                           | Does not clear the player storage                                                                                                                                                                        |
| Clears most registry settings but importantly does not clear the player’s network settings (e.g., WiFi configuration) unless these settings are explicitly changed in the new Setup File            | Clears all registry settings including the player’s network settings.                                                                                                                                    |
| - If a new Setup File has been assigned, the new Setup File will take effect upon bootup.
- If a new Setup File has not been applied, the player will boot to the Registration / Activation screen. | Does not affect the player’s provisioning record. The player’s Setup File on record will be applied after the player boots back up. Changing the player’s Setup File requires reprovisioning the player. |


[title] Network Settings
[path] ⭐ Player Setup/Setup File/

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/AhkTD1eNcxaGaLUmwMQOb_image.png)

Configuration of a player's network settings is coming soon to BrightSign Control. Until then, BrightSign Author must be used to configure network settings in a Setup File. For more details, see [Network Options](docId\:gfqm5HVphjQijhZxb2NGy).



:::CtaButton{label="Next: Tools" docId="GnwA1Gfy45kcpFUmZFRXM" openInNewTab="false"}

:::


[title] Single Provisioning
[path] ⭐ Player Setup/Provisioning/

To provision a single player, go to: **Player Setup > Provisioning**

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/bGLVr9CqXlZTTS_yUJdzh_image.png)

# Add Player

Click **Add Player** to provision a single player. You will be prompted to enter the player's serial number and optionally, a player name and description.

:::hint{type="warning"}
### IMPORTANT

The player is now provisioned even though a Setup File was not explicitly assigned because the [Default Setup File](docId\:J9wsBHJjZhW01fvh_nqfn) has been automatically assigned to the player.

**If the player is powered on at this point**, it will configure itself with the Default Setup File. Changing to another Setup File at that point would require [reprovisioning](docId:1w4jVaZ8RyKER3J2tLnjw) the player.

If you do **not** want the player to be configured with the Default Setup File, **do not boot up the player yet** and continue with the steps below.
:::

::::ExpandableHeading
### Player Already Registered

If you enter a serial number of a player that has already been provisioned, you will get an error. If the player was brand new when obtained, then you or someone in your organization likely already provisioned the player and you should be able to find the player in the Provisioning List.

However, if the player was previously owned and provisioned, the previous owner / administrator must delete the player's provisioning record from their player network before you can provision the player for your player network.

:::hint{type="warning"}
For security reasons, only the current administrator of a player is able to delete a player's provisioning record. BrightSign is generally unable to remove player provisioning records. If you have a player that was previously provisioned, contact the previous owner / administrator and request that they ﻿delete the player's provisioning record.
:::
::::

# Assign Setup File

Until the player boots up and configures itself with the assigned Setup File (in this case, the Default Setup File), you can assign a different Setup File to the player. When the player boots up, it will configure itself per the currently assigned Setup File

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
1. Select the target player(s)
2. Click **Assign Setup File**
3. Select the desired Setup File

- If the player has *not* booted up since being provisioned, it will download and apply the selected **Setup File** upon boot up.
- If the player *has* booted up since being provisioned, see the important note below.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/Q_B8CCWAyW3U07f02xq2t_image.png)
:::
::::

:::hint{type="warning"}
### IMPORTANT

For provisioned players that have already booted up, **assigning** a Setup File strictly defines the Setup File that should take effect *when the player is reprovisioned*.

A reboot or even a [Factory Reset](docId\:ynCF7P2PYZo2qedF1JYim) will *not* result in the new Setup File going into effect. The player must be *reprovisioned* for the new Setup File to take effect. See [Reprovisioning](docId:1w4jVaZ8RyKER3J2tLnjw) for more details.
:::

# Apply CMS URL

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
The **Apply CMS URL** option lets you set up a CMS not affiliated with the BrightSign Partner program by providing the URL where the setup package for this CMS resides.

Refer to [CMS URL](docId\:rEScIigY-dJRPuZgwaA4e) for more details on this Publishing Mode.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/oDEhNbbFi64JQSDEzvmP4_image.png)
:::
::::

# Delete Player

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
Click **Delete** to remove a player from the Provisioning List. This deletes the player's provisioning record with BrightSign.

When a player without an associated provisioning record boots up, it can individually be provisioned anew per the steps above, or [bulk provisioned](docId:0SB4SHwyEyDfrGuQJOi9Q) along with other players.
:::

:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/6jOSdThRmjIkV5Kw6gv8p_image.png" size="70" isUploading="false" width="235" height="238" darkWidth="235" darkHeight="238" showCaption="false"}
:::
::::


[space] Author (/author)

[title] Set Panel Output
[path] BrightSign Author/Presentation/Commands & Conditional Targets/

This section has an accompanying tutorial video:&#x20;

::embed[]{url="https://vimeo.com/371507437"}

Configures the LED output of an attached USB device (BP200, BP900, or BLC400)

:::hint{type="warning"}
If you're connecting a single BP/BLC device to a player, use the "A" version of the device (e.g. "BP900A"). If you plan to connect multiple BP/BLC devices to a player, see [here](docId\:yDEH8qOcVKymgJ2KDxn7L) to learn more about using the A, B, C enumerations.
:::

## BP900/BP200

- **Button number**: Select a single button LED to affect, or select **All** to affect all button LEDs on the board.
- **Action**: Select one of the following actions:
- **Off**: Disables an output that was previously set on the button LED(s). This action *does not* disable the default lighting effect that occurs when a button is pressed.
- **On**: Displays a solid pattern.
- **Fast Blink**: Displays a quick flashing pattern.
- **Medium Blink**: Displays a moderate flashing pattern.
- **Slow Blink**: Displays a slow flashing pattern.

## BLC400

:::hint{type="warning"}
You cannot use multiple BLC commands to simultaneously trigger multiple LED patterns (e.g. a breathe effect on channel A and a marquee effect on channel B). BLC commands that belong to the same event/state will trigger in descending order at slightly offset intervals.
:::

- **Intensity**: Triggers each channel at the specified intensity. Specifying a **Time** of zero causes the channel(s) to reach that intensity immediately, while a non-zero value causes them to ramp up over the specified interval.

:::hint{type="success"}
**Tip**
To turn off a channel, set the **Intensity** to zero.
:::

- **Blink**: Triggers each channel at a **Fast**, **Medium**, or **Slow** speed.
- **Breathe**: Causes a channel to ramp up from the specified **Min** to the specified **Max** intensity over the specified **Time** interval. The channel(s) will then ramp down to the specified **Min** over the same **Time** interval.
- **Strobe**: Triggers each channel in short bursts at maximum intensity. The **Time** parameter specifies how frequently the channel(s) will trigger; values greater than 1000ms will default to 1000ms. 
- **Marquee**: Triggers each channel in succession. You will need to specify the marquee type:
- **Loop**: Cycles through the channels (A B C D) continuously.
- **Back and forth**: Cycles from A to D to A (A B C D C B A) continuously.
- **Play once**: Performs a singe cycle through the channels (A B C D).
- **Random**: Cycles through the channels in continuous random order (e.g. C A D B A D C B D B C A).

You will also need to specify the pattern timing for marquee effects:

- **Hard on/off**: Channels can only be off or at full brightness, without transitions. The **On time** specifies how long each channel remains at full brightness, while the **Off time** specifies the interval between one channel turning off and the next turning on. 
- **Smooth delay**: After completing its **On time**, a channel will decrease in brightness until it turns off completely. Then, once the **Off time** has transpired, the next channel will increase in brightness to full intensity.
- **Smooth full overlap**: The current channel decreases in brightness only when the next channel has reached full brightness.
- **Smooth partial overlap**: The current channel decreases in brightness while the next channel simultaneously increases in brightness (i.e. the rate of increase and decrease are inversely proportional).

:::hint{type="info"}
For the "Smooth" options, the ramp up and ramp down intervals are fixed at approximately 20 percent of the **On time**.
:::




[title] Video In State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/gxwMAuvohdBGZOUESribR_videoinstate.png" size="14" width="209" height="154" position="center" darkWidth="209" darkHeight="154" showCaption="false"}

The Video In state allows for live-video playback from another source via the HDMI® Input port on the XT1145, XT2145, XT1144, XT1143, and 4K1142 models.

## State Properties

- **Name:** The name of the Video In state
- **Initial** **State**: Select this to make this state the home screen

### Options

- **Volume:** Allows you to set the volume. For presentations in Advanced mode, volume can also be changed using the **Set Volume** command.
- **Overscan enabled**: Check this box to display the video input beyond the edges of the zone. Use this option if the source video signal is using an overscan setting.

## Using Video In

![Screenshot 2025-02-12 at 1.19.06 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/dGlFpT8Bq6pKm9MR7Yl9s_screenshot-2025-02-12-at-11906-pm.png)

1. In a presentation for an XT1145, XT2145, XT1144, XT1143, or 4K1142 player, drag the **Video** **In** widget onto your canvas.
2. Give the state a name in the **State** **Properties** panel.
3. Connect the widget to a media event as shown in the image above. When the media ends, it will go to the **Video In** widget, which will take the signals from the HDMI input and display it in that zone.

## Example

This section has an accompanying tutorial video:

::embed[]{url="https://vimeo.com/366576270"}


[title] Presentations
[path] How-tos/Video Guides/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

# Managing Media

In this tutorial, you’ll learn how to upload and manage content using BrightSign Author (BrightAuthor\:connected), allowing you to publish presentations that contain images, video, audio, and HTML pages.

::embed[]{url="https://vimeo.com/349088530"}

[Download Sample Assets](https://www.brightsignnetwork.com/download/Videos/Training%20Videos/Media-management-assets.zip)

# Building a Simple Presentation

In this tutorial, you’ll learn how to build a simple presentation, and publish it to your BrightSign player.

::embed[]{url="https://vimeo.com/350773959"}

# Building a Multizone Presentation

This tutorial explains how to use BrightSign Author (BrightAuthor\:connected) to build a multizone presentation, where specified regions of the screen display various types of content simultaneously.

::embed[]{url="https://vimeo.com/350770968"}

# Scheduling and Publishing Content

This tutorial explains how to schedule and publish a presentation to your BrightSign player.

::embed[]{url="https://vimeo.com/350772319"}

# Creating a Ticker

In this tutorial, you will learn how to generate both static and live text, make and format a ticker zone, add text to the zone, and make live updates to the ticker text while a presentation is running.

::embed[]{url="https://vimeo.com/358861003"}

[Download Sample Assets](https://www-old.brightsign.biz/application/files/5515/8256/9466/BrightSign-Tutorial-RSS-text.zip)

# Adding Time and Date

In this tutorial, you will learn how to add and format the date and time in two separate clock zones within a multi-zone presentation using BrightSign Author (BrightAuthor\:connected).

::embed[]{url="https://vimeo.com/358936999"}

# Using a Transparent Overlay

In this tutorial, you will learn how to use BrightSign Author (BrightAuthor\:connected) to add a PNG image with transparent areas to a multizone presentation.

::embed[]{url="https://vimeo.com/359076977"}

[Download Sample Assets](https://www.brightsignnetwork.com/download/Videos/Training%20Videos/overlay_assets.zip)

# Making an HTML5 Presentation

With BrightSign Author (BrightAuthor\:connected), you can make HTML5 presentations to display websites, utilize touch gestures (like swiping), use JavaScript, and update text. In this tutorial, you will learn how to make a presentation using an HTML5 webpage and publish it directly to your BrightSign player. Then we’ll switch over to BrightSign Cloud to see how to host HTML sites remotely both on a web server and via BrightSign Cloud.

::embed[]{url="https://vimeo.com/361905857"}

[Download Sample Assets](https://www.brightsignnetwork.com/download/Videos/Training%20Videos/overlay_assets.zip)

# How to Use Audio Zones

In this tutorial, you’ll learn how to make an audio zone that includes a playlist of audio tracks, as well as a dynamic playlist that can be updated live. You’ll also learn how to mute the audio coming from the video zones.

::embed[]{url="https://vimeo.com/366362094"}

[Download Sample Assets](https://www.brightsignnetwork.com/download/Videos/Training%20Videos/AudioZone-assets.zip)

# Video Sync Overview

This video describes how video sync works in BrightSign Author (BrightAuthor\:connected).&#x20;

::embed[]{url="https://vimeo.com/1160258168"}

# Using the Video-In Widget

In this tutorial, you’ll learn how to add HDMI content, even HDCP content, to a video zone using the Video-In widget.

::embed[]{url="https://vimeo.com/366576270"}

# How to Use Streaming Content

In this tutorial, you’ll learn how to stream content to your presentation using BrightSign Author (BrightAuthor\:connected).

::embed[]{url="https://vimeo.com/366605276"}

# How to Use Zone Messaging

In this tutorial, you will learn how to add interactive touch functionally to the multi-zone presentation using zone message events and zone message commands.

::embed[]{url="https://vimeo.com/378348077"}

[Download Sample Assets](https://www.brightsignnetwork.com/download/Videos/Training%20Videos/Zone-messaging-assets.zip)

[title] Image State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/nysZEYN1SYpYF3S-q9qEL_imagestate.png" size="14" width="93" height="94" position="center" showCaption="false"}

An image state represents a single image file.

# State Properties

## Name

The name of the image file

## Initial State

Select this to make this state the home screen

## Transition

### Effect

Select an effect that occurs when the playlist transitions to the image state. The available image effects are in the expander below.

### Duration

Specify the duration of the transition effect

:::ExpandableHeading
### Transition Effects

- No effect
- Image wipe from top
- Image wipe from bottom
- Image wipe from left
- Image wipe from right
- Explode from center
- Explode top left
- Explode top right
- Explode from bottom left
- Explode from bottom right
- Venetian blinds – vertical
- Venetian blinds - horizontal
- Comb effect – vertical
- Comb effect - horizontal
- Fade to background color
- Fade to new image
- Slide from top
- Slide from bottom
- Slide from left
- Slide from right
:::

## Select a different file

Brings up an asset dialog box that lets you select a different image file.

## Notes

This section lets you store important information about the Image state for future users. It can be modified at any time.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more info.


[title] Super  State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/tqt4vuaifn4qq-ZCrVLif_superstate.png" size="16" width="208" height="198" position="center" showCaption="false"}

If you create a large, complex interactive playlist, you will likely run into two problems: You’ll find yourself having to create a large number of redundant events, and it will become difficult to keep track of numerous branching states and conditions. Super States are implemented to alleviate these problems and make complex interactive presentations manageable.

# State Properties

- **Name**: The name of the state
- **Initial State**: Select this to make this state the home screen

## Notes

This section lets you store important information about the Super state for future users. It can be modified at any time.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more info.

# Using Super State

The Super State functions as both a state and a self-contained interactive playlist. A Super State can be transitioned into and out of using any event, but double-clicking reveals the interactive playlist canvas contained within the original. This canvas lets you add media states from **Widgets** to the Super State. To exit the canvas, click the Zone description located in the top left corner of the canvas. This will take you back to the Zone Content canvas. 

Several behaviors are unique to the Super State:

- *Each Super State contains a Home State*: A transition to a Super State will point to the initial state within the Super State by default. However, you can point the transition to any other state within the Super State by opening the event and selecting the desired state from the **Specify next state** drop down menu.
- *Super States can be nested inside other Super States*: You can use the breadcrumb trail above the playlist area to keep track of where you are within the hierarchy of Super States.
- *Super States can have Entry and Exit Commands*: Entry Commands are triggered when any state within the Super State is transitioned to. If a Super State is contained within one or more other Super States, a transition to or from that Super State will trigger Entry/Exit commands on all other Super States that will need to be moved through for the transition to reach its destination. Commands will be executed in sequential order, depending on whether the transition is ascending or descending through a hierarchy of Super States.
- *You can copy and paste, export Super States*: All events, states, commands, and other Super States contained within the Super State will be copied over as well.


[title] Network Status
[path] BrightSign Author/Dashboard and Menus/

The **Network Status** tool provides a visualization of network health over time.

# Accessing Network Status

Network Status is visible either through the Dashboard pulldown menu, or the thermometer icon in the toolbar. Both are indicated by the red arrows in the image below.

![](https://archbee-image-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-VeZWeN5vcc6e8L3HJ8PhN-20250716-183219.png)

# Network Status Results

The Network Status page contains pie and bar charts. The bar chart automatically refreshes every 15 minutes to display the status of players over the previous 24 hour period. The pie chart and the information in the label next to it are based on whichever time period is selected in the bar chart (the last bar/data in the chart is highlighted by default). Hovering over an individual bar in the chart will also display a tooltip with the player status information for that time period.

Note that the data is aggregated, so statistics for specific players are not currently available. All dates and times are in the local timezone.

![image-20241209-191929.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/ixflIi49eIYGufNMCyOM9_image-20241209-191929.png)


[title] Undocking Panels
[path] BrightSign Author/Content/

# Undocking

To undock individual panels from the right pane, select the icon in the top right corner, as shown below. These icons only appear on panels which support undocking/docking.

Note that:

- If multiple tabs are undocked, the window which was most recently undocked will have focus until the user clicks on another window. 
- If all tabs within a pane are undocked, it will collapse.
- Selected panels from both the left and right panes can be undocked.

Note that if you have undocked panels and navigate out of that tab, the related undocked panels will all close. When you come back to that UI, the previously undocked panels will reopen again in their last position on screen. Also, when you undock multiple panels while in a particular tab, the undocked windows open directly on top of each other.

![image-20241211-220217.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/Z1DxpOwx0oMfOaS9HnZ-s_image-20241211-220217.png)

# Docking

Select the icon in the top right corner to redock the floating pane.

Note that:

- If the pane has collapsed because all panels are undocked, it will reappear when a panel is docked.

![image-20241211-220325.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/JLYUREqMwOJYnqJ6m98we_image-20241211-220325.png)

# Interacting with Undocked Panels

The undocked panel can be moved around and resized like any other window. To return the panel to its docked position, simply close its window.


[title] Create GPIO Input
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

This example presentation demonstrates how to define GPIO input in BrightSign Author. When GPIO 0 is pressed the presentation will switch from the current video to the next video:

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
1. Create an interactive playlist.  
2. Go to **Presentation Settings > Interactive**, and locate the **Connectors** tab (see Image 1). 
3. Go to **GPIO Configuration** and select **Input** for **GPIO 0**.
4. Add the videos to the playlist.
5. From the top **Events** bar, select **GPIO 0** and draw a connection from *video1.mp4* to *video2.mp4*.
6. Add a **Media End** event to *video2.mp4* to play it immediately after *video1.mp4* finishes. While *video2.mp4* plays, GPIO 0 input will be ignored.
7. To accept GPIO 0 input during *video2.mp4* and have it trigger *video1.mp4*, draw a connection from the *video2.mp4&#x20;*&#x74;o *video1.mp4* state using the **GPIO 0** Event from **Events**. Pushing GPIO 0 will now take you back to *video1.mp4*.
8. Select the **GPIO 0** Event stemming from *video2.mp4&#x20;*&#x61;nd in **Event Properties > Target State** select **Transition to new state** and select *video2.mp4* from the dropdown list (see Image 2). Now, pushing GPIO 0 restarts *video2.mp4* instead of taking it back to *video1.mp4*. 
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/-KdO8WW-GCOZSalCF-QE6_image.png" size="80" width="800" height="1585" position="center" caption="Image 1" darkWidth="800" darkHeight="1585" showCaption="true"}
:::
::::

![Screenshot 2024-03-29 at 2.35.04 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/t21d6ehjPIdv87VcfiDV1_screenshot-2024-03-29-at-23504-pm.png "Image 2")


[title] Convert Video Formats
[path] How-tos/

See [Video Formats & Codecs](docId\:knsFFwMTD4NswXm4BUP0I) to determine if your file format is currently supported. If it is not, you can convert videos with many applications, though you may lose video quality when converting from one video format to another. If you are experiencing performance or quality issues with your video, see [Optimize Video Quality](docId\:h730dRkSG_mJtZfmU-1gx) for guidance.

# MPEG-2

BrightSign players support MPEG-2 files, including *.vob* files found on DVDs. If your MPEG-2 file was generated on a Mac, it might use an *.mpeg* extension. You can rename the extension to *.mpg* to get it to work properly on your player.

# H.264 (MPEG-4 Part 10)

BrightSign players currently support H.264 *.ts*, *.mov*, *.mp4*, *.mpg*, *.vob*, and *.m2ts* files. You can use a program like VLC or tsMuxer to change the container/encapsulation of an H.264 stream to one of these files without re-encoding. 

If you do need to convert from one format to another or between different MPEG formats, these are a few recommended applications:

- Apple Quicktime Pro
- Elecard Converter Studio
- Final Cut Pro + Compressor (MacOS)
- Pinnacle Studio
- Adobe Premier
- TMPGEnc 4.0 Xpress

These are some free utilities that customers have recommended:

- Mpeg Streamclip
- VLC Media Player
- tsMuxer (changes H.264 MOV files into H.264 transport streams)
- Handbrake


[title] Display an Excel File
[path] How-tos/

BrightSign does not support Excel files natively. However, you can either export an Excel worksheet as HTML, or display Excel files as images. The instructions for both scenarios are below.

# Export an Excel file as HTML

1. Go to **File > Save As** in Excel.
2. In the **Save as type** list, select *\*.htm, \*.html*.
3. Under **Save**, choose **Selection: Sheet** and click **Publish**.
4. The **Publish as Web Page** window will open. Select the sheet(s) you wish to publish.
5. Use the **Browse** button to find and select your server (in the example screenshot, the HTML file is being placed into a public dropbox folder).
6. Check the **AutoRepublish web page** box.
7. Click **Publish**. The first time you save the workbook again, you will see the following window. Select the **Enable AutoRepublish feature** to ensure that the worksheet is automatically updated whenever a change is made to the document. 

![step5.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/y6fpZcy96lqp0dY4fjJws_namestep5.png)

# Display Image or Text of an Excel file

You can convert Excel files to image or text files and then display them using the player. There are many different applications that can perform this conversion (here's [one example](http://www.print-driver.com/howto/convert_excel_to_jpeg.html)). The easiest way to convert an Excel sheet is to take a screenshot of it and save it as image file. Check [Image Formats](docId\:gZcaQrOoR8-ZaRNrEPKN1) to ensure the saved images will display successfully on the player.

Depending on how complicated the spreadsheet is, you can recreate the fields and layout using the [Live Text State](docId\:zmRkcTVFWvLi8U1Z5fRVk) in BrightSign Author or the [Live Text](docId\:azDujH1WTCMXrP_0oIX7_) feature in .

[title] Preferences
[path] BrightSign Author/Admin/

Whenever you create a new project, various presentation properties will be set using the default settings. If you often use the same set of properties, you can save time by changing the default settings to what you use most often. To edit application preferences, navigate to **Admin > Application Preferences**. Select **Apply Changes** to save changes to your preferences, or **Reset** to reset them to the initial or previously saved values. Note that **Reset** will not change any values that have already been saved.

# Video

The **Video** dropdown allows you to specify default settings for video states. 

- **Volume**: Specify the volume of the audio. 

# Video In

The **Video In** dropdown allows you to specify default settings for the Video In state. 

- **Time on Screen**: The amount of time (in seconds) that the image displays on screen before transitioning to the next item. 

# Image

The **Image** dropdown allows you to specify default settings for image states. 

- **Slide transition**: Use the dropdown list to set an effect for image transitions.
- **Transition duration**: Specify how long the transition effect will take to complete. This duration should be less than the **Slide Delay Interval**. 
- **Timeout event duration**: Set how long each image displays (in seconds).

# IR Remotes

Use "+" to add an IR Remote Configuration. Select **Browse** to load custom remote codes from a CSV file. Your CSV file should be formatted like this example:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/jq1TObIyTdks-p7aACENy-20251024-195427.csv" label="ir-remote-example.csv"}

## Adding IR remote codes

For the IR code .csv, only NEC protocol is currently supported. [IRscrutinizer](https://github.com/bengtmartensson/IrScrutinizer/releases/) may be helpful for converting from commonly-found formats like Pronto.

The Decimal value is the combination of the Code (common prefix) followed by the Unique Value. So for RC-1001, for example... Custom Code: <font color="#2166ae">**6F90**</font>

| <font color="#ae2121">**0x16**</font> | power | <font color="#178223">**7311382**</font> |
| ------------------------------------- | ----- | ---------------------------------------- |

hex <font color="#2166ae">**6F90**</font>****<font color="#ae2121">**16**</font>

- hex 6F9000 (common custom code plus trailing 0s to leave space for the unique value) + hex 16 (unique value)
- decimal 7311360 + decimal 22
- decimal <font color="#178223">**7311382**</font>

See [RC-1002 Remote Control](docId:2VCGHMSxhuRis4ojFTRZl) for RC-1001 and RC-1002 codes.

# Interactive

Use the **Interactive** dropdown to set a default timeout period for events. 

# Live Text

Use the **Live Text** dropdown to edit default preferences for text fields in Live Text states: 

- **Alignment**: Use the dropdown list to set whether the text is left-aligned, right-aligned, or centered.   
- **Foreground Color**: Set a default color for the text. 
- **Background Color**: Set a default color for the background of text fields. 
- **Font Size**: Select **Set Fixed Point Font Size** to enter a value for the font size (1-500). 

# User Interface

The **User Interface** dropdown allows you to edit various options related to the BrightSign Author UI, including selecting Beta features as of version 1.26. See image below.

You must click **Apply Changes** for your changes take effect.

![image-20241218-205818.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/m276xnYliq9pknrJ1-LC8_image-20241218-205818.png)

## Content

- **Enable Image File Resize Dialog**: If this is selected and you try to add a 4K image to a presentation that has been created with a 2K Target Resolution, a dialog box will give you the option to scale the image down to 2K.
- **Enable Image File Resize:** If this is selected and you add a 4K image to a presentation that has been created with a 2K Target Resolution, the image will be automatically scaled down to 2K so it can be added to the presentation.

:::hint{type="warning"}
If you do not select either **Enable Image File Resize Dialog** or **Enable Image File Resize**, your presentation will error if you try to add a 4K image to a presentation that has been created with a 2K Target Resolution, and you will not have the option to resize the image.
:::

## Publishing

- **Disable Save Schedule Dialog**: Disables the dialog box which asks if you would like to save the schedule as a separate file when you exit the **Schedule** tab. 
- **Discard changes:** Discards any unsaved **Schedule** changes.

## Presentation

- **Disable Save Presentation Settings Dialog**: Disables the dialog box, which asks if you would like to save your changes, that appears when you exit the **Presentation** tab. 
- **Discard changes:** Discards any unsaved **Presentation Settings** changes.

## Live Media Feed

- **Disable unsaved warning**: Disables the dialog box warning that you may have unsaved **Live Media Feed** changes when you exit the **Content** tab. 
- **Discard changes:** Discards any unsaved **Live Media Feed** changes.

## Live Data Feed

- **Disable unsaved warning**: Disables the dialog box warning that you may have unsaved **Live Data Feed** changes when you exit the **Content** ta&#x62;**.** 
- **Discard changes:** Discards any unsaved **Live Data Feed** changes.

## Dynamic Playlist

- **Disable unsaved warning**: Disables the dialog box warning that you may have unsaved **Dynamic Playlist** changes when you exit the **Content** ta&#x62;**.** 
- **Discard changes:** Discards any unsaved **Dynamic Playlist** changes.

## Tagged Playlist

- **Disable unsaved warning**: Disables the dialog box warning that you may have unsaved **Tagged Playlist** changes when you exit the **Content** ta&#x62;**.** 
- **Discard changes:** Discards any unsaved **Tagged Playlist** changes.

## Transition Display Mode

Determines how BrightSign Author draws event connections between states in the interactive playlist area.

- **Automatic**: Displays either a line or a label, depending on the current playlist layout. 
- **Display Line**: Displays event lines between states. 
- **Display Label**: Displays numbered event labels that show connections between states. 

## Transition Label Location

Determines where numbered event labels are located. 

- **Bottom**: Numbered event labels are located below states. 
- **Right**: Numbered event labels are located to the right of states. 

## Presentation Destination

Refers to which save destination folder a saved presentation will go to when BrightSign Author is in **Local Content** mode. 

- **Last Used**: The destination defaults to the last folder used to save a presentation project.
- **My Documents**: The destination defaults to the *My Documents* folder. 

## State Defaults

Set the following State properties panel view defaults:

- **Advanced Panel:** Set the default for this panel to expanded or collapsed.
  - **Entry Commands:** Set these commands to expanded or collapsed by default.
  - **Exit Commands:** Set these commands to expanded or collapsed by default.

## Event Defaults

Set the following Event properties panel view defaults:

- **Target State:** Set the view for these options to expanded or collapsed by default.
- **View Options:** Set the view for these options to expanded or collapsed by default.
- **Advanced Panel:** Set the default for this panel to expanded or collapsed.
  - **Commands:** Set the view for these options to expanded or collapsed by default.
  - **Conditional Targets:** Set the view for these options to expanded or collapsed by default.

# Storage

Selecting **Enable Reserve Storage** allows you to divide the presentation storage device (microSD card, USB device, etc.) into different segments. You can then allot maximum sizes to those segments to ensure that a certain type of data does not take up too much space on the storage device. 

:::hint{type="info"}
If you select **Absolute**, it is possible to specify a combined set of segments that is larger and smaller than the absolute size of your storage device. If you select **Percent**, you will need to ensure that the percentages add up to 100% (which is equivalent to the absolute size of the storage device.
:::

The segment types are specified as follows:

- **Published Data**: The maximum size allotted to all presentation and content files that are written to the storage device during the publishing process. This includes audio, video, images, text, and HTML content files. 
- **Dynamic Data**: The maximum size of all dynamic content, including Dynamic Playlists and MRSS feeds. When this segment runs out of space, dynamic content files will be deleted to create space, starting with the oldest files first. 
- **HTML Data**: The maximum size of the HTML application cache. 
- **HTML Local Storage**: The maximum size of all JavaScript variables and data. 
- **HTML IndexedDB**: The maximum amount of storage allocated to the IndexedDB web database application. 
- **Total**: The sum percentage or amount of MB allotted. 

# Network Hierarchy

The **Network Hierarchy** allows users to set either **All Players** or **Player Group** as the default in the Hierarchy pane (see Image 2). When Network Hierarchy is not set, **All Players** is the default setting. **Groups** and **Group View** are only available for Content Cloud networks.

Toggle to your desired preference and then select **Apply Changes** to set it as the default.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/9WamuP_TVClg8RIe1M8V-_image-20230814-233918.png" size="70" width="817" height="420" position="center" darkWidth="817" darkHeight="420" showCaption="false"}


[title] Content
[path] BrightSign Author/

:::hint{type="warning"}
Access to the Content tab requires a BrightSign Author Plus subscription.
:::

Use the Content tab to add, delete, or move files on your BrightSign Cloud network. You can also use the Content tab to create BrightSign Cloud presentation components: Dynamic Playlists, Live Data Feeds (RSS), and Live Media Feeds (MRSS). 

This section has an accompanying [tutorial video](https://vimeo.com/349088530).

# Content Library

![image-20241210-202824.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/BbP_Ec5f_vTe7R2-7aFuw_image-20241210-202824.png)

1. **Library**: View assets that are part of your BrightSign Cloud network. The **Media** directory contains content files (image, video, audio, text) and the **Components** directory contains other presentation assets (playlists, feeds, plugins, HTML pages).
   - Click the **New folder** icon to create a new folder in the specified directory. This option is only available for the **Media** directory.
2. **Content Tab**:
   - **Upload New Media** adds new media to your library 
   - **New Component** allows you to add a Dynamic Playlist, Tagged Playlist, Live Data Feed, or Live Media Feed; or to upload an HTML site, Node.js app, or script to your library. Note that if you upload an HTML site/Node.js app as a regular website, it will be available in the [Presentation](docId:0Vm0UTpL2j8dss-DFNhMo) tab as media content in the [HTML5](docId\:AkrM58NDS_BN6AyhWZRax) widget.
   - **Content Library** takes you to the content library
3. **Search**: Enter text in the search field to search the folder for a filename
4. **Sort**: Use the dropdown list to select a sort criteria. Use the icon to toggle between ascending and descending order.
5. **Properties**: Use this pane to view information about a selected item:
   - **Media**: Provides information about a media file:
     - **Name**: The name of the media file
     - **Media Type**: The type of media file ("image", "video", "audio", or "text")
     - **Dimensions**: Resolution of the media file
     - **File Size**: The size of the file, in kilobytes or megabytes
     - **Upload Date**: The date and time the file was uploaded to BrightSign Cloud
     - **Last Modified**: The date and time the file was last modified on the client machine
     - **Thumbnail Image**: To enlarge your image or video thumbnail to show more content detail, select the enlarge icon in the top right corner of the thumbnail icon (see the arrow over the thumbnail in the image above).
   - **Security:&#x20;**&#x50;rovides information about the object permissions for the content. See [Object Permissions & Custom Roles](docId\:arSvZyPzjxMP9Uh9v95H2) for more information.
   - **Component**: Provides information about a presentation component:
     - **Name**: The name of the component
     - **Type**: The type of component ("Dynamic Playlist", "Data Feed", "Media Feed", "Html Site", or "Script")
     - **Size**: The size of the component file(s), in kilobytes or megabytes
     - **Creation Date**: The date that the component was created on BrightSign Cloud
     - **Upload Date**: The date that the component was uploaded to the BrightSign Cloud (applicable HTML sites only)
6. **Undock:** Select the icon to undock panels from the left or right panes. See [Undocking Panels](docId\:np7Z4QgXRfi_mqzL4lDtO) for more information.
7. **Delete**: When the lower-right corner of a media file, component, or folder is hovered over, the Delete (trash can) icon will appear. Click the icon to delete that item. A lock icon on an item indicates that it is being used in an active presentation (i.e. a presentation that is assigned to a BrightSign Cloud group) and cannot be deleted.

# Uploading Files

## Media Files

To add media files to your BrightSign Cloud library, navigate to **Content > Upload New Media** or click the **Add Media** icon (the "+" icon) in the **Media** directory of the Library.

![image-20241210-210839.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/crBsAx9vrGXJ-JonWGXSe_image-20241210-210839.png)

1. **Choose Files**: Select media files from your local machine to upload to BrightSign Cloud
2. **Properties**: View information about the selected media file:
   - **File Name**: The name of the media file
   - **File Type**: The type of media file ("Image", "Video", "Audio", or "Text")
   - **File Size**: The size of the file, in kilobytes or megabytes
   - **Last Modified**: The date and time the file was last modified on the client machine
3. **Add content to folder**: Change the target BrightSign Cloud directory (media file uploads default to the "Media" root-directory folder).
4. **Upload Content**: Click this button to upload the selected files.

## HTML Site / Node.js App

To upload an HTML site to your BrightSign Cloud library, navigate to **Content > New Component > Upload HTML Site**.

:::hint{type="info"}
All assets for an HTML5 site should be contained in a single folder to ensure that they can be easily selected and uploaded (only include the HTML assets to avoid uploading unrelated items).
:::

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/C6e5EAGD-q6YlN14zrSsd_image-20241210-211034.png" size="70" width="657" height="466" position="center" alt="image-20241210-211034.png" darkWidth="657" darkHeight="466" showCaption="false"}

1. **Site Name**: Enter a name for the HTML site for easy identification in the BrightSign Cloud library.
2. **Upload as Internal Web Page**: Check this box if you want to upload an *.html* page for the player to display.
3. **Browse to Select Site Index**: Select the *.html* file of the site that you wish to upload.
4. **Upload**: Click this button to upload the HTML site (including the *index.html* file and all assets).

## Scripts

To upload a plugin script, navigate to **Content > New Component > Upload Script**.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/MMpJtaWXAFqoknAeCExyE_image-20241210-213303.png" size="70" width="657" height="318" position="center" alt="image-20241210-213303.png" darkWidth="657" darkHeight="318" showCaption="false"}

1. **Browse to Select Script**: Select a script file (with a *.brs* extension) to upload.
2. **Upload**: Click this button to upload the HTML site (including the *index.html* file and all assets).

# Dynamic Playlists

Dynamic Playlists allow you to easily update content across multiple presentations on your network. When you modify a Dynamic Playlist, every presentation that includes the Dynamic Playlist receives these changes. This means that a single update can reach numerous presentations. 

:::hint{type="success"}
**Example**
You have several groups on your BrightSign Cloud network playing different presentations based on their location. However, you have a playlist of daily deals you wish to apply to all of your presentations. Instead of updating each presentation individually, you can include a single Dynamic Playlist in them. When you update the Dynamic Playlist, the changes are broadcast to all your players automatically.
:::

## Adding a Dynamic Playlist

To create a Dynamic Playlist, navigate to **Content > New Component > Dynamic Playlist** or go to the the **Components > Dynamic Playlists** directory and click the **New Dynamic Playlist** icon (the "+" icon).

When the **Create Dynamic Playlist** window opens, enter a **Name** for the Dynamic Playlist and click **Create**.

## Building a Dynamic Playlist

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/vlrNH_-6nRpXDce6YJelS_dynamic-playlist-rev-b.png)

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/CC6h3s3mq2qPQlPWTmaVE_dynamic-playlist-alt-b.png" size="30" width="276" height="216" position="center" darkWidth="276" darkHeight="216" showCaption="false"}

1. **Library**: Select a folder containing media files that you wish to add to your Dynamic Playlist.
2. **Assets**: Drag and drop media files from the folder into the playlist area to add them to the Dynamic Playlist.
   - **Select All**: Click to select all files in the folder. Alternatively, you can hold down shift to select any number of files to drag into the playlist area. Click **Clear Selection** to clear your multi-selection.
   - **Search**: Enter text in the search field to search the folder for a filename.
   - **Sort**: Use the dropdown list to select a sort criteria. Use the ascending / descending icon to toggle between ascending and descending order.
   - **Refresh**: Click the icon to query the contents of the folder again.
   - **Resize**: Use the dropdown menu to change the size of the image thumbnails in the **Assets** pane.


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/m3ODF7JX7FQxU9WP7JTnl_content-add-media-to-dp.png" size="100" isUploading="false" initialPath="./attachments/Content%20-%20Add%20Media%20to%20DP.png" githubPath="user-guides/brightauthorconnected-user-guide/attachments/Content - Add Media to DP.png" width="821" height="750" darkWidth="821" darkHeight="750" showCaption="false" indent="3"}

3. **Playlist Area**: Edit the playlist order by dragging items to different positions in the playlist. To remove an item from the playlist, hover your cursor over the thumbnail and click the icon when it appears.
4. **Save**: Click the Save icon to save the Dynamic Playlist to your BrightSign Cloud network or select **Save As** from the file drop down menu.
5. **Properties**: Select a media item to view properties associated with it:
   - **Asset Name**: The filename of the media item.
   - **Time On Screen** (images only): Specify the amount of time (in seconds) that the image should be displayed before transitioning to the next item.
   - **Volume** (videos and audio only): Specify the volume of the media.
   - **Enable Validity Date**: Check the box to assign a validity date to the media item. If this box is checked, the file will only be included in the Dynamic Playlist between the specified **Start Time/Date** and **End Time/Date**. For example, if the start date is 1:00pm 2025-11-11 and the end date is 11:59pm 2025-11-31, the content will start playing at 1:00pm on November 11, 2025 and play all day every day until November 31, 2025 at 11:59pm.
     - Please note that unlike the timestamps on the Schedule tab, these validity dates are specific to the UTC timezone. This means that players in different time zones will receive all the changes synchronously, and not according to their local time.
     - A playlist item with a validity date will have an icon in the top left to indicate its current status:
       - The item is not currently included in the Dynamic Playlist because the validity **Start Time/Date** begins in the future.
       - The item is currently included in the Dynamic Playlist.
       - The item is not currently included in the Dynamic Playlist because the validity **End Time/Date** has passed.

# Live Data Feeds

Live Data Feeds allow you to host and update fully functional RSS feeds on BrightSign Cloud using a simple user interface. You can use Live Data Feeds to populate [Live Feed](https://docs.brightsign.biz/display/DOC/State+Properties#StateProperties-LiveFeedStatelive_feed) [Live Feed States](docId\:YewTo_xHNE9Aa4vah2BuZ) (as part of a [Ticker Zone](docId\:v-EVnMU6c7K5NHUNs86qT)) or [modify User Variables](docId\:a6Ali6u-szxHuansk6T3-).

## Adding a Live Data Feed

To create a Live Data Feed, navigate to **Content > New Component > Live Data Feed** or go to the **Components > Live Data Feeds** directory and click the **New Live Data Feed** icon (the "+" icon).

The **Create Live Data Feed** window will open. Enter a **Name** for the feed and click **Create**.

## Building a Live Data Feed

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/WuEj97MVPDqh4n0Q2V02t_live-data-feed.png)

1. **Add Item**: Click the icon to add an item to the feed.
2. **Move Item**: Click and hold the icon to move a feed item to a different position in the feed.
3. **Enter Key**: Enter a key for the item.
4. **Enter Value**: Enter a value to associate with the key. The [Live Feed State](docId\:YewTo_xHNE9Aa4vah2BuZ) state displays the value, rather than the key, of each item.
5. **Delete**: Click the icon to remove an item from the feed.
6. **Save**: Click the icon to save the feed on your BrightSign Cloud network or select **Save As** from the file drop down menu.
7. **Properties**: Select a feed item to view properties associated with it:
   - **Order**: Enter an index number to move the item to a different position in the feed.
   - **Enable Validity Date**: Check the box to assign a validity date to the item. If this box is checked, the item will only be included in the Live Data Feed between the specified **Start Time/Date** and **End Time/Date**. Please note that unlike the timestamps on the Schedule tab, these validity dates are specific to the UTC timezone. This means that players in different time zones will receive all the changes synchronously, and not according to their local time. An item with a validity date will have an icon in the top left to indicate its current status:
     - The item is not currently included in the Live Data Feed because the validity **Start Time/Date** begins in the future.
     - The item is currently included in the Live Data Feed.
     - The item is not currently included in the Live Data Feed because the validity **End Time/Date** has passed.

# Live Media Feeds

Live Media Feeds allow you to host and update fully functional media RSS (MRSS) feeds using a simple user interface. You can use Live Media feeds to populate [Live Feed](https://docs.brightsign.biz/display/DOC/State+Properties#StateProperties-LiveFeedStatelive_feed) [Live Feed States](docId\:YewTo_xHNE9Aa4vah2BuZ) or [modify User Variables](docId\:a6Ali6u-szxHuansk6T3-).

:::hint{type="warning"}
The title of assets added to a Live Media Feed is set to the asset's filename by default.
:::

## Adding A Live Media Feed

To create a Live Media Feed, navigate to **Content > New Component > Live Media Feed** or go to the **Components > Live Media Feeds** directory and click the **New Live Media Feed** icon (the "+" icon).

The **Create Live Media Feed** window will open. Enter a **Name** for the feed and click **Create**.

## Building a Live Media Feed

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/e5taYcPyq8l4rhte2VQV3_live-media-feed.png)

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/PMNEcnd7LHH3HNtyXR4dY_live-media-feed-alt-b.png" size="30" width="276" height="416" position="center" darkWidth="276" darkHeight="416" showCaption="false"}

1. **Library**: Select a folder containing media files that you wish to add to your Live Media Feed.
2. **Assets**: Drag and drop media files from the folder into the feed area to add them to the Live Media Feed.
   - **Select All**: Click to select all files in the folder. Alternatively, you can hold down shift to select any number of files to drag into the playlist area. Click **Clear Selection** to clear your multi-selection.
   - **Search**: Enter text in the search field to search the folder for a filename.
   - **Sort**: Use the dropdown list to select a sort criteria. Use the ascending / descending
     icon to toggle between ascending and descending order.
   - **Refresh**: Click the icon to query the contents of the folder again.
   - **Resize**: Use the drop down menu to change the size of the image thumbnails in the **Assets** pane.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/RnXO9gg18eiiwjJmP2Aa0_content-add-media-to-live-media-feed.png" size="100" isUploading="false" initialPath="./attachments/Content%20-%20Add%20Media%20to%20Live%20Media%20Feed.png" githubPath="user-guides/brightauthorconnected-user-guide/attachments/Content - Add Media to Live Media Feed.png" width="958" height="939" darkWidth="958" darkHeight="939" showCaption="false" indent="3"}

3. **Feed Area**: Edit the feed order by dragging items to different positions in the playlist.
4. **Expand**: Click the icon to edit information about the feed item:
   - **Title**: Enter a key for the item.
   - **Description**: Enter a value to associate with the key.
   - **Add Item Data**: Click the button to add a custom name/value pair to the item.
5. **Move Item**: Click and hold the icon to move a feed item to a different position in the feed.
6. **Delete**: Click the icon to remove an item from the feed.
7. **Save**: Click the icon to save the Live Media Feed to your BrightSign Cloud network or select **Save As** from the file drop down menu.
8. **Properties - Media Feed**: Displays properties associated with the feed.
   - **Name**: The name of the Live Media Feed
   - **TTL**: Specify how long the feed will remain on the player (in minutes) before it is refreshed using the source URL.
9. **Properties - Media Feed Item**: Displays properties associated with the currently selected media feed item:
   - **Order**: Enter an index number to move the item to a different position in the feed. The index begins at 1.
   - **Duration**: The amount of time an image is displayed or audio/video file is played. A value of 0 indicates that the image will be displayed continuously.
   - **Enable Validity Date**: Check the box to assign a validity date to the item. If this box is checked, the item will only be included in the Live Media Feed between the specified **Start Time/Date** and **End Time/Date**. Start Time and End Time assumes the time is entered in **UTC timezone** (not the local time of the user). An item with a validity date will have an icon in the top left to indicate its current status:
     - The item is not currently included in the Live Media Feed because the validity **Start Time/Date** begins in the future.
     - The item is currently included in the Live Media Feed.
     - The item is not currently included in the Live Media Feed because the validity **End Time/Date** has passed.


[title] Event Handler State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/1jXZz4BVpC_xrS5aiS0GG_eventhandlerstate.png" size="14" width="209" height="207" position="center" darkWidth="209" darkHeight="207" showCaption="false"}

The Event Handler has no media associated with it but can be used to perform a function. For example, it could be used to:

- Be an placeholder if you want a blank home screen and no content to play until the presentation is activated.
- Add a [command](docId\:az1YTDtEYH-Zp2Dbg_lBL)  that is performed before the first file in the presentation plays.
- Have the presentation sit at a blank screen when finished, instead of looping.

You can add commands and interactive events to enter or exit the **Event** **Handler** state.

# State Properties

- **Name**: The name of the Event Handler state
- **Initial State**: Select this to make this state the home screen
- **Stop Playback:** Check this box if you would like audio/video playback to end once a media file transitions to the Event Handler state.

## Notes

This section lets you store important information about the Event Handler state for future users. It can be modified at any time.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [this page](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more information.

# Using the Event Handler

![Screenshot 2025-02-10 at 2.48.29 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/ytse_AaJR21QOKtJAffeS_screenshot-2025-02-10-at-24829-pm.png)

1. Drag the **Event** **Handler** widget into your presentation.
2. Give it a name and select **Initial** **State**, if you want it to be the first state in your presentation.
3. Under **Advanced** **> Add Command**, add one or more commands to create an action. The image above for an example which sets the audio level and the blink speed of a button panel.
4. Add a **Timeout** to go from the **Event** **Handler** to the first media state in your presentation.

# Example

This example starts a presentation on a button press:

1. Add an **Event Handler** widget to your presentation.
2. Set the **Event Handler** state as the home screen by selecting **Initial** **State.**
3. Define a [BP900](docId\:ALTWiwEsaM7-pgdLmu3Sp) event linked from the **Event Handler** state to the first presentation item. Now the display will sit at a blank screen until a user presses the BP900 button when it will begin playing.


[title] Touch Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/RftA5jkatfnFs3egZ3Qk0_touchevent.png" size="10" width="81" height="80" position="center" showCaption="false"}

The Touch event triggers when the user presses a region on a touch screen that is connected to the BrightSign player. Click the **Set Touch Regions** button in the **Event Properties** pane to define touch regions that will trigger the event.

Click **Add Touch Region** to add a new Touch event to the state: Each Touch event corresponds to a single touch region. Select a touch region to edit the transition as well as the exact positioning of the region:

- **Size**: Set an exact size for the touch region. Alternatively, you can click and drag the marks surrounding the touch rectangle to change its size.
- **W**: Enter the pixel width of the touch region.
- **H**: Enter the pixel height of the touch region.
- **Position**: Set an exact position for the touch region. Alternatively, you can click and drag the rectangle to a different area.
- **X**: Enter the horizontal position (in pixels) of the top-left corner of the touch region.
- **Y**: Enter the vertical position (in pixels) of the top-left corner of the touch region.
- **Advanced Commands**: Add [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL).

Once you are finished editing the touch region, click the Zone description located in the top left corner of the canvas. This will take you back to the Zone Content canvas.


[title] Languages
[path] BrightSign Author/Dashboard and Menus/

# Overview

English is the default language in BrightSign Author, but it can also be viewed in any one of the following languages:

1. English (US)
2. German
3. Spanish
4. Portuguese (Brazilian)
5. French
6. Italian
7. Japanese
8. Korean
9. Chinese (Simplified)
10. Chinese (Traditional)
11. Russian
12. Turkish

Once you switch to a new language, that choice will persist even if you logout or reboot.

# Switching Languages

![image-20241209-191803.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/bMV6n7wdyKPBEfDOKK79v_image-20241209-191803.png)

To switch languages:

1. Select the globe icon in the upper right hand corner of the app. This will open a pull-down menu of language choices.
2. Select the desired language.
3. A dialog box will appear asking you to confirm the language change. Save your work and select **Continue** to proceed.
4. The application will reboot, and the application will display the new language after reboot.

# Additional Information

- For decimal specifications like timeout seconds, you need to use x.y and not x,y even if that is how your locale specifies a decimal point.
- If you revert to a version of BrightSign Author that does not have localization (any version before 1.7.14), set the language that you want to see in the application before reverting, because the older version of BrightSign Author will not have an interface that lets you select your chosen language.


[title] UDP Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/LS_mD-xcm0qzgcAtIzDOq_udpevent.png" size="10" width="85" height="79" position="center" showCaption="false"}

The UDP Input event triggers when the BrightSign player receives a UDP (User Datagram Protocol) message from another device on the local network. Source devices can include tablets/smartphones running the [bsn.Mobile App](docId\:PerXfpcZbZzYlNTY0Cxui), other BrightSign players, and PCs/Macs.

- **Specify UDP input**: Enter the UDP message string that will trigger the event. You can also use the `<any>` wildcard to match some or all of the UDP message string (i.e., entering `<any>` in this field will match all UDP messages, while entering `mycommand_<any>` will match any UDP message that begins with `mycommand_`).
- **Label**: Specify a label for the UDP command button in the BrightSign App. By default, the command label will be the same as the UDP message string.
- **Show in BrightSign App**: Display the command button corresponding to the UDP Input in the bsn.Mobile app.
- **Assign input to variable**: Assign the content of the UDP message to a [User Variable](https://docs.brightsign.biz/space/DOC/404623943/Presentation+Settings#Variables).
- **Input specifies variable**: The UDP message string will dynamically specify which User Variable to modify. The UDP message string must be sent in the form of `<variable name>:<variable value>`.
- **Specify fixed variable**: The UDP string will modify a fixed User Variable. Use the dropdown list to choose which User Variable the UDP input will modify. The UDP string must be sent in the form of `<variable value>`.

:::hint{type="success"}
You can use the **Input specifies variable** option to modify more than one User Variable with a single event. Use the following UDP string format:
`<variable name>:<variable value>!!<variable name>:<variable value>`
:::

- **Assign wildcard to variable**: Specify the value of a User Variable using the `<any>` wildcard. Select the User Variable to modify using the dropdown menu to the right. The **Specify UDP Input** field must contain the `<any>` wildcard, either by itself or with additional text (e.g., `message_<any>`).


[title] State Properties
[path] BrightSign Author/Presentation/

The **State Properties** pane allows you to view and edit settings associated with a state in a playlist. To view the **State Properties** of a state, select a state that is part of your playlist in the **Content** tab. Each state will have different properties associated with it. However, the State Properties pane for all states will contain an **Advanced** menu, which allows users to add entry and exit commands to that state.

![image-20241217-211920.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/fC5foem4I1sjBrkjM5SiK_image-20241217-211920.png)

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/bP1wvlY4X_Grw95_EZdsC_image-20241217-212119.png" size="50" width="498" height="578" position="center" alt="image-20241217-212119.png" showCaption="false"}

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
# Notes

Introduced in version 1.32.0, the **Notes** feature enables the user to add a more detailed description about the function of the selected state. This can be accessed from **Zones > State Properties > Notes**.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/5NzCzeZMrIzeimXxN7kiX_image.png" size="80" width="518" height="318" position="center" showCaption="false"}
:::
::::

***

Click on each individual state in the left panel for more info.

# PDF Version

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/GFiQ4fpHm1Q-ZVkC3w_MH-20260121-223631.pdf" label="State_Properties_Section.pdf"}


[title] Display YouTube Videos
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

YouTube content can be displayed on any BrightSign player. This is done using an [HTML5 State](docId\:AkrM58NDS_BN6AyhWZRax). To do this, you must construct an embedded player URL from the standard YouTube URL for the page. The process is different depending on whether you are playing a single video or a playlist.

Note that not all YouTube videos can be embedded, and some aren't in a compatible format for our players. 

:::hint{type="danger"}
As of late 2025, you must include an `HTTP Referer` request header when embedding videos, otherwise YouTube will return a 153 code error. For instructions on how to do this, see this [BrightSign GitHub page](https://github.com/srodriguez-brightsign/bs-youtube-iframe).
:::

# Link Type

To determine if your link is for a single video or a playlist, check the YouTube URL. If it contains *list=something*, it's a playlist. Otherwise, it's a single video.

![Screenshot 2024-04-19 at 2.53.05 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/pb6Kc5rAb_Hf6NbOSrH0b_screenshot-2024-04-19-at-25305-pm.png "Image 1 (single video)")

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/anYDknuZfgaLhSwozrAcD_image.png "Image 2 (playlist)")

Another indicator that it is a playlist is if you can see the playlist name and author listed, and can see shuffle and repeat icons and can add it to the library (see the example image below):

![Screenshot 2024-04-19 at 2.34.26 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/d9YKpis5I3h90hUGxvyvj_screenshot-2024-04-19-at-23426-pm.png "Image 3")

# Single Video URL

::::WorkflowBlock
:::WorkflowBlockItem
Open the YouTube video or playlist in a web browser and find the URL in the address bar as shown in Image 4:

![Small.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/kMUlOLlVoQ9CTrCS9ccev_small.png "Image 4")
:::

:::WorkflowBlockItem
The base URL is **https\://www\.youtube.com/embed/**. The following elements will be appended to the base URL.

- Append the video ID from the current URL to the base URL. The video ID appears after the **v=** in the current URL. For the image above, the video ID is **y1XxnZA1yiQ** and the link would now be:

  https\://www\.youtube.com/embed/**y1XxnZA1yiQ**

- Append **?playlist=** to the end of the URL. For example, the link would now be

  https\://www\.youtube.com/embed/y1XxnZA1yi&#x51;**?playlist=**

- Add the playlist id. This is the same as the video ID for single (not playlist) videos:

  https\://www\.youtube.com/embed/y1XxnZA1yiQ?playlist=**y1XxnZA1yiQ**
:::

:::WorkflowBlockItem
Add parameters to control the video:

- Add **\&autoplay=1** to automatically start playing the video without interaction:

  https\://www\.youtube.com/embed/y1XxnZA1yiQplaylist=y1XxnZA1yiQ ***\&autoplay=1***

- Add **\&rel=0** to the end of the URL to eliminate related videos appearing at the end of the video:

  https\://www\.youtube.com/embed/y1XxnZA1yiQ?playlist=y1XxnZA1yiQ\&autoplay=&#x31;**\&rel=0**

- Add **\&controls=0** to turn off video controls as they aren't useful in a non-interactive environment:

  https\://www\.youtube.com/embed/y1XxnZA1yiQ?playlist=y1XxnZA1yiQ\&autoplay=1\&rel=&#x30;**\&controls=0**

- Add **\&showinfo=0** so video info and titles are not displayed:

  https\://www\.youtube.com/embed/y1XxnZA1yiQ?playlist=y1XxnZA1yiQ\&autoplay=1\&rel=0\&controls=&#x30;**\&showinfo=0**

- Add **\&loop=1** to loop the video when it reaches the end:

  https\://www\.youtube.com/embed/y1XxnZA1yiQ?playlist=y1XxnZA1yiQ\&autoplay=1\&rel=0\&controls=0\&showinfo=&#x30;**\&loop=1**
:::

:::WorkflowBlockItem
In BrightSign Author **State properties > Source > Site Source**, paste the new URL into a **HTML 5** widget as shown in Image 5:

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/a1IuxodBxtCe55CTWKymo_360027939453.png "Image 5")
:::

:::WorkflowBlockItem
In **State Properties > Source > Options**, ensure that **Enable BrightSign** **JavaScript objects**, **Enable native video** **playback**, and **Enable cross domain policy checks** are all enabled.
:::

:::WorkflowBlockItem
BrightSign Author does not know when a YouTube video ends. If you want your presentation to move to a different state after the video is complete, make sure that there is a [Timeout Event](docId\:p2IAPuAXjbsLp4yNaqlet) set to the HTML 5 state.
:::

:::WorkflowBlockItem
Publish the presentation. 
:::
::::

# Multiple Video (Playlist) URL

::::WorkflowBlock
:::WorkflowBlockItem
Open the YouTube video or playlist in a web browser and find the URL in the address bar, as shown in Image 6:

![Screenshot 2024-04-19 at 4.04.46 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/46aH5cDMAyq7YsHP7gd1U_screenshot-2024-04-19-at-40446-pm.png "Image 6")
:::

:::WorkflowBlockItem
The base URL of the new URL you will construct is [https://www.youtube.com/embed/](https://www.youtube.com/embed/). Add the following elements to that base URL:

- Add the video id to the end of the new base URL. The video id appears after **v=** and before *&* in the original URL. For the image above, this would be:

  https\://www\.youtube.com/embed/**Zsqr1HVnuDE**

- Add **?listType=playlist** to the URL:

  http\://www\.youtube.com/embed/Zsqr1HVnuDE&#x6B;**?listType=playlist**

- Add the playlist id, which appears after the **list=** in the original URL as well as **\&list=**:

  https\://www\.youtube.com/embed/Zsqr1HVnuDE?listType=playlis&#x74;**\&list=PL1QgAgqcnXH\\\_faB-fdX1hYaW1DVoMBC02**
:::

:::WorkflowBlockItem
Add parameters to control the video:

- Add **\&autoplay=1** to automatically start playing the video without interaction:

  https\://www\.youtube.com/embed/Zsqr1HVnuDE?listType=playlist\&list=PL1QgAgqcnXH\\\_faB-fdX1hYaW1DVoMBC0&#x32;**\&autoplay=1**

- Add **\&rel=0** to the end of the URL to eliminate related videos appearing at the end of the video:

  https\://www\.youtube.com/embed/Zsqr1HVnuDE?listType=playlist\&list=PL1QgAgqcnXH\\\_faB-fdX1hYaW1DVoMBC02\&autoplay=&#x31;**\&rel=0****

- Add **\&controls=0** to turn off video controls as they aren't useful in a non-interactive environment:

  https\://www\.youtube.com/embed/Zsqr1HVnuDE?listType=playlist\&list=PL1QgAgqcnXH\\\_faB-fdX1hYaW1DVoMBC02\&autoplay=1\&rel=&#x30;**\&controls=0****

- Add **\&showinfo=0** so video info and titles are not displayed:

  https\://www\.youtube.com/embed/Zsqr1HVnuDE?listType=playlist\&list=PL1QgAgqcnXH\\\_faB-fdX1hYaW1DVoMBC02\&autoplay=1\&rel=0\&controls=&#x30;**\&showinfo=0**

- Add **\&loop=1** to loop the video when it reaches the end:

  https\://www\.youtube.com/embed/Zsqr1HVnuDE?listType=playlist\&list=PL1QgAgqcnXH\\\_faB-fdX1hYaW1DVoMBC02\&autoplay=1\&rel=0\&controls=0\&showinfo=&#x30;**\&loop=1**
:::

:::WorkflowBlockItem
In BrightSign Author **State properties > Source > Site Source**, paste the new URL into a **HTML 5** widget as shown in Image 5, above.
:::

:::WorkflowBlockItem
In **State Properties > Source > Options**, ensure that **Enable BrightSign** **JavaScript objects**, **Enable native video** **playback**, and **Enable cross domain policy checks** are all enabled.
:::

:::WorkflowBlockItem
BrightSign Author does not know when a YouTube video ends. If you want your presentation to move to a different state after the video is complete, make sure that there is a [Timeout Event](docId\:p2IAPuAXjbsLp4yNaqlet) set to the HTML 5 state.
:::

:::WorkflowBlockItem
Publish the presentation.
:::
::::

# Reference Table

These are the most commonly used parameters:

| **Parameter** | **Description**                       | **Values**                                                   |
| ------------- | ------------------------------------- | ------------------------------------------------------------ |
| autoplay      | Auto-start video on load              | 1 = autoplay, 0 = manual start (default)                     |
| controls      | Show or hide player controls          | 0 = hide, 1 = show (default)                                 |
| loop          | Loop video or playlist                | 1 = loop, 0 = no loop (default); requires playlist=VIDEO\_ID |
| playlist      | Comma-separated video IDs for looping | First video plays from URL, rest from playlist               |
| rel           | Show related videos after playback    | 0 = same channel only, 1 = show all (default)                |
| showinfo      | Show or hide video info and titles    | 0 = hide, 1 = show                                           |
| start         | Start playback at specific time (sec) | Positive integer (e.g., start=30)                            |
| end           | Stop playback at specific time (sec)  | Positive integer (e.g., end=60)                              |
| fs            | Show fullscreen button                | 1 = show (default), 0 = hide                                 |
| disablekb     | Disable keyboard shortcuts            | 1 = disable, 0 = enable (default)                            |



# Other

- See YouTube's [Player Parameters page](https://developers.google.com/youtube/player_parameters) for more URL parameters.
- These steps to create a single or playlist URL outline the parameters used for a non-interactive display. Different parameters are needed if you want to display the video interactively.


[title] Migrate Local Setups from BrightAuthor Classic to BrightSign Author
[path] How-tos/

This page describes how to migrate Local File Network, Simple File Network, or Standalone players from BrightAuthor Classic to BrightSign Author/BSN.Cloud using a plugin. Presentation content must be moved separately (see [this page](docId:0Vm0UTpL2j8dss-DFNhMo) for more information).

# Player Setup

### Prerequisites

- Your players must be Series 3, 4, 5, or 6.
- Your players must be connected to the internet.
- Your players must have been set up using the Local File Network, Simple File Network, or Standalone methods.
- The player must have a current BOS version. You can download the latest from [this page](https://www.brightsign.biz/resources/software-downloads/) or follow [these instructions](docId\:YuRogAgj103wwXgoDfMFj) to update the BOS.

# BrightSign Author Setup

To create a Setup File in BrightSign Author and add it to your players:

![](https://archbee-image-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-6e-QCnohxLBKSYlc3uW62-20250626-175656.png "Image 1")

1. Install BrightSign Author on your computer (see [this page](https://www.brightsign.biz/resources/software-downloads/)).
2. Create a BSN.Cloud network in BrightSign Author by selecting **Register&#x20;**&#x69;n the sign-in screen.
3. Go t&#x6F;**&#x20;Admin > Setup** and create a setup for a single player (it will be applied to multiple players). In the new setup, under the **NetworkConfiguration** section (see Image 1), make sure to **Use current player settings&#x20;**(if you select **Include network configuration**, players could lose their internet connectivity). Check that BSN.Cloud is enabled in the **Advanced** section.
4. Click on the **Save Setup** option and save the setup package to a separate folder on your computer.
5. Select **Add Setup to Library**.
6. Find the player serial number(s) either from the back of the player(s) or through the local [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM) at their IP address. You could also publish a presentation containing a system variable (serial number) to display the serial number on the connected screen.
7. Use the **Add** **Player** button in **Admin > Provision&#x20;**&#x74;oadd all the players and their serial numbers.
8. Go back to **Admin > Provision**, and apply the setup package to all the player serial numbers as shown in Image 2, below.

![](https://archbee-image-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-fGYf9BPHMjZzhAg7nDxxm-20250626-180315.png "Image 2")

# Publishing the Setup

To publish the Setup package to the players through BrightAuthor Classic and switch the players to BrightSign Author:

1. Download [this file](https://www.brightsignnetwork.com/download/Tools/autozip.zip) to your computer, unzip it, and copy only the *autozip.brs* to the folder you created in step 4, above.
2. Create a .*zip* file that contains th&#x65;*&#x20;autorun.brs, autozip.brs&#x20;*&#x61;nd all the other setup files at the root (not inside another folder).
3. Open a presentation in BrightAuthor Classic and go to **File > Presentation Properties > Files**.
4. Use the **Add File** button to add the *autorun*.*zip* to a presentation.
5. Under **File > Presentation Properties > Autorun > Script plugin> Add Script Plugin**, add the plugin named *setup\_plugin&#x20;*(from the autozip.zip folder you downloaded in step 1) using the name "setup". See Image 3, below, for reference.
6. Publish to the players. Once the player(s) receive that publish they will reach out to BSN.Cloud and appear under the **Network** tab. Note that [these ports and URLs](docId:6MBtfGmpjWoCqOmVC0oE5) must be available. The player will reboot a couple of times and apply the BrightSign Author Setup File. The display will indicate when the process is complete and the player will appear in the **Network** tab.

![](https://archbee-image-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-tFGycy65VM5ltVaPIEPEH-20250626-180842.png "Image 3")


[title] USB Drive Passwords
[path] BrightSign Author/Admin/Setup/

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
If you specified a password when creating a [Standalone Setup](docId\:kLu38ghvQRQssgjjFYpbO), you will need to enter that password when publishing for USB drive updates:

1. Select **Local System Storage**.
2. Select **USB** in the **Property Panel** under **Options** (see the image on the right).
3. Check the box labeled **Publish for USB update**.
4. Enter the password that you entered when setting up the device in the **Specify Password** dialog box.
5. Complete the publish.
6. Insert the USB storage device into their BrightSign player. It will display a message indicating that a publish is in progress. On completion, the user is instructed to remove the USB drive; the system reboots and plays back the updated presentation.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/ETaJbXSDs_lV1PtoGmI7l_image.png" size="80" width="1280" height="1886" position="center" showCaption="false"}
:::
::::

If you did not setup the device with a password, you don't need to specify one when publishing an update.

## PDF Version

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-QIdgXCzkHmZblxpvRwTkM-20250716-213756.pdf" label="USB Drive Passwords.pdf"}


[title] Media List State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/IxG983hLKMBa2YC9BsJVb_medialiststate.png" size="14" width="210" height="213" position="center" darkWidth="210" darkHeight="213" showCaption="false"}

The Media List state is a convenient tool for defining interactive events with many files in a single feed. By default, each time the playlist transitions to a Media List state, the next file in the list will play and exit the list after a timeout (images) or when the file finishes playing (video and audio). Alternatively, you can set the list to shuffle files or cycle through every file in the list before exiting and transitioning to the next state.

# State Properties

- **Name**: The user-selected name of the Media List state
- **Initial State**: Select this to make this state the home screen

## List Content

Use this section to specify how the Media List is populated. Note that you can instead populate the Media list through the Media List canvas (which appears when the widget is double-clicked) by adding content from the **Assets** tab to the Media List.

- **Populate From Feed**: Populate the Media List using a feed.
  - **URL**: Specify the URL of an RSS feed (this feature does not support MRSS feeds). In the example below,  is the item title,  is the media download URL and  is the medium. Upon playing the presentation, the player will retrieve media from the download URLs specified `<description>` field of each item in the feed. Note that:
    - Each media piece must have their type specified under `<medium>` 
    - Supported mediums include image, video, and audio

:::ExpandableHeading
### Example

```text
<rss xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        <title>The Feed</title>
        <link>https://site.com/</link>
        <description>The videos</description>
        <generator>Server RSS Generator</generator>
        <item>
            <title>myvideo.mp4</title>
            <pubDate>2022-08-24T17:29:30.74Z</pubDate>
            <link>https://site.com/myvideo.mp4</link>
            <description>https:/site.com/myvideo.mp4</description>
            <medium>video</medium>
            <media:content url="https://site.com/myvideo.mp4" fileSize="25863908" type="video/mp4" medium="video"></media:content>
        </item>
    </channel>
</rss>
```
:::

- **Dynamic Playlist**: Populate the Media List using a [Dynamic Playlist](docId\:gPjwF1LNjhau_EQZJMfUq) from your BrightSign Author Plus library.
- **Live Media Feed**: Populate the Media List using a [Live Media Feed](docId\:gPjwF1LNjhau_EQZJMfUq) from your BrightSign Author Plus library.
- **Update Interval**: Specify how often the player should refresh the contents of the feed.
- **Parser Plugin**: Select a [Parser Plugin](docId\:a6Ali6u-szxHuansk6T3-) to parse the feed data before it is passed to the Media List.
- **Optimize Feed Updates (use HEAD calls)**: Check this box to have the player make an HTTP HEAD request before retrieving the contents of a feed. See [Data Feeds](docId\:a6Ali6u-szxHuansk6T3-) for more details.
- **Automatically generate User Variables from Data Feed:** Use the feed to populate a set of User Variables for HTML pages. See [Data Feeds](docId\:a6Ali6u-szxHuansk6T3-) for more details.

## Playback

Use this section to customize the Media List playback.

- **Play from start index on entry to state**: Check this box to have the Media List begin playing from the specified **Start Index** each time it is entered. If you leave this box unchecked, subsequent transitions to the Media List will play the next file in the list.
- **Start Index** : Specify which item in the list should count as the beginning of the list.  When non-shuffled playback reaches the end of the list, it will loop back to the top of the list (i.e. start index 0), rather than the specified **Start Index** .
- **Transition**: Specify the transition effect for image files:
- **Effect**: Select an effect that occurs when there is a transition to an image.
- **Duration**: Specify the duration of the transition effect.
- **Shuffle Playback**: Check this box to randomize the order of media items in the Media List each time it is entered.
- **Send Zone Message (using file name as parameter) prior to showing each item**: Check this box to [send a zone message](docId\:YhhsEPs59HmccM1ZvIqS4) command every time there is a file transition in the Media List. The Zone Message string will consist of the filename (without the file extension) of the target item in the Media List.
- **Return to start after inactivity**: Returns to the start of the Media state after a specified inactivity time.

:::hint{type="warning"}
BrightSign Author inactivity timeout is counted on a per state basis. BrightAuthor Classic used global inactivity timeout values, and as a result imported .bpf files will lose their previous inactivity timeout value.
:::

## Events / Commands

Use this section to define [events](docId\:VNsooBt2TyX2rkudmLeCn) that will cause a transition to a new item in the Media List. You can also define [commands](docId\:az1YTDtEYH-Zp2Dbg_lBL) that will be triggered when transitions occur.

- **Play Next Events**: Select interactive event(s) that allow the user to transition to the next file in the Media List. 
- **Play Previous Events**: Select interactive event(s) that allow the user to transition to the previous file in the Media List.
- **Play Next Commands**: Select command(s) that will trigger when the Media List transitions to the next file.
- **Play Previous Commands**: Select command(s) that will trigger when the Media List transitions to the previous file.

## Notes

This section lets you store important information about the Media List state for future users. It can be modified at any time.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more info.

# Example

![Screenshot 2025-02-11 at 9.52.14 AM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/75eDWF9bYAU_OQtgmVc-y_screenshot-2025-02-11-at-95214-am.png)

To display library content in a Media List widget:

1. Drag the **Media** **List** widget onto the canvas in your presentation.
2. Double click on the widget.
3. In the **Library** panel on the left, select the items you want and drag them into the Media List widget, as shown in the image above. Click and drag on the media items to reorder them if needed.
4. Click off of the content or use the **Back** button to go back to the Media List widget. Set the other **State** **Properties** as desired (see the previous section for more information).
5. Add an event to transition into the **Media** **List** from the other content in your presentation.
6. Add a **Media** **End** event to transition out of the **Media** **List**.


[title] GPIO
[path] BrightSign Author/Presentation/Commands & Conditional Targets/

Changes the state of GPIO buttons that are [configured for output](docId\:a6Ali6u-szxHuansk6T3-) . See [Use GPIO on Players](docId\:YDPhUp1VAStjmUoS_L7QH) for additional information.

- **On**: Turns on the specified GPIO button.
- **Off**: Turns off the specified GPIO button.
- **Set State**: Allows you to turn multiple GPIO buttons on or off. The buttons are specified as bits in an integer value; see the documentation for [roControlPort.SetWholeState()](docId:8ExDHgmoHqig7J-UvfCe1) for an example.

:::hint{type="info"}
The "button" numbers are not the same as GPIO "pin" numbers: Some pins act as power supply or ground, so they are not included in the button numbering scheme. See the **Hardware Interfaces** section of the [hardware manual](docId\:UYYJYeJ6qoJy1HKSbRlPu) associated with your player model to view a mapping of buttons to pins.
:::


[title] Object Permissions & Custom Roles
[path] BrightSign Author/Admin/Untitled/

You can create and edit object permissions in conjunction with Custom Roles to meet the organizational needs of a large digital signage network where pricing and offerings may vary by regions and/or stores. In this scenario, you may need to limit or allow access according to the objects (Media files, Dynamic Playlists, etc.) themselves. See [Restrict/Allow Access in Author Plus](docId\:qikGFspJ_RLIErSJ0pXne) for examples of how to use object permissions.

![Screenshot 2024-10-31 at 2.23.02 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/p6FamRKKSUumwBOfdbBn-_screenshot-2024-10-31-at-22302-pm.png)

Object permissions are accessed through the **Security** section of the **Properties** panel when you select an object. This is on the right side of the screen in **Network**, **Content**, or **Presentations** tab (for player, content, or presentation properties).

1. Select the **Security** section of the **Properties** panel.
2. Assign object permissions by role or by user:
   1. In the **Assigned Roles** section, select the desired role (remember that you can only edit permissions for Custom Roles).
   2. In the **Assigned Users** section, select the desired user.
   3. If the toggle is enabled, you can click on it to create an allowing or denying permission to execute a given operation under the current object.

:::hint{type="info"}
Permissions settings for users have higher priority than those for roles, and permissions for objects have higher priority than those for operations. For example, if the **Presentation Creators** role has a denying permission to manipulate **Live Text** feeds, but one of its members has **Full** **Control** access to a particular **Live Text** feed instance then the allowance for that specific object takes precedence over the general restriction for **Presentation Creators**.
:::

# User Permissions & Roles

User permissions and roles follow rules as described below.

## No Permissions

When permissions are not granted either to a user or that user’s current role, the toggle switches are grey but active and do not have a delete icon.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/VMAvV_aVYtk6qmGjwtks5_shot6.png" size="50" width="765" height="921" position="center" alt="Shot6.png" darkWidth="765" darkHeight="921" showCaption="false"}

In this example, the selected user doesn’t have any permissions to execute content-specific operations and has no inherited permissions from their role.

## Explictly Defined Permissions

When a specific role or user has an explicitly defined permission to execute a particular operation under the given object, the enabled/disabled toggle will be shown in the enabled state with a delete (trashcan) icon next to it.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/CD5OCDOCbeOS9RIvFy1qC_shot1.png" size="50" width="861" height="696" position="center" alt="Shot1.png" darkWidth="861" darkHeight="696" showCaption="false"}

In this example, the members of the **Content Managers** role are explicitly allowed to view a particular file (**View** **Content**) but not allowed to change it (**Update** **Content**). You can delete these permissions by clicking on the delete icon which will put inherited permissions into effect instead.

## Parent / Child Permissions

When a specific role or user has an explicitly defined permission to execute a parent operation under the given object, the toggles on the all the child operations will have the same enabled/disabled state but no delete icon.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/kTz1jhudw1ixucgYSnjrN_shot2.png" size="50" width="870" height="939" position="center" alt="Shot2.png" darkWidth="870" darkHeight="939" showCaption="false"}

In this example, the members of the **Content Managers** role have **Full Control** permission which applies to all child operations as well.

## Roles & Objects

When permission is granted to any role on the **Admin > Roles** page, it automatically applies to all objects of a given type and is displayed with an active enabled/disabled toggle but without a delete icon.

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/A0ZHoqwfrQwy1bOJNwIOe_image.png" size="80" width="1280" height="1227" position="center" caption="Operation permissions for Content Managers" darkWidth="1280" darkHeight="1227" showCaption="true"}
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/55CZ9PVH0a9lxQXUrrsYR_image.png" size="80" width="1280" height="1395" position="center" caption="Object permissions for Content Managers" darkWidth="1280" darkHeight="1395" showCaption="true"}
:::
::::

In this example, the members of the **Content Managers** role have permission to view all files and manage their tags which is reflected in the **Security** tabs of all the files which do not have an overriding permissions. The same applies when you grant any permission to a parent folder of a given file.

## Roles & Users

When permission is granted to any role on the **Admin > Roles** page, it automatically applies to all the users assigned to this role and is displayed with an active enabled/disabled toggle but without a delete icon.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/liFplWejhMzTmBD8pqSUt_shot4.png" size="50" width="771" height="924" position="center" alt="Shot4.png" darkWidth="771" darkHeight="924" showCaption="false"}

In this example, the selected user is a member of the **Content Managers** role and that is why they have permissions to see a particular file and manage tags despite the fact that no permission is granted specifically to this user.

## System Roles

Permissions granted to **System Roles** apply to all objects of a given type and are displayed with active enabled/disabled toggles without delete icons but are not editable.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/92oHz1s-76d043Vv4POJN_shot5b.png" size="50" width="765" height="1152" position="center" alt="Shot5B.png" darkWidth="765" darkHeight="1152" showCaption="false"}

In this example, you can see that the members of the **Creators** role have almost all permissions under the given object but you cannot override any of them. The same applies to specific objects like your home folder or the “Disabled Players” group.


[title] GPIO  Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/XzQ_EIOusP_AD3sgYMllp_gpioevent.png" size="10" width="85" height="79" position="center" showCaption="false"}

The GPIO event triggers when a specific GPIO button is pressed or input is received. The playlist toolbar includes the different GPIO button numbers that you can use to define interactions. See [Use GPIO on Players](docId\:YDPhUp1VAStjmUoS_L7QH) for additional information.

- **Specify button number**: Specify the number of the GPIO button.
- **Trigger Event on Button**: Specify whether the event should trigger when the button is depressed (**Down**) or when it is released (**Up**). If you've selected **Down**, choose one of the following behaviors:
- **Press (First Touch)**: The event triggers once at the moment the button is depressed.
- **Press Continuous**: The event triggers the moment the button is depressed, then continues triggering at the specified **Repeat interval in milliseconds** as long as the button is depressed.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/6qqhV_up5Ub8r36Dpmwm__screenshot-2025-01-13-at-32323-pm.png" size="90" width="1104" height="258" position="center" alt="Screenshot 2025-01-13 at 3.23.23 PM.png" showCaption="false"}

:::hint{type="warning"}
The "button" numbers described above are not the same as GPIO "pin" numbers: Some pins act as power supply or ground, so they are not included in the button numbering scheme. See the **Hardware Interfaces** section of the [hardware manual](http://docs.brightsign.biz/display/DOC/Hardware) associated with your player model to view a mapping of buttons to pins.
:::


[title] Plugin Message Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/HFL5JdNVNXLGmWzCI3Zt-_pluginmessageevent.png" size="10" width="90" height="82" position="center" showCaption="false"}

The Plugin Message event triggers when a message is received from a [script plugin](docId\:a6Ali6u-szxHuansk6T3-) that is attached to the presentation. See the [Use Plugins & Parsers](docId\:uWsz22b8BpJF6DQq_ioq2) tech note for more information on creating custom scripts that send plugin messages.

- **Plugin Name**: Use the dropdown menu to determine which plugin the event can receive messages from. 
- **Specify Plugin Message input**: Enter the message string that will trigger the event. You can also use the `<*>` wildcard to match some or all of the plugin message string (i.e., entering `<*>` in this field will match all plugin messages, while entering `mycommand_<*>` will match any plugin message that begins with `mycommand_`).
- **Assign input to variable**: Assign the content of the Plugin Message to a [Variable](docId\:a6Ali6u-szxHuansk6T3-).
- **Input specifies variable**: The Plugin Message string will dynamically specify which User Variable to modify. The Plugin Message string must be sent in the form of `<variable name>:<variable value>`.
- **Specify fixed variable**: The Plugin Message string will modify a fixed User Variable. Use the dropdown list to choose the User Variable to modify. The Plugin Message string must be sent in the form of `<variable value>`.

:::hint{type="success"}
You can use the **Input specifies variable** option to modify more than one User Variable with a single event. Use the following Plugin Message string format: `<variable name> : <variable value> !! <variable name> : <variable value>`
:::

- **Assign wildcard to variable**: Specify the value of a User Variable using the `<any>`  wildcard. Select the User Variable to modify using the dropdown menu to the right. The **Specify Plugin Message input** field must contain the `<any>`wildcard, either by itself or with additional text (e.g., `message_<any>`).


[title] Video & Audio Time Code Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/Yjf2lj_iRl0C5Oh25pXH6_videoaudiotimecodeevents.png" size="20" width="175" height="80" position="center" showCaption="false"}

The Video Time Code and Audio Time Code events perform [commands](docId\:az1YTDtEYH-Zp2Dbg_lBL) at specific times during video or audio file playback. If you want to trigger a transition at a certain point in a video or audio file, use the Timeout event instead.

Click the **Add Time Code** button to add a new time-code command. Enter the **Timeout&#x20;**&#x69;nterval for the command (in milliseconds), and then select the **Command&#x20;**&#x61;n&#x64;**&#x20;Parameters&#x20;**&#x66;rom the corresponding lists.


[title] Zone Message Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/3wXt2QDaXeRwbFgFmE2Br_zonemessageevent.png" size="10" width="85" height="81" position="center" showCaption="false"}

The Zone Message event allows you synchronize content between zones. This event is compatible with all state types, while the Link Zones event only works with video and image states; however, the Link Zones event provides better synchronization times because it pre-loads the next image / video file before displaying it.

Zone Message events can be used with Synchronize events to synchronize zones in a multi-screen presentation, while Link Zones events cannot be used with Synchronization events.

In the **Specify zone message** field, enter the message that is sent by the corresponding Send Zone Message command.


[title] Connector Volume
[path] BrightSign Author/Presentation/Commands & Conditional Targets/

Changes the audio volume of a specific connector.

- **Set**: Specifies the volume level. Select the Audio (i.e. analog), HDM&#x49;**®**, or SPDIF connector in the dropdown list and enter a volume value between 0 and 100 in the field.
- **Increment**: Specifies how much the volume level increases with each interaction. Select the Audio (i.e. analog), HDMI, or SPDIF connector in the dropdown list.
- **Decrement**: Specifies how much the volume level decreases with each interaction. Select the Audio (i.e. analog), HDMI, or SPDIF connector in the dropdown list.
- **Mute**: Turns the connector audio output off. Use the checkboxes to select among the Audio (i.e. analog), HDMI, and SPDIF connectors.
- **Unmute**: Turns the connector audio output on. Use the checkboxes to select among the Audio (i.e. analog), HDMI, and SPDIF connectors.


[title] Video State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/28kPzTSjw21G94C4bnJ5W_videostate.png" size="16" width="93" height="93" position="center" showCaption="false"}

## State Properties

### Video State

A video state represents a single video file.

- **Name**: The name of the video state
- **Initial State**: Select this to make this state the home screen
- **Loop media if no media end transition is specified**: Choose this option to loop the video indefinitely when no Media End event is attached to the state.
- **Hold last video frame if no media end transition is specified**: Choose this option to display the last frame of the video after it ends when no Media End event is attached to the state.

:::hint{type="warning"}
Volume can only be changed using the **Set Volume** command when the presentation is interactive. Video states in a non-interactive state still utilize the Set Volume option in **State Properties**.
:::

### Notes

This section lets you store important information about the Video state for future users. It can be modified at any time.

### Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more information.


[title] Presentation Settings
[path] BrightSign Author/Presentation/

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
The **Presentation Settings** pane allows you to edit settings that relate to the entire presentation.

# Property Lock

As of the BrightSign Author version 1.6.46 release, **Presentation Settings** contains a **Property Lock** feature. If your presentation has a script or script plugin that contains functions to configure or change the network settings of the player (for example, HTML or a plugin that modifies device settings), check the **Property Lock** checkbox to ensure that your settings are not overwritten by the BrightSign Cloud.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/WVWymqQK69JgG1x8cYSqG_image.png" size="80" width="1280" height="1730" position="center" darkWidth="1280" darkHeight="1730" showCaption="false"}
:::
::::

## Property Lock Unchecked

When this box is unchecked and the presentation is published, player properties are not locked and can be edited and updated through the [Properties](docId\:Uba8sfkMSAJsIBrbv4A6N) panel in the **Network** tab.

## Property Lock Checked

When you check **Property Lock** and publish the presentation, users can no longer change the player property settings (**Player Name**, **Overview, Device Configuration, Logging**, **Network Settings** and **Location**) through the Properties panel. The settings will appear greyed out when viewed in the **Properties** panel of the player in the **Network** tab. However, the player property settings can still be changed through JavaScript or plugin script. 

The player should reboot automatically when the presentation is published. If it has not, reboot the player manually.

:::hint{type="warning"}
When the Property Lock setting changes, there can be a reporting delay of up to 10 minutes between the OS, BrightSign Cloud, and the BrightSign Author UI. During the reporting delay, the UI may be out of sync with the player. If you change the properties during this period, the UI will accept the changes and post them to BrightSign Cloud. BrightSign Cloud will store and deliver those settings to the player, but the player will not respond to them (the properties of the player will be locked). The player will not apply your changes until the settings handler has been reenabled by the presentation.
:::

# Presentation

Use this section to edit video and audio output settings.

## Display

:::hint{type="warning"}
If you are using a Series 5 player and BrightSign Author version 1.7.11 and beyond, note that the Connector, Target Resolution, Force Resolution, Enable YCbCr 10-bit Output, Target Frame Rate, Orientation, and Enable Dolby Vision fields described below have been moved to the Screens tab.
:::

### Connection Type

Select the video connector that connects the player to the display.

### Target Resolution

Choose a resolution that is compatible with your monitor. See [Video Modes](docId\:QpML112mBhEK7LBDGUxnv) for a list of supported video modes.

### Force Resolution

Check this box to have the player output the selected resolution even if the display reports over HDMI® that it does not support it. If this box is unchecked, the player will attempt to use the selected **Target Resolution**,  but will then fall back to the highest resolution supported by the display if it is unsupported. 

### Enable YCbCr 10-bit output

Check this box to output a 10-bit color video signal to the connected display. See the [Video Formats & Codecs](docId\:knsFFwMTD4NswXm4BUP0I) for more details on supported 4K color spaces and bit depths.

### Enable Full Resolution Graphics

Check this box to enable full-resolution for the selected **Target Resolution**. When this box is checked, the graphics plane (images, text, HTML animations, etc.) is rendered at the same size as the video output, rather than being upscaled to the output resolution after rendering. This option is only available for certain video modes larger than 1920x1200; all smaller video modes user full-resolution graphics automatically. This setting is subject to additional restrictions based on the resolution and player model - see [Full-Resolution Graphics](docId\:TJNw230KCx6i9tNihfCvD) for full details. 

### Enable Dolby Vision

Check this box to enable Dolby Vision on the video output. The presentation will be limited to a single video zone with this option enabled. This option is supported on XT244 and XT1144 models only.

### Target Frame Rate

Choose a frame rate that is compatible with your monitor.

### Orientation

The monitor orientation for the presentation. This property must be set when you create a presentation. 

### Background Color

Select a background color for the presentation. This color will show through if there's no content on an area of the screen, or if the content has some level of transparency. 

### Language

Select a language for your presentation. This option affects the time/date display of Clock zones only.

### Delay Schedule Change until current media item completes playback

Check this box to have the player wait until a media item completes playback to switch to a new scheduled presentation. For multi-zone presentations, the first media item to complete playback, no matter the zone, will trigger the scheduled presentation change. If this box is unchecked, a player will switch from one scheduled presentation to another at the specified time regardless of current playback.

### Monitor overscan

Select an overscan setting to determine how the content fills the display screen. 

### No overscan – use full screen

Displays content to the edge of the video signal.

### Overscan – action safe area

Restricts the display area to a size that is compatible with most displays.

### Overscan – title safe area

Restricts the display area to a size that is much smaller than the generated video signal.

## Audio

Use the Audio tab to configure audio mixing and output options:

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
### Audio Volume

Set the **Minimum Volume** and **Maximum Volume** for the audio output (0 – 100).

### HDMI Volume

Set the **Minimum Volume** and **Maximum Volume** for the HDMI output (0 – 100). If you are using BrightSign Author version 1.7.11 or above and multiple HDMI outputs are available on the device, each will be displayed as in the image at right.

### SPDIF Volume

Set the **Minimum Volume** and **Maximum Volume** for the SPDIF output (0 – 100).
:::

:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/yVoP7h4dByoiXTGn9Fa8A_image.png" size="80" width="800" height="1392" position="center" darkWidth="800" darkHeight="1392" showCaption="false"}
:::
::::

### Audio Configuration

Configure the audio routing for the presentation:

- **Mixed Audio PCM Only**: Multiple PCM audio sources (for example, from a video and audio file playing simultaneously) will be mixed into a single source for audio outputs. Differing sampling rates (e.g. 44.1 kHz vs. 48 kHz) will be merged into a single rate of 48 kHz. This setting also allows for dynamic adding and removing of audio sources while audio is already playing.
  - **Auto level volume**: Check this box to level all PCM audio streams on a particular audio output to a similar volume level.

### Mixed Audio PCM / Compressed

The behavior is the same as the **Mixed Audio PCM Only** setting, but compressed audio is supported as well. This is either **Mixed PCM Audio** or a **Compressed** audio source (compressed audio cannot be mixed), that can be routed to an audio output.

### Fixed Audio

Audio sources are mixed only if their sampling rates match. If you attempt to add or remove audio sources while audio is playing, playback will fail.

:::hint{type="warning"}
AU5 players do not support some audio options and those will not be displayed in the **Presentation Settings**:

- Auto level volume in **Mixed Audio PCM Only** mode
- **Mixed Audio PCM/ Compressed** mode
:::

# Support Content

Use the **Support Content** section to add supplementary files to a presentation. 

:::hint{type="info"}
If you are in **BSN.cloud** Content Mode, you will need to upload support content to your BrightSign Author Plus network in the **Content** tab before adding it to your presentation. If you are in **Local** content mode, you will add files from your local machine.
:::

## Files

Add custom files that will be published along with the presentation. This feature is useful if you frequently publish files that are not used in the presentation itself (for example, a media file being played by a custom script) and you want to automate the process of publishing both presentation files and custom files. 

- **Name**: Specify a name for the auxiliary file.
- **Select File**: Locate and select the auxiliary file.

## Script Plugin

Script plugins allow you to add custom scripts to a standard BrightSign Author presentation without actually modifying the autorun file. For example, you can use script plugins to change variable values, extract information from a *.txt*, *.csv*, *.xml*, or *.json* file to display onscreen, change the contents of a playlist, or change how the presentation responds to external input. Script plugins also allow you to access features that are enabled in player firmware, but haven't yet been built in BrightSign Author.

This custom functionality can be triggered by events (button press, touch, video end, etc.) or by commands, such as a Zone Message or UDP Command. A script plugin can also be triggered by a Plugin Message command, which allows you to target the function of a specific plugin.

See the [Use Plugins & Parsers](docId\:uWsz22b8BpJF6DQq_ioq2) tech note for more information on building script plugins.

- **Name**: Specify a name for the script plugin. This name must match the initialization function in the plugin.
- **Source**: Locate and select the script plugin file.

You can find examples of plugins on the [BrightSign GitHub page](https://github.com/brightsign/BrightAuthor-Plugins): 

- **Widget Hide or Show**: Allows you to hide or show a Ticker or Clock zone by sending Plugin Message commands.
- **Touch Audio Feedback**: Plays an audio file over HDMI whenever a touch event is triggered in the presentation.

:::hint{type="info"}
To retrieve a plugin from the GitHub page, right-click the **Raw** link on the plugin page heading and click **Save Link As...**.
:::

## Parser Plugin

This feature allows you to add a custom BrightScript snippet for parsing feeds in your presentation. It can be added to states that use feeds to download and display content such as a [Media List](docId\:QA4WYTvulmrTKN30caj1y), and, like plugins, can change playlist contents or display information from a .txt, .csv, .xml, or .json file. Parsers are not triggered by a command or associated with an event. Any function that uses an event as a trigger must be written as a plugin, not a parser. 

A parser does not need to work exclusively with the data in the associated feed. Once the parser starts running, you can use it to delete a file on the storage, send a UDP command, or download another feed or file. See [Use Plugins & Parsers](docId\:uWsz22b8BpJF6DQq_ioq2) for more information on building parsers.

- **Parser Plugin Name**: Specify a name for the parser plugin file. The name should be the same as the subroutine name in BrightScript.
- **Parser Plugin Source**: Locate and select the parser plugin file.
- **Feed Parser**: Enter the name of the feed-parser function in the script.
- **User Agent Parser (optional)**: Enter the name of the parser function for user-agent strings.
- **User Variable Parser (optional)**: Enter the name of the user-variable parser function in the script.

You can find examples of parsers on the [BrightSign GitHub page](https://github.com/brightsign/BrightAuthor-Parser-Scripts):

- **RSS Converter**: Converts a standard RSS feed into the same format as a BSN Live Text feed, allowing you to display RSS feed items by index number in a Live Text state.
- **Live Text Title and** **Description**: Allows you to display both the title and description of an RSS item in a Live Text State.

:::hint{type="info"}
To retrieve a plugin from the GitHub page, right-click the **Raw** link on the plugin page heading and click **Save Link As...**.
:::

## Video Mode Plugin

This plugin changes the video resolution, frame rate, color space and color depth. BrightSign offers the following Video Mode plugins:

- **SetMultiScreensVideoMode.brs** configures video for Series 5 players. See [https://github.com/brightsign/video-mode-plugin/blob/master/SetMultiScreensVideoMode.brs](https://github.com/brightsign/video-mode-plugin/blob/master/SetMultiScreensVideoMode.brs) for more details.
- **SetSingleScreenVideoMode.brs** configures video for Series 4 and below. See [https://github.com/brightsign/video-mode-plugin/blob/master/SetSingleScreenVideoMode.brs](https://github.com/brightsign/video-mode-plugin/blob/master/SetSingleScreenVideoMode.brs) for more details.

Once you have updated the .brs file with your desired screens settings, you can add it to BrightSign Author. See [Video Modes](docId\:QpML112mBhEK7LBDGUxnv) and [Multiscreen VideoMode](docId\:Bz9WxFV8MPxSFJWMTJrBD) for more information about which values are valid for your player.

:::hint{type="info"}
[https://github.com/brightsign/BrightAuthor-Plugins/tree/master/Set-Video-Mode](https://github.com/brightsign/BrightAuthor-Plugins/tree/master/Set-Video-Mode) manages a plugin that sets the videomode (the **videomode\_plugin.brs** option). Though this method is more complicated, it is useful if you want to control the videomode in your presentation through logic-driven events and commands.
:::

## Switch Presentation

Add supplementary presentations that will be published along with the primary presentation. You can use the **Switch Presentation** command to switch to another presentation while a presentation is running.

- **Presentation Name**: Specify the presentation name, which will be used in the Switch to Presentation command.
- **Presentation Source**: Locate and select the *.bpfx* presentation file.

You can also switch presentations based on a timeout event. This feature is available in both BrightSign Author and BrightSign Author Plus. To do this:

1. Make sure that your presentation is connected to a **Timeout Event** and save it.
2. Open the **Switch Presentation** drop down by selecting the plus sign. Select the name with the red dot (see Image 1).
3. Enter a new **Presentation Name** and **Presentation Source**.
4. Under **Event Properties > Advanced**, select **Add Command** (see Image 2).
5. Select **Other** in the **Command** drop down.
6. Under **Command Parameters**, either:
   1. Select **Switch to Presentation** and specify the new **Presentation Name.** 
   2. Alternatively, select **Specify via user variable** and create a new variable (under **Variables**) with the new **Presentation Name** as the **Default Value**. Enter that variable under **Specify via user variable.**
7. Save your changes.

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/gufE3CXfPOwP4mvUE-qJ-_image.png" size="70" width="800" height="1225" position="center" caption="Image 1" darkWidth="800" darkHeight="1225" showCaption="true"}
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/L-Hl28Owr7Y0xRIfswZTt_image.png" size="70" width="1280" height="1294" position="center" caption="Image 2" darkWidth="1280" darkHeight="1294" showCaption="true"}
:::
::::

:::hint{type="warning"}
You cannot successfully switch presentations between presentations with different connector types, screen resolutions and/or frame rates. If you try to do this, the player will reboot and return you to the originally scheduled presentation. If you have plugins, etc. that reboot the player, **Switch Presentation** will also fail.
:::

:::hint{type="warning"}
**Switch Presentation** does not let you switch to a presentation that has never been published. This bug will be resolved in a future release.
:::

## Data Feeds

Add Data Feeds to the presentation.

- **Name**: Specify a name for the Data Feed.
- **URL**: Source the Data Feed from an RSS URL.
- **Dynamic Playlist**: Source the Data Feed from a [Dynamic Playlist](docId\:gPjwF1LNjhau_EQZJMfUq) on your BrightSign Author Plus network.
- **Live Media Feed**: Source the Data Feed from a [Live Media Feed](docId\:gPjwF1LNjhau_EQZJMfUq) on your BrightSign Author Plus network.
- **Live Data Feed**: Source the Data Feed from a [Live Data Feed](docId\:gPjwF1LNjhau_EQZJMfUq) on your BrightSign Author Plus network.
- **Parser Plugin**: Select a [Parser Plugin](docId\:a6Ali6u-szxHuansk6T3-) to parse the feed data before it is passed to the Data Feed.
- **Optimize Feed Updates (use HEAD calls)**: Check this box to have the player make an HTTP HEAD request before retrieving the contents of a Data Feed. See the Data Feed section
- **Automatically generate User Variables from Data Feed:**  Use the Data Feed to populate a set of User Variables for HTML pages. The User Variables can then be retrieved using JavaScript. Use the  `<title>` tag of the Data Feed to specify the Name  of a variable and the  `<description>` tag to specify its default value. 
- **User Variable Access**: Select **Shared** to make the User Variable accessible to other presentations scheduled on the player. If two presentations use a variable with the same name, the value of the variable with the **Shared** attribute will be used for the variable with the **Private** attribute.

## Node.js

Select the **+** sign to add Node.js® applications to your presentation. Each application included here will be automatically launched when the presentation starts. Use [WebPack](docId\:vlSKfVzeQu04pD58rvXam) to reduce the number of files in your application before uploading it.

# Internal Web Page

The Internal Web Page allows you to view and edit User Variables over your local network. In order to display a standard or custom device web page, the [Local Web Server](docId\:nzYa_n1q222TpB7IUGyag) must be enabled on the player.

- **Disable**: Choose this option if you would like to enable the Local Web Server but do not want the device webpage to be accessible.
- **Standard**: Choose this option to enable the default device web page, which lists all User Variables and their default/current values on a sparsely formatted page.
- **Custom**: Choose this option to use a device web page with custom appearance, formatting, and functionality. See [Custom Internal Web Page](docId\:DIpNaZgDp9lzbG8drP7B6) for more information (although this note describes BrightAuthor Classic, it has information that can be useful to BrightSign Author users).

# Variables

Use the **Variables** section to create, edit, and delete User Variables. User Variables are customizable values that can be set in [Commands and Conditional targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) and used in the [User Variable State](docId\:X4PpGsMPdH1xPzPB9cQsP). The values of User Variables can also be changed during a presentation using the Set Variable or Reset Variable commands. The [Commands and Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) page describes the syntax of user variable values.

## Creating Variables

Click the **Add Variable** icon (the "+" icon) to add a new variable to your presentation:

- **Variable Name**: Enter a unique name for the User Variable.
- **Default Value**: Specify an initial value for the User Variable. Whenever a User Variable is reset (via the [Reset Variable](docId\:x5QvX4z6UPu5YmwG7x3FT) command), it will return to this default value.

:::hint{type="info"}
Setting a new **Default Value** and republishing the presentation will not set the value of that variable to the new default value. Instead, the variable will retain whatever value it had before the publish operation. To set variables to their new default values, you will need to check the **Reset variables to their default value on presentation start** box before publishing the presentation. To set a single variable to its new default value, use the [Reset Variable](docId\:x5QvX4z6UPu5YmwG7x3FT) command.
:::

- **Access**: Select **Shared** to make the User Variable accessible to other presentations scheduled on the player. If two presentations use a variable with the same name, the value of the variable with the **Shared** attribute will be used for the variable with the **Private** attribute.
- **Type**: Select a User Variable type: 
- **Local**: Local variables can be changed with the **Set Variable**/**Reset Variable** commands or via the Device Web Page. They can also be set with properly formatted serial, UDP, and Plugin Message events.
- **Networked**: Networked variables are set and modified using a feed (RSS, Dynamic Playlist, Live Media Feed, or Live Data Feed). Note that every RSS entry has a  value and a  value: use the  value to designate the name of the User Variable being modified; use the  value to change the value of the User Variable.
- **Parser Plugin**: Select a feed parser to parse the feed data before it is used to update the variable.
- **Optimize Feed Updates (use HEAD calls)**: Check this box to have the player make an HTTP HEAD request before retrieving the contents of a feed. See the [Data Feeds](docId\:a6Ali6u-szxHuansk6T3-) section above for more details.
- **Automatically generate User Variables from Data Feed:** Use the feed to populate a set of User Variables for HTML pages. See the [Data Feeds](docId\:a6Ali6u-szxHuansk6T3-) section above for more details.
- **SystemVariable**: System variables are not determined by the user, but by independent system parameters, such as firmware version number, IP address, RF channel count, and various types of EDID (Extended Display Identification Data) information received from the display over HDMI. Note that displays will often lack a complete set of EDID parameters. Make sure to test the EDID values of a certain display model before using them in a presentation.
  - **System Variable:** This option will appear if you selected **System Variable** under **Type**. Use it to select a system variable from the drop down list. See the image below.
  - **Connector**: This option will be visible if you selected an EDID **System Variable** under **Type:**
    - If you are using a player with one HDMI output, this option will be greyed out and show only HDMI-1.
    - If you are using a player with multiple HDMI outputs, you can use this feature to link the variable to the available HDMI outputs for that device.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/_sL3xqG1dDgLF2Ox9DRn6_screenshot-2023-07-13-at-111600-am.png" size="40" width="807" height="1272" position="center" darkWidth="807" darkHeight="1272" showCaption="false"}

## Viewing Variables

**Expand All | Collapse All** is useful if you have multiple variables in your presentation. It allows you to easily expand or collapse all of the variables in your presentation with one click:

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/182JdEv90n61UQbPnr6Tk_image.png" size="70" width="1280" height="3542" position="center" caption="Expand All" darkWidth="1280" darkHeight="3542" showCaption="true"}
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/m5FbJUm8tka4y7EV-c7Mq_image.png" size="70" width="1280" height="1660" position="center" caption="Collapse All" darkWidth="1280" darkHeight="1660" showCaption="true"}
:::
::::

## Editing Variables

You can also configure settings that apply to all variables in the presentation:

- **Alphabetize variables in app display**: Check this box to list variables on the Device Web Page alphabetically. Select the arrow next to **Variable Name** to sort the variables from A to Z or Z to A. New variables will be added to the end of the alphabetized list and the arrow next to **Variable Name** will revert to a dash (which indicates that the list is again unsorted).
- **Automatically create media counter variables**: Check this box to create Media Counters for all media files in the presentation. Media Counters record how many times a file has played in a presentation. They can be displayed in a [Live Text State](docId\:zmRkcTVFWvLi8U1Z5fRVk) or [User Variable State](docId\:X4PpGsMPdH1xPzPB9cQsP).
- **Reset Variables to their default value on presentation start**: Check this box to reset all User Variables to their default values whenever the presentation begins. If this box is unchecked, User Variable values will be preserved on the SD card after the device reboots, the presentation is switched, etc.
- **Update frequency for networked variables**: Specify how often networked User Variables should be refreshed by feeds.

# User Events

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
These event types allow you to save interactive event types and parameters, so that you can access them more readily in the future, and allows you to combine multiple interactive events into one **User** **Event.**

For example, if you frequently use a five second **Timeout Event**, you can create a **User Event** with this specification. In the future, instead of having to set each **Timeout Event** to five seconds, you can instead use this **User Event**. Or you could combine multiple transition events like Button Press, Keyboard, Touch, and GPIO into a single **User Event**.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/GTC56GdMnbFlCt0QtYZnw_image.png" size="80" width="1280" height="1266" position="center" darkWidth="1280" darkHeight="1266" showCaption="false"}
:::
::::

To create a **User Event**, select **Add Event** and enter a unique name. Use the drop down list to select an interactive event (a **Timeout Event** is shown in the image), and enter any parameters that are needed for that event type. Repeat this process for all of the events you want included in the **User Event**. To assign the **User Event** to content, select the content in the center pane and assign a [User Event](docId\:W3quP70GqXc6itrp-j9Vq) to it.

You can also copy a **User Event** using the copy icon in the top right corner.

When in “Local” mode, **User Events** can also be imported from other presentations, or exported to other presentations. See [Dashboard and Menus](docId:8yTHtVfOe83v1SSsbyIW-). The import and export functions can be found under the **Edit** menu.

# Interactive

The **Interactive** section allows you to configure interactive I/O for the presentation.

## Touch

Use this tab to configure BP200/BP900 button panels and touch screens.

## Button Panel

Use the **Button Panel** dropdown list to select the type of button panel (BP200 or BP900) you wish to configure. The A, B, and C letters specify which device is enumerated first; the B and C letters are only applicable if you are connecting more than one BP device to the player.

Choose one of the following:

- **Automatically configure which buttons are enabled**: Only buttons that are configured with BP200/BP900 events in the presentation will be enabled. All other buttons will not light up or react to button presses.
- **Specify which buttons are enabled**: Only the specified buttons will be enabled regardless of whether there are BP200/BP900 events in the presentation configured to use them. If this option is selected, a BP200/BP900 event set to the **Any Button** option will only react to button numbers that have been enabled.

## Touch

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
- **Cursor**: Select a mouse display option for a [Touch Event](docId\:fDDoo4F6nVH3lczechpWh). The default cursor setting for touch screen events is **Auto display cursor**: The cursor will be displayed if there's more than one touch region currently on the screen; if there's only one touch region on the screen, the cursor will be hidden. This option does not apply to HTML5 States (the cursor in HTML5 States is enabled/disabled on a case-by-case basis in **State Properties > Options**).
- **Always hide cursor**: The mouse cursor will never appear with Touch events.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/JTzEJ5AFdK1M807BJGvDF_image.png" size="80" width="1280" height="1410" position="center" darkWidth="1280" darkHeight="1410" showCaption="false"}
:::
::::

- **Always display cursor**: The mouse cursor will always appear with Touch events.
- **Auto display cursor**: The mouse cursor will be present only if there is more than one Touch event region on the screen.
- **Flip coordinates**: Check this box to reverse the coordinates of the touchscreen input.

## Connectors

Use this tab to configure serial port, GPIO communication, and IR Remote configuration.

## Serial

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
- **Port**: Select a serial port to configure. Most standard serial devices enumerate on port 0 (on the HO523, they will enumerate on port 1). A USB-serial device (such as a GPS receiver) will enumerate on port 2. Additional USB-serial devices will enumerate on ports 3, 4, 5, etc. The enumeration order will remain consistent between reboots as long as the USB-serial devices are connected to the same player/hub ports. The enumeration order can be retrieved using the "usblist" command at the `brightsign>` [shell prompt](docId\:YWkSi6X-2hez1BwztfHMP); otherwise, it will need to be determined by testing the setup.
- **GPS Receiver** (Port 2 only): Check this box if the port is being used to connect a USB-serial GPS device to the player.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/5zUrXumHPry_SM9jfU07y_image.png" size="82" width="1280" height="1699" position="center" darkWidth="1280" darkHeight="1699" showCaption="false"}
:::
::::

- **Protocol**: Determine whether the serial data is formatted as **Binary** or **ASCII**
- **Baud rate**: Set the baud rate for serial communications on the port
- **Data bits**: Set the number of data bits
- **Parity**: Set the parity
- **Stop bits**: Select the number of stop bits
- **Send EOL**: Select the end-of-line character when sending data to a serial device
- **Receive EOL**. Select the end-of-line character when receiving data from a serial device
- **Invert Signals**: Check this box to invert the TX/RX signal levels on the serial port. This allows the player to communicate with devices that use -12V to 12V signaling. Inversion is only supported on the following ports: The DE9 and USB ports on the 4Kx42, as well as the 3.5mm serial port on the XTx43/XDx33 (units that are rev H or earlier) and HDx23. Except for the 4Kx42, all of these ports perform 5V signaling.

## GPIO Configuration

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
Many BrightSign models feature a DA15 or Phoenix-style GPIO port for device communication and interactive input/output. Select **Input** or **Output** for each GPIO button to indicate whether it should be used to receive or send information.

The "button" numbers are not the same as GPIO "pin" numbers: Some pins act as power supply or ground, so they are not included in the button numbering scheme. See the **Hardware Interfaces** section of your player [hardware manual](docId\:UYYJYeJ6qoJy1HKSbRlPu) to view a mapping of buttons to pins.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/AwL64XB6UlhMgIIMTAvHF_image.png" size="80" width="1280" height="901" position="center" darkWidth="1280" darkHeight="901" showCaption="false"}
:::
::::

## IR Remote Configuration

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
The user can select from the events and/or commands available based on their **IR In Source** and **IR Out Destination** selections.

- **Remote Control:** This can be either a  [BrightSign remote](https://docs.brightsign.biz/hardware/rc-1002-remote-control) or a user specified remote.
- **IR In Source:** This configuration is one of a dedicated IR, or Iguana (USB), or None.
- **IR Out Destination**: This configuration is either dedicated IR, or Iguana (USB), or None.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/z1-O9w4yXrAKqoBXGEFeI_image.png" size="80" width="1280" height="1500" position="center" darkWidth="1280" darkHeight="1500" showCaption="false"}
:::
::::

## Networking

Use this tab to configure UDP communications and PTP synchronization.

## UDP

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
- **UDP Destination Address**: Specify where UDP commands generated by the presentation should be sent:
- **Specific IP Address**: Enter a single destination IP address in dotted quad form.
- **All devices on the local subnet**: Broadcast UDP messages to all devices on the local subnet.
- **All devices connected via Ethernet**: Broadcast UDP messages to Ethernet-connected devices on the local subnet.
- **All devices connected via Wireless**: Broadcast UDP messages to Wireless-networked devices on the local subnet.
- **UDP Destination Port**: Specify the destination port for UDP messages generated by the presentation.
- **UDP Receiver Port**: Specify the port used by the player to receive UDP messages (for triggering [UDP Events](docId\:UGiCbbP6YX_8Te_bJDGe8) on the player).
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/eX-e7Lac2_kv7lwB9XKB2_image.png" size="80" width="1280" height="2083" position="center" darkWidth="1280" darkHeight="2083" showCaption="false"}
:::
::::

## UDP Input List

This section lists all UDP events in the presentation. For each event, you can specify the following options:

- **Label**: Specify a label for the UDP command button in the bsn.Mobile app. By default, the command label will be the same as the UDP message string.
- **Show in BrightSign App**: Check this box to have the command button corresponding to the UDP Input event appear in the bsn.Mobile app.

## Player Sync

You should enable synchronization between players. This feature passes synchronization events from leader to follower players (in video walls, for example). 

- **Enable**: Select this checkbox to put players in a synchronization domain (this domain selects a PTP address where clock and synchronization events will be published from the leader player and read by the follower player).
- **Leader:** Makes the currently selected player a leader player.
- **Follower:** Makes the currently selected player a follower player. There can be multiple follower players.
- **Domain:** Enter a domain number between 0 and 127 that is unique for each set of leader/follower presentations on the local network. This will ensure that multiple groups of synchronized presentations can operate on the same local network without synchronization messages interfering with each other.

# PDF Version

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-Tx_ehpIW-C1W5I7M5K81P-20250716-205856.pdf" label="Presentation Settings.pdf"}


[title] BrightSign Author
[path] /

:::hint{type="info"}
Note that BrightSign Author (BrightAuthor\:connected) is our latest app for managing content and players. Although similarly named, it is *different* from BrightAuthor Classic, our legacy app. Development of BrightAuthor Classic has ceased and it will soon be deprecated and replaced with BrightSign Author.
:::

# BrightSign Author

**BrightSign Author** is BrightSign’s latest app for player setup / management, authoring, and content management. Key features include:

- Multi-Platform
  - Free desktop app available for Mac or PC ([download](https://www.brightsign.biz/resources/software-downloads/)).
  - Web app version available at [https://app.bsn.cloud](https://app.bsn.cloud). Note that with the web app, players must be connected to the internet.
- [Player Setup](docId\:XNnXywMV09iEgZIIt7RWA): Configure and set up players for use.
- [Player Management](docId\:Uba8sfkMSAJsIBrbv4A6N): Monitor and troubleshoot players over the Internet.
- [Presentation Creation](docId:0Vm0UTpL2j8dss-DFNhMo): Create presentations consisting of video, images, audio, HTML, and text.
- [Presentation Publishing](docId\:go2VHVit1mkPM8WmRwgIT): Publish presentations for players to display. Presentations can be delivered to players via several available [Publishing Modes](docId\:rEScIigY-dJRPuZgwaA4e).

## Requirements

To create presentations and publish them to your player, you will need the following:

:::ExpandableHeading
**Mac or PC**

**Mac**

Any Mac computer running one of the last two major production releases of macOS.

**Windows PC**

Any Windows PC that meets or exceeds the following *minimum* requirements:

- 2.3 GHz CPU
- 2 GB RAM required (4 GB recommended)
- 100 MB available hard disk space for program files (additional disk space required if storing content and/or presentations on your hard disk)
- One of the following operating systems:
  - Windows 11
  - Windows 10 (32 or 64 bit)
  - Windows 8 (32 or 64 bit)
  - Windows 7 (32 or 64 bit)

The following is optional but recommended:

- Bonjour 3.x or later: Required for automatically discovering players on the local network; available with the Airport Utility installer.
:::

:::ExpandableHeading
**Web Browser**

The browser version of BrightSign Author should be compatible with all major web browsers (e.g., Chrome, Edge, Safari, Firefox, Brave, etc.).
:::

:::ExpandableHeading
**BrightSign Player**

Players must be running at least the indicated minimum OS indicated.

- **Series 5**
  - AU335, XCx55, XDx5, LSx5, HDx5, XTx5 (minimum OS: 9.0.22.3)
  - AU335 (minimum OS: 8.2)
- **Series 4&#x20;**(minimum OS: 8.0)
  - XTx44, XDx34, HDx24, LS424, HS124
- **Series 3&#x20;**(minimum OS: 8.0)
  - XTx43, XDx33, HDx23, LS423, HS123, HO523
- **Series 2** (minimum OS: 8.0)
  - 4Kx42 only
:::

:::ExpandableHeading
**Display**

A monitor, TV, or touchscreen with an HDMI® input.
:::

:::ExpandableHeading
**Storage Device**

As mentioned [here](docId\:o4YzospNpFaGbgLdUleee), players require a separate storage device. These can include any of the following:

- microSD card (most common storage device)
  - Formatting requirements described [here](docId\:o4YzospNpFaGbgLdUleee).
  - Note that some very early player models use the larger form-factor SD card.
  - If publishing a [Setup](docId\:XNnXywMV09iEgZIIt7RWA) and/or presentation directly from your computer to a microSD card, a card reader / writer is required.
- USB Flash Drive (supported on models with a USB port)
- M.2 SSD (XCx55, XDx35, XTx45, XTx44, XTx43, XDx34, XDx33 models only)
- mSATA drive (4Kx42 models only)
:::

# BrightSign Author Plus

The subscription-based BrightSign Author Plus (formerly known as bsn.Content) includes all BrightSign Author features plus cloud hosting of presentations and media assets along with tools to manage that content. Subscribers can use the [BrightSign Author](docId:7xqhhE03hrlS_QzV35_ta) Mac or Windows desktop app to access BrightSign Author and Author Plus. For those who prefer not to use a desktop app, all of this functionality is also accessible via a web browser at [https://bsn.cloud](https://bsn.cloud/).

You can access Author Plus through our [free 30-day trial](https://www.brightsign.biz/bsncloud/bsncloud). After the trial, you can subscribe to Author Plus for $139 per player, per year, or simply let the trial expire where you’ll be reverted to the free BrightSign Author service. With BrightSign Author, you'll still be able to control your players remotely, but you'll lose access to the BSN.Cloud hosting and publishing tools along with any content and presentations you saved to the cloud during the trial.

:::ExpandableHeading
## Updating to Author Plus

Players configured for BrightSign Author Plus must be set up to receive content updates through BSN.Cloud. If your player was previously set up with another Publishing Mode, you will have to change how it receives content updates. To do this:

**Create your Account**

- To connect an existing BrightSign player to BSN.Cloud for the first time, first  [Factory Reset](docId\:ynCF7P2PYZo2qedF1JYim) the player.
- Format a blank microSD card to FAT32 or ExFAT and insert it into the player.
- Activate your free BrightSign Author Plus trial through the BrightSign Author **Admin** tab.

**Create a Setup**

1. In BrightSign Author, select **Setup** under the **Admin** tab.
2. If you have not already done so, select **Player Settings** and fill out **Setup Name**, **Player Name**, and **Player Description.** Set the **Idle Screen Color** to something other than black, so that you can see if the player is outputting a video signal. 
3. Select **BrightSign Author Plus** (bsn.Content) as the **Publishing Mode**.
4. Choose **Add Setup to Library**.

**Provision The Player&#xA0;**

![MicrosoftTeams-image (2).png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/NUHvObL7Nch4_jfZmVa1I_microsoftteams-image-2.png)

1. Go to the **Admin** tab in BrightSign Author and select **Provision.** Use the checkbox to select the player from the list.
2. Select **Apply Setup** and select the Setup File that you saved to your library.
3. **Apply Setup** to the player.
4. Go to the **Network** tab and select the cog icon next to the player you want to provision. This will take you to the remote Diagnostic Web Server.
5. From the **Control** tab, go to **Reprovision Player**, and select **Update**. The player will reboot several times in the process.
6. When reprovisioning is complete, a green check mark will appear next to the player and the **Setup Type** in the **Properties** pane will be BrightSign Author Plus. You will see the welcome screen when the player boots.

**Publishing**

BrightSign players support several methods for publishing content to players. This is known as a Publishing Mode. With a BrightSign Author Plus subscription, most users will opt for the BrightSign Author Plus Publishing Mode in which all content is stored on BSN.Cloud and readily available to any internet connected player. However, users have the flexibility to choose an alternative Publishing Mode if desired. For more info, refer to this page on [Publishing Mode](docId\:rEScIigY-dJRPuZgwaA4e).
:::

::::ExpandableHeading
## Managing Content

BrightSign Author Plus allows you to create and manage your own content library. All content uploaded or created will be available to every player registered on the BrightSign Author Plus network. 

**Content Library**

You can access the **Content Library** through the Dashboard on the BrightSign Author home page or in the **Content** tab drop down menu. If you do not have a paid BrightSign Author Plus subscription, these sections in the BrightSign Author home page will be unavailable because they access cloud content, not local content.

From the this section, you can:

- **Upload New Media** (for example, images, video, and audio)
- Create a **New Component** like BrightSign dynamic playlists, data, or media feeds, or upload an HTML site or script. 
- Navigate the media and components already uploaded into the cloud, and view data on content including media type, dimensions, file size, and upload and modification dates in the **Content Library**.

![](https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/T0L_HBg6Oc6U4L5RaKS7v-20260515-143401.png "Image 1")

**Local vs. Cloud Content**

As a BrightSign Author Plus subscriber, you can build a presentation from content you have uploaded to BSN.Cloud, or from assets stored locally on your computer. However, *remote and local assets can't be used in the same presentation*. If you plan to work with locally stored assets, switch to **Simple** mode via the Simple/Advanced toggle switch at the top right. If you plan to host presentations and content remotely with your BrightSign Author Plus subscription, switch to **Advanced** mode.

If you added content or presentations to BrightSign in Simple mode, and want to use that content with your BrightSign Author Plus network, select the content or presentation and then select the Upload Presentation button, above the **Advanced**/**Simple** toggle, to make those assets available in the cloud.

:::hint{type="warning"}
Note that the Simple / Advanced switch is only available in the BrightSign Author Plus desktop app. If you open it through a web browser, you cannot access files on your local computer.
:::

![](https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/jTTifloeaoVZ4HfnjycDM-20260515-170719.png "Image 2")

**Adding Content to the Library**

In the Content Library, select a folder that corresponds to your media type, or select the icon to the right of the folder location to make a new folder. Enter a descriptive title and select **Create** to create the folder.

Add new media by selecting **Upload New Media** in the **Content** tab dropdown and **Choose Files** to select the files from your computer that you want to upload. You can preview your content and make sure it is pointing to the right folder. Then select **Upload Content.**

You will see a progress bar at the top of your screen, as shown in Image 3. Select **Transfer Info** to check the progress of your upload. You can navigate to other tabs while your media is uploading, which is helpful if you want to work on your presentation while content is uploading.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/lAZTJTnRLVn1GdFvC1BDN_image-20230404-180458.png "Image 3")


::::

:::ExpandableHeading
## Scheduling & Publishing

**Publishing Modes**

The **Type** dropdown list allows you to select a publishing option and the destination is set by default to whichever location was last used. The player [Setup File](docId\:XNnXywMV09iEgZIIt7RWA) must be configured for BSN.Cloud, and the [Content Mode](docId:8yTHtVfOe83v1SSsbyIW-) must be set to **BSN.cloud Content** before you can publish to BSN.Cloud (see the image below). When the Content Mode is set to **Local Content** (for example, if you are using BrightSign Author rather than Author Plus) only the **Standalone**, **Local Network**, or **Web Folder** publishing methods will be available. Note that local filesystems are not accessible from the BSN.Cloud web interface so this switch is only available in the desktop app.

You can also use the **Group** dropdown to view the presentation schedule for any group you have created.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/PxTqFv2GZNWGm0LMUFg4d_pubtypes.png)

**Scheduling and Publishing**

Presentations can be published per predefined schedules. The current player schedule can be seen in the **Schedule** tab. Presentations can be set to run 24/7, at a specific time, or at a recurring time. If two presentations are scheduled during the same time, one will be set to interrupt the other. Only one presentation can interrupt another at a time. 

BrightSign Author Plus allows you to remotely publish presentations, or interruptions, on the player group schedule. Once you have created or finished editing the schedule, select the **Publish** icon at the top right to send your presentations and schedule to your networked players. 
:::

# Input Devices

BrightSign Author can be used to create Advanced presentations that take advantage of various types of input devices. Depending on player model, the following input devices are supported.

::::ExpandableHeading
## Supported Input Devices

- Touchscreens equipped with a supported touch controller. See [Supported Touchscreens](docId\:ACL5V8_jQiuq3SntxSNfO) ﻿for a list of supported touchscreens.
- BrightSign [BP200 and BP900](https://www.brightsign.biz/digital-signage-products/accessories/Button-Panels) USB button panels 
- Many brands of USB keyboards 
- Many brands of USB mice or trackballs 
- Many brands of USB bar code scanners
- Quadravox Serial Button Board
- AMX, Crestron, and similar control devices
- Any GPIO (open/close contact switch) button, signal, or LED (your custom board or LED display); GPIO connections may require [Phoenix-type GPIO](https://www.brightsign.biz/digital-signage-products/accessories/GPIO-terminal-block) terminal blocks.
- PC (via UDP or serial)
- IR input/output devices using the NEC or Pronto Hex remote control protocols. BrightSign Author supports IR events through the IR port as well as through IR USB devices (e.g., [Iguanaworks USB transceiver](https://www.iguanaworks.net/products/usb-ir-transceiver/)).

:::hint{type="warning"}
Note: The LS424/423 models have a USB-C port, while many of the above USB devices (including the BP200/BP900) ship with USB-A connectors. BrightSign sells a [USB-A to USB-C](https://www.brightsign.biz/digital-signage-products/accessories/USB-C-Cables) adapter for this purpose.
:::
::::


[title] Tagging
[path] BrightSign Author/Content/

The BrightSign Author tagging feature lets you create tags to organize your media and playlists and play different content on different players. This page describes the different types of tags, provides an example of how to create and apply them, and explores some advanced tagging options unique to BrightSign Author.

# Tag Types

## User Tags

To add tags to media and players, you must assign the following values in the User Tags menu (note that tags can simply be a name, or can be more complex and contain a name, type, and value):

- **Tag Name**: Enter any name to describe the tag
- **Tag Type**: Select either **String**, **Numeric**, **Boolean**, **Date**, **String Array**, or **Numeric Array**. The value of the tag will match the tag type. For example, if you select **Numeric**, your tag **Value** must be numeric. 
- **Value**: Boolean and Date tags will automatically provide valid value formats.

:::hint{type="warning"}
"You may get an *"Unable to save tag for device. Please try again!"* error when adding user tags to a device. This message is incorrect - your user tags will save and you can close the error message or navigate away from it."
:::

## Player Tags

Player Tags are applied to registered players on a network instead of to media content. To access Player Tags, select a player in the **Network** tab and then open the **Tags** menu in the right pane. This will let you assign the same tag fields to that player as you can assign to content with User Tags (see User Tags, above, for more details about these fields).

## System Tags

System Tags are built into BrightSign Author. System Tags are innate properties like media type (video, image, audio), file location, and file name, and are automatically generated for all tagged media in BrightSign Author. System Tags are treated the same as User Tags and can be used in media rules on tagged playlists.

# Tagging Content

To create a content tag:

1. Create a folder and make sure that the content you want to tag is in that folder.
2. Select the content (**FluffyCat.jpg** in Image 1)
3. Select the **Tags** section on the righ&#x74;**.**
4. Expand the **User Tag** drop down, and select **Add Tag**.
5. Expand the new tag and enter the **Tag Name** and **Value** (**Value** is not mandatory). See **User Tags,** above, for an explanation of the different fields.
6. Select the save icon in the top right.
7. A tag symbol will appear in the top left corner of the content thumbnail (see the arrow in Image 1), and a success notification will appear at the top of the screen.

For all non-array tag types, each tag may only have one unique value per piece of media. For more information about how array tag types work, see **Advanced Tagging**, below.

Currently, tags cannot be assigned to more than one media item at a time.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/cbqU6CXbxd5q05c7Zrq-x_taggingexample-1.png)

# Tagging Players

To create a player tag:

1. You should have already created a tag name and value pair for your content (see Tagging Content, above)
2. Select a registered player under the **Network** tab
3. Add the tag name and value in the **Tag** menu at right. As you type, a drop down menu will appear with tag names that have already been entered on media assets to ensure that you enter the correct name/value. 
4. Select the save icon in the top right.

# Creating Tagged Playlists

Once content has been tagged, you can create tagged playlists which contain all relevant tagged media and which will automatically track tag additions or removals. Tagged playlists use media rules, which can use system and user tags, to determine their contents. Create and apply your tags to your media before creating a tagged playlist, so you can view contents in real time as media rules are applied.

:::hint{type="info"}
Tagged playlists only pull from the selected content library directory. In order to create the playlist with all the content desired, make sure that all tagged media relevant to your playlist exists under the same file directory.
:::

## Creating a Tagged Playlist (Example)

For example, if you want to create a playlist containing all media tagged as "Animal: Cat" to play in a section of a store, create a tagged playlist to display all content that matches the Animal tag with a value of "Cat". To do this (assuming you tagged content as shown in the User Tags section above):

1. Select **Tagged Playlist** under **Content > New Component > Tagged Playlist**.
2. Enter a name and select **Create**. Note that Tagged Playlist names that only contain numbers are not valid and cannot be saved.
3. Select the directory that contains your content and select **Add Media Rule** (see Image 2)
4. Enter the correct **Tag Name, Condition, and Value** to create the rule. Note that **Value** can contain multiple comma separated values when used with the **Contains**, **Contains All**, or **Contains Any** conditions. Once the rule is created, all the media with the tag should appear in the **Results** section.
5. You can optionally change the **TTL** (time to live) value in the Properties pane (under **Tagged Playlist**) from the default value of 5 minutes and/or change the default **Match Rules** and **Order content by** settings.
6. Select the save icon (next to **Add Media Rule**).

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/NOWXVlYwdlD3Q2qRGeYiM_mediarule.png)

## Adding a Tagged Playlist to a Presentation

Once you have created your tagged playlist, you can add it to a presentation. To do this:

1. Create a presentation (under [Presentations](docId:0Vm0UTpL2j8dss-DFNhMo)) or select an existing presentation.
2. Add a tagged playlist widget from the **Widgets** tab into the presentation (see Image 3)
3. Player tag matching acts as a secondary filter, allowing you to exclude items from the playlist based on the tags assigned to the player. Decide how you want to match your tag names (not values). Select one of:
   - **Match all Media Tags to Player Tags**: The player will only play content from the playlist that has the same set of tags as the player.
   - **Match Any:** The player will play content from the playlist that has least one media tag that matches a player tag.
   - **Match All Media Tags**: Tag names on content must exist on the player to be played.
   - **Match All Player Tags**: Tag names on the player must also exist on the content to be played.
   - **Match Player Tags Disabled**: All content from the tagged playlist will play without regard to assigned player tags.
4. Save the presentation.
5. Publish the presentation to the desired group
6. Go to the **Network** tab
7. Add the correct device tag to the player if you have not done so already (see Tagging Players). Now the player should play the content associated with the tags.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/hoHOIgL-T08WOg5mlNWtI_widgets.png" size="80" isUploading="false" initialPath="./attachments/Widgets.png" githubPath="user-guides/brightauthorconnected-user-guide/content/attachments/Widgets.png" width="1124" height="999" darkWidth="1124" darkHeight="999" showCaption="false"}

## Setting Media Order and Duration

You can change the media order and media duration in any tagged playlist. To do this:

1. Select the desired media in the **Results** panel.
2. Under **Properties**, you can change the order and duration of the media (by default this is six seconds). The order can also be modified by clicking and dragging media in the **Results** panel. See Image 4.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/xm9CKHddTAHRif8rLmb98_tagplaylistproperties.png)

# Updating Tagged Playlists

## Adding and Approving New Content

To add new content to an existing tagged playlist:

1. Upload your new content into the folder that contains the original tagged playlist content.
2. Add the media tags that you have assigned to the other content in the folder to the new content. 
3. Save the media tags.
4. Go to the tagged playlist and select the "thumbs up" icon to approve the new content (see Image 5, below). The presentation will update with the new content based on the interval setting (**TTL)** that you assigned to the playlist. This TTL interval setting is the frequency with which player checks BrightSign Cloud servers for new media.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/D3rb9jk1Vkp8wSuxoX4xq_thumbsup2.png)

### Automatic Approvals

To avoid the approvals process and automatically include any new content that meets the criteria of your tagged playlist, you can go to the **Admin > Subscriptions > Network Settings** tab to enable automatic approvals.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/FX2t_uzssarVNrDhxA_YQ-20260105-153324.png)

## Deleting Content

To delete content from a tagged playlist, simply delete the content from the original folder, or remove the tags from that content.

# Advanced Tagging Features

## Array Tags 

Two versions of array tagging are supported: string arrays and numeric arrays. Array tags allow users to assign multiple values to the piece of media on a single tag name.

For example, in Images 6 and 7, a string array tag named Landscape has been applied to three pictures. Each picture has one or more tag values: Snow, Forest, Lake. When the media rule contains Snow, all three pictures appear under **Results**. When the rule contains Forest, only two pictures are displayed under **Results**. 

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/jwqbrAZGog4RSp4nXpPcZ_array-example-1.png)

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/NNb7h02YvaqyuwG78nPAM_array-example-2.png)

## Validity Dates

You can assign validity dates to selected content. When a validity date has been assigned, that content will only be displayed on screen during the assigned date range. For example, this can be used to display seasonal content or sales. 

To assign validity dates to content:

1. If you have not already done so, define the media rules in the tagged playlist.
2. Select the content thumbnail.
3. Select the **Enable Validity Date** checkbox in the **Properties** panel (see Image 8).
4. Enter a **Start Time/Date** and **End Time/Date**. The time should be entered in **UTC timezone** (not your local time).

:::hint{type="info"}
You must specify a validity date at least 24 hours in the future, or it may not work correctly.
:::

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/H7gOsueNfFtkfZ3JqEKga_validity-date-example.png)


[title] USB Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/wsUE08EI0VQVPFXFSvdEl_usbevent.png" size="10" width="83" height="80" position="center" darkWidth="83" darkHeight="80" showCaption="false"}

The USB event is used for USB input devices that deliver multi-character strings to the player. The original design for this event was to handle inputs from devices like USB bar code scanners, which translate bar code graphics into alpha numeric strings. While the USB Keyboard Event is limited to single character input strings, the USB Event handles devices that deliver strings that are one character or more.

The USB event triggers when a BrightSign player receives the specified input from a connected USB device (for example, a keyboard, mouse, or other peripheral). This feature is typically used to provide interactivity or automate certain functions.

As of BrightSign Author version 1.32.0, you can specify `<any>` or `<*>` for USB events through the **Assign Input to variable** and **Assign wildcard to variable** check boxes.

In the **Specify USB input** field, enter the USB input string that will trigger the event.

A common use cases for a USB event is user interaction. USB devices such as keyboards or mice can trigger specific interactions within an application or interface displayed on the screen. For example, a USB keyboard could be used for users to input information or navigate through a menu.


[title] Tree View
[path] BrightSign Author/Presentation/Untitled/

The **Tree View** in the **Presentation** tab allows users to quickly view and search through all of the zones in a presentation, the contents of each zone, and the parameters of each of the zone events and assets. 

## Opening the Tree View

To open the tree view, simply select the **Tree View** tab in the left pane:

![image-20241217-210420.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/GOZ7qb-AXBQA1QzRL3_c4_image-20241217-210420.png)

## Tree View Interactivity

Elements within zones are selectable by name, and an arrow next to a name indicates that it can be expanded. Click the arrow next to the element to expand it, or use the **Expand All** button to view the entire tree and **Collapse All** to close the expanded tree.

If users click on any element name in the **Tree View**, corresponding information for the selected element will appear in the other panels.

## Searching the Tree View

Users can search for an element (or elements) in the tree view. To do this, enter the search term and click an orange arrow. The down arrow finds each instance of your search term from the top of the tree to the bottom, and the up arrow selects each instance from the bottom to the top:

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/aMpWAp2x4hpab24Gj0Dlj_searchable.png)

## PDF Version

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-eKz7n6zJa5t13CKQTtQZm-20250716-210002.pdf" label="Tree View.pdf"}


[title] Presentation
[path] BrightSign Author/

There are three types of presentation you can create in BrightSign Author and Author Plus:

- **Full-screen presentations**: A looping playlist of media–images, videos, HTML pages, etc. that occupies the entire presentation display. 
- **Multi-zone presentations**: Content can occupy different zones on the screen, allowing you to display multiple images, videos, HTML pages, and text widgets in a customizable layout.
- **Interactive presentations**: Playback, whether full-screen or multi-zone, is responsive to interactive events such as button presses, GPIO input, or UDP commands.

Besides image, video, audio, and HTML files, presentations can also feature a number of [States](docId:2eh0-u7XsTxqw_emIiign), such as Live Text, Media RSS feeds, and HDM&#x49;**®** input, and [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL).

Your presentation can be saved to the cloud, where it can be accessed by other users, or it can be published directly to players.

## Next Steps

For a step-by-step guide to creating and publishing a simple presentation, see [Quick Publish](docId\:CZGuHZ_OMw1rSbPfddPaH).

[title] Users
[path] BrightSign Author/Admin/

This screen allows you to add, edit, and delete users on your network.

# Add a User

Click the **Add User** button ("+" icon) to add a user to the network:

- **Email**: The user's email address.
- **First Name**: the user's first name.
- **Last Name**: The user's last name.
- **Description**: A custom description for the user.
- **Assign to Role**: Select a role for the user. You can view permissions for each role and create a custom roles on the **Roles and Permissions** screen.

:::hint{type="info"}
A person can be part of more than one BrightSign Cloud network (their email address acts as their unique identifier); the person's password is the same for all the networks they belong to as users. For this reason, password management must be performed by individual persons and not the network administrator.
:::

# Edit a User

Click the **Edit** icon (gear icon) to edit the user's description and/or role.

# Delete a User

Click the **Delete** icon (trash can icon) next to a user to delete that user.


[title] Add GitHub Plugins
[path] How-tos/

:::hint{type="info"}
BrightSign Author supports all  plugins.
:::

The BrightSign GitHub page offers a variety of [BrightAuthor Plugins](https://github.com/brightsign/BrightAuthor-Plugins), which allow you to extend the standard functionality of BrightSign Author and BrightAuthor Classic. To add a plugin to BrightSign Author, you first need to retrieve it from GitHub. Follow these steps to download the *.brs* plugin file from GitHub.

1. Select the *.brs* file in the desired plugin directory (for example, the *Media-Server* directory contains the *server-plugin.brs* file).
2. Select the download icon as shown in the image below. The plugin will be saved to your Download directory.

![Screenshot 2024-06-19 at 10.42.37 AM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/iSXgY88nI42ci9PmY1dgz_screenshot-2024-06-19-at-104237-am.png)

You can now add the plugin file to the BrightSign Cloud in BrightSign Author via **Content > New Component > Upload Script**.

Go to **Presentation Settings > Support Content > Script Plugin** to add the plugin directly to a presentation.

[title] Play Back Multiscreen Video
[path] How-tos/

The XC2055, XC4055 and XT2145 BrightSign players have multi-headed output features to let you author video wall and multiple screen presentations. This page describes how to create a multiscreen presentation in BrightSign Author for these players.

# Prerequisites

To ensure a successful multiscreen video presentation, check the following before you begin:

1. You should know the screen characteristics, including the number of screens, [bezel compensation](docId:_ppg0qT6SXnJnjrufZr1I), screen size, resolution, and screen orientation. 
2. All screens must have same orientation and resolution.
3. Frame rates must match exactly if you want the screens to be in sync (so, for example, 23.97 is not the same as 24). If you don’t care about the screens being in sync, you can have different frame rates.
4. You should have a plan or diagram of how the screens should be installed.

# Set Up the Presentation

Follow these steps to set up a video presentation with XC2055, XC4055 and XT2145 players in BrightSign Author.

## Create the Presentation

1. Select **New** **Presentation** in the **Dashboard**. This will take you to the **Basic > Single Zone > Playlist** entry in the **Presentation** tab.
2. Select either the two output **XC2055** or **XT2145**, or the four output **XC4055** (each output is 4K), as the **Target Device**.
3. Enter a presentation **Name**.
4. Select **Start** to create the presentation.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/krjmn1OeEpecCWGGOuhVb_selectdevice.png)

## Screen Layout and Properties

1. This will take you to the **Screens** tab. If your player has two outputs, two screen layouts will be displayed. If it has four outputs, four screen layouts will be displayed (see Image 2).
2. Select the layout and resolution by changing the number of layouts in the **Screen Count** dropdown menu and picking a **Screen Resolution**. If you chose one output, you can select 8K resolution output, but if you have more than one screen, the output is limited to 4K for each screen. **Layout Resolution** in the right panel will show you the total resolution.
3. Select a **Target Frame Rate** or use the default.
4. Check **Force Resolution** or **Enable YCbCr 10-bit Output** for those options:
   1. **Force Resolution** forces the player to output the selected resolution even if the display reports over HDMI® that it does not support it. If this box is unchecked, the player will attempt to use the selected **Screen Resolution**,  but will then fall back to the highest resolution supported by the display if it is unsupported. 
   2. **Enable YCbCr 10-bit Output** outputs a 10-bit color video signal to the connected display. See [Video Formats & Codecs](docId\:knsFFwMTD4NswXm4BUP0I) for more details on supported 4K color spaces and bit depths.
5. Under **Screen Properties**:
   1. Enter a **Name** for your screen
   2. Select a **Video Output** (**HDMI-1**, **HDMI-2**, **HDMI-3**, **HDMI-4**).
   3. Enter **Bezel Compensation** values, including bezel **Top**, **Bottom**, **Left**, and **Right,** to adjust the display for the space between the screens. Set this for each screen or select **Apply to All Screens** to apply the settings for one screen to all the screens. Bezels that are selected will be highlighted.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/UeLIY9qimVgEce2uIe8rQ_screens2.png)

## Content Layout

1. Switch to the **Layout** tab to see the content layout. 
2. Resize the zone by clicking and dragging on the blue tabs in the corner and middle of the zone and/or move it around the layout to place it as you want. You can do this without affecting the screen layout.
   1. **Toggle** **Layout Boundaries** lets you see the screen and bezel boundaries are. This feature makes it easy to resize a zone to match the edge of the screen or the edge of the bezel. 
   2. **Enable snap to canvas** lets you snap to elements quickly and ensure that your zone fills the entire screen.
3. To add more zones, use **Add Zone.** In the **Zone** panel, you can change the priority to put the zone on top of or under other zones. 
4. Under **Type**, you can change the zone type to **Audio**, **Image**, **Ticker**, or **Control**.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/O7Td4wemuh3OsvkybFqrW_screen-shot-2022-11-15-at-100507-am.png)

## Add Content

1. Select a zone. Each zone will have its own content assignment.
2. Go to the **Content** tab, or double-click on the zone to go directly to the Content tab.
3. Drag your content from the **Assets** tab into the zone, either as a playlist or an interactive playlist.
4. Continue to do this until all the zones have content. Remember, you can use the **Zone** panel to put some content zones over others if you wish. You can also change screen configuration and the zone information will remain the same though you will probably have to resize the zone to match the new layout. 
5. You can now publish the multi-screen video presentation.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/oXDb0Ow-R8HuukFEgbYsB_content.png)

# Example

In the video below, we demonstrate how to create a four screen video wall running on the XC4055 video player:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/TYAqEnq_Txckpox4eAKHe-Aa5DIsyLjLaRMhYndEXUs-20250418-212128.mp4" label="XC4055_8K_Videowall.mp4"}

# Decoding Constraints

XC5 players have the following video output constraints:

- Both players support up to 7680x4320 resolution on the HDMI-1 connector
- All other outputs support up to 4K video resolution
- When using more than one HDMI output simultaneously, all outputs are constrained to 4K video
- If you are outputting 8K, make sure to select HDMI cables that support 8K

# Supported Video Types

The chart below describes the supported video types. Video sources larger than 3840x2160 resolution must be in HEVC (H.265) or VP9 format. Neither AV1 nor AVC (H.264) will work at 8k video resolution, and all video sources other than HEVC and VP9 are limited to 3840x2160. See [Video Formats & Codecs](docId\:knsFFwMTD4NswXm4BUP0I) for more info.

| **Stream / Codec Name** | **Common Name** |
| ----------------------- | --------------- |
| hevc                    | H.265 or HEVC   |
| h264                    | H.264 or AVC    |
| av1                     | AV1             |
| vp9                     | VP9             |
| mpeg4                   | MPEG 4 part 2   |
| mpeg1video              | MPEG1 video     |
| mpeg2video              | MPEG2 video     |
| mjpeg                   | MJPEG video     |

## Supported Audio Types

See [Audio Formats](docId\:Hs4EUH9JcuiJcBafGShef).

## Touchscreens

As of BrightSignOS 9.0.22.3, even if multiple touchscreens are attached to a player, only the screen attached to the HDMI-1 output of a XC2055, XC4055, or XT2145 can be configured for touch events (the touch area will be mapped to the portion of the screen associated with HDMI-1).

[title] Create a VideoWall
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

# Overview

Video wall creation usually consists of:

1. Preparing the content - usually by dividing it for multiple screens
2. Using software tools to distribute that content to the players
3. Configuring the players to render the content into a cohesive video wall

BrightSign software and hardware simplifies these tasks. This documentation describes the primary methods available to BrightSign customers to create video walls using our software and hardware. Select a method based on your BrightSign player(s) and the video assets you want to display:

:::hint{type="warning"}
You cannot use BrightWall video creation methods if you are using the Standalone publishing method, because you must be connected to a network (additional configuration is required after publishing the presentation).
:::

# XC5 Players

XC5 players can distribute video to up to four screens. All screens must be in either portrait or landscape orientation.

# Manual / Legacy Video Walls

[Standard (Linked / Sync'd) Videowalls](docId\:kUVhcsC_jOTYfetq-o8yh) is a legacy method to create a video wall presentation with Series 3, 4, and 5 players in BrightSign Author. This method is completely manual so it is unconstrained in terms of the number of screens and screen rotation.

# Bezel Compensation

See [Bezel Compensation for Video Walls](docId:_ppg0qT6SXnJnjrufZr1I) to calculate the correct bezel compensation for your video wall.

# Dos and Don'ts&#x20;

## Domain Values

All BrightWall and presentation sets using enhanced sync that are connected to the same network must have unique domain values for each set.

- This domain value can be found in the *Presentation Settings > Support Content > Interactive* (see the image below).
- The domain value sets the communication “channel” between the leader and followers, and that communication generally is carried over the entire network via multicast PTP (Precision Time Protocol) packets. If there is more than one leader on the same domain, followers will jump back and forth between different points in their playback as they try to follow conflicting leader commands.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/OL4hOpArcbBrkdt55_zei_firstbullet.png" size="42" width="827" height="1078" position="center" darkWidth="827" darkHeight="1078" showCaption="false"}

## Syncing Different Player Models

Players in a sync configuration should be of the same model family. Mixing model families *can* work but is not recommended. For example, players in the XT4 family are similar enough to be used, but players with very different performance like XT4 and LS4 may yield inconsistent results.

## Media Limitations

All media must strictly conform to supported specifications. Even media that is slightly out-of-spec may play back fine on its own but can cause issues with sync'd playback. For example, if the bitrate is too high, it may affect playback on one of the sync'd players.

## OS Versions

The leader player must have OS/firmware version that is the same or older than the follower players.

## Seamless Looping

Seamless looping of a single video is supported with synchronized playback. The seamless looping requirements are:

- Use an MP4 or MOV container
- There must be no audio track, or SOWT (PCM little-endian) audio track
- All tracks must be exactly the same length (including the sample length)

## Other

- Synchronization cannot be used simultaneously with [roStreamQueue](docId\:ViH_1nQEDu7xAa6auJjzP) for seamless clip-to-clip transitions, so sync presentations that have a playlist including more than one video will have a slight pause between the videos.
- We recommend using only one zone of video per player to ensure best results.

# General Challenges

You should be aware of the following industry-wide hardware challenges when creating your video wall.

## Display Screen Rows and Video Offset

If you have fast-moving content on a video wall which contains more than one row of screens, you may see offsets at the top and bottom boundaries of the screens in your video wall configuration. This is a result of the speed at which pixels are drawn/scanned on each screen (see the image below).

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/frFBf1ANUpX69_2ioswRy_diagram7.png" size="70" width="1000" height="790" position="center" darkWidth="1000" darkHeight="790" showCaption="false"}

This problem can only be fixed by using display screens that are capable of inverting the order of the scan and provide the ability to control frame offsets on the display screen. Some manufacturers call this scan inversion/frame control. LG is an example of a hardware manufacturer who provides features to mitigate this problem on video walls (see [https://news.europedsl.com/lg-videowall-image-gap-reduction)](https://news.europedsl.com/lg-videowall-image-gap-reduction).

## Sync Limitations

- Playback must be started simultaneously on all players.
- You must periodically re-sync to correct for sync drift over time.
- You must also attempt to sync output signal generation timing (known as "genlock" or "v-sync" synchronization).
- Downstream processing on players can result in out-of-sync playback, even if players are on the same frame, corrected for drift, and have the same redraw timing:
  - Display smoothing or scaling can result in a frame or redraw delay. To fix this, disable display processing if possible. Otherwise, ensure that all displays are set and connected identically.
  - Different display sets may have different timing if unlinked parallel processors are used for wall or tile processing.

## Screenshot Lag

When taking a screenshot of an XC5 player, screenshots are captured one at a time from screen 1 to 4. This results in a frame offset of three to four frames between screen 1 and screen 4 since the offset increases by one frame of video between each screen.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/upeE2BwZ7MbQtmNp2QKKG_image-20230418-025616.png" size="70" width="2642" height="1652" position="center" darkWidth="2642" darkHeight="1652" showCaption="false"}


[title] How-tos
[path] /

This section contains How-to and Video guides for BrightSign Author:

:::ExpandableHeading
### BrightSign Author Video Guides

[Presentations](docId\:mLhkoS5yd5fricge0RcKd)&#x20;

[Interactivity](docId\:Aau5UThsUT9WXrNkyQSAl)&#x20;
:::

:::ExpandableHeading
### BrightSign Author How-tos

[Add GitHub Plugins](docId\:By5439_1haPfQqgeE_1ba)&#x20;

[Add Plugins to Presentations](docId\:Hwuy2hGfUnfpqrdQrtiuW)&#x20;

[Add Node.js to Presentations](docId:8Frpqv8sra8XV3cMlCno-)&#x20;

[Convert Video Formats](docId\:sOHPezTa15Nh8qhymCrrE)&#x20;

[Create a VideoWall](docId\:NP-Iuz6aWL1Pl439MECjK)&#x20;

[Create GPIO Input](docId\:d0mS5AwZao9hGwW5_Aoap)&#x20;

[Create Image Transitions](docId\:lBv9lU-Jg54qFRsB5zQ7-)&#x20;

[Display a Direct View LED Presentation](docId\:Pd4XP5Vp2P-1djJY4ftu_)&#x20;

[Display a Google Calendar](docId\:EOHyx9HmbolyI9AvctAgt)&#x20;

[Display an Excel File](docId\:tMZhLH-f12dQaCXzGny_I)&#x20;

[Display YouTube Videos](docId\:MqRlLlYxFGIezDrGGzBuV)&#x20;

[Encode Final Cut MOV Files for TSMuxer](docId\:Rv3V-TSPgYo5V61za9aUO)&#x20;

[Get Optimal 4K Image Quality](docId:_zzq3iJ3oSLjbaQhKUnCL)&#x20;

[Migrate Local Setups from BrightAuthor Classic to BrightSign Author](docId:_HtpQbAo8LfkuCEHcz0sP)&#x20;

[Pause / Resume a Video](docId\:qwUAT8k7UbCU4OxxydvJF)&#x20;

[Play PowerPoint Presentations](docId:5sYVFv2Txl5-qsomg349r)&#x20;

[Play Videos with Audio Despite Chromium Restrictions](docId\:vfy-jGNvyQx3WR46ASJJB)&#x20;

[Quicktime for Looping Files](docId\:FtRtZhrEf5tUvVnUoTe4x)&#x20;

[Seamlessly Loop Videos](docId\:ez4Alm6KyBFcOAobifHIR)&#x20;

[Send a Serial Command on Receiving a UDP Message](docId\:bSdmFhjelfvz8zVepqxya)&#x20;

[Send Hex Commands](docId\:us6qFlvaE7vOiI-NcClep)&#x20;

[Set GPIO Outputs On/Off](docId\:H0zdn0VRrrrIrZj3JcVqI)&#x20;

[Sleep / Wake a Display](docId\:H4-tYGXA-hQo2C2gJ4GIl)&#x20;

[Switch Presentations](docId\:fN2Q3GxwAEj-EoJvKZ4Mn)&#x20;

[Sync Zones](docId\:jwsGnw0TrRAaThcEdAQ50)&#x20;

[Use GPIO on Players](docId\:YDPhUp1VAStjmUoS_L7QH)&#x20;

[Use Plugins & Parsers](docId\:uWsz22b8BpJF6DQq_ioq2)&#x20;
:::










[title] Play PowerPoint Presentations
[path] How-tos/

BrightSign does not support playback of native PowerPoint (PPT) files. However, you can export your presentation to BMP or JPEG images, and then play those images using a BrightSign Author or  playlist. You can also convert the PowerPoint slideshow into an MPEG-4 video *(MP4)* which is supported by BrightSign players.

You can use the attached PowerPoint add-in to change the resolution of your slides, set a default folder for exports, and easily export all of the slides in your presentation to sequentially named JPEG files.

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/TYAqEnq_Txckpox4eAKHe-BBEu8cPscZ1Cc7f_zM4EJ-20250415-203831.zip" label="powerpoint.zip"}


[title] On Demand State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/CK_ZXvqsjJvSnZZ_FWslS_ondemand.png" size="14" width="231" height="232" position="center" darkWidth="231" darkHeight="232" showCaption="false"}

The On Demand state allows you to combine media files into a single state in the playlist area. You can then use the event that transitions to the On Demand state to conditionally determine which file in the playlist should be played.

:::hint{type="warning"}
When the On Demand state is double-clicked, the On Demand canvas will appear. The On Demand canvas gives you the option to add content from **Assets** to the On Demand state. To exit this canvas, click the Zone description located in the top left corner of the canvas. This will take you back to the Zone Content canvas.
:::

The On Demand state can only be transitioned to using input from BP900/BP200, UDP, Serial, Keyboard, or USB devices. The input data from the controller will determine which media item in the On Demand state will be played: For example, you can use a Keyboard Input event to playback “Video 1” if the “A” key is pressed, “Video 2” if the “B” key is pressed, "Video 3" if the "C" key is pressed, etc. Any type of event can transition out of the On Demand state and into a new state.

:::hint{type="info"}
For BP200/BP900 events, you must specify each **Key** using both the panel enumeration and button number: For example, if you have a single BP200/BP900 panel connected to the player and want button 3 to trigger an image, you would specify the **Key** as "0-3"; on the other hand, if you have a second BP200/BP900 panel connected to the player and want button 3 on the second panel to trigger the image, you would specify the **Key** as "1-3".
:::

# State Properties

- **Name**: The user-selected name of the On Demand state

## List Content

- **Populate From Feed**: Populate the state using a feed.
- **URL**: Specify the URL of an RSS feed (this feature does not support MRSS feeds). In the example below,  is the On Demand key value and  is the media download URL.Upon playing the presentation, the player will retrieve media from the download URLs specified in the `<description>` field of each item in the feed. The On Demand state will use the value in the `<title>` field as the key to determine which media item to play. You must specify the item type. Either the 'type' or 'medium' attributes can be used (see [http://www.rssboard.org/media-rss](http://www.rssboard.org/media-rss)). Valid values are 'image', 'video', and 'audio'. For example:

```xml
<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>media_RSS_feed</title>
    <description>OnDemandWidget</description>
    <item>
      <title>image1</title>
      <description>https://www.brightsignnetwork.com/download/JohnDoe/mrss/formedialist/1.jpg</description>
      <medium>image</medium>
    </item>
    <item>
      <title>video1</title>
      <description>https://www.brightsignnetwork.com/download/alexk/mrss/formedialist/1.mov</description>
      <medium>video</medium>
    </item>
  </channel>
</rss>
```

- **Dynamic Playlist**: Populate the On Demand state using a [Dynamic Playlist](docId\:gPjwF1LNjhau_EQZJMfUq) from your BrightSign Author Plus library. The On Demand state will use the filename as the key to determine which media item to play.
- **Live Media Feed**: Populate the On Demand state using a [Live Media Feed](docId\:gPjwF1LNjhau_EQZJMfUq) from your BrightSign Author Plus library. The On Demand state will use the **Title** of the feed item to determine which media item to play.
- **Update Interval**: Specify how often the player should refresh the contents of the feed.
- **Parser Plugin**: Select a feed parser to parse the feed data before it is passed to the On Demand state.
- **Optimize Feed Updates (use HEAD calls)**: Check this box to have the player make an HTTP HEAD request before retrieving the contents of a feed. See [Data Feeds](docId\:a6Ali6u-szxHuansk6T3-) for more details.
- **Automatically generate User Variables from Data Feed:**  Use the feed to populate a set of User Variables for HTML pages. See [Data Feeds](docId\:a6Ali6u-szxHuansk6T3-) for more details.
- **Display default media if input does not match any keys**: Check this box to display the specified media file when the input data does not match any existing keys in the On Demand state. If this box is not checked, and the input data does not match an existing key, the presentation will not transition to the On Demand state, remaining on its current state instead.
- **Use variable to specify key**: Check this box to have a [Variable](docId\:a6Ali6u-szxHuansk6T3-) specify the media-file key. The input data from the controller will be ignored, though input of some kind must be received to trigger the interactive event. For example, if a Keyboard event is attached to the On Demand state and this option is enabled, any key press will initialize a transition to the Play File state; the value of the specified User Variable will then be checked against the keys in the On Demand state to determine which file, if any, should be played.

:::hint{type="info"}
If you attach a command that modifies the User Variable value (e.g. Set Variable, Increment Variable) to an event that transitions to the On Demand state, the media-file keys will still be compared against the old variable value. However, if the **Display default media** option is enabled, the new User Variable value will be used instead.
:::

## Notes

This section lets you store important information about the On Demand state for future users. It can be modified at any time.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more info.


[title] Encode Final Cut MOV Files for TSMuxer
[path] How-tos/

Though BrightSign players support MOV and MP4 containers, there are specific instances where MPEG Transport streams are necessary, particularly if using [roStreamQueue](docId\:ViH_1nQEDu7xAa6auJjzP) in custom BrightScript to achieve seamless file-to-file (concatenated) playback. TSMuxer lets you change a H.264 encoded MOV file produced by Final Cut Compressor to a Transport Stream. Since the video isn’t re-encoded, there should be no quality loss.

To create MOV files that are compatible with TSMuxer:

1. Export your video content (it should be in Broadcast 1080 or 720 format for HD):
   1. Choose **File > Export**. Make sure the **Export** field is **Quicktime Movie**.
   2. Select **Options**.
   3. Select **Kind = Quicktime Movie, Compressor = H.264**. You can experiment with the **Quality** slider depending upon your content (some have found that settings as low as 50% are still very good).
   4. Click **OK** and use **Save As** to save the .*mov* file you want to create.
2. Close the video preview window that may open after the file has been rendered and close Motion / Final Cut (don't forget to save your Motion file).
3. Open the *.mov* file in the finder to play it back (it should open with Quicktime Player).
4. Press **Pause / Stop** to stop playback.
5. Choose **Window > Show Movie Properties**. In addition to your video track, there are one or two other tracks along with this file. There may be a Text Track and/or an unknown track with the file's name. These are the unnecessary tracks that confuse TSMuxer.
6. Select the video track (the format will be H.264) and select **Extract**. If your video has audio, select the audio and video tracks together. This feature is only available with Quicktime Pro, which comes with Final Cut Studio. You can also purchase an upgrade separately from Apple's website.
7. A new video window will open with your video with the header "Untitled". Select **Save As** and choose a new file name. You won't be able to use the same name as the original *.mov* file.
8. Open TSMuxer, click **Add**, and select the new extracted file.
9. Click **Start Muxing**. The *.ts* file will be created. This file can be played back directly using the BrightSign player.


[title] Other
[path] BrightSign Author/Presentation/Commands & Conditional Targets/

Sends various commands that are not contained within the above categories.

# Pause

Pauses presentation playback for a specified number of milliseconds.

# Reboot

Reboots the BrightSign player. See the bottom of the page for an example.

# Set Variable

Sets a new value for the specified User Variable.

# Increment Variable

Increases the value of the specified User Variable by 1.

# Decrement Variable

Decreases the value of the specified User Variable by 1.

:::hint{type="info"}
The Increment Variable and Decrement Variable commands have the following special rules:

- If the command is used on a number with a decimal value, the number will be converted to an integer by removing the decimal (i.e. the number is always rounded down).
- If the command is used on a string, the value will be converted to a zero. Then the increment/decrement action will be performed on the zero. Negative numbers are also possible.
:::

# Reset Variable

Resets the specified User Variable to its current default value.

# Reset Variables

Resets all User Variables to their current default values and all Media Counters to zero.

# Switch Presentation

Switches to a different presentation. Before using this command, you must add additional presentation(s) by navigating to [Presentation Settings > Support Content > Switch Presentation](docId\:a6Ali6u-szxHuansk6T3-). The following settings must be identical for both presentations: Player Model, Connector Type, Screen Resolution, Monitor Orientation, and Monitor Overscan.

- **Specify Presentation**
  - Choose the presentation to switch to from the dropdown list.
- **Specify via user variable**
  - Choose the User Variable that will determine which presentation to switch to. The value of the User Variable must be identical to the name given to the target presentation in the **Switch Presentations** tab.

# Update Data Feed

Refreshes the contents of the specified Data Feed.

# Resize Zone

Repositions and/or resizes the specified zone. Select the zone you wish to modify. Then enter an **X** and **Y** coordinate (corresponding to the top-left corner of the zone), as well as **W** and **H** (width and height) values for the zone.

# Hide Zone

Hides the specified zone from view.

# Show Zone

Shows the specified zone if it is hidden.

# Pause Zone Playback

Pauses video play in the specified zones

# Resume Zone Playback

Resumes video play in the specified zones

# Generate Session GUID

Lets users generate a GUID for a session. Once the session GUID is generated, it will be assigned to the [Variable](docId\:a6Ali6u-szxHuansk6T3-) “Session GUID“. If the session GUID is set, then it will be included in the presentation event log.

# Clear Session GUID

Lets users clear the GUID from a session.

:::hint{type="info"}
The Hide Zone and Show Zone commands do not affect Audio Only, Enhanced Audio, or Background Image zones.
:::

## Reboot Example

To reboot a player on a local network via UDP command, using the **Reboot** command, add an Event Handler that responds to a UDP message in the presentation(s) scheduled on the player. This allows the bsn.Mobile app or any app capable of sending UDP messages to reboot the player. This method can be adapted for other trigger mechanisms such as Serial Input or GPIO Input, but this article centers around UDP as it doesn't require additional wiring or cables. 

1. In an interactive playlist, drag and drop the **Event Handler** state into the interactive zone from the **Widgets** section
2. Select the **UDP** event from **Events**. 
3. Add a **UDP** event to the **Event Handler** state. 
4. Select the **UDP** event and find **Event Properties**.
5. In the **Specify UDP Input** field enter a string that will trigger the reboot. Be sure the string you use in the **Specify UDP Input** field is unique enough so that it won't be triggered by random UDP traffic on your network. Note that **Label** is used in the BrightSign app to identify the command, and by other apps that query the player for available events. 
6. Select the **Advanced** button in **Event Properties** and select **Add Command**.
7. Select **Other** and **Reboot** as shown in the image below
8. **Save**, **Upload** (if necessary), and **Publish** the presentation. 

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/VpVanRcRrFYRfnEBjHepn_screenshot94.png" size="60" width="622" height="412" position="center" alt="Screenshot__94_.png" showCaption="false"}

:::hint{type="info"}
If you have multiple players on the same network subnet and they are all listening on the same UDP port, you can send a UDP message to the subnet's broadcast address, for example, 192.168.1.255 for everything on 192.168.1.x, and all the players that are listening for that command will respond.
:::


[title] Activate
[path] BrightSign Author/Admin/

This feature allows you to easily provision a player.

Upon boot up, a player that has not yet been provisioned (primarily new players but also factory reset players) will try to connect to BrightSign Cloud and look for a provisioning record. If one is found, the player will set itself up according to the provisioning record.

If a provisioning record is not found, the player will boot up to the “Activate” screen.

# Prepare the Player

## New Player

If your player is brand new, you simply need to attach a properly formatted storage device to the player, connect the player to the Internet, and power up the player.

## Previously Provisioned Player

BrightSign Cloud retains the provisioning record for a player until that provisioning record is *explicitly changed*. Info on deleting or changing existing provisioning records can be found [here](docId\:Cyl9kPm02CO5rgcB9WQQv).

:::hint{type="info"}
Performing a [factory reset](docId\:ynCF7P2PYZo2qedF1JYim) on a player returns the *player* to its factory condition. However, a factory reset does *not* impact the *provisioning record* of that player’s serial number on BrightSign Cloud.
:::

# Activate the Player

You can activate your player automatically or manually. Automatic activation is the most common method, but manual activation can be useful on audio-only players, like the AU335, which do not have a display.

## Automatic Player Activation

Shortly after boot up, assuming no provisioning record was found, the player should display the Activation screen shown below:

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/gdgJSM3e8DZ7VDVIBJKJL_microsoftteams-image-20230411-171038.png)

From this screen, there are several ways to activate the player.

1. As shown on the activation screen, you can use a web browser and go to [http://bsn.cloud/activate](http://bsn.cloud/activate) which will launch BrightSign Author and take you to the appropriate screen for device activation. For those who do not wish to use BrightSign Author, one of the below activation methods may be used in conjunction with [https://control.bsn.cloud](https://control.bsn.cloud).
2. If you are using a smartphone, you can scan the displayed QR code. The QR code contains a link that will take you to the activation web page.
3. Alternatively, select **Player Activation** under the **Admin** tab in either BrightSign Author or via BrightSign Control at which point you will be prompted to enter the code. Once the code has been entered, you will be presented with a message indicating that the player has been activated.

![image-20241218-205048.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/TX2mYHBOEnTMkhwzewzWp_image-20241218-205048.png)

## Manual Player Activation

You must know the player serial number to use manual activation. It can be found on the bottom of the player, or on the side of the packaging box.

1. Go to **Admin > Provision**
2. Select **Add Player**
3. Add the **Player Serial Number**, **Player Name**, and **Player Description** and then **Add Player**

![image-20241218-205142.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/8HelYsWbtiejTKN-HN5HR_image-20241218-205142.png)

Once activated, BrightSign Cloud will know about the player. However, the player will first need to apply its Setup File (as specified by its provisioning record) in order to establish the proper connections to BrightSign Cloud. After the Setup File has been applied, the player will be listed under the [Network](docId\:Uba8sfkMSAJsIBrbv4A6N) tab, assuming that there are no networking obstructions. From here, access to many player settings is available.


[title] GPS Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/-HxormKo9Bepn4IfxJ1tU_image.png" size="10" width="53" height="52" position="center" showCaption="false"}

The GPS Event enables dynamic content changes based on geographic location. For example, one video can be set to play while the player is in one geographic location, and when the player enters another geographic location, another video is displayed.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/2xpNyFnNQslBXKAk3B8qL_image.png)

# Advanced Zone Type

GPS Events can only be applied to an [Advanced Zone](docId:0Vm0UTpL2j8dss-DFNhMo) (as opposed to a Simple Zone) as shown above.

# Set the GPS Port

The icon for the GPS Event will be grayed out until it is specified where the GPS is plugged in (**Presentation Settings > Interactive > GPS** as shown above). Serial port 2 is the player's USB port which is where the GPS device should be plugged into.

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
# Create GPS Events

Once the GPS port has been defined, the GPS Event icon will no longer be grayed out. The GPS icon can now be clicked and be used to trigger GPS Events. When active, the icon will turn blue as shown.

In this example, GPS Events have been created by clicking-and-dragging from the Home (leftmost) video to each of the videos on the right. In addition, a GPS Event is created for each of the right videos by clicking-and-dragging from each of those videos back to the Home video.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/z7U_FxyhFXyRg3e6GPFsO_image.png)
:::
::::

# Entry & Exit Regions

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/PniuzudNKRrQo6f54OzJb_image.png)

Each GPS Event must have either an **Entry region** or an **Exit region**. The Entry region is defined by a circular region, with radius set by the **Buffer Radius**, around specified **Latitude** an&#x64;**&#x20;Longitude** coordinates. The Exit region is set with similar parameters.

If a GPS Event has an Entry region set, that event will be triggered when the player *enters* the Entry region. Similarly, if a GPS Event has an Exit region set, that event will be triggered when the player *exits* the Exit region.


[title] Setup Library
[path] BrightSign Author/Admin/

The Setup Library is where you can view, edit, clone, or delete player Setup Files that have been saved to your BrightSign Cloud account.

1. **New Player Setup**: Click the **New Player Setup** button to add a new Setup File to the Setup Library.
2. **Clone Player Setup**: Click the Clone Setup icon to clone an existing Setup File.
3. **Edit Setup**: Click the Edit Setup icon to edit a Setup File.
4. **Delete Setup**: Click the Delete Setup icon to delete a Setup File.

![image-20241218-183138.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/d2ivSSs_r1MAo86Jqsj_0_image-20241218-183138.png)


[title] BrightControl
[path] BrightSign Author/Presentation/Commands & Conditional Targets/

Sends commands to monitors and other digital signage displays:

- **Display On:** Turns the display on.
- **Display Off:** Turns the display off.
- **Send Hex String** (formerly **Send Ascii String**)**:** Sends a CEC command. The provided string will be converted to hexadecimal format before being sent to the display. 
- **Set source to HDMI 1**: HDMI 1 will be set as the active playback source. Other HDM&#x49;**®**&#x73; are not currently supported as the active source out of the box.
- **Set Philips Volume:** Sets the Philips TV volume.

:::hint{type="info"}
BrightControl CEC command strings cannot contain spaces.
:::


[title] Admin
[path] BrightSign Author/

The Admin tab allows you to set up and provision players, create users, and modify permissions. See the sections below for more details:

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
- [Users](docId\:d2Ji505MJBmH4yU5WVpev)&#x20;
- [Roles](docId\:D1q2MGHt3KsaHZvB-lkCD)&#x20;
- [Setup](docId\:XNnXywMV09iEgZIIt7RWA)&#x20;
- [Setup Library](docId\:HZY2W0MeeeryifOrZ9XFR)&#x20;
:::

:::VerticalSplitItem
- [Provision](docId\:Cyl9kPm02CO5rgcB9WQQv)&#x20;
- [Activate](docId\:OOf-RmqHqFVLhokXI8ypJ)&#x20;
- [Subscriptions](docId\:OHLeb3bjOvk2nX7V625Ps)&#x20;
- [Preferences](docId\:Y7kHm4hE_NXvTF3C3nhti)&#x20;
:::
::::


[title] Media End Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/H1_8cs3_BRCHNJvLzeZUn_mediaendevent.png" size="10" width="87" height="85" position="center" showCaption="false"}

The Media End event is triggered when a video or audio file reaches the end of playback, either going to a new state or remaining on the current state. This event does not work for still images because they do not have a beginning, middle, and end.

## Usage

![](https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/eORjipBjX2VHg3N0YpB6B-20251110-180822.png "Image 1")

1. Select the **Media End Event** in an Advanced/Interactive presentation.&#x20;
2. Drag it to a video or audio file (a green plus sign shows when it is connected).
3. Drag the event to either another file or to the canvas, as shown in Image 1:&#x20;
   - If you drag it to another file, when the original file has played, the next file you selected will play. The Event Properties settings in the right panel lets you change the next file if you wish, as shown in Image 2:

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/3PP2rQojOxPEo01i03gLb-20251110-175744.png" size="56" width="981" height="834" position="center" caption="Image 2" showCaption="true"}

:::Paragraph{listStyleType="disc" indent="2"}
If you drag it to the canvas, the setting will change to **Remain on current state&#x20;**(see Image 3). You then have these options:
:::

:::Paragraph{listStyleType="disc" indent="3"}
**Continuous**: Remain on the current state and continuously loop
:::

:::Paragraph{listStyleType="disc" listStart="2" indent="3"}
**Stop Playback**: Remain on the current state and stop playback to show the last frame
:::

:::Paragraph{listStyleType="disc" listStart="3" indent="3"}
**Stop Playback and clear the screen**
:::

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/BXiQW5C_G_33XZ76Zxu7j-20251110-175106.png" size="56" width="978" height="843" position="center" caption="Image 2" showCaption="true"}

4. In the **Advanced** panle, you can add advanced commands and conditional logic to this event if you desire.


[title] Keyboard Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/1nLA76RLC5H41rwu09Ktw_keyboardevent.png" size="10" width="83" height="82" position="center" showCaption="false"}

The Keyboard event triggers when a BrightSign player receives the specified input from a connected keyboard.

In the **Specify keyboard input** field, enter the keyboard input that will trigger the event. Here is a list of the non-printable keyboard codes:

- Space \<sp>
- Left arrow \<la>
- Right arrow \<ra>
- Up arrow \<ua>
- Down arrow \<da>
- Return \<rn>
- Enter \<en>
- Escape \<es>
- Page Up \<pu>
- Page Down \<pd>
- F1 \<f1>
- F2 \<f2>
- F3 \<f3>
- F4 \<f4>
- F5 \<f5>
- F6 \<f6>
- F7 \<f7>
- F8 \<f8>
- F9 \<f9>
- F10 \<f10>
- F11 \<f11>
- F12 \<f12>
- F13 (Print Screen)\<ps>
- F14 (Scroll Lock) \<sl>
- F15 (Pause Break) \<pb>
- Backspace \<bs>
- Tab \<tb>
- Insert \<in>
- Delete \<de>
- Home \<ho>
- End \<ed>
- Capslock \<cl>
- Mute \<mu>
- Volume down \<vd>
- Volume up \<vu>
- Next track \<nt>
- Previous track \<pt>
- Play/Pause \<pp>
- Stop music \<sm>
- Stop browsing \<sm>
- Power \<pwr>
- Back \<bk>
- Forward \<fw>
- Refresh \<rf>


[title] Set Audio
[path] BrightSign Author/Presentation/Commands & Conditional Targets/

Changes the audio settings of a zone. Note that triggering the Set Audio command while an audio/video file is playing will cause playback to freeze (though the player will still respond to interactive events like Timeout, UDP, etc). You can also use the Set Audio command while displaying an image file, or you can attach the Set Audio command to an interactive event that transitions to or from an audio/video file.

- **Zone**: Specify the zone to which the audio settings will apply.
- **Audio Output**: Enable or disables the Analog Stereo, HDMI®, and SPDIF audio outputs.
- **Pass through**: Supplies the un-decoded audio signal through the HDMI/SPDIF connector. Use this option if the presentation audio (for example, AC3 Dolby Digital) is not supported by the player and is being decoded on an external device.
- **Stereo**: Supplies the decoded audio signal through the HDMI/SPDIF connector.
- **Audio Mixing**: Specify the part(s) of the audio signal to send.
- **Stereo**: Sends both left and right audio signals.
- **Left**: Sends the left audio signal only.
- **Right**: Sends the right audio signal only.


[title] Dashboard and Menus
[path] BrightSign Author/

# Dashboard

Use the Dashboard to get a status overview of your players and jump into common BrightSign Author tasks. Some of the tasks will be greyed out until you **Connect to BSN.Cloud** and sign in to your account (in the upper right corner).

![image-20241023-211754.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/lvleDTgAT0i47shRjDyLh_image-20241023-211754.png)

## 1. Content Mode

This drop-down menu enables switching between content that is **Local** (stored on your computer) and BrightSign Author Plus (bsn.Content)**,&#x20;**&#x77;hich is stored on BrightSign Cloud:

**Local**: Author presentations using content files located on your Mac or PC, and publish them using the Standalone, Local Network, or Web Folder [Publishing Modes](docId\:rEScIigY-dJRPuZgwaA4e). Presentations authored with Local content cannot be directly accessed when **BrightSign Author Plus** (bsn.Content) mode is selected; content must first be uploaded to BrightSign Cloud before it can be accessed.

**BrightSign Author Plus**: Author presentations and feeds using content files that [have been uploaded](docId\:gPjwF1LNjhau_EQZJMfUq) to your BrightSign Cloud network. This option requires a [BrightSign Author Plus](docId:7sQjdlzkP5FQzdP4HNsxv) subscription. Presentations authored with this mode cannot be accessed when **Local** content mode is selected.

:::hint{type="warning"}
This drop-down menu is only available in the desktop, not the browser, version of BrightSign Author.
:::

## 2. Nav Bar

Use the Nav Bar to navigate among the different sections of BrightSign Author. Select the down arrow next to a heading to see additional options (for example, the dropdown menu under Dashboard allows you to access info about the [Network Status](docId:69pLOn-PS9HU-fnFJCVFt) and [BrightSign Cloud Status](docId\:ere9vExDfZ42ps2gjzHYm)).

## 3. Player Status Overview

This bar provides a quick overview of player health. Players must first have been added before their health can be displayed. The following statuses can appear in the status-overview bar:

| **Icon**                                                                                                                                                                                                                          | **Interpretation**                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| <br />::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/rNDTTDX46kJdN1SGC3mTb_image.png" size="20" width="28" height="27" position="center" darkWidth="28" darkHeight="27" showCaption="false"} | Healthy: The player has checked in less than 5 minutes ago.                                                                          |
| <br />::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/HRY1jZQgAy9PU02L2NieW_image.png" size="20" width="28" height="28" position="center" darkWidth="28" darkHeight="28" showCaption="false"} | Connection Lost: The player has not checked in for 5 to 15 minutes.                                                                  |
| <br />::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/vea0lzNHyZF0aEBP-cpEj_image.png" size="20" width="28" height="28" position="center" darkWidth="28" darkHeight="28" showCaption="false"} | Inactive: The player has not checked in for 15 or more minutes.                                                                      |
| <br />::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/msdyEJtodj55J7jXjl6aj_image.png" size="20" width="28" height="30" position="center" darkWidth="28" darkHeight="30" showCaption="false"} | Disconnected: The player has no subscription, or its subscription has expired. This only applies to BrightSign Author Plus networks. |

:::hint{type="success"}
Click the Player Status Overview bar to jump to the [Network](docId\:Uba8sfkMSAJsIBrbv4A6N) tab, where you can get more detailed information about the current status of your players
:::

## 4. Recent presentations

This pane provides a list of recently created/edited presentations. As noted above, you will only see locally saved presentations when **Local** content is selected. Select **Manage Presentations >>** to see all saved presentations.

## 5. Activate Player

[Activate](docId\:OOf-RmqHqFVLhokXI8ypJ) a player for BrightSign Cloud.

## 6. New Presentation

Create a [new presentation](docId:0Vm0UTpL2j8dss-DFNhMo).

## 7. Manage Content

Manage [content](docId\:gPjwF1LNjhau_EQZJMfUq) on your BrightSign Cloud network (this feature does not apply to local storage).

## 8. Manage Schedule

Create or modify [presentation schedules](docId\:go2VHVit1mkPM8WmRwgIT) for players.

## 9. Manage Network

[Manage players](docId\:Uba8sfkMSAJsIBrbv4A6N) that have been added to your BrightSign Cloud network.

## 10. Get Help

[Link](https://www.brightsign.biz/resources/tutorial-videos/) to training and support resources.

## 11. Subscription Information

This section provides the following dynamic subscription information:

- The subscription type
- The total number of subscriptions available and the number that are in use
- The number of days remaining on those subscriptions
- The expiration date of the BrightSign Author Plus subscriptions

# Menu Items

When BrightSign Author is launched, three menus will appear in the menu bar along the top of the window. These menus offer additional functionality.

## BrightSign Author

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/DPyYbQNdTx5_E8yyK-dPG_image-20230810-203701.png" size="50" width="965" height="350" position="center" caption="Mac" darkWidth="965" darkHeight="350" showCaption="true"}

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/amYZSXaFYAXWvCCu2waxx_image-20230810-201028.png" size="50" width="527" height="117" position="center" caption="Windows" darkWidth="527" darkHeight="117" showCaption="true"}

## About BA connected

Displays which version of BrightSign Author you are running, as well as copyright information. 

## Check for Updates...

This allows you to see if there are new BrightSign Author versions, and to update BrightSign Author if you choose to do so.

## Quit BA connected

Use this, or the corresponding key command, to quit the application.

## File

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/twMIf59DFiGZhHlXYeGq9_file2.png" size="70" width="1171" height="600" position="center" darkWidth="1171" darkHeight="600" showCaption="false"}

## New/Open/Import/Recent

These tools allow you to create a new presentation or schedule, open or import an existing presentation, and list recent presentations that can be reopened. As of version 1.37.1, projects with User Events can be imported, such as BrightAuthor .bpf presentations that include User Events. This is useful for migrating projects from BrightAuthor Classic to BrightSign Author.

## Close

This allows you to close the current presentation.

## Save / Save As... / Export 

These tools let you to save or export the current presentation, or to save it with a new name.

## Edit

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/y74-nL0w0hlwG0h1k2qoa_editfinal3.png" size="70" width="1169" height="759" position="center" alt="Edit_FINAL3.png" darkWidth="1169" darkHeight="759" showCaption="false"}

## Undo/Redo

These tools allow you to undo or redo a previous action in the application.

## Cut / Copy / Paste

These tools let you cut, copy, or paste information within the presentation.

## Import States / Export States

These tools let you import and export presentation states.

## Import Variables / Export Variables

These tools allow you to import and export user variables, which can save time when you are creating multiple presentations that use the same set of variables.

## Import User Events/Export User Events

These tools allow you to import and export [User Events](docId\:a6Ali6u-szxHuansk6T3-) from BrightAuthor or from another BrightSign Author presentation. This can save time when you want to reuse events.

Note that you must be in [Local Content](docId\:ZYOMJ6y1H_FuAQL0PD022) mode to import and export **User Events**.

## Replace Media File

This allows you to replace files within media states, but only in a local presentation. You will be prompted to save any unsaved changes.


[title] Serial Input Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/0hN1xCkSziceP8aVRHxnm_serialinputevent.png" size="10" width="83" height="80" position="center" darkWidth="83" darkHeight="80" showCaption="false"}

The Serial Input event triggers when the BrightSign player receives input from a device connected to a serial port.

- **Specify port**: Enter the port number of the input device. Most standard RS-232 serial devices enumerate on port 0. If you are connecting a USB-serial device, it will enumerate on port 2. To configure the serial port, navigate to [Presentation > Interactive > Connectors](docId\:a6Ali6u-szxHuansk6T3-).
- **Specify serial input**: Enter the serial input string that will trigger the event. You can also use the `<*>` wildcard to match some or all of the serial input (i.e., entering `<*>` in this field will match any input, while entering `mycommand_<*>` will match any input message that begins with `mycommand_`).
- **Assign input to variable?**: Check this box to assign the content of the serial input to a User Variable.
- **Input specifies variable**: The serial input string will dynamically specify which User Variable to modify. The serial input string must be sent in the form of `<variable name> : <variable value>`.
- &#x20;**Specify fixed variable**: The serial input string will modify a fixed User Variable. Use the dropdown list to choose which User Variable the serial input will modify. The serial input string must be sent in the form of `<variable value>`.

:::hint{type="success"}
You can use the **Input specifies variable** option to modify more than one User Variable with a single event. Use the following serial input string: `<variable name> : <variable value> !! <variable name> : <variable value>`
:::

- **Assign wildcard to variable?**: Check this box to specify the value of a User Variable using the `<*>` wildcard. Select the User Variable to modify using the dropdown menu to the right. The **Specify serial input** field must contain the `<*>` wildcard, either by itself or with additional text (e.g., `message_<*>`).

:::hint{type="info"}
Wildcards are only supported when the serial port is using the ASCII [protocol](docId\:dKUSdiVRXpUAiUOVm2eHL), not when using the Binary protocol.
:::


[title] Media List End Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/hMqrS5Ionr5sWXk6UBPNO_medialistendevent.png" size="10" width="83" height="80" position="center" showCaption="false"}

The Media List End event lets you transition from a Media List to another state when everything in the list has played. It is triggered when the last Media List item ends.

:::hint{type="info"}
The Media List End event can only originate from a Media List state.
:::

## Usage

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/833IouapNQvJoBopjND_Q-20251110-211514.png" size="68" width="1395" height="1461" position="center" caption="Image 1" showCaption="true"}

1. Drag a **Media List** from the **Widgets** tab onto the canvas.
2. Double-click on the **Media** **List** and drag your assets into it, as shown in Image 1.
3. Select **Back** to go back to the main screen
4. Select the **Media List End** event and drag from it to another state, as shown in Image 2.
5. Once everything in the **Media** **List** finishes playing, it will transition to the other state you selected.

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/5o6fmdra__LUpE0YQyMab-20251110-212956.png" size="68" width="1386" height="921" position="center" caption="Image 2" showCaption="true"}


[title] Timeout Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/iP389E0GTc23qJAJta-CM_timeoutevent2.png" size="10" width="83" height="81" position="center" showCaption="false"}

The Timeout event displays a state for a predetermined period of time before the event is triggered. In the **Time on screen** field, specify the number of seconds the state should display before the trigger. A zero value will display the state indefinitely.

When a Timeout event leads to an HTML widget, you should expect a multi-second delay while the HTML site is loading. HTML states wait until the page is fully loaded before they are displayed to prevent signage consumers from watching pages load. You should consider how the following factors will affect the load time of the page when assigning events to the state:

1. Your internet connection will affect load time for HTML pages, adding some number of seconds to the specified timeout event
2. The timeout value in seconds plus the page load delay in seconds will equal the actual time between the previous state and the display of the HTML on the screen.
3. Results may vary based on your connection speed and the complexity of the HTML page.


[title] Local Playlist State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/CwYd8Vfw7X_5Al2z9Ma73_screenshot-2024-04-29-at-11032-pm.png" size="14" width="192" height="199" position="center" alt="Screenshot 2024-04-29 at 1.10.32 PM.png" showCaption="false"}

:::hint{type="info"}
To use **Local Playlist**, you must be in **Interactive** mode.
:::

The Local Playlist allows you to see and update the playlist content on selected players in a group. This lets you have certain players within a group play different content while the rest play the default content.

# State Properties

- **Name:** The name of the Local Playlist
- **Initial State:** Select this to make this state the home screen

## Default Playlist

This section displays the default playlist content of your players.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more info.

# Local Playlist State

1. Add a **Local** **Playlist** widget to your content in the center pane
2. Double click on the **Local** **Playlist** icon to see the players in a group and their assigned playlist under the **Playlist** column (see Image 1 below).
3. Select a player and **Specify playlist** to assign certain players to play different presentations (in the image, one player is assigned to “Matt Local Playlist 1” while the other players in the group play the default playlist). Or use the filter or search features to see/change playlists content for a subset of players.

![Screenshot 2024-04-29 at 2.11.07 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/F8NkqlU4e6Zmfto-YWW58_screenshot-2024-04-29-at-21107-pm.png)


[title] Zone Volume
[path] BrightSign Author/Presentation/Commands & Conditional Targets/

Sets the volume for a zone. Note that the **Connector Volume** settings take precedence over the **Zone Volume** settings when both are active in a presentation.

- **Set**: Specifies an absolute volume level for a zone. Use the dropdown menu to select the zone to which this command applies and enter a volume value between 0 and 100.
- **Increment**: Specifies how much the volume level increases with each interaction. Use the dropdown menu to select the zone to which this command applies and enter an increment amount.
- **Decrement**: Specifies how much the volume level decreases with each interaction. Use the dropdown menu to select the zone to which this command applies and enter a decrement amount.


[title] Audio State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/-B6KcsG25Dk0ypY6C_T7X_audio.png" size="14" width="243" height="283" position="center" showCaption="false"}

An audio state represents a single audio file.

# State Properties

## Audio State

- **Name**: The name of the audio file
- **Initial State**: Select this to make this state the home screen
- **Select different file:** Brings up a dialogue that lets you select a different audio asset

## Notes

This section lets you store important information about the Audio state for future users. It can be modified at any time.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more information.


[title] Link
[path] BrightSign Author/Presentation/Commands & Conditional Targets/

Connects presentation zones or synchronizes BrightSign players.

- **Synchronize**: Specifies the [Synchronization](docId\:v02mEBLBoCntink_BERQb) trigger.
- **Zones**: Specifies the [Link Zones](docId\:pjppVS1PJCNEppvl8k56U) trigger.

As of BrightSign Author version 1.19.3 and BOS 9.0.101, when a Link synchronization command is added to a state transition event, it automatically makes that state and the zone that it occupies into the leader for other states to follow with a synchronize event. Adding this advanced command automatically enables enhanced synchronization, which means that videos that follow the leader target state will synchronize with the leader’s state using these three methods:

- Jam sync, which ensures that all synchronized videos start at the same time.
- Frame sync, which ensures that synchronized videos adjust their playback speed to match the leader state (frame by frame).
- HDMI-sync or V-sync, which ensures that video frames are all drawn at the same time as they leave the HDM&#x49;**®** port.


[title] Video
[path] BrightSign Author/Presentation/Commands & Conditional Targets/

Changes the video playback settings:

- **Pause video:** Pauses video playback.
- **Resume video:** Resumes video playback.
- **Enable monitor power save mode:** Turns the monitor's power saving mode on.
- **Disable monitor power save mode:** Turns the monitor's power saving mode off.


[title] Link Zones Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/muJGmLfDnr2YZTkpvJ870_linkzonesevents.png" size="10" width="89" height="81" position="center" darkWidth="89" darkHeight="81" showCaption="false"}

Use the Link Zones event, combined with the Link Zones [commands](docId\:az1YTDtEYH-Zp2Dbg_lBL), when you require close, millisecond-level synchronization of content between zones on the same player.

The Link Zones event supports video and image states only; use the Zone Message event to synchronize other states. The Link Zones event provides better synchronization times than the Zone Message event because it pre-loads the next image/video file before displaying it.

Link Zones events cannot be used in the same presentation as Synchronize events; to synchronize zones in a multi-screen presentation, use the Zone Message event.

In the **Specify link keyword** field, enter the message that is sent by the corresponding Link Zones command. 

:::hint{type="info"}
For players running presentations in BrightSign Author version 1.19.3+ and BOS 9.0.101+, [Synchronize Event](docId\:v02mEBLBoCntink_BERQb) is the preferred method of synchronization instead of Link Zones. For players on earlier software, Link Zones is still a valid method.
:::


[title] Subscriptions
[path] BrightSign Author/Admin/

This screen reports the following subscription information:

# Network Status

- Subscription level
- Subscription expiration date
- Number of subscriptions in account
- Number of subscriptions being actively used

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/Ng_K9PBZytmn4XnxSYN92_image.png)

# Network Settings

Contents will be updated on the player without approval if this flag is set. 

Network Settings can only be edited by members of “System Administrators”, “Order Administrators” and “Administrators” roles. If you do not have a BrightSign Author Plus subscription, Network Settings will not be displayed.


[title] Event Properties
[path] BrightSign Author/Presentation/

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
The **Event Properties** pane allows you to view and edit settings associated with Advanced events. To view the **Event Properties** of an event, select an event that is part of your presentation in the **Content** tab. Each event will have different properties associated with it. The Event Properties pane for all events will also contain Target State, View Options, and Advanced menus:

- Target State lets users change the state of the event (to transition to a new state, return to a prior state, or remain on the current state.
- View Options lets users change how the event is viewed in the content window by showing labels or lines, and positioning labels.
- Advanced allows users to add entry and exit commands to that state.
:::

:::VerticalSplitItem


![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/v88cVmufs0wZyh70L5J29_image.png)
:::
::::

# Common Event Properties

All event types have the following properties. For event-specific properties, see the event descriptions below.

- **Event Type**: The event type (e.g. Timeout, Zone Message)
- **Start State**: The state that the event is transitioning from

## Target State

Specify what should occur when the event is triggered:

- **Transition to new state**: The playlist will transition to a new state when the event is triggered. Use the dropdown list to specify the transition target.
- **Return to prior state**: The playlist will revert to the previous state when the event is triggered.
- **Remain on current state**: The state will not change when the event is triggered. This option is useful when you need to perform actions that are not immediately visible, such as sending a UDP command, altering the value of a user variable, or lowering the volume. These actions are performed by attaching [commands](docId\:az1YTDtEYH-Zp2Dbg_lBL) to an event.
- **Continuous**: Audio/video playback is unaffected when the event is triggered.
- **Stop playback**: Audio/video playback stops when the event is triggered, and the stopped frame is displayed for video files.
- **Stop playback and clear screen**: Audio/video playback stops when the event is triggered, and the playback area is cleared.

## View Options

Customize how the event is displayed in the playlist UI.

- **Show line**: Displays a line between the two states connected by the event.
- **Show label**: Displays numbered event labels on the two states connected by the event.

## Advanced

See the [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) page to learn more about the options in the **Advanced** section.

Click on each individual event in the left panel for more info.

# PDF Version

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/BZ_oaX7T3gwjbeiy47plG-20260116-173334.pdf" label="EventPropertiesSection.pdf"}


[title] Network Options
[path] BrightSign Author/Admin/Setup/

A player's network configuration can be set as part of its Setup. From the **Admin > Setup** screen, click **Network Configuration > Network Options**.

Here, you can configure an Ethernet connection, Wi-Fi connection, or USB-connected network access (e.g., a mobile / cellular modem connected via USB) as well as diagnose the player's network connection.

The Network Options screen consists of tabs named Player, Ethernet, Wi-Fi, USB, and Diagnostics, each of which is described below. A red dot will appear next to a tab heading if there is an error or more info is required. In this example, additional info is required to properly configure Wi-Fi:

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/ymNBXEw0czmkzREEIk97I_image.png" size="50" width="713" height="124" position="center" darkWidth="713" darkHeight="124" showCaption="false"}

# Player

This tab allows you to configure various player settings.

## Host Configuration

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
- **Interface Priority**: All network connections that have been enabled are listed here, ordered by priority from highest (top) to lowest (bottom). In the example to the right, the Ethernet connection is the highest priority, then Wi-Fi, then Cellular (via a USB connection). Each listed interface can be dragged and dropped to change their priority. If the higher priority network connection loses connectivity, it will fall back to the next connection in priority. When the higher priority connection is restored, the player will switch back to that connection.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/hFyQ50qXSmqo16UtESzWu_image.png)
:::
::::

- **Specify hostname**: Designate a custom hostname for the player on the local network. By default, the player serial number is used to generate a unique hostname (i.e., `brightsign-<serial_number>`).
- **Use Proxy**: Configure the player to use a proxy server:
  - **Address**: Set the name or address of the proxy server used for HTTP and FTP requests. The proxy string should be formatted as `http://user:password@hostname:port`. The hostname can contain up to four `*` characters; each `*` character can be used to replace one octet from the current IP address. For example, if the IP address is currently 192.168.1.2, and the proxy is set to `proxy-*-*`, then the player will attempt to use a proxy named `proxy-192.168`.
- **Download Window**: Checking this box restricts player content downloads to a certain time of day or Download Window. This is useful if you want to limit network traffic during certain hours. This option is not applicable to Standalone and Local Network Setups since players using those Setups are not connected to the internet.
  - **Start time:** The beginning of the Download Window in 24-hour format.
  - **End time**: The end of the Download Window in 24-hour format.
- **Time Server**: Specify the server that the player should use to synchronize its clock. Players use the time server at [http://time.brightsignnetwork.com](http://time.brightsignnetwork.com) by default. Supported protocols are as follows:
  - `ntp://host` - Uses NTP.  
  - `http://host\[:port\]` - Uses HTTP \[with an optional port].
  - `https://host\[:port\]` - Uses HTTPS \[with an optional port].
  - `httpns://host[:port]` - Uses HTTPS \[with an optional port], but ignores cert failures.

## Certificates

:::hint{type="info"}
You can potentially run out of space on your player if you do not remove any existing CA packages before adding new ones. See [RemoveCAPackage(package\_name As String) As Boolean](docId\:GhSZNW9eS8TEMURQXq-DU) for information on how to remove a CA package.
:::

Some networks require certification. CA certificates can be added as part of a player's Setup or via API through [roKeyStore](docId\:GhSZNW9eS8TEMURQXq-DU). To add CA certificates to a player Setup:

1. In the BrightSign Author **Admin > Setup&#x20;**&#x73;creen, go to **Network Configuration > Network Options** and click the **Player** tab.
2. Under the **Certificates** section, the following fields exist:
   - **Name**: Designate a unique name. 
   - **Certificate:** Browse to select the file that you want to add.
3. Select **Apply** to apply the certificate to the Setup.

For more information about CA certificates, see [Add Digital Certificates](docId\:j17PU2fWzG7niK1NIYT-Y).

# Ethernet

Network access over Ethernet is enabled by default.

## Network Settings

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
### DHCP Enabled

By default, the player will let a DHCP server automatically assign the player an IP address. Uncheck this to assign a static IP address to the player.

- **IP Address:** This value must be provided.
- **Subnet Mask:** This field will error if it fails subnet mask validation.
- **Default Gateway:** The default gateway is any IPv4 address, The gateway address will be validated against the subnet mask and will error if it is not valid.
- **DNS1:** This value must be provided to resolve domain names to the IP address.
- **DNS2:** This value is optional.
- **DNS3:** This value is optional.

### Add VLAN

- **VLAN ID:** A VLAN ID is optional for physical LAN and required when using one or more virtual LANs.
- **Add VLAN:** Allows the user to add virtual LANs. Use the trashcan on the top right to delete these additional addresses if they are not needed.
:::

:::VerticalSplitItem


![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/TejLciqnZCWNBXRZNNOyJ_image.png)
:::
::::

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
## Download Rates

This feature enables you to set rate limits when downloading content. Rate limits can be set for **During** or **Outside&#x20;**&#x74;he **Download Window** as well as **During Initial Downloads**.

- **Unlimited Download Rate**: Sets no limit on downloads.
- **Default limit**: Sets the default limit (2,000 kbps) on downloads.
- **Specify limit**: Sets a customized limit. Enter a limit in the text field in kbps.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/1aHyaAcWQKMYK9Hf6_Z6__image.png)
:::
::::



::::VerticalSplit{layout="right"}
:::VerticalSplitItem
## Network Security

### Enable 802.1x

Click to enable 802.1x and select options for the following:

- Network Authentication Variant (EAP-TLS or PEAP / MSCHAPv2)
- EAP-TLS Certificate (PKCS#12 or X.509 PEM/DER).

## Data Types Enabled

Use the checkboxes to determine the data types that can be transferred using the connection. You can enable/disable downloads (**Content**, **Text Feeds**, **Media Feeds**), as well as uploads (**Health**, **Log Updates**).
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/WIWY-k8ULwzAO0xeYdZP__image.png)
:::
::::

# Wi-Fi

Players can use Wi-Fi to connect to the network via either an internal Wi-Fi module (sold separately; see [Wi-Fi, SSD, & Cell Modem Info](docId:54O8NV8TSDVXiP35hf4cg)) or an external Wi-Fi bridge (e.g., a Wi-Fi game adapter connected to the Ethernet port).

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/CaRkiGrXFZ7mKNsfozjFy_image.png" size="50" width="713" height="715" position="center" showCaption="false"}

## Enable Wi-Fi

Wi-Fi is not enabled by default. Click to enable Wi-Fi.

## Network Settings

Specify the required credentials for connecting to the Wi-Fi network.

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
### SSID

Enter the Wi-Fi network's name.

### Password

Enter the Wi-Fi network's password.

### DHCP Enabled

By default, the player will let a DHCP server automatically assign the player an IP address. Uncheck this to assign a static IP address to the player. The required fields for the static IP address are similar to those described for an Ethernet connection above.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/o6pD1O4CbcYodopEWWRFC_image.png)
:::
::::

## Network Security

Set up authentication for your Wi-Fi connection

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
### Enable WPA Enterprise

**Network Authentication Variant**

- **EAP-TLS:** Authenticate using Extensible Authentication Protocol - Transport Layer Security (defined in [https://www.rfc-editor.org/rfc/rfc5216.html](https://www.rfc-editor.org/rfc/rfc5216.html) )
  - **Choose EAP-TLS Certificate**: Select a certificate-based authentication and enter an optional passphrase:
    - **PKCS#12**
    - **X.509 PEM/DER**
- **PEAP/MSCHAPv2:** Authenticate using Protected Extensible Authentication Protocol.
- **Select Additional CA Certificate**: This should be the root CA certificate for the CA which signed the authentication server certificate. If omitted, the server certificate will not be validated.
- **Data Types Enabled**: Use the check boxes to determine the data types that can be transferred using the connection. You can enable/disable downloads (**Content**, **Text Feeds**, **Media Feeds**), as well as uploads (**Health**, **Log Updates**).


:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/a_vzCU0SKV0WA5-YiJYIl_image.png)
:::
::::

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
## Rate Limit Network Download Traffic

Set rate limits for downloading content. Rate limits can be set for **During** or **Outside&#x20;**&#x74;he **Content Download Window** as well as **During Initial Downloads**.

- **Unlimited Download Rate**: Sets no limit on downloads.
- **Default limit**: Sets the default limit (2,000 kbps) on downloads.
- **Specify limit**: Sets a customized limit. Enter a limit in the text field in kbps.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/p2aeUzKSisGo5qoK9wAnp_image.png)
:::
::::

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
## Data Types Enabled

Use the checkboxes to determine the data types that can be transferred using the connection. You can enable/disable downloads (**Content**, **Text Feeds**, **Media Feeds**), as well as uploads (**Health**, **Log Updates**).
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/qsqSD6DNAqJ0Va6DXIExr_image.png)
:::
::::

# USB

The USB tab allows you to control the settings for USB-based networking interfaces (e.g., USB modems, USB Ethernet, or Wi-Fi adapters).

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/BA0f-JJso79-FHznZFXbt_image.png" size="50" width="713" height="715" position="center" showCaption="false"}

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/UIuwQ05EbwRjDNWrQCYuY_usbnetworkoptions.png" size="60" width="1087" height="989" position="center" showCaption="false"}

## Enable USB Networking

USB Networking is not enabled by default. Click to enable.

## Network Settings

Lets you select any of the following options:

- **Ethernet:** 
- **Wi-Fi:** Enter the **SSID** and **Security Key** for DHCP, or a **Static Address** 
- **BrightSign Mobile:** The BrightSign cell modem will be automatically selected
- **Rate Limit Network Download Traffic** (this option is only available if Network Configuration is Wi-Fi): Set rate limitations for downloading content. You can also set rate limitations for **During content download window** and **During initial downloads**.
  - **Unlimited Download Rate**: Sets no limit on downloads.
  - **Default limit**: Sets the default limit (2000 Kbps) on downloads.
  - **Specify limit**: Sets a customized limit. Enter a limit in the text field (in Kbps).

# Diagnostics

- **Enable network diagnostics**: Have the player display the Network Diagnostics screen during setup. The player will keep rebooting until it passes the specified tests, so in general, only use network diagnostics for testing purposes and turn it off in production environments.
  - **Test Ethernet**: The Network Diagnostics screen will indicate whether or not it was able to attain an IP address over Ethernet.
  - **Test Wi-Fi**: The Network Diagnostics screen will indicate whether or not it was able to attain an IP address over wireless.
  - **Test Internet Connection**: The Network Diagnostics screen will indicate whether or not it was able to communicate with a remote server.

# PDF Version

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-p-pxWqJacJlETJHhSNdJt-20250716-213618.pdf" label="Network Options.pdf"}


[title] User Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/yDoP8IRuVMZPDDrU4J6UI_brighter.png" size="10" width="97" height="91" position="center" alt="Brighter.png" darkWidth="97" darkHeight="91" showCaption="false"}

This feature allows you to combine and save interactive events so that you can easily use them in the future. **User Events** save both the event type and event parameters.

The **User Event** must first be defined in [Presentation Settings](docId\:a6Ali6u-szxHuansk6T3-) before it can be added to your presentation. If you have multiple **User Events** in your library, select the correct event under **Specify user event**.

:::hint{type="info"}
This feature was implemented in BrightSign Author version 1.37.1
:::


[title] BrightSign Cloud Status
[path] BrightSign Author/Dashboard and Menus/

The BrightSign Cloud Status page allows you to see the System Status, subscribe to updates, and report problems. The page defaults to the current day, but you can use the Calendar to see BrightSign Cloud status for previous days as well:

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/HSS-zmW4gHJzwCoBgbn2v-20260409-163352.png)


[title] Display a Google Calendar
[path] How-tos/

BrightSign players can display a Google Calendar in an [HTML5 State](docId\:AkrM58NDS_BN6AyhWZRax). To display a Google Calendar in full-screen mode (1920x1080):

1. In Google Calendar, go to **My Calendars** (on the left side directly below the overview of the current month). Find the calendar to display.
2. Hover your mouse over the calendar name and click **Options for** **"Name of Calendar" > Settings and sharing**.
3. Check the **Make available to public** box and click **Ok**.
4. Scroll down to **Integrate calendar** and copy the URL in **Public URL to this calendar** (see the Image below).
   1. If you are using BrightSign Author, paste the URL from Google Calendar into the **URL** field in **State Properties > Source > Site** **Source** in your **HTML5** state. 
   2. If you are using BrightAuthor Classic, paste the URL from Google Calendar into the **URL** field when creating or editing an **HTML5** state.

**Note:** You should refresh the page by adding a 30 second [Timeout Event](docId\:p2IAPuAXjbsLp4yNaqlet) to the HTML5 state. This will ensure that changes will be displayed within an acceptable time.

![Screenshot 2024-04-23 at 8.41.25 AM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/kGDlAhJM1sKOqPc3m7hyH_screenshot-2024-04-23-at-84125-am.png)


[title] Play Videos with Audio Despite Chromium Restrictions
[path] How-tos/

The following Chromium flags are not yet supported on BrightSign players:

- `disable-user-media-security`
- `allow-hidden-media-playback`
- `autoplay-policy="no-user-gesture-required"`

To automatically play videos with audio despite these Chromium autoplay restrictions, start your video with its audio muted and activate the audio shortly after video playback begins. This will work on a player’s browser (not in a Chrome browser).

# Example

In the example below:

- `source` is set to `video.mp4`
- `type` is `mp4`
- `width` is `640`
- `height` is `360`
- The audio is activated 100 milliseconds into the video

```html
<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <video id="myVideo" width="640" height="360" autoplay muted>
        <source src="video.mp4" type="video/mp4">
    </video>

    <script>
        const videoElement = document.getElementById("myVideo");

        videoElement.addEventListener("canplaythrough", function() {
            setTimeout(function() {
                videoElement.muted = false;
            }, 100); // Adjust the delay (in milliseconds) if necessary
        });
    </script>
</body>
</html>
```


[title] Bezel Compensation for Video Walls
[path] How-tos/Create a VideoWall/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

# Layout Overview

A bezel is the physical frame around the display area of a panel, which usually contains a border of black (inactive) pixels that separate that display area from the display area on adjacent panels. If there is no compensation for the bezel, it can cause alignment issues. Bezel compensation, which discards the display content under the central bezels, should be applied to video walls to ensure that displayed images move smoothly across adjacent panels.

# Calculate Bezel Size

You must know the screen width and height to calculate the bezel size. The formula to calculate the size of a screen bezel in pixels from millimeters is:

(Screen width/height in pixels) X (Bezel size in millimeters) / (Screen width/height in millimeters) = Bezel size in pixels

See the example below for more information.

:::hint{type="warning"}
Note that bezels on the ‘outside of the layout’ aren’t included, meaning no matter how large they are, if a zone is placed at \[0, 0] on the zone layout canvas, it will indeed start at the top left of the first screen in the layout.
:::

## Example

This example uses a four panel display wall (see image below) where the panel dimensions are 1100mm (1920 pixels) by 620mm (1080 pixels), the horizontal bezel is 17mm, and the vertical bezel is 20mm.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/bPIkuQZHQgLdsxTUmjAhp_bswallwbg4.png)

To get the number of pixels in the horizontal bezel area, multiply the screen width in pixels by the bezel in millimeters, then divide by the screen width in millimeters: 

(1920p x 17mm) / 1100mm = 30 pixels

To get the number of pixels in the vertical bezel area, multiply the screen height in pixels by the bezel in millimeters, then divide by the screen height in millimeters:

(1080p x 20mm) / 620mm = 35 pixels.

To get the total bezel-adjusted resolution, add the width to the height:

(1920p + 30p + 1920p) + (1080p + 35p + 1080p) = (3870 x 2195 pixels)

# Configure a Video Wall with Bezel Compensation

The BrightScript code below sets up a 1x2 video wall with bezel compensation via [roVideoMode](docId\:QQ734nQz0hCwNI0uNSdMP). To include this code as a custom script in your presentation:

1. Open your presentation and select either the **Layout** or **Content** tab.
2. Go to **Presentation Settings** **>** **Support Content&#x20;**&#x69;n the right panel.
3. In the **Video Mode Plugin&#x20;**&#x73;ection, use the plus arrow to add a new BrightScript file (for example, bezel.brs) which contains the snippet.
4. Save & publish.

```text
vm = CreateObject("roVideoMode")
sm = vm.GetScreenModes()

sm[0].video_mode = "1920x1080x60p"
sm[0].transform = "normal"
sm[0].display_x = 0
sm[0].display_y = 0
sm[0].enabled = true

sm[1].video_mode = "1920x1080x60p"
sm[1].transform = "normal"
sm[1].display_x = 0
sm[1].display_y = 1100    'Bezel compensation of 20 pixels 
sm[1].enabled = true

sm[2].enabled = "false"
sm[3].enabled = "false"

vm.SetScreenModes(sm)
```


[title] Pause / Resume a Video
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

You can attach [Commands](docId\:az1YTDtEYH-Zp2Dbg_lBL) to events to pause and resume videos in a BrightSign Author presentation. 

1. Create an [Advanced presentation](docId:0Vm0UTpL2j8dss-DFNhMo) with a video.
2. Select the desired event from **Events** and add it to the video. 
3. Ensure the event is selected and in **Event Properties > Target** **State**, choose **Remain On Current State - Continuous**. 
4. In **Advanced**, click **Add Command** and select **Video** from the drop-down list.
5. Select **Pause**.
6. Create a second event with the same configuration and choose **Video - Resume**.


[title] Add Node.js to Presentations
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

You may need to compress your Node.js file to import it into BrightSign Author. See [Node.js](docId\:vlSKfVzeQu04pD58rvXam) for more info.

# New Presentation

::::WorkflowBlock
:::WorkflowBlockItem
In the **Presentation** dropdown menu, select **New Presentation**.
:::

:::WorkflowBlockItem
Select **Single Zone > Node.js** as the presentation type.
:::

:::WorkflowBlockItem
Enter a presentation name.
:::

:::WorkflowBlockItem
Select the Node.js file you want to include in the presentation, as shown:

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/fGPWxEKDkE9SsFMSu_m9v_screenshot-2025-03-10-at-102918-am.png)
:::

:::WorkflowBlockItem
Select **Start**.
:::

:::WorkflowBlockItem
Save and publish your presentation. You will be able to see your Node.js content in **Presentation Settings > Support Content**.
:::
::::

# Existing Presentation

To add a Node.js file to an existing presentation, select the plus sign in **Presentation Settings > Support Content**, as shown:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/ySdgfrFPfZawoIpVIfKPD_screenshot-2025-03-07-at-24135-pm.png" size="50" width="822" height="804" position="center" darkWidth="822" darkHeight="804" showCaption="false"}

:::hint{type="info"}
Node.js can only be enabled on HTML5 states pointing at Local Site.
:::

# Other Resources

See these pages for more info:

- [Node.js](docId\:vlSKfVzeQu04pD58rvXam)&#x20;
- [https://github.com/brightsign/node.js-starter-project](https://github.com/brightsign/node.js-starter-project)








[title] Standard (Linked / Sync'd) Videowalls
[path] How-tos/Create a VideoWall/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

The link/sync command can be used to synchronize two or more zones containing video. These zones can be sync'd on one player without player clock synchronization, or they can be synchronized across multiple players when player clock synchronization is enabled in the **Presentation Settings**, as shown below.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-CFiDqVc_FZAwLEe9vmemT-20250902-185414.png" size="44" width="807" height="1374" position="center" showCaption="false"}

# Create the Leader Presentation

::::WorkflowBlock
:::WorkflowBlockItem
Select **New Presentation** in the Dashboard
:::

:::WorkflowBlockItem
Select **Standard** as the **Presentation Type**
:::

:::WorkflowBlockItem
Enter a **Name** (for example, "Upper Left")
:::

:::WorkflowBlockItem
Select **Start**
:::

:::WorkflowBlockItem
This will take you to a new window. Double-click on the zone in the center panel.
:::

:::WorkflowBlockItem
Switch the **Interactive** slider at the top right to make the presentation interactive.
:::

:::WorkflowBlockItem
Drag your starting image onto the screen to prepare for synchronization as well as a video.
:::
::::

# Set the Sync Commands

::::WorkflowBlock
:::WorkflowBlockItem
Add a **Timeout** event to the image and drag it to the video (see Image 1)

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/STBlqpNb-T2Udk7EjZ5oJ_image1b.png)
:::

:::WorkflowBlockItem
Add a **Media End** event to the video and drag it to the image
:::

:::WorkflowBlockItem
Select the **Timeout** event on the image and open the **Advanced** tab. Select **Add Command:**

- Select **Link** under **Command**
- Chose **Synchronize** as the **Command Parameter**
- Choose the down arrow and then enter "play" as the **Keyword**:

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/43s6CgsflL5Ykvbp4heFE_image2a.png)
:::

:::WorkflowBlockItem
On the **Media End** event on the video, select **Add Command:**

- Select **Link** under **Command**. 
- Chose **Synchronize** as the **Command Parameter**.
- Choose the down arrow and then enter "stop" as the **Keyword**. 
:::

:::WorkflowBlockItem
You can optionally add a **UDP Media** event to the image and name/label it "play", and add a **UDP Media** event to the video and name/label it "stop". Select the UPD Media event icons and under the **Advanced** tab, select **Add Command**:

- Select **Link** under **Command**
- Chose **Synchronize** as the **Command Parameter**
- Choose the down arrow and then enter "play" as the **Keyword** for the image **UDP Media** event and enter "stop" as the **Keyword** for the video **UDP Media** event
:::

:::WorkflowBlockItem
Select **Publish** in the top right corner and **Save**
:::

:::WorkflowBlockItem
This will take you to the **Schedule** tab. Select a networked unit to play the presentation by clicking the correct box under **Networked Units.**
:::

:::WorkflowBlockItem
Select **Publish**. Your display screen will now receive the presentation you sent it over the network.
:::
::::

# Create the Follower Presentations

::::WorkflowBlock
:::WorkflowBlockItem
While the player reboots, return to the presentation in the **Presentation** tab
:::

:::WorkflowBlockItem
Select **Save As** and give the presentation a new name (for example, Upper Right)
:::

:::WorkflowBlockItem
Remove the **Timeout** and **Media End** events from the image and video and add a **Synchronization** event to the image:

- Drag the event from the image to the video.
- Enter "play" under **Specify synchronization keyword**:

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/VhCjanrR7GooEC0mASJtA_image3.png)
:::

:::WorkflowBlockItem
Add a **Synchronization** event to the video:

- Drag the event from the video to the image.
- Enter "stop" under **Specify synchronization keyword**
:::

:::WorkflowBlockItem
Select **Publish** in the top right corner, and **Save**
:::

:::WorkflowBlockItem
In the **Schedule** tab, assign this presentation to the correct player (for example, the upper right player) by clicking the correct box under **Networked Units**
:::

:::WorkflowBlockItem
Repeat these steps until each player has been assigned a separate presentation
:::
::::


[title] Video Guides
[path] How-tos/

Watch these concise, easy-to-follow videos to learn how to use your BrightSign player. Videos are organized into the categories listed below (also accessible from the left panel).

:::hint{type="warning"}
While we do our best to keep the videos up to date, some of the video guides may show older versions of the software / user interface. These videos will be undergoing a major revamp in the coming months.
:::

# [Presentations](docId\:mLhkoS5yd5fricge0RcKd)

Creating presentations.

# [Interactivity](docId\:Aau5UThsUT9WXrNkyQSAl)

Touch and button panels for interactive presentations.


[title] Interactivity
[path] How-tos/Video Guides/

# How to User Interactive Touch Features

In this tutorial, you will learn how to use BrightSign Author (BrightAuthor\:connected) to create an interactive playlist, which enables users to select a video from a menu using a touchscreen or mouse.

::embed[]{url="https://vimeo.com/369709919"}

[Download Sample Assets](https://www.brightsignnetwork.com/download/Videos/Training%20Videos/Interactive-Touch-assets.zip)

# How to Use Interactive Button Panels

In this tutorial, you will learn how to build an interactive presentation that uses a button panel to trigger content.

::embed[]{url="https://vimeo.com/371507437"}


[title] Create Image Transitions
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

Image transition effects are currently available in BrightSign Author (and ) for images in the [Image State](docId\:aC3srsjbmpI1w2gN0Y3El) menu (the duration can also be set).

![Screenshot 2024-04-18 at 10.13.08 AM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/IjB9wDXatfY3TLJ6Q6Zjc_screenshot-2024-04-18-at-101308-am.png)


[title] Add Plugins to Presentations
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

See [https://github.com/brightsign/BrightAuthor-Plugins](https://github.com/brightsign/BrightAuthor-Plugins) for a repository of custom BrightScript plugins that extend the functionality of BrightSign Author as well as .

::::WorkflowBlock
:::WorkflowBlockItem
Open a new or existing presentation.
:::

:::WorkflowBlockItem
Go to **Presentation Settings** **> Support Content**.
:::

:::WorkflowBlockItem
Click the **+** beside **Script Plugin** or **Parser Plugin**, depending on which type of script you want to upload. 
:::

:::WorkflowBlockItem
Enter the script name in the **Script Plugin Name** or **Parser Plugin Name** fields. To find the object name of a script plugin:

- Open the plugin with a text editor and find the initialization function at the beginning of the script. It will begin with the line `Function [plugin]_Initialize(...) As Object`. See the highlighted text in the example image below.
- Find the "return" call at the end of this function. The returned object name must match the text in the **Script Plugin Name** field. Again, see the highlighted text in the image below.

![Screenshot 2024-05-01 at 10.37.10 AM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/HKF5DTguZzwpvADn2iHX-_screenshot-2024-05-01-at-103710-am.png)
:::

:::WorkflowBlockItem
Add the plugin:

- If you are a BrightSign Author Plus subscriber, upload the plugin under **Content > New Component** > **Upload Script** and add it to your Content Library. Then go to **Script Plugin Source > BSN Scripts** (for Script Plugin) or **Parser Plugin Source** **> BSN Parsers** (for Parser Plugin) to add it to the presentation.
- If you don't have access to BrightSign Author Plus, go to **Script Plugin Source > Local Script Plugin** (for Script Plugin) or **Parser Plugin Source > Local Parser Plugin** (for Parser plugin) to add a plugin locally. If the plugin source isn't available, confirm that the BrightScript site is uploaded to the **Content Library** under **Components > Scripts**. 
:::
::::


[title] Author
[path] /

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/GXbFkpvUoPBDTn8Uxkv7A_author-icon-lm.svg" darkSrc="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/YKNfbf3HINMWmOsASV0Ly_author-icon-dm.svg" size="20" width="185" height="210" darkWidth="185" darkHeight="210" position="center" showCaption="false"}

There are generally two approaches for authoring player content: BrightSign presentations and web presentations.

# BrightSign Presentations

Players can display presentations created with BrightSign's authoring tools.

## Author & Author Plus

In addition to *managing* player content, [BrightSign Author](docId:7xqhhE03hrlS_QzV35_ta) can also be used to *author* the presentations that players display. From simple looping videos to advanced interactive displays with multiple zones, BrightSign Author gives you the tools to realize your most creative digital signage ideas.&#x20;

::::VerticalSplit{layout="left"}
:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/T6vd0v69-yqv5ROrqaNIo_image.png" size="60" isUploading="false" width="429" height="154" darkWidth="429" darkHeight="154" showCaption="false"}
:::

:::VerticalSplitItem
[BrightSign Author](docId:7xqhhE03hrlS_QzV35_ta) is BrightSign's free CMS for the authoring and managing of content that players display.
:::
::::

::::VerticalSplit{layout="left"}
:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/wFF4J1hjV6bUXpIgperZb_image.png" size="80" isUploading="false" width="600" height="166" darkWidth="600" darkHeight="166" showCaption="false"}


:::

:::VerticalSplitItem
The subscription-based [BrightSign Author Plus](docId:7xqhhE03hrlS_QzV35_ta) adds cloud-based content management, ideal for larger (more than 10 players) and/or geographically-dispersed deployments.
:::
::::

# Web Presentations

The Chromium engine built in to every player enables players to display standards-compliant web pages. Players can thus display web presentations created with popular web technologies (i.e., HTML, JavaScript, etc.).

***

::::ExpandableHeading
# Legacy Products

:::hint{type="warning"}
The legacy software and services below either have been replaced or are being replaced by the offerings above. While we continue to offer these legacy products, their development has largely ceased, and they will eventually be deprecated and replaced with the solutions above.

We recommend that you use the latest software and services listed above.
:::

### [BrightAuthor Classic](docId\:esnt254wtrJUehfmyAj1-)

Our legacy app for authoring and management of players and content.

### [BrightSign Network (BSN)](docId:5bospe_fB82pcTnnERJPy)

Our legacy cloud platform for player and content management.

### [BrightMenu](docId:5oLRP4Vu9o-rPi6HZ6CjV)

Control and update your menu from your phone.

### [BrightLink](docId\:BPHncrbhFOorFVu627xWk)

View and control interactive digital signs with your mobile phone.&#x20;


::::


[title] Provision
[path] BrightSign Author/Admin/

# Overview

As covered in the [BrightSign Primer](docId\:d1tz0hy4BH9NGCvuoE3Of) section, setting up a player for use involves applying a [Setup](docId\:XNnXywMV09iEgZIIt7RWA) to the player, and applying a Setup File to a player using BrightSign Cloud is known as provisioning.

When powering up a new or [factory reset](docId\:ynCF7P2PYZo2qedF1JYim) player that has previously been provisioned, the player will automatically retrieve and apply the Setup File that was previously applied to it.

In many cases, it is best to provision the player prior to powering up the player. Players can be provisioned using the methods described below, and once provisioned, the player will configure itself per the applied Setup File upon bootup.

![image-20241218-183242.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/nqDBgod3-_ZmZGDb20cua_image-20241218-183242.png)

# Prerequisites

1. You must be logged in to a BrightSign Cloud account.
2. Note the player serial number, which can be found on the bottom of the player or on the side of the packaging box.
3. Connect the player(s) to an active network connection and to a display screen through HDM&#x49;**®**.
4. The player(s) must have a blank, properly formatted storage device.
5. You must have a [Setup File](docId\:XNnXywMV09iEgZIIt7RWA):
   - Note the Setup File name.
   - Make sure that the Setup File is in the library (when creating the Setup File, choose **Add Setup to Library**).

# Provisioning Individual Players

## Add Player

1. Go to **Admin** > **Provision**.
2. Select **Add Player** to add a player to the Provisioning list. You will be prompted to enter the following information:
   - **Serial Number**: The serial number of the player.
   - **Player Name** and **Player Description**: An optional name and description for the player. If these are not specified, the values in the **Setup** will be used.

![image-20241218-183334.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/aFwTw_LkFDJcBqvFiHavL_image-20241218-183334.png)

### Player Already Registered

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
If you enter a serial number of a player that has already been provisioned, you will get an error as shown to the right.

If the player was brand new when obtained, then you or someone in your organization likely already provisioned the player and you should be able to find the player in the Player Provisioning list.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/N5ChmUMJtV0YQlK091D0h_image.png)
:::
::::

However, if the player was previously owned and provisioned, the previous owner / administrator must delete the player's provisioning record from their BrightSign Cloud network before you can provision the player for your BrightSign Cloud network.

:::hint{type="warning"}
For security reasons, only the current administrator of a player is able to delete that player's provisioning record. BrightSign is generally unable to remove player provisioning records. If you have a player that was previously provisioned, contact the previous owner / administrator and request that they [delete the player's provision record](docId\:Cyl9kPm02CO5rgcB9WQQv).
:::

## Apply Setup

From **Admin** > **Provision**:

1. Select the checkbox next to the player(s) you want to provision.
2. Select **Apply Setup:**
   - If the players have not been previously provisioned, they will download the appropriate **Setup** from the BrightSign Cloud servers when they boot up.
   - If the players have had a Setup File applied previously, the new Setup File will take effect only when that player has been explicitly re-provisioned.

:::hint{type="warning"}
It is important to note that **Apply Setup** strictly establishes *what* should be applied to the player *when* the player is re-provisioned. If a previously provisioned player reboots or even if it is factory reset, it will *not* adopt the new Setup until the player has been *explicitly re-provisioned*. Re-provisioning is covered below.
:::

The **Apply App URL** option lets you assign an application, via a player-accessible URL, to selected players in the list. Upon boot up, the players will download the application package from the specified **App URL** and set up the player for that application. App URL will shortly be renamed to CMS URL.

![image-20241218-183436.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/xDJfK7BuYaRlNcPjlGOlA_image-20241218-183436.png)

You can also **Delete Player(s)** from the Provisioning list. If you delete a player's provisioning record, it will be disassociated from its BrightSign Cloud network and will no longer automatically retrieve a Setup package from BrightSign Cloud. When a player is booted up without an associated provisioning record, it will display an activation code, which you can use to create a provisioning record for the player. Other methods of provisioning the player are the BrightSign Author **Provision** tab or the B-Deploy API.

# Bulk Provisioning

Bulk Provisioning is the process of provisioning multiple players at once.

1. Go to **Admin** > **Provision**.
2. Select the download icon to download the Provisioning Template as a CSV file. Enter the:
   - **Serial Number** (required)
   - **Player Name**
   - **Setup** name (required)
   - **App URL**
   - **Description**
3. Save the CSV file.
4. Select **Upload Provisioning File** to upload the saved CSV file. Once the file has been uploaded, players listed in the file will be automatically provisioned per the file.
5. Review the player list for bulk provisioning and select **Submit**. The players will automatically download and apply the new Setup Files from the cloud.

:::hint{type="info"}
Note that the CSV template includes a column for Setup as well as App URL. If a player is desired to be provisioned for App URL, it can be done with a Setup File where the Setup File includes the App URL information. Alternatively, the App URL can be directly entered in the CSV file, negating the need for a Setup File.
If a Setup File that includes an App URL is specified *and* an App URL is entered in the CSV column, the App URL in the Setup File will take precedence.
:::

# Default Provisioning

If a Setup File is not explicitly applied to a player, the [Default Setup](docId\:XNnXywMV09iEgZIIt7RWA) will be applied to the player when it is provisioned.

# Reprovisioning

As mentioned above, **Apply Setup** strictly establishes *what* should be applied to the player *when* the player is reprovisioned. If a previously provisioned player reboots or even if it is factory reset, it will *not* adopt the new Setup File until the player has been *explicitly re-provisioned*.

The re-provisioning process performs the following actions:

1. Clears the player storage
2. Clears the registry settings used by BrightSign Cloud but retains some register settings, specifically the player’s networking settings (e.g., WiFi configuration).
3. Reboots the player
   - Upon reboot, the player will download and apply the Setup File associated with its provisioning record.
   - If no Setup File has been applied to the player, the player will boot to the [Activate](docId\:OOf-RmqHqFVLhokXI8ypJ) screen.

Re-provisioning a player consists of the following steps:

1. Apply a new Setup File to the player.
   - When a player is added (either via **Provision** > **Add Player** or via a Provisioning File using the Provisioning template) with no Setup File explicitly applied, the Default Setup File will be applied.
2. Explicitly re-provision the player so that the new Setup takes effect.

## Apply a New Setup

To re-provision the player, first go to **Admin > Provision** where you should see your player(s) listed. From here, follow the steps below.

![image-20241218-203140.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/AFE0G65WCiMuSyX9kQyvI_image-20241218-203140.png)

1. Select the player from the list. Multiple players can be selected to apply the same Setup to.
2. Click **Apply Setup**.

![image-20241218-203300.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/d9luXRpKX0oMKfEy-W0Sf_image-20241218-203300.png)

3\. A pop-up will appear with a drop-down list of all the Setup Files in the Setup Library. Choose the desired Setup File from the drop-down list and click **Apply Setup**.

## Reprovision the Player

:::hint{type="warning"}
When a new Setup File is applied to a player, the new Setup File does *not* automatically go into effect on the player. After applying the Setup File, the player must be explicitly reprovisioned (after which the player will reboot) in order for the new Setup File to be active on the player.
:::

Find the player in the **Network** tab and select the settings (gear) icon:

![image-20241218-203424.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/v3DXxxTvclkX4p84UIVv4_image-20241218-203424.png)

From there, navigate to the **Control** tab, **Reprovision Player**. Note the actions that will occur and select **Reprovision**.

![image-20240424-184507.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/_KL03LnPKnkND4hvMZu3C_image-20240424-184507.png)

There may be a message asking to confirm that there is indeed a Setup that has been applied to the player. If a Setup has not been first applied to the player, the player will connect to BSN.cloud to download and apply the Default Setup.

# Deleting a Provision Record

1. Go to **Admin > Provision** and delete the player from the Provision table by clicking the delete (trash can) icon.
2. Go to the **Network** tab and find the player. Click the gear icon to access the player's RDWS.
3. Navigate to the **Control** tab of the player’s RDWS and click the **Reprovision** button which will cause the player to reboot.
   - Since no Setup has been applied to the player, the player will boot to the [Activate](docId\:OOf-RmqHqFVLhokXI8ypJ) screen.
4. After the player has rebooted, go the **Network** tab and click the delete (trashcan) icon to delete the player from the network.
   - This is more of a housecleaning step and while recommended, is not strictly necessary. If not done, the player will continue appearing in the Network tab but show an Inactive status.

:::hint{type="warning"}
BrightSign does not remove provision records from players because of the potential for theft. We also do not provide information about the network they are provisioned to for privacy reasons.&#x20;

If you purchase a secondhand player, the seller must remove the provision record. If an ex-employee is the only administrator on the BSN.Cloud network, your IT department must access their email to reset their password and remove the network provision record/add administrators. 
:::

# Reprovisioning vs. Factory Reset

Users should understand some key differences between reprovisioning and a [Factory Reset](docId\:ynCF7P2PYZo2qedF1JYim). Reprovisioning applies a new Setup without affecting network settings, while a factory reset is a more comprehensive reset that clears all settings:

| **Reprovision**                                                                                                                                                      | **Factory Reset**                                                                                                                                                                                                 |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Clears the player storage                                                                                                                                            | Does not clear the player storage                                                                                                                                                                                 |
| Clears most registry settings but importantly does not clear the player’s network settings (e.g., WiFi configuration)                                                | Clears all registry settings including the player’s network settings.                                                                                                                                             |
| - If a new Setup has been applied, the new Setup will take effect upon bootup.
- If a new Setup has not been applied, the player will boot to the Activation screen. | Does not affect the player’s provisioning record on BSN.cloud. The player’s Setup on record will be applied again after the player boots back up. Changing the player’s Setup requires reprovisioning the player. |

# Additional Info

See [this video](https://vimeo.com/350338863) for more information about provisioning players and creating player groups to display different Setups in different groups.


[title] HTML5 State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/f7RkWtsIhBpzpXrNthd76_html5state.png" size="14" width="56" height="64" position="center" darkWidth="56" darkHeight="64" showCaption="false"}

The HTML5 state allows you to display HTML web pages, including video, image, text, and JavaScript elements. Note that HTML video content will play even if it is embedded in an Image zone. For a full explanation of how to create HTML content for BrightSign players, see the [HTML Development](docId\:XA-PfJbjN_4Gm_f-KWw_k) section.

:::hint{type="warning"}
BrightSign models are not designed to be used as general-purpose web browsers. Many web pages have elements that will not display correctly on a BrightSign player. Make sure to thoroughly test a web page before using it as digital signage.
:::

# State Properties

- **Name**: The name of the HTML5 state
- **Initial State**: Select this to make this state the home screen

## Source

- **Site Name**: Specify a name for the HTML site. The site name must be unique within the presentation.
- **Site Source**: Select a source for the HTML site:
  - **Components**: Display an HTML page that is stored on your Author Plus network. This option is only available if the Storage Selector is set to **BSN.cloud Content**. If you need to add the page to your BSN.cloud network, go to the [Content](docId\:gPjwF1LNjhau_EQZJMfUq)  tab first.
  - **URL**: Display an HTML page from a remote URL.
  - **Local Site**: Include the HTML page with the presentation files. This option is only available if the Storage Selector is set to **Local** **Content**. You will be prompted to locate and select the *.html* file that you wish to display.
- **Query String** (optional): Enter a query string to be appended to the site URL using the following format: http\://www\.example.com/over/there?my\_query\_string

:::hint{type="success"}
The **URL** and **Query string** fields accept [Variables](docId\:a6Ali6u-szxHuansk6T3-). To specify a Variable, enter the name of the variable between two sets of braces. The variable value can be either standalone (e.g., `{{my_variable}}`) or part of a static value (e.g., `http://www.brightsign.biz/{{my_variable}}`).
:::

## Options

Use the following checkboxes to enable optional, advanced features associated with the webpage:

- **Enable BrightSign JavaScript objects**: Enables [BrightScript-JavaScript Objects](docId\:URrXhU7L-V9ea-Zhy0JV3) for the HTML page.
- **Enable cross domain policy checks**: Enables Chromium security checks for cross-origin requests.  
- **Ignore HTTPS certificate errors**: Instructs the state to ignore security errors when connecting to insecure HTTPS hosts. Enabling this feature makes the player insecure; it is not suitable for production environments and should only be used for testing.
- **Enable camera**: Enables webpage access to USB cameras connected to the player (access is disabled by default). This allows support for WebRTC applications.
- **Enable mouse and touch events**: Enable user interaction with the HTML page (clicking on links, interacting with JavaScript elements, etc.). 
- **Display cursor**: Displays a cursor whenever a USB mouse is connected to the player.
- **Enable native video playback**: Enables [HWZ Video](docId\:e6uJleH69Q0JmMv8kyTrp) on all `<video>` elements contained within the page. This increases the frame rate and quality of HTML video playback, but can also cause problems with CSS page transforms and other page elements. By default, it will place video on top of all graphics in the presentation and set the [Video Mode](docId\:v-EVnMU6c7K5NHUNs86qT) of all `<video>` elements to [Scale to Fill](docId\:v-EVnMU6c7K5NHUNs86qT).
- **Enable native Chromium video playback**: This feature allows you to use Chromium’s video player instead of BrightSign’s video player that is based on MPV software. Note that some features will only work when using BrightSign’s video player (like synchronization), but for customers trying to play stock websites and not HTML content custom developed for BrightSign, the Chromium video player will act more like Chrome on a desktop. This is only available on Series 5 (except AU335) and 6 players.
- **Enable JavaScript console**: Enables the [Web Inspector](docId:4qlK1krr1cnx7xypWXRY5) for HTML sites in the presentation. For security reasons, **Enable JavaScript console** should only be used in non-production presentations. Make sure to disable JavaScript console before publishing to a production environment. In the Chromium version found in BOS 8.5 and beyond, the JavaScript console will log information in memory even when you are not connected to the inspector. This will consume memory until the player runs out, which will result in a crash. To enable the JavaScript console in BOS 8.5.31 and above, you will need to either:
  - Set the `enable_web_inspector` registry key (in the "html" section) to enable the JavaScript console (see the "inspector\_server" in [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) for more info).
  - Enable "Chromium debugging" in the BrightSign Author Remote DWS (with BrightSign Author version 1.7.11 and above) or the Local DWS.
- **Sites from URLs share storage:** HTML widgets that display file URLs will share the same storage database.
- **Sites from local disk share storage:** In OS 8.2.55.4 and later, HTML widgets that are loaded from HTTP/HTTPS protocols do not share the same local storage database (HTML widgets that are loaded via file protocol act as they did previously). This flag allows HTML widgets loaded via HTTP/HTTPS protocol to share local storage if they are loaded from the same domain.

## Notes

This section lets you store important information about the HTML5 state for future users. It can be modified at any time.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more information.

# Using HTML5 States

To add an HTML component to your presentation:

1. Either select an external website to display, or upload an internal website to the **Content Library** (by going to the **Content** drop down and selecting **New** **Component** **>** **Upload HTML Site**).
2. Select and drag the HTML widget to your canvas.
3. You will see a red dot on the widget, which indicates that some [State Properties](docId\:AkrM58NDS_BN6AyhWZRax) need to be filled in. Fill them in depending on what you want to display.
4. Now connect other events to the HTML State as desired.

# Example

This tutorial video shows you how to add weather and time information to a presentation using an HTML widget.

::embed[]{url="https://vimeo.com/361905857"}


[title] BP900/BP200 Event
[path] BrightSign Author/Presentation/Event Properties/

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/Rgcm8QI-fOxxBfPD3vnaO_bp900event.png" size="20" width="82" height="81" position="flex-end" showCaption="false"}
:::

:::VerticalSplitItem
::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/MkyJOiIuJbfZmi7N16tCb_bp200event.png" size="20" width="83" height="79" position="flex-start" showCaption="false"}
:::
::::

The BP900 and BP200 events trigger when a BP900 or BP200 button is pressed. The [BP900 and BP200 button panels](https://www.brightsign.biz/digital-signage-products/accessories/usb-4-buttons-panels) are LED-based touch devices that allow you to add button interactivity to BrightSign players with a USB port. 

# Enumeration

There are a total of eight event icons: BP900A, BP900B, BP900C, BP900D, along with BP200A, BP200B, BP200C, and BP200D. The letters A, B, C, and D correspond to USB ports. If the event you are defining is for a button pad connected to USB port A, use "A". If it is for a button pad connected to the second port, use B.

:::hint{type="info"}
**Example**
An XD1134 has two available USB ports. If you want to connect two button boards, a BP900 to port A and a BP200 to port B, you would use the BP900A and BP200B icons to define events for each.
:::

You can use a USB hub to connect up to four BP900/BP200 button panels to a BrightSign player. See [this guide](docId\:yDEH8qOcVKymgJ2KDxn7L) to learn more about BP900/BP200 enumeration on USB hubs.

# Event Properties

- **Specify Button Number**: Select a button on the button pad that you want the user to press to transition to the next state.

:::hint{type="warning"}
Selecting **Any Button** will enable only the button numbers used in other BP200 or BP900 events in the presentation (or numbers enabled in the [Presentation Settings > Interactive > Touch](docId\:a6Ali6u-szxHuansk6T3-) section): For example, if you have defined BP900 events for buttons 1 and 4, a BP900 event set to **Any Button** will trigger for buttons 1 and 4 only.
:::

- **Press (First Touch)**: The event triggers once at the moment the button is pressed.
- **Press Continuous**: The event triggers the moment the button is depressed, then continues triggering at the specified **Repeat interval in milliseconds** as long as the button is depressed.


[title] Commands & Conditional Targets
[path] BrightSign Author/Presentation/

Conditional Targets and Commands are advanced features for interactive playlists. Conditional Targets are available for events, while Commands can be added to both events and states.

Click the **Advanced** button in the **State Properties** or **Event Properties** pane to add or edit Conditional Targets and Commands.

## Conditional Targets

Conditional Targets allow you to change the behavior of an event transition depending on the value of a [Variable](docId\:a6Ali6u-szxHuansk6T3-). You can set multiple Conditional Targets for a single event, and you can specify new commands to occur when the Conditional Target is met. With this feature, you can change the behavior of a presentation based on a wide array of interactive and networked conditions.

1. **Add Conditional Target**: Click this button to add a Conditional Target to an event.
2. **Variable**: Select the User Variable that will trigger the Conditional Target.
3. **Operator**: Select the conditional operator that will compare the current value of the variable against the value set in the field to the right. The **Target state** and **Commands** defined below will only occur when the entire statement—the variable, the operator, and the target value—is true. 
4. **Value**: The value that the User Variable value will be compared against.
   1. In the **Value** field, you can enter either a fixed integer or the name of another User Variable (for example, “when Variable A is equal to 42” or “when Variable A is equal to Variable B”). You must enter the name of a target User Variable between two sets of braces (for example, `“{{my_variable}}”)`.
5. **Target State**: Select the transition behavior that will occur if the Conditional Target is met.
6. **Command**: Add commands that will be executed if the Conditional Target is met.

## Commands

Commands allow you to add extended functionality to your presentations. Commands can help you control displays and devices (Display On, GPIO On, etc.) or perform additional actions when interactive events are performed (Pause Video, Set Volume, etc.).

You can add commands to interactive events or to states. If you add a command to an interactive event, the command will be performed when that event occurs. If you want to add a command to a state, you will need to choose between an **Entry Command** (executed upon entering the state) or an **Exit Command** (executed upon leaving the state). Some commands (such as Switch Presentation) can only be added to interactive events.

Click on each individual command in the left panel for more info.

## PDF Version

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/4JpjsiS3WVCr-twV5fJP7-20260121-195229.pdf" label="Commands&ConditionalTargetsSection.pdf"}


[title] Creating a Presentation
[path] BrightSign Author/Presentation/

# Overview

The **Presentation** tab has a dropdown with the following options:

- **New Presentation:** see [New Presention](docId\:c9oPDf5pSFByakCQ0sjsJ) for more information about building a new presentation 
- **Import Presentation:** see [Import Presentation](docId\:c9oPDf5pSFByakCQ0sjsJ) for more information about importing presentations
- **Recent Presentations:** allows you to select a presentation from a recent presentation
- **All Presentations:** lets you select a presentation from the existing presentations in your network

# New Presentation

To create a new presentation, select **New Presentation** or the **New Presentation** icon in the **Recent Presentations,** or the **New Presentation** screen. For a visual reference, see the accompanying [tutorial video](https://vimeo.com/350773959) for a step-by step guide to building a new presentation.

**Series 5 Players with Multiple Outputs**

If you select an XC5 or XT5 player, you will see the following screen and a Screens tab (the additional options have been moved to the Screens tab):

![image-20241211-230148.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/7oJGxz3qaB9Xla9GbAFlR_image-20241211-230148.png)

:::hint{type="warning"}
For information about how to create a multi-screen presentation on XC5 players, see [Play Back Multiscreen Video](docId\:K9HPTP4rvEBNEGdEEgRJP).
:::

**Other Players**

If you select a single output Series 5 player, or Series 4 or older players, you will see the following screen:

![image-20241211-231114.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/3sR21RkRo1XNT2XOtMdzq_image-20241211-231114.png)

| Destination                                                                                                                                  | Display HTML Site                                                                                                                            | Video Stream                                                                                                                                 |
| -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| <br />:inlineImage[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/RP6aHSdkqZVxo3Zvjj3PT_image.png" alt caption} | <br />:inlineImage[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/ztQEt-M0LR59maWReNjDz_image.png" alt caption} | <br />:inlineImage[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/mpJnzTUy82syMgClJM0mo_image.png" alt caption} |

Note that if you are using an AU335, you must select **Audio** under **Single Zone** before the AU335 will appear in the **Target Player** list:

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/bjrDi7kt3o_fFJg6P1HR8_screenshot-2026-06-30-at-105929-am.png)

****

1. **Select Template**: Select a pre-made zone layout for your presentation. You can modify the zone layout later when editing the presentation.
   1. **Single** **Zone**: A single image, video, Node.js application, or HTML page occupies the screen at any time.
      1. **Playlist**: Videos and images are displayed in a playlist
      2. **HTML**: A single HTML page is displayed
      3. **Video In**: Video from the HDM&#x49;**®** input is displayed (available on XTx44, XTx43, and 4Kx42 players only).
      4. **Video Stream**: Video from a remote streaming source is displayed
      5. **Node.js application**: A Node.js application is added to the presentation as “Support Content" and can be added, updated, removed later, through “Support Content“. For more info, see [Node.js](docId\:a6Ali6u-szxHuansk6T3-).
   2. **Multi-Zone**: Multiple media items (images, videos, text) are displayed simultaneously.
      1. **Two Zone Horizontal**: A playlist of videos and images is displayed with a text ticker beneath.
      2. **Two Zone Vertical**: A playlist of videos and images is displayed on the left, while a playlist of images occupies the right side of the screen.
      3. **Three Zone**: A playlist of videos and images occupies the left side of the screen, a playlist of images occupies the right side, and a text ticker occupies the bottom.
2. **Preview**: View a preview of the zone layout (green indicates a Video or Image zone, Blue an Image zone, and yellow a Ticker zone).
3. **Name**: Enter a name for the presentation.
4. **Destination** (Local mode only): Choose a location to save the presentation project file on your local machine.
5. **HTML Presentation** (HTML template only): Specify a HTML site to display on screen. 
   1. **URL**: Specify the URL for the HTML page to display.
   2. **Local Content**: Browse your local machine to locate the *.html* file that you wish to display.
6. **Video Stream URL** (Video Stream template only): Specify the streaming video URL to display on screen.
7. **Target Player**: Select the target player model for the presentation. This will determine the available video resolutions, zone types, widgets, and events in the presentation.
8. **Connector**: Select the connector type that connects the player to the display.
9. **Output Resolution**: Choose a resolution that is compatible with your monitor. See [Video Modes](docId\:QpML112mBhEK7LBDGUxnv) for a list of all available video modes.
10. **Target Frame Rate**: Choose a frame rate that is compatible with your monitor.
11. **Screen Orientation**: Select a screen orientation for your presentation: 
    1. **Landscape**: Content is not rotated.
    2. **Portrait – Bottom Left**: Content is rotated counter-clockwise 90 degrees. Select this option if the bottom of the monitor is on the left when it is portrait oriented.
    3. **Portrait – Bottom Right**: Content is rotated clockwise 90 degrees. Select this option if the bottom of the monitor is on the right when it is portrait oriented.
12. **Start**: Go to the playlist/layout editing screen.

![image-20241211-235716.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/CcHQjXVr3xrY6pKnpuK0t_image-20241211-235716.png)

# Presentation Builder

![image-20241212-230612.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/JWdExQgZlnFa3nrXEhqAp_image-20241212-230612.png)

1. **Content Mode**: Presentation content may be stored in one of two places. Importantly, a presentation cannot contain a mix of content storage types. Changing this option thus requires that you exit your current presentation. More details [here](docId:8yTHtVfOe83v1SSsbyIW-).
   1. **BrightSign Author Plus&#x20;**(bsn.Content) mode stores content on BrightSign Cloud.
   2. **Local** mode stores content on your local computer.
2. **Library / Tree View**
   The **Library** displays available content from either your BrightSign Cloud network or your local computer, depending on the selected Content Mode as described above. If you need to add media to your BrightSign Cloud network, select the dropdown next to the **Content** tab and select **Upload New** **Media**.

   **Tree View** allows you to quickly view and search through a presentation by displaying it as a set of expandable / collapsible zones, states, events, and commands. See [here](docId:4jUqtTlQPFwLJZZ59NRZE) for more info.
3. &#x20;**Layout / Content**: Select **Layout** to change the presentation layout and edit zone properties; select **Content** to edit the content in a zone. Series 5 players will also display a Screens tab in this location. See [Play Back Multiscreen Video](docId\:K9HPTP4rvEBNEGdEEgRJP) for information about how to set up a multiscreen presentation using the Screens tab.
4. **Presentation Name**: The name of the presentation. The cloud icon indicates that the presentation uses BrightSign Cloud content, while the computer display icon indicates that the presentation content is stored locally.
5. **Save**: Select the Save icon to save the presentation (either locally or on your BrightSign Cloud network) or select **Save As** from the file drop down menu to save the current presentation with a different name.
6. **Upload**: Select the Upload icon to upload a locally created presentation to BrightSign Cloud.
7. **Publish**: Select the Publish icon to publish the presentation to one or more BrightSign players.
8. **Zones**: Use this pane to add, delete, and layer zones. See below for more details.
9. **Presentation Settings**: Modify various settings that apply to the entire presentation. See [Presentation Settings](docId\:a6Ali6u-szxHuansk6T3-) for more details.
10. **Zone Properties** (**Layout** tab only): Modify settings associated with a selected zone. See [Zone Types](docId\:v-EVnMU6c7K5NHUNs86qT) for a description of each zone type.
11. **State Properties** (**Content** tab only): Modify settings associated with a selected state. See [State Properties](docId:2eh0-u7XsTxqw_emIiign) for a description of each state.

# Layout (Zone Ordering)

![image-20241216-192432.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/xcQlEd80PT0G6e6tpQeAs_image-20241216-192432.png)

In the **Layout** tab, click on a zone to select it. The selected zone can be resized by manually dragging the drag handles (light blue squares) or by entering pixel values for the zone’s **Size** and **Position** in the **Properties** tab. Pressing the **Delete** key deletes the selected zone. Various properties can be configured for each zone. See the [Zones](docId\:v-EVnMU6c7K5NHUNs86qT) page for more details.

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
The **Zones** pane organizes visible zones into three layers:

- **Graphics**: This layer includes all Ticker, Clock, Video or Images, and Image Only zones.
- **Video 1:** This layer contains a Video Only, Video or Images, or Background Image zone.
- **Video 2**: This layer contains a second Video Only or Video or Images zone. The Video 2 layer is only supported on player models with multiple video decoders: XTx44, XDx34, XTx43, XDx33, and 4Kx42

Use the Layers icon to change the display order of the three layers - top layers are displayed above layers beneath them.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/H_ozQywzs6Gq_Ufg7UFPm_image.png" size="80" width="1280" height="1760" position="center" darkWidth="1280" darkHeight="1760" showCaption="false"}
:::
::::

:::hint{type="info"}
Because a **Video or Image** zone can display either graphics or video, it belongs to both the graphics layer and one of the video layers. The **Video or Image** zone will switch between those two layers depending on the type of media being displayed.
:::

For a more comprehensive explanation of the various layer types, please refer to the [Zones](docId\:v-EVnMU6c7K5NHUNs86qT) page.

The display order of graphics zones within the **Graphics** layer can be unpredictable, and may change if the player OS is updated or other presentation settings are changed. To ensure one image is displayed behind other graphics elements, place a Background Image zone in a video layer behind the graphics layer.

# Simple Zones

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
A Simple Zone displays media in a looping playlist. Click the **Content** tab (or double-click a zone) to begin editing a non-interactive playlist.

To add content to the playlist, drag items from the **Assets** or **Widgets** pane into the playlist area above. To align the elements in your playlist area, right-click on the background grid to bring up the **Snap to grid** checkbox option. You can also adjust the spacing of the grid by selecting **Grid Spacing**. Use the arrows in the pop up to adjust the spacing.

Transitions occur automatically at the end of audio and video files, but you can configure the display duration of image and HTML files by selecting the stopwatch icon after an image / HTML file to modify its display duration.
:::

:::VerticalSplitItem


![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/rNQXaunjBsEEA0GLqOJMy_image.png)
:::
::::

![image-20241216-213641.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/PxsXeUekr_d3j9O4yuQWI_image-20241216-213641.png)

1. **Library**: Select a folder containing media files or components that you wish to add to the presentation playlist. The **Library** is sourced from either your BrightSign Cloud network or local machine, depending on the setting of the [Content Mode](docId:8yTHtVfOe83v1SSsbyIW-). If you need to add media to your BrightSign Cloud network, click the **Content** tab and select **Upload New** **Media**. 
2. **Assets / Widgets**: Switch between adding media files (**Assets**) and other presentation states (**Widgets**). See [State Properties](docId:2eh0-u7XsTxqw_emIiign) for more details about various widgets.
3. **Select All / Clear**: Select/unselect all media files in a folder. You can select multiple files:
   1. *Select a series of adjacent media files* – Hold the **Shift** key as you select the files in the Library.
   2. *Select a group of non-adjacent files* – Hold the **Ctrl** key as you select the files in the Library.
4. **Search**: Enter text in the search field to search the folder for a filename
5. **Sort**: Use the dropdown list to select a sort criteria. Use the icon to toggle between ascending and descending order.
6. **Refresh**: Click the Refresh icon to query the contents of the folder again.
7. **Resize**: Use the dropdown menu to change the size of the media thumbnails in the **Assets** pane.
8. **Playlist**: Drag media or widgets into this area to add them to the playlist. Once an item is added, you can also drag it  to a different position in the playlist. To delete an item or state from the playlist, hover your cursor over it and click the "X" that appears in the top right corner of the object. See pic below.
9. **Presentation and Zone**: The name of the presentation project and the zone that the playlist belongs to. If your presentation has multiple zones, switch between zone playlists in the **Navigator** pane.
10. **Simple** or **Advanced** Zone: Use the drop-down to select whether the Zone will be Simple or Advanced. Simple Zones contain basic functionality (e.g., looping images or videos) while Advanced Zones can contain interactivity, widgets, etc.
11. **Zones**: Configure zones and set zone layers.
12. **State Properties**: Edit the properties of media items and widgets. See [State Properties](docId:2eh0-u7XsTxqw_emIiign) to learn more about different state properties.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/QDIv7HK8_z8M-6QHPXBXD_image-20241216-214456.png" size="70" width="754" height="772" position="center" alt="image-20241216-214456.png" darkWidth="754" darkHeight="772" showCaption="false"}

# Advanced Zones

Unlike Simple Zones which loop endlessly, Advanced Zones can transition to new media by responding to [events](docId\:VNsooBt2TyX2rkudmLeCn), such as input from a GPIO button or touchscreen. Be default, a Zone is Simple. To make it Advanced, click the **Simple / Advanced** drop-down menu and selected **Advanced**:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/BshMkhFz19m36CLFX5NYj_image-20241216-214739.png" size="50" width="412" height="205" position="center" alt="image-20241216-214739.png" darkWidth="412" darkHeight="205" showCaption="false"}

:::hint{type="info"}
You can convert a Simple Zone to an Advanced one. However, once you add events in Advanced mode, you will no longer be able to convert it back to a Simple Zone.
:::

## Home Screen

The Home Screen is the first media file or widget in an Advanced playlist. It is where the Advanced playlist begins. 

By default, the first media file or widget you drag into an Advanced playlist will become the Home Screen, identified by the

**Home** icon. You can change the Home Screen at any time by selecting a state in the playlist and checking the **Initial State** box in the **State Properties** pane.

![image-20241216-215706.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/prQAEEpnjHF1uycp3ZQDo_image-20241216-215706.png)

## Advanced Events

Advanced events link states in the playlist and determine what must occur before one state transitions to another. Follow these steps to define an event:

1. Select an event icon in the **Event Toolbar**. 
2. Click (and hold) the state name below the thumbnail image of the current state.
3. Drag the pointer to the thumbnail of the state you want to play next.

![image-20241216-220345.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/gX40nhtayG7OPycCBUg17_image-20241216-220345.png)

Alternatively, you can select an event and click the state name. This will add the event to the state, but will not define the transition target. You can then set the target state in the **Event Properties > Target State** pane. This is useful if you haven't added all states to the playlist yet or if the presentation is too complex to easily drag the mouse cursor between states.

:::hint{type="warning"}
In most cases, your Advanced Zone should work in a loop. In the playlist shown above, a user can transition from the Home Screen to the other images by interacting with a USB device. After a set period of time (indicated by the timeout event) or via USB input, the playlist will return to the Home Screen.
:::

## Event Inputs

Most events are triggered by a specific input that you need to define. A red dot on an event indicates that it is missing the required input.

Select an event to view the **Event Properties** pane on the right. See the [Event Properties](docId\:VNsooBt2TyX2rkudmLeCn) page for more information on defining interactive triggers for different events.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/_AZzJWErNDN_ZO2Fwvz_M_image-20241216-220935.png" size="70" width="526" height="422" position="center" alt="image-20241216-220935.png" darkWidth="526" darkHeight="422" showCaption="false"}

# Import Presentation

**Import Presentation** lets you import BrightAuthor Classic presentations in Local Content mode. Alternatively, you can do this via **File > Import…** In BrightSign Author Plus (bsn.Content) mode, **Import Presentation** can also import presentations from a BrightSign Network (not BrightSign Cloud) account.


[title] Schedule
[path] BrightSign Author/

The BrightSign Author **Schedule** tab allows you to schedule presentations according to time, date, and day of the week and then publish those presentations to your BrightSign players through BSN.Cloud. 

This section has an accompanying tutorial video:

::embed[]{url="https://vimeo.com/350772319"}

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
# Select the Publishing Mode

Use the **Destination > Type** dropdown list to select one of the following Publishing Modes: BSN.Cloud, Standalone, Local Network, or Web Folder. Your players must be configured for the specified publishing type during [Player Setup](docId\:XNnXywMV09iEgZIIt7RWA) before you publish to them.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/0OL--38ORvJJMRQLv-oJU_image.png" size="80" width="339" height="219" position="center" darkWidth="339" darkHeight="219" showCaption="false"}
:::
::::

:::hint{type="info"}
The **BSN.Cloud** option for Destination Type is only available if the [Content Mode](docId:8yTHtVfOe83v1SSsbyIW-) is set to **BSN.Cloud**. The other Publishing Modes (Standalone, Local Network, and Web Folder) require the **Content Mode** be set to **Local**.
:::

## BSN.Cloud

Distribute your schedule to any number of players over the Internet using BSN.Cloud. Select the target BSN.Cloud **Group** for the schedule.

### Standalone

Publish your schedule to a microSD card or USB flash drive. You can also publish to a folder on your computer and copy the files to a storage device later on.

### Local Network

:::hint{type="info"}
Local Network is called Local File Networking in version 1.13.0 and older of BrightSign Author.
:::

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/iF7Sh_7E569nzAdpYZAvg_local-network-player-list.png" size="40" width="420" height="429" position="center" darkWidth="420" darkHeight="429" showCaption="false"}

Publish your schedule to a player over the local network.

1. **Add Player**: Click the plus icon to add a player to the Local Network list. The player must be on your local network and set up for Local File Networking first. You will be prompted to enter the IP address of the device.
2. **Refresh**: Click the refresh icon to refresh the list of networked players (e.g. if a networked player has just booted up and you don't see it in the list yet).
3. **Player List**: Use the checkboxes to select which player(s) on the local network you want to publish to.
4. **Device Credentials**: Click the settings icon (the cog wheel) to enter the Local Web Server credentials for the player. If you have set up the player using the same instance of BrightSign Author, you should not have to enter the password. If the password changes, or you are using a new BrightSign Author instance, you'll need to enter the Local Web Server credentials again.
5. **Delete** **Player**: Click the delete icon (trash can) to remove the player from the Local Network list. This action will delete the player record from the BrightSign Author instance, but the Local Web Server on the player remains active. You can add the player to the list again using the plus icon.

### Web Folder

:::hint{type="info"}
Web Folder is called Simple File Networking in version 1.13.0 and older of BrightSign Author.
:::

Publish your schedule to a web-server directory. Players that are set up for Web Folder can then retrieve the scheduled presentations from the defined Web Folder URL.

# Add Presentations to the Schedule

Drag one or more presentations from the **Source** pane to the schedule area in the center. The **Recent Presentations** tab provides a list of recently edited presentations.

If you are publishing using BSN.cloud, the **BSN.cloud** tab lists all presentations saved on your BrightSign Cloud network. If you are publishing using another method, click the **Open** icon to locate a folder containing presentation files on your local computer.

:::hint{type="success"}
Click the Edit icon (pencil icon) next to a presentation name if you need to edit the presentation before publishing the schedule.
:::

![image-20241217-215436.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/fnwh5OT1ssi_0n5XI-8QQ_image-20241217-215436.png)

# Edit the Schedule

Once you've added your presentation(s) to the schedule, select a presentation in the schedule area or the **Presentation** pane on the right to open the **Schedule** pane. The schedule pane allows you to specify the date and time that a presentation plays:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/LuZzz_kEEPrCM3qscr40n_schedule.png" size="40" width="270" height="463" position="center" darkWidth="270" darkHeight="463" showCaption="false"}

- **Active all day, every day**: The presentation plays at all times (i.e. without day parting).
- **Event Date and Time**: The presentation plays once at the specified date and time:
  - **Event Date**: Specify the date that the presentation plays.
  - **Event Time**: Specify the time interval during which the presentation plays. You can also drag the top and bottom of the presentation block in the schedule area 
- **Recurring Event**: The presentation recurs during the specified days. If you don't check this box, the **Event time** will only apply to the single day selected in the schedule.
  - **All Days**: The presentation plays every day between the specified **Start Date** and **End Date** at the specified **Event Time**. The **Start Date** defaults to the currently selected date in the schedule.
  - **Weekends**: The presentation plays only on weekends between the specified **Start Date** and **End Date&#x20;**&#x61;t the specified **Event Time**. The **Start Date** defaults to the currently selected date in the schedule.
  - **Weekdays**: The presentation plays only on weekdays between the specified **Start Date** and **End Date&#x20;**&#x61;t the specified **Event Time**. The **Start Date** defaults to the currently selected date in the schedule.
  - **Custom**: Select a custom date and time. Use the checkboxes to select which days of the week the presentation will play and the following additional parameters:
    - **Start Date**: Specify the start date of the scheduled recurrence.&#x20;
    - **End Date**: Specify the end date of the scheduled recurrence.
    - **Event Time**: Specify the time interval during which the presentation plays.
- **Interrupt Other Presentations**: Designate the presentation as the Schedule Interrupt presentation (see below).

## Schedule Interrupts

If you add one presentation to the same time slot as another presentation, the added presentation will function as a **Schedule Interrupt** presentation. These presentations can occupy the same time slot as other presentations and will play instead of those presentations. **Schedule Interrupt** presentations are useful when you need to add a new presentation to a regular, recurring schedule that you don't wish to alter permanently.

A **Schedule Interrupt** presentation is indicated with the Interrupt icon (shown in the image below). You can switch the **Schedule Interrupt** designation from one presentation to another using the **Interrupt Other Presentations** checkbox.

![image-20241217-215804.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/mrMLCZuBSFKdWItUXAjtg_image-20241217-215804.png)

# Publishing Options

Use the **Options** pane to specify additional publishing options.

## Device Setup

Click the **Create Setup** box to go to the [Setup](docId\:XNnXywMV09iEgZIIt7RWA) screen. This feature allows the user to publish new player settings to players including [BrightSignOS updates](docId\:XNnXywMV09iEgZIIt7RWA).

## Debugging

Enable or disable the following debugging options.

:::hint{type="info"}
These debugging options are disabled by default.
:::

- **Enable** **serial debugging**: The autorun script will output debugging information related to the presentation to the serial port (as well as over Telnet and SSH if these features are enabled).
- **Enable system log debugging**: The autorun script will output debugging information related to the presentation to the **Log** tab in the[Diagnostic Web Server (DWS)](docId\:XUE20rJXhFt-Lq0RDmJbW).

## BrightSignOS Update

This section allows you to select either **Latest Released OS**, **Beta OS**, or **MInimum OS** that is compatible with your player. When you select **Publish**, the OS will be sent to the player for installation, during which the player will reboot.

**Do Not Update** is the default setting.


[title] Time/Clock Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/582cqF7W3Lz0HqLD2kvVw_timeclockevents.png" size="10" width="84" height="83" position="center" showCaption="false"}

The Time/Clock event triggers at a specific time and date or at regular intervals on a recurring schedule.

- **Single date/time event**: Specify a one-time-only event.
- **Date**: Specify the time and date of the event.
- **Specify with user variable**: Use the value of a [Variable](docId\:a6Ali6u-szxHuansk6T3-) to specify the date and time. Choose a variable from the dropdown list. The value of the variable must be in this format: `yyyy-mm-ddThh:mm:ss`. For example, if you would like the event to occur on December 20, 2021 at 3:45PM, then you would use the value `2021-12-20T15:45:00`.
- **Daily timeout event**: Specify a recurring event.
- **Once per day**: Select this option to have the event occur once per day at the specified **Time.**
- **Periodic throughout the day**: Select this option to have the event occur at intervals throughout the day.
- **Interval between events**: Determine the frequency of the recurring event (in minutes).
- **Active between**: Specify the period during which recurring events can trigger.
- **Set the days the timeout is active**: Select which days the time/clock event is active.


[title] Dynamic Playlist State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/kgFtI0NAHFbRM5OqJm4dG_dynamicplayliststate.png" size="14" width="219" height="222" position="center" showCaption="false"}

A Dynamic Playlist widget in a presentation points to an external bucket of content in a [Dynamic Playlist](docId\:gPjwF1LNjhau_EQZJMfUq). The widget constantly checks the contents of that bucket to make sure it’s up-to-date. These widgets can be used in presentations where the structure and layout of the presentation remains unchanged, but the content of the Dynamic Playlist widget changes based on the content and order of the items in the source playlist.

# State Properties

- **Name**: The name of the Dynamic Playlist state
- **Initial State**: Select this to make this state the home screen

## Source

This section lets you select a Dynamic Playlist to populate the state.

## Content Usage

This section lets you modify other options associated with the Dynamic Playlist. 

- **Update Interval**: Specify how often the player should refresh the contents of the Dynamic Playlist.
- **Optimize Feed Updates (use HEAD calls)**: Check this box to have the player make an HTTP HEAD request before retrieving the contents of the Dynamic Playlist. See [here](docId\:a6Ali6u-szxHuansk6T3-) for more details.
- **Automatically generate User Variables from Data Feed:** Use the feed to populate a set of User Variables for HTML pages. See [here](docId\:a6Ali6u-szxHuansk6T3-) for more details.

## Notes

This section lets you store important information about the Dynamic Playlist state for future users. It can be modified at any time.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more information.

# Using the Dynamic Playlist

There are two main steps to using these widgets. The first step is to create the dynamic element in the content library so that it can be accessed in any presentation. The second step is to create a presentation and refer to those external elements through the playlist widget **Source** parameter.

To do this:

1. Go to the **Content** menu and selecting **New Component > Dynamic Playlist**.
2. Save your project.
3. Enter a name for the new playlist and select **Create**.
4. Go to your **Media** folder and pick the media that you want to add to your playlist.
5. Drag those media files into your sandbox and reorder them as needed. When you are done, select the save icon at the top right.
6. Go back to the presentation and drag a **Dynamic** **Playlist** widget into the sandbox.
7. With the widget selected, go to the **State** **Properties** panel and select the playlist you just created under **Source**. The presentation will now display this playlist.


[title] Display a Direct View LED Presentation
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

# Overview

LED walls are comprised of modules which can be rearranged in multiple ways. The final arrangement usually doesn’t correspond to a standard display resolution, so you will probably need to make some adjustments to get the desired resolution. To do this in BrightSign Author, set a zone to the correct resolution, then configure your controller to scale standard resolutions from the player or apply a custom resolution to the player through a plugin. These methods are described below.

# Create a Zone

:::hint{type="info"}
See [this page](https://app.archbee.com/docs/Woa_q_AQfPYJ9OT2FofO7/3zy6Z2wTPdJc2XZD_BwR1) for BrightAuthor (legacy) instructions
:::

Select a standard resolution and then create custom zone size that matches your output resolution. This will give you better image quality and a better representation of your content.

To do this:

1. Determine the LED wall dimensions and the number of HDMI outputs on your player.
2. Create a new presentation.
3. In the **Screens** tab, select the number of screens based on the number of player HDMI outputs and how you want to display the content.
4. Select a standard output resolution in **Layout Settings** that is equal to or larger than the desired display resolution.
5. Switch to the **Layout** tab and set the pixel size and dimensions of the zone to correspond to the number of pixels and dimensions in your display. The size cannot exceed the maximum resolution for the player. See the example below.

# Example

This is a layout for an LED wall that is 12064 pixels wide and 1872 pixels high. The BrightSign player has three 4K HDMI outputs, so this layout uses three screens.

![Screenshot 2024-04-15 at 2.23.45 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/0fLjrNv1Of6RTZnURKMMk_screenshot-2024-04-15-at-22345-pm.png)

## Set the Resolution in the Controller

To scale resolutions in your controller, see the customer literature and/or videos for that product (e.g., Novastar, Samsung, etc.). Note that there are a range of models which have different maximum output resolutions (for example, some take full HD input, and some take 4K input). You can use a custom resolution or use regular resolutions with custom zone sizes (higher end controllers support this, lower end controllers may not).

## Set the Resolution via a Plugin

To set a custom video mode in your BrightSign player:

1. Get the relevant modeline. This is a list of parameters that describe how a display should be driven at a specified resolution. See [this page](docId:58VplQM4sGH_VgqVs4Frs) for information about how to get a modeline in Linux or in BrightSign Author.
2. Add that modeline information to a BrightSign plugin. See [this page](docId:58VplQM4sGH_VgqVs4Frs) and the plugin example below for more information.
3. Add the plugin:
   1. Create a presentation with the correct **Target Player**, a single screen, and an **Output Resolution** and **Frame Rate** (in **Layout Settings**) that are similar the resolution you want.
   2. In the **Layout** tab, under **Properties**, adjust the zone **Size** to match your desired resolution, which must be less than 8K (see Image 2, below).
   3. Under **Presentation Settings** > **Support Content**, add the plugin that specifies the correct modeline.
   4. Add your content to the zone and publish your presentation.

![Screenshot 2024-03-20 at 3.54.29 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/lSCZE3NftdH0ov_FrlRPt_screenshot-2024-03-20-at-35429-pm.png)

# Example

Sample plugin for Series 5 players:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/hcVscSrvW3zUn3Dy_j_92_setmultiscreenvideomode-7680x2160-30p.brs" label="SetMultiScreenVideoMode_7680x2160_30p.brs" isUploading="false"}


[title] Stream State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/4hQwOG8qaOQrFLkWl2WYH_streamstate.png" size="14" width="215" height="147" position="center" showCaption="false"}

The Stream state allows you to play an IP stream from a local or remote source.

# State Properties

- **Name**: The name of the state
- **Initial State**: Select this to make this state the home screen

## Source

- **Audio**: Play an audio stream.
- **Video**: Play an audio/video stream.
- **MJPEG**: Play an MJPEG stream.
- **Stream URL**: Enter a valid URL for any HLS, RTSP, PTP, or UDP stream. The URL can also include a number of optional parameters:
- Specify a [Variable](docId\:a6Ali6u-szxHuansk6T3-) to replace all or part of the URL. To include the value of the variable in the URL, enter the variable name between two sets of braces (e.g., `http://www.example.com/streams/{{my_URLvar}}`).
- Append the "latency" and "jitter" parameters to modify the default latency (see [Customize Network Streaming](docId:0Tioy9PJdGG4G25yGBnib) for more details).
- Append the "buffersize", "vcdbsize", and "acdbsize" parameters to modify the default streaming buffer size (see [Customize Network Streaming](docId:0Tioy9PJdGG4G25yGBnib) for more details).
- Append the "lowlatency" parameter to reduce the default latency.

## Notes

This section lets you store important information about the Stream state for future users. It can be modified at any time.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more info.

# Examples

This tutorial video shows how to implement different use cases for the Stream State.

::embed[]{url="https://vimeo.com/366605276"}


[title] Synchronize Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/TNJpyBxJwMVcqKZHZ872E_synchronizeevent.png" size="10" width="83" height="80" position="center" showCaption="false"}

The Synchronize event synchronizes playback with other BrightSign players on the same local network using UDP. This event is useful for synchronizing playback according to user input. When you add a synchronization event to a state, that state becomes a follower of the state in the leader zone that is issuing the Link Synchronize advanced command as a transition.

This event triggers when a [Synchronize command](docId\:az1YTDtEYH-Zp2Dbg_lBL) with the same keyword as the Synchronize event is used on another player on the local network. Enter the keyword that corresponds to the Synchronize command in the **Specify synchronization keyword** field.

For Synchronize events to work, you must ensure UDP communication is configured correctly in [Presentation Settings > Interactive > Networking](docId\:a6Ali6u-szxHuansk6T3-).

See [Sync Zones](docId\:jwsGnw0TrRAaThcEdAQ50) for more information.


[title] Zones
[path] BrightSign Author/Presentation/

:::hint{type="warning"}
For information about changing zone order (moving zones forwards or backwards), see [Layout (Zone Ordering)](docId\:c9oPDf5pSFByakCQ0sjsJ)&#x20;
:::

# Zone Properties

Select a zone in the **Layout** tab to edit the **Properties** for that zone. For invisible zones (Audio or Enhanced Audio), use the **Navigator** pane to select the zone.

- **Name**: Edit the zone name.
- **Type**: Use the dropdown list to change the zone type. The options in this list may be limited by the capabilities of the player, as well as media types that you have already added to the zone playlist. The various zone types are described in more detail below.
- **Size**: Define the pixel **Width** and **Height** of the zone (applicable to visible zones only).
- **Position**: Define the position of the zone by specifying the X and Y coordinates of the top-left corner of the zone (applicable to visible zones only).

![image-20241216-221606.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/5tXzRCm0A-yGRHT1lIXCd_image-20241216-221606.png)

# Zone Types

When displaying videos and/or images there are three zone types that users must consider:

- **Video, Image, or Audio**
- **Video Only**
- **Image Only**
- **Audio Only**

Upon first glance, these types may seem somewhat confusing. If one wants to add a video to a zone, for example, should the zone type be “Video, Image, or Audio”, “Video Only”, or does it not matter?

With BrightSign players, graphics elements (e.g., videos, images, HTML, etc.) are rendered on “planes”. Players have a single Graphics Plane where images can be rendered as well as a limited number of Video Planes where videos and images can be rendered.

The Graphics Plane on most BrightSign players is limited to HD. When the Output Resolution of a presentation is set to a resolution higher than HD and an image with a higher-than-HD resolution is placed on the Graphics Plane , graphics upscaling must be employed to display the image which can result in a reduction in visual quality. To get around these limitations of the graphics plane, a video plane can be used to display an image at higher-than-HD resolutions. However, this takes away one of the available video planes.

Another consideration is that the Graphics Plane can render multiple graphics elements simultaneously while a Video Plane can only play one video at a time. Since these resources need to be managed, we have zone types with limitations on the number of zones of each type you can create. These limits are driven by the hardware capabilities of the particular player the presentation is being created for.

The “Video, Image, or Audio” type makes it easier to transition between graphics states and video states without also needing zone manipulation because the autorun generated by BrightSign Author automatically takes care of this complexity behind the scenes for this zone type.

## Video, Image, or Audio Zone

This zone type allows you to display images, video, and HTML as well as play audio files.

## Video / Image Modes

When displaying videos and images, a number of “modes” exist which dictate how the video or image will be positioned and/or scaled/stretched.

### Centered

Centers the video or image without scaling. This may result in cropping if the image is larger than the zone.

### Scale to Fit

The video or image is *scaled* (the aspect ratio *is* maintained) to *fit* the zone. No cropping of the image occurs and black borders are added as necessary.

### Scale to Fill

The video or image is *scaled* (the aspect ratio is maintained) to completely *fill* the zone. The image is cropped as necessary.

### Stretch to Fill

The video or image is *stretched* (if the aspect ratio of the image differs from that of the zone, the aspect ratio of the image will *not* be maintained) to *fill* the zone. The image may appear stretched or squashed if the aspect ratios of the image and zone do not match.

:::hint{type="info"}
The **Stretch to Fill** and **Scale to** **Fit** options will not remove letterboxing if it's part of the video file.
:::

These animated gifs help visualize the different modes:

| **Centered**<br />(Image Mode Only)                                                                                                                                                                                                                            | **Scale to Fit**                                                                                                                                                    | **Scale to Fill**                                                                                                                                                    | **Stretch to Fill**                                                                                                                                                    |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <br />::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/g9GdeLUGIGMWrslnjvRxb_centered-image-20230620-233228.gif" size="80" width="160" height="120" position="center" darkWidth="160" darkHeight="120" showCaption="false"} | <br />:inlineImage[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/RjyhxXvBC0t946xNJjos6_scale-to-fit-20230620-235021.gif" alt caption} | <br />:inlineImage[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/Bl-HGrg2ViSOT7qsnumdQ_scale-to-fill-20230620-224017.gif" alt caption} | <br />:inlineImage[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/pD5n4kshO2jx9ZGNguRkw_stretch-to-fill-20230621-004058.gif" alt caption} |

## Audio Output

Audio settings for this zone type are as follows:

- **Audio Output**: Configure audio outputs for the zone. 
  - **Analog Stereo**: Check this box to enable audio output via the 3.5mm audio connector (or USB Type C connector on the LS423/LS424).
  - **HDMI**: Check this box to enable audio output via the HDM&#x49;**®** connector. If your device has multiple HDMI outputs, the corresponding number of HDMI boxes will appear, numbered as HDMI1, HDMI2, etc.  
  - **PCM**: Supplies the decoded audio signal through the HDMI connector.
  - **Pass through**: Supplies the un-decoded audio signal through the HDMI connector. Use this option if the source audio codec (for example, AC3 Dolby Digital) cannot be decoded by the BrightSign player and is being decoded on an external device.
  - **Stereo**: Supplies the decoded audio signal through the HDMI connector.
  - **SPDIF**: Check this box to enable audio output via the SPDIF connector.
  - **PCM**: Supplies the decoded audio signal through the SPDIF connector.
  - **Pass through**: Supplies the un-decoded audio signal through the SPDIF connector. Use this option if the source audio codec (for example, AC3 Dolby Digital) cannot be decoded by the BrightSign player and is being decoded on an external device.
  - **Stereo**: Supplies the decoded audio signal through the SPDIF connector.
- **Initial Video Volume**: Set the initial volume for video files (0-100).
- **Initial Audio Volume**: Set the initial volume for audio files (0-100).
- **Minimum Volume**: Set the minimum volume for the zone (0-100).
- **Maximum Volume**: Set the maximum volume for the zone (0-100).

:::hint{type="info"}
The **Maximum Volume** setting will be overridden by other volume settings in a presentation, including the **Initial Volume** setting for the zone and volume commands attached to events or states.
:::

- **Audio Mixing**: Choose the mixing of the audio output:
  - **Stereo**: Outputs both left and right audio signals.
  - **Left**: Outputs the left audio signal only.
  - **Right**: Outputs the right audio signal only.

## Video Only Zone

This zone type allows you to display video files, video streams, or HDMI input. Applicable settings are similar to those described for “Video, Image, or Audio” zone above.

## Image Only Zone

This zone type allows you to display images and HTML. Applicable settings are similar to those described for “Video, Image, or Audio” zone above. Note that setting the **Image Mode** will have no effect if the image and the zone are the same size.

## Audio Only Zone

This zone type allows you to play audio files and streaming audio.

This section has an accompanying tutorial video:

::embed[]{url="https://vimeo.com/366362094"}

Audio output settings are similar to those described for “Video, Image, or Audio” zone above.

:::hint{type="warning"}
Attempting to play AC3 audio using a BrightSign player will fail if PCM is enabled and AC3 audio is not enabled.
:::

## Enhanced Audio Zone

Enhanced Audio zones provide similar functionality Audio zones, but allow cross-fading between audio files in the playlist: Fading occurs from silence at the beginning of the audio playlist and to silence at the end of the audio playlist, while cross-fading occurs between audio files.

Use the **Fade** property to specify the duration of cross-fading between audio files. This setting also affects the fade-in and fade-out durations.

## Ticker Zone

Ticker zones allow you to display RSS feeds or pre-defined text strings.

This section has an accompanying tutorial video:

::embed[]{url="https://vimeo.com/358861003"}

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
## Ticker Zone Properties

- **Rotation**: Specify the rotation of text in the zone in 90 deg increments.
- **Text appearance**
  - **Animated**: Text appears on screen, *character-by-character*, from left to right as if each character is being typed. This is similar to a Teletype-style ticker.
  - **Number of lines**: Set the number of text lines displayed in the zone. The font size of the ticker will increase with fewer lines and decrease with more lines. Ticker font size can also be adjusted by increasing or decreasing the size of the zone.
  - **Time to Display Each Line**: The length of time, in seconds, each line displays in the zone.
- **Static Text**: Lines of text appear without any animation.
  - **Number of lines**: Set the number of text lines in the zone. As with animated text, the font size of the ticker will increase with fewer lines and decrease with more lines.
  - **Time to Display Each Line**: The length of time, in seconds, each line displays in the zone.
  - **Alignment**: Specify whether the static text is left aligned, right aligned, or centered in the zone.
- **Scrolling**: Text scrolls smoothly across the screen, similar to a news or stock ticker.
  - **Scroll Speed**: Use the slider to set the scroll speed to 100%, 200%, 300%, or 400% of normal.
:::

:::VerticalSplitItem


![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/QAd5XUsNtpU7oXvGAfWD9_image.png)
:::
::::

:::hint{type="info"}
Text can scroll either right-to-left or left-to-right: This scrolling direction is determined by the language of the first text item used in the zone (e.g. Spanish text will set the ticker to right-to-left, while Arabic text will set the ticker to left-to-right).
:::

- **Foreground text color**: Select a color for text in the zone.
- **Background text color**: Select a color for the text background in the zone.
- **Background bitmap**: Check the box to display an image as the text background. You will be prompted to select an image from your BrightSign Author Plus library or your local machine (depending on the Storage Selector setting).
  - **Stretch to Fit**: Check this box if you want to stretch the image to fill the zone.
- **Font**: Select the font type for displaying text in the zone.
  - **System Font**: Displays text using the default Linux font.
  - **BSN Font**: Displays text using a custom font stored on your BrightSign Author Plus network. You can use any TrueType font. This option is only available when the [Content Mode](docId:8yTHtVfOe83v1SSsbyIW-) is set to **BSN.Cloud**. 
  - **Local Font**: Displays text using a custom font stored on your local machine. You can use any TrueType font. This option is only available when the [Content Mode](docId:8yTHtVfOe83v1SSsbyIW-)  is set to **Local**.
    - When selecting a local font file, you cannot browse to the font files in the Windows fonts folder. You will need to copy the font file to your Desktop or another location and then select it using the **Local Font** button in BrightSign Author. If the presentation's **Destination** is set to **BrightSign Network**, fonts can be accessed through the BSN.cloud by navigating to **Set Text Parameters** **> BSN Fonts**. 
  - **Safe Text**: Define the dimensions of the text region in the zone.

## Clock Zone

Clock zones allow you to display the date or time.

- **Rotation**: Specify the rotation of text in the zone.
- **Foreground text color**: Select a color for text in the zone.
- **Background text color**: Select a color for the text background in the zone.
- **Background bitmap**: Check the box to display an image as the text background. You will be prompted to select an image from your BrightSign Author Plus library or your local machine (depending on the Storage Selector setting).
  - **Stretch to Fit**: Check this box if you want to stretch the image to fill the zone.
- **Font**: Select the font type for displaying text in the zone.
  - **System Font**: Displays text using the default Linux font.
  - **BSN Font**: Displays text using a custom font stored on your BrightSign Author Plus network. You can use any TrueType font. This option is available when the Storage Selector is set to **BSN.cloud Content**. 
  - **Local Font**: Displays text using a custom font stored on your local machine. You can use any TrueType font. This option is available when the Storage Selector is set to **Local Content**. 
- **Safe Text**: Define the dimensions of the text region in the zone.

## Background Image Zone

The Background Image zone allows you to place an image or media feed in the background of your presentation. All other zones appear on top of this zone.

The Background Image zone consumes a video decoder on the BrightSign player. If the player model supports two video zones, it can support one Background Image zone and one video zone, while single-video models do not support both a video zone and Background Image zone simultaneously.

:::hint{type="success"}
If you want a background color for your presentation, change the **Background Color** in the [Presentation Settings](docId\:a6Ali6u-szxHuansk6T3-) pane.
:::

## Control Zone

This is an invisible zone that is used to control other zones. A zone can be converted to a Control Zone from another zone type.


[title] User Variable State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/CDW5npFo4uzlnFnw40T65_screenshot-2025-02-06-at-35332-pm.png" size="14" width="144" height="130" position="center" alt="Screenshot 2025-02-06 at 3.53.32 PM.png" showCaption="false"}

The User Variable state allows to display text from [Variables](docId\:a6Ali6u-szxHuansk6T3-) in a Ticker zone. Select a Variable to display from the **Variables** drop down list.

# State Properties

- **Name**: The name of the Variable state.
- **User variables**: A drop down containing the available Variables.

## Notes

This section lets you store important information about the User Variable state for future users. It can be modified at any time.


[title] Setup
[path] BrightSign Author/Admin/

As covered in the [Player Setup](docId\:rCuHsQUJj1ethBHvT46xi) section, when configuring a BrightSign player for use, the player must have a “Setup” applied. The Setup contains information such as the intended publishing mode as well as various player settings.

:::hint{type="warning"}
Many of the BrightSign Author capabilities for player management are also accessible in BrightSign Control.
:::

# Default Setup

When a player is provisioned and a Setup is not explicitly applied to it, the Default Setup will be applied to the player. The Default Setup can be one of two BrightSign Default Setups or it can be a custom one.

## BrightSign Default Setup

See **Default Setup File&#x20;**&#x73;ection in the Set Up tab for more information about default setups.

# BrightSign Cloud

While BrightSign Author does offer limited functionality without a BrightSign Cloud account, accessing the full functionality of BrightSign Author requires that users be logged in to BrightSign Cloud:

1. Launch BrightSign Author
2. Sign In (upper right corner) using your email address and password or click **New User** to create an account.

# Player Settings

You can configure various player settings in the **Setup** screen. A Setup File can be created from the option within the **Admin** tab (**Admin > Setup**) or via the [Setup Library](docId\:HZY2W0MeeeryifOrZ9XFR).

![image-20241218-175520.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/c1BPMZAwG-s3A97T7rWJQ_image-20241218-175520.png)

![image-20241218-182714.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/3DICCSPYBPI7jSM04TbTI_image-20241218-182714.png)

:::::WorkflowBlock
:::WorkflowBlockItem
## Setup Name

Enter a name for the Setup File.

If you wish to create this Setup File to function as a Default Setup as described above, name the Setup File “Default Setup” (spelling and capitalization as shown, no quotes).
:::

:::WorkflowBlockItem
## Player Name

Enter a name for the player. All players provisioned with this Setup File will use this name by default. To differentiate between players, the name can be appended with a unique suffix per the Customization section below.
:::

:::WorkflowBlockItem
## Player Description

Enter an optional description for the player.
:::

:::WorkflowBlockItem
## Customization

- **Append Player ID**: Appends the serial number of the player to the end of the **Player Name**. This option is useful if you're applying the Setup File to multiple players and want each player name to be unique.
- **Use Name Only**: Does not append anything to the **Player Name**.
- **Time Zone**: Select the time zone where the player is located.
- **Idle Screen Color**: Specify what screen color the player should display if it does not have an active presentation. The default is black, but you should choose a color other than black to differentiate when the screen is on or off.
:::

:::WorkflowBlockItem
## Publishing Mode

This section specifies the Publishing Mode the player will use. See [this page](docId\:rEScIigY-dJRPuZgwaA4e) to better understand these modes.

### Standalone

This mode involves publishing your presentation to a storage device (such as a microSD card or USB drive) and then manually inserting the storage device into the player. This method is suitable if your player doesn't have a network connection and/or you do not plan to update the presentation frequently.

The USB drive can be used to update the schedule/presentation if you do not want to remove the microSD card and/or it is inaccessible. The USB drive can be used with or without a password: the password protection feature ensures that a player cannot be updated with the **Publish for USB update** option unless the correct password is supplied. If you choose to require a password, note that the password cannot be changed once configured, and cannot be recovered. See [USB Drive Passwords](docId\:ZIqN3FAW3E5pJyxJdll-v) for more information.

### Local Network

This mode publishes presentations to players over the local network. Players set up for Local Network require the Local Web Server to be enabled which can be done via the Player Configuration part of the Player Settings:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/aw_eps5GPJf76g-A_oW4p_image-20230814-185813.png" size="80" width="762" height="441" position="center" darkWidth="762" darkHeight="441" showCaption="false"}

### bsn.Content (BrightSign Author Plus)

This mode (which will soon be renamed to BrightSign Author Plus), publishes to players via BrightSign Cloud. It requires a subscription and enables you to remotely schedule and publish presentations.

- **Group**: Select a BrightSign Cloud group for the player. The player will appear in this group after the Setup File has been applied and can later be moved to other groups if desired. All players in a group receive the same presentation schedule. Groups can be added via the [Network](docId\:Uba8sfkMSAJsIBrbv4A6N) tab.

### Web Folder

With this publishing mode, presentations/content are placed on a web folder accessible via a URL. A player set up for the Web Folder publishing mode periodically checks the URL for new content and if new content is found, the player downloads the content from the URL.

- **URL for Web Folder**: Specify the URL from which the player will download content updates. The use of trailing slashes in the URL is not recommended as some web servers do not support trailing slashes. If you're having trouble getting players to communicate with your web server, see [Web Folder](docId\:wLEAAppYqa_4leMrn0E2z) for troubleshooting tips.
- **Content Check Frequency**: Set how often you want the player to check the web folder for updates.
- **Web Folder Authentication (optional)**: Enter a **User Name** and  **Password** to enable authentication between the player and the server.
  - **Enable basic authentication**: Instruct the player to pass credentials to the web server in unsecured packets. Use this option only if it is absolutely required by the configuration of your web server.

### Partner App/Partner CMS

Select applications created by BrightSign Cloud integrated partners. See [Partner Setup and Recovery](docId\:Qt5mKqoUWVlBScUzp9CC4) for more information about creating a recovery URL for partner applications.

### App URL/CMS URL

Specify a URL address to point players directly to an externally hosted application. CMS URL is the current name for this method.
:::

:::WorkflowBlockItem
## Network Configuration

- **Include Network Configuration** allows you to set network options in the [Network Options](docId\:gfqm5HVphjQijhZxb2NGy) window before connecting to your network.
- Use **Current Player Settings** if the player to be re-provisioned is currently configured on a network which requires a specification configuration (security, certificates, etc.) to maintain your player's current network configuration.
:::

::::WorkflowBlockItem
## Save Setup

Publish the Setup File manually. Follow these steps to complete the Setup process: 

1. Save the Setup File to a storage device (e.g., microSD card or USB flash drive). Ensure the Setup File is saved to the *root folder* of the storage device.
2. Turn off the player by unplugging the power adapter (or unplug the Ethernet cable if the player is being powered by PoE).
3. Insert the microSD card or USB flash drive into the player:
   - Format the microSD card using FAT32 or exFAT. The exFAT format allows you to store files larger than 4GB, but is not supported on the 4Kx42.
   - The storage device must remain in the player at all times while playing presentations.
4. Turn on the player by reconnecting the power. 

:::hint{type="warning"}
Players cannot be migrated from one BrightSign Cloud network to another unless the player provisioning record is first deleted from the old network and created in the new network (see [Provision](docId\:Cyl9kPm02CO5rgcB9WQQv) for more information). Otherwise, the player will remain in the old network.
:::
::::

:::WorkflowBlockItem
## Add Setup to Library

Add the Setup File to the [Setup Library](docId\:HZY2W0MeeeryifOrZ9XFR). You can then open the Setup later or [provision players](docId\:Cyl9kPm02CO5rgcB9WQQv) using the Setup File.
:::
:::::

For more info on how to change player types, here is a tutorial video:

::embed[]{url="https://vimeo.com/351440170"}

The **Player Settings** section on the right allows you to configure additional optional parameters.

## Player Configuration 

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
### Enable Diagnostic Web Server

Enable the [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM) and specify a password for the server (the username is always "admin"). You should secure the DWS with a strong password.

- **Use default password**: Use the player serial number as the password.
- **Specify password**: The password will be reset to the password you input.
- **Disable password**: No password is required.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/Q2f55glcc4imXRM7w7mAx_image-20230814-190108.png)


:::
::::

### Enable Local Web Server

Enable the Local Web Server, which is necessary for Local Network configured players. This feature enables the Player Web Page, which allows you to update [Variables](docId\:a6Ali6u-szxHuansk6T3-) over the local network.

- **Username**: A username for the Local Web Server login.
- **Password**: A password for the Local Web Server login.
- **Enable Update Notifications**: (Optional) Check this box to have the player automatically refresh the Player Web Page whenever variable values change on the player.

:::hint{type="success"}
You can access the Player Web Page using BrightSign Author or a web browser. To locate the Player Web Page on a web browser, enter the IP address of the player at port 8008 (for example, “10.0.1.199:8008”).
:::

## Logs

Use the check boxes to enable/disable logs. Logs can be turned on and will work behind the scenes, but can only be retrieved from the microSD card.

- **Playback**: Record playback start and end times, zone names, media types, and file names.
- **Events**: Record timestamps, state names, zone names, event types, and event data.
- **States**: Record current and last state names, timestamps, and media types.
- **Diagnostics**: Record timestamps, OS, and script versions, and the current presentation.
- **Variables**: Record the current and default values of all [Variables](docId\:a6Ali6u-szxHuansk6T3-) in the presentation.
- **Uploads**: This feature is available with the bsn.Content (BrightSign Author Plus) and Web Folder publishing modes. Specify log upload settings:
  - **On Startup**: Check this box to have the player upload its logs to BrightSign Cloud each time it boots up.
  - **At specific time daily**: Check this box to have the player upload its logs daily at the specified time.
- **Relative URL for log uploads**: If you are using Web Folder publishing, check this box to have the player upload logs to this URL location.

## BrightSignOS Update

Use this section to include an OS update file with the Setup. First, determine the behavior of the update file using the **Update Type** dropdown list:

- **Standard**: The OS update is applied to the player. The player reboots and deletes the update file after the update is complete.
- **Different**: The OS update is only applied if the version of the update file is different from the current OS version on the player. The player reboots and deletes the update file after the update is complete.
- **Newer**: The OS update is only applied if the version of the update file is newer than the current OS version on the player. If the player is booting up in [Rescue Mode (Safe Mode / Secure Boot)](docId\:YuRogAgj103wwXgoDfMFj), the update is always applied because the player cannot check its OS version before applying the update. The player reboots and deletes the update file after the update is complete.
- **Save**: The OS update is applied to the player, but the update file is not deleted from the storage device. The player does not reboot after applying the update; instead, it waits for the storage device containing the update file to be removed.

Next, select the version of the OS update file according to your player model:

- **Production Release**: The current official release of BrightSignOS
- **Beta Release**: The current beta release of BrightSignOS
- **Minimum Compatible Release**: The minimum OS version that supports presentations created by your version of BrightSign Author. The minimum compatible OS may not support all features provided by a contemporary version of BrightSign Author.
- **Specific File**: Select a *.bsfw* firmware update file from your hard drive. The other options will download the update file from BrightSign when the setup files are created.
- **Update from URL**: Enter the download URL for a *.bsfw* firmware update file. This option is only available when distributing a Setup File via player [Provisioning](docId\:Cyl9kPm02CO5rgcB9WQQv).

## Remote Screenshot

If you select the **Enable** **Remote Screenshot** checkbox, this feature will be enabled in BrightSign Author. Remote screenshots can be turned on and will work behind the scenes, but can only be retrieved from the SD card. This feature has the following options: 

- **Remote Screenshot Interval**: Specify how often the player should take a screenshot of the presentation display in minutes.
- **Maximum Number of Images to Save:** Specify how many JPEG screenshot images can be stored on the local storage of the player.
- **JPEG Quality Level (1-100):** Specify the quality level (and thus the file size) of each image file.
- **Screen Orientation:** Images can be rotated to Landscape or Portrait mode.
- **Relative URL for Remote Screenshot Handler:** Post screenshots to this endpoint (only available for the Web Folder publishing mode).

## Debugging

- **Enable Serial Debugging**: Enable serial debugging on the player. The autorun script will output debugging information related to the presentation to the serial port (as well as over [Enable Telnet & SSH](docId\:L0L_gyiHAvtdBci9FFcQh) if these features are enabled).
- **Enable System Log Debugging**: Enable system-log debugging on the player. The player will output system log information to the **Log** tab in the [Diagnostic Web Server](docId\:XUE20rJXhFt-Lq0RDmJbW) (or the Serial/Telnet/SSH ports if these are enabled via the **Serial Debugging** option).

## Advanced

- **Enable bsn.Control or bsn.Content**: Enable the persistent WebSockets connection between the player and BrightSign Cloud servers. This allows players to access BrightSign Author or BrightSign Author Plus. 

:::hint{type="warning"}
If you disable the WebSockets connection, there is no way to enable it again remotely. You will need to perform player set up locally via a storage device to reenable this feature.
:::


[title] Live Feed State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/XwXsQ3KiccsDKZVj3kh5__livefeedstate.png" size="14" width="168" height="195" position="center" darkWidth="168" darkHeight="195" showCaption="false"}

The **Live Feed** state allows you to display media from an MRSS feed (or text from an RSS feed in Ticker zones). An MRSS feed can be hosted on a third-party server or your BrightSign Author Plus network (using the **Live Media** feature). MRSS feeds can be used to play image, video, audio, and HTML (different content types can be mixed into a single feed).

# State Properties

- **Name**: The user-selected name of the Live Feed state
- **Initial State**: Select this to make this state the home screen

## Source

This section lets you specify the feed source:

- **URL**: Populate the Live Feed state from a remote URL.
- **Live Media Feed**: Populate the Live Feed state using [Live Media Feeds](docId\:gPjwF1LNjhau_EQZJMfUq) from your BrightSign Author Plus library.
- **Validate:** Click on this to ensure that your link is valid

## Feed Configuration

This section lets you modify other options associated with the feed:

- **Update Interval**: Specify how often the player should refresh the contents of the feed.
- **Parser Plugin**: Select a feed parser to parse the feed data before it is passed to the Live Feed state.
- **Optimize Feed Updates (use HEAD calls)**: Check this box to have the player make an HTTP HEAD request before retrieving the contents of a feed. See [Data Feeds](docId\:a6Ali6u-szxHuansk6T3-) for more details.
- **Automatically generate User Variables from Data Feed:** Use the feed to populate a set of User Variables for HTML pages. See [Data Feeds](docId\:a6Ali6u-szxHuansk6T3-) for more details.

## Notes

This section lets you store important information about the Live Feed state for future users. It can be modified at any time.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more information.

# Using a Live Feed State

To add a Live Feed to your presentation:

1. Drag the **Live** **Feed** widget onto your canvas. You'll notice a red dot, which indicates that there's information you need to fill out in the **State** **Properties**.
2. Fill out the **Name** and **Initial State** fields under **State** **Properties**.
3. Find an RSS Feed on the internet or use your own live feed (add it under the **Content** tab in **New** **Component** **> Live Media Feed**), and enter it in the **Source** panel.
4. Under **Feed** **Configuration**, specify the update interval, how often to refresh the content, and a parser plugin if you want to parse the information coming from that feed.
5. Connect these states using regular events as shown the image below.

![Screenshot 2025-02-07 at 4.06.08 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/KD-VTSiH6sBWg5YEf_eGO_screenshot-2025-02-07-at-40608-pm.png)


[title] Send
[path] BrightSign Author/Presentation/Commands & Conditional Targets/

This section has an accompanying tutorial video:

::embed[]{url="https://vimeo.com/378348077"}

Information can be sent using the following interfaces.

# Send Zone Message

Triggers a [Zone Message Event](docId\:HoHYzkfWnNG_vccSM68u_) with the same command parameter as the Send Zone Message command.

# UDP

Sends a message to a networked device using the UDP protocol. Go to [Presentation Settings > Interactive > Networking](docId\:a6Ali6u-szxHuansk6T3-)  to specify the destination address and port for UDP messages.

# Send IR Remote

Via the player’s 3.5mm IR Out port (availability depends on player model), **Send IR Remote** sends NEC-formatted commands while **Send IR Remote (Pronto)** sends commands using the Pronto Hex Code (PHC).

::::ExpandableHeading
## More info about Send IR Remote

Many BrightSign players have a 3.5 mm jack which, when paired with a compatible IR transceiver, enables the player to send and receive IR commands. Presentations created with BrightSign Author can then be designed to instruct those players to send and receive IR commands at user-defined times. For example, a [Remote Input Event](docId\:teRXGBRZ03XIsv2N8YqFH) can be created such that a specified remote control button will trigger the desired event.

:::hint{type="info"}
Note that while the 3.5 mm jack on most players are capable of sending *and* receiving IR signals, some models (such as the XDx30) can only send IR signals. Refer to the [hardware specifications](docId\:UYYJYeJ6qoJy1HKSbRlPu) for your specific player model.
:::

### IR Codes

IR-capable players are compatible with either NEC-formatted integer values or Pronto-formatted IR codes. These codes are available on sites like [remotecentral.com](http://remotecentral.com/) as well as from the display manufacturer.

### IR Transceivers

Many IR transceivers with TS type 3.5mm male jacks are compatible with BrightSign players. TRS/TRRS type male 3.5mm jacks are not supported.

[This IR transceiver](https://www.iguanaworks.net/products/usb-ir-transceiver/) has been tested and proven to work with BrightSign players.

### Events and States

IR commands can be set up for Events as well as a States.

### IR Commands for an Event

To set up IR commands for an Event:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/yptbOjKFLaEzFiFpR0aaK_eventprontocmds.png" size="60" width="622" height="469" position="center" alt="Event_Pronto_CMDs.png" darkWidth="622" darkHeight="469" showCaption="false"}

1. The presentation must be [Advanced](docId:0Vm0UTpL2j8dss-DFNhMo).
2. From the **Content** pane, select the Event during which the IR command will be in effect. 
3. Go to **Event Properties > Advanced**. 
4. Click **+ Add Command** to add a command. 
5. Set the **Command** to **Send**. 
6. Use **Command Parameters > Send IR Remote** for NEC commands. Use **Command** **Parameters > Send IR Remote (Pronto)** for Pronto Hex commands. 

### IR Commands for a State

To set up IR commands for a State:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/i5GqRdHqryYMcSyMvg2O9_iroutputcommands.png" size="60" width="542" height="597" position="center" alt="IR_Output_Commands.png" darkWidth="542" darkHeight="597" showCaption="false"}

1. The presentation must be [Advanced](docId:0Vm0UTpL2j8dss-DFNhMo).
2. From the **Content** pane, select the State during which the IR command will be in effect.
3. Go to **State Properties > Advanced**. 
4. IR commands for a State can be either an *Entry Command* or an *Exit Command*. Entry Commands are executed when the State is entered. Exit Commands are executed when the State is exited:
   1. To create an Entry Command, click **+ Add Command** next to **Entry Commands**.
   2. To create an Exit Command, click **+ Add Command** next to **Exit Commands**.
5. Set the **Command** to **Send**. 
6. Use **Parameters > Send IR Remote** for NEC commands. Use **Parameters > Send IR Remote (Pronto)** for Pronto Hex commands. 

### Pronto IR Codes

When using Pronto-formatted IR codes, you may get a "pulse too long" error in the system log, and the code will fail to work. To fix this issue, change the last four characters of the IR code to all zeros. Below is a "power on" command before and after the change. 

**Before:** 

*0000 0071 0000 0032 0080 003F 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0030 0010 0030 0010 0030 0010 0030 0010 0010 0010 0010 0010 0010 0010 0030 0010 0030 0010 0030 0010 0030 0010 0030 0010 0010 0010 0030 0010 0A98*

**After:**

*0000 0071 0000 0032 0080 003F 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0030 0010 0030 0010 0030 0010 0030 0010 0010 0010 0010 0010 0010 0010 0030 0010 0030 0010 0030 0010 0030 0010 0030 0010 0010 0010 0030 0010 0000*
::::

# Serial string (EOL)

Sends the specified string to the specified serial port. This command adds a carriage return at the end of the string.

# Serial string (no EOL)

Sends the specified string to the specified serial port. This command does not add a carriage return at the end of the string.

# Serial byte

Sends the specified byte to the specified serial port. The byte must be entered in decimal format (0-255).

# Serial bytes (comma separated)

Sends the specified bytes to the specified serial port in comma-separated format.

:::hint{type="info"}
Most standard serial devices enumerate on port 0 (on the HO523, they will enumerate on port 1). If you are connecting a USB-serial device, it will enumerate on port 2.
:::

# Send Plugin Message

Sends the specified string to a [Script Plugin](docId\:a6Ali6u-szxHuansk6T3-) attached to the presentation. Use the dropdown menu to select a desired script plugin. See [Use Plugins & Parsers](docId\:uWsz22b8BpJF6DQq_ioq2) for more information on creating custom scripts that can receive plugin messages.


[title] Live Text State
[path] BrightSign Author/Presentation/Untitled/

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/upWKJLTwP2T6PdzEzOWkN_livetext.png" size="14" width="148" height="148" position="center" darkWidth="148" darkHeight="148" showCaption="false"}

A Live Text state consists of images and text fields overlaid on top of each other. Images can be layered with both static text and updatable RSS and MRSS content, and the positions and sizes of all items can be customized.

# State Properties

- **Name:** The name of the Live Text state
- **Initial State:** Select this to make this state the home screen

## Notes

This section lets you store important information about the Live Text state for future users. It can be modified at any time.

## Advanced

This section lets you add commands to your presentation to extend its functionality. See [Commands & Conditional Targets](docId\:az1YTDtEYH-Zp2Dbg_lBL) for more information.

# Using a Live Text State

![image-20240410-231756\_new.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/MAucj0Ppcxi2wWkstoz8r_image-20240410-231756new.png)

Make sure the **Advanced** zone type is selected (instead of Simple) and drag-and-drop a **Live** **Text** state onto the canvas. Double-click the **Live** **Text** widget icon on the canvas to edit the state.

## Layers

![image-20240430-230856.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/p3bkpf0S92b2enboOnfMn_image-20240430-230856.png)

Live Text items are organized by items with each item belonging to its own layer (unless you click the trashcan icon to delete an item from the Live Text canvas). Each layer can be clicked-and-dragged up or down. Each layer has a number associated with it. Higher numbered layers are displayed on top of lower numbered layer. For example, in Image 2 above, the “OS Version” is layer 2 and will be displayed on top of the “Fixed Text Example” text which is layer 1.

Background is a permanent layer that is always displayed behind all other Live Text items. To set the background, click anywhere on the canvas outside of an existing item. The Background layer will be highlighted. Next, click Layer Properties to set the background to either a color or an image.

## Add Item

Click the "+" icon to add a new item to the Live Text canvas.

- **Position**: Check this box to set an initial position for new items in relation to the most recently created item. Input the offset distance for the next text item (in pixels) in the **Left (X)** and **Top (Y)** fields.

## Duplicate

This enables a duplication of the currently selected item.

- **Offset**: Checking the offset option will offset the duplicated item relative to the item selected.

## Update Live Data

Refresh items that are populated from a remote URL (i.e. Live Text Data, RSS Feed, Media RSS Feed).

## Grid Lines

Check this box to include invisible gridlines on the Live Text canvas. When you manually move or resize elements by clicking and dragging them, they will snap to these lines. Enter the distance between gridlines (in pixels) in the **Vertical** and **Horizontal** fields.

:::hint{type="info"}
To exit the Live Text canvas and go back to the Zone Content canvas, click either:

- the **\< Back** button in the top-right corner of the canvas, or
- the Zone description located in the top left corner of the canvas.
:::

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
## Layer Properties

Select an item on the canvas or from the **Layers** list to edit its properties:

## Size & Position

Adjust the width and the height of the item as well as the position of the item on the horizontal (**X**) and vertical axes (**Y**).

## Type

Use the dropdown menu to select the item type:

**Fixed Text:&#x20;**&#x44;isplays simple, static text. Under **Text**, enter the text you want to display. 

**System Variable:&#x20;**&#x44;isplays the player serial number, OS version, script version, or other system value. Use the dropdown list under **System Variable Options** to determine the system value to display.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/qVpyqf_Et6IA3MM6Hdytm_image.png" size="80" width="1280" height="2610" position="center" darkWidth="1280" darkHeight="2610" showCaption="false"}
:::
::::

**Media Counter:&#x20;**&#x44;isplays the number of times a media file has played in a presentation.  To use this feature, Media Counters must first be enabled in the [Presentation Settings > Variables](docId\:a6Ali6u-szxHuansk6T3-) section. Use the dropdown list under **Media Options** to select a media file that is being used in your presentation.

**Variable:&#x20;**&#x44;isplays the current value of a Variable. You must create a [Variable](docId\:a6Ali6u-szxHuansk6T3-) before using this option. Use the dropdown list under **Variable Options** to specify a Variable in the text field.

**Image:&#x20;**&#x44;isplays an image. Depending on your [Content Mode](docId:8yTHtVfOe83v1SSsbyIW-), you will be prompted to select an image file from either your BrightSign Author Plus library or your local computer.

**Live Text Data:&#x20;**&#x44;isplays content from a feed in the text field. The displayed feed item will remain fixed and will not cycle through feed items like an RSS ticker (use the "RSS Feed" type for this functionality). However, you can still update the text in real time by modifying the feed on the server and changing the description associated with the feed item.

- **Item title**: Specify the feed item to display using the Title/Name of the item.
- **Item index**: Specify the feed item to display using the index number of the item.
- **Validate Live Text Data**: Refresh the contents of the item based on the selected item title/index.
- **RSS Feed**: Displays content from an RSS Feed.
- **Display RSS title**: Check this box to display the title of the RSS item.
- **Display RSS description**: Check this box to display the description of the RSS item.
- **MRSS Feed**: Displays content from an MRSS Feed.
- **Display Media RSS Title**: Check this box to display the title of the MRSS item.
- **Display Media RSS Description**: Check this box to display the description of the MRSS item.
- **Display Media RSS Media**: Check this box to display the media item associated with the MRSS item.

:::hint{type="info"}
BrightSign Author presentations cache a single Media RSS (MRSS) feed and retain the content files until they are refreshed. When displaying the MRSS feed, the presentation will play files as they are downloaded. If an image file takes longer than five seconds to download, the unit skips to the next image in the feed. If a video file hasn't finished downloading, the unit skips to the next file until all items have been attempted.
:::

## Data Feeds

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
Use this section to add Data Feeds to your Live Text Data, RSS Feed, and MRSS Feed items. For RSS Feed and MRSS Feed items, you can add multiple feeds. The item will cycle through the feeds according to their order in the list.

Use the **Validate** button to check if the feed is accessible and if the format is correct. If your data feed is valid, a green message will appear to let you know that the data feed was accessed successfully. If there are problems with your data feed, you may get the following messages:
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/7oG6orfcPLTkZF_LT9b3o_image.png)
:::
::::

- If no data feed URL is specified, you will get an error stating “Data Feed source not properly specified”. If you select **Validate** at this stage, you will get an error indicating that you must specify a data feed URL.
- If an incorrect data feed URL has been input, you will get an error stating “Unable to access specified data feed. Check the URL or try a new one.”

## Set Text Parameters

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
Use this section to edit the appearance of a text item. For example, you can adjust the font size of a text widget in a Live Text state by choosing an **Automatic** or **Fixed point** font size for the text.

1. **Time to Display Each Line** (RSS Feed, MRSS Feed only): Specify how long (in seconds) to display each entry in the feed.
2. **Rotation**: Specify a degree of rotation for the text. This option does not rotate the dimensions of the text box, so you'll likely need to resize it manually.
3. **Alignment**: Specify whether the text is left-aligned, right-aligned, or centered.
4. **Foreground Text Color**: Select a color for the text.
5. **Background text color**: Check this box to include a background color for text fields.
6. **Font size**:
   - Select **Automatic** to fit the text to the height of the text field so each text widget contains only one line of text. This is the default option.
   - Select **Fixed point size** to enter a value for the font size (1 - 500).
7. **Font**: Select a font for the text. The **System Font** option uses the default Linux font. You can use any TrueType font. Click **Reset to System Font** to reset the font to the default. When selecting a font file, you cannot browse to the font files in the Windows fonts folder. You will need to copy the font file to your desktop or another location and then select it using the **Local Font** button in BrightSign Author. If the presentation's **Destination** is set to **BrightSign Network,** fonts can be accessed through BrightSign Cloud by going to **Set Text Parameters** **> BSN Fonts**. 
:::

:::VerticalSplitItem


![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/2FouyWUkRUP3lZYhyOmAx_image.png)
:::
::::

# Examples

## Adding a Live Text State to a Presentation

1. Make sure that your BrightSign Author presentation contains a **Video or Image** zone, and that the toggle is set to **Interactive**.
2. Drag and drop the **Live Text** icon into the canvas.
3. In **State Properties** enter a **Name** for the Live Text state.
4. Double-click the state to edit it, and select a **Background Image**. If you do not specify a background image, the text may display on top of a video, image, or the background color of the presentation (depending on the [zone layering](docId:0Vm0UTpL2j8dss-DFNhMo) in the presentation). 
5. Add one or more **Live Text** items (fields) and adjust the settings for those fields.

:::hint{type="info"}
Live Text states aren't available in Ticker zones.
:::

## Updating a Static Text Field

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
You can manually edit Live Text fields in BrightSign Author  and republish, or use an RSS feed or BrightSign Cloud Live Data feed to remotely update Live Text. To configure the Live Text state to receive updates:

1. Go to **Content > New Component > Live Data Feed** to create a BrightSign Cloud [Live Data Feed](docId\:gPjwF1LNjhau_EQZJMfUq).
2. In the **Presentation** tab, open a **Live Text** state.
3. Select a text box or add one using the **Add Item** button.
4. Use the **Type** drop down list, select **Live Text Data,** and go to **Data Feed** 
5. Choose the data feed you created in Step 1 in **Live Data Feed**. If you're hosting your own RSS feed, enter the **URL** in the **Data Feed** field.
6. Enter an **Item title** or **Item index** number for the **Live Text** item. The feed item (RSS or Live Data) that matches this value will be displayed in the text box.
7. Once you have configured the **Live Text** state, publish the presentation to your player.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/b2vYD-FB8iuiIP_nUjGNj_image.png" size="80" width="1280" height="2398" position="center" darkWidth="1280" darkHeight="2398" showCaption="false"}
:::
::::

## Displaying a UDP message using a Live Text State

Follow these steps to display and update Live Text fields using UDP messages:

1. Create the required number of User Variables by going to **Presentation Settings > Variables** and clicking the **Add Variable** button to create each user variable. Then click OK.

![Variables\_UDP.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/K5h5ACKXf_bcQOMqNn66d_variablesudp.png)

2. Drag and drop a **Live Text** state onto an interactive playlist.

![Live\_Text\_state.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/aV1zvjO9vpWa82s-dM3m5_livetextstate.png)

3\. Select **User variable** for the item **Type**, then select the corresponding User Variable under **User Variable Options** (“cell1” in this example).

![Set\_Type.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/Wg2UX8KA6DlDCDbIKv6Xe_settype.png)

4. Click **Add Item** to add more text widgets to the Live Text canvas, and then assign the remaining User Variables to these widgets. Go back to the interactive zone where the Live Text state is located. 

![Three\_Variables.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/qswyHMiwfD20zVjuVaAYi_threevariables.png)

5. Drag and drop the **UDP** event onto the Live Text widget from **Events**.

![UDP\_Event.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/P7we2ivxBBea7DL5iZ_WT_udpevent.png)

6. In **Event Properties** enter "” (without the quotation marks) into the **Specify UDP input** field.

:::hint{type="info"}
**Note:** Text in the **Label** field is up to the user.
:::

7. Select **Transition to new state** under **Target State**.

![Transition\_UDP.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/VK54yp4nrY1aEC7CEkaBa_transitionudp.png)

8. In **Event Properties** select the **Assign input to variable** option and make sure that the **Input specifies variable** option is selected. Then publish the presentation to the player.

![Input\_UDP.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/P8GGnGiVWRWke0OOiMi0e_inputudp.png)

## Sending UDP Messages

You can use any application capable of sending UDP messages to display your UDP messages on the screen.

This example uses [Hercules](http://www.hw-group.com/products/hercules/index_en.html) to send UDP messages to the networked player(s) playing the above presentation.

1. Open Hercules and go to the **UDP** tab.
2. Under **Module IP**, enter the BrightSign player IP address and port 5000 (this is the default UDP sender and receiver port on BrightSign Author)
3. Under the server settings make sure to deselect **Server echo**, **Redirect to TCP Server**, and **Redirect to TCP client**.
4. At the bottom under the Send section enter “cell1\:new message” and click **Send** to display “new message” on the BrightSign player. The string consists of "User Variable\:the message".
5. You can also use one UDP string to update multiple Live Text items at the same time. To do so, you need to separate each message with a `!!`. For example, you can enter `cell1:my message!!cell2:my other message!!cell3:yet another message` and click **Send**.

![image-20240520-232919.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/in_YypgX28XCgwNnEHbvV_image-20240520-232919.png)

If you want to broadcast a UDP message to all the BrightSign players on the same subnet, you can replace the IP address of the player with a broadcast address (e.g., 192.168.1.255).


[title] Get Optimal 4K Image Quality
[path] How-tos/

These tips can help you get the best image quality if you are using 4K resolution:

- To add a 4K image to a presentation in BrightSign Author or , or to 4K HTML canvas, the presentation must be set to full resolution graphics. This is not required for 4K video.
- Only the XC5, XT4, and XT5 support full resolution mode. Other Series 5 players do not support this mode.
- You can only select **Enable Full Resolution Graphics** if **Force Resolution** is also selected in [Presentation Settings > Display](docId\:a6Ali6u-szxHuansk6T3-).
- If your player or resolution doesn’t support full resolution graphics and you select 4K output and add an 1080p or larger image to your presentation or HTML page, the player will downscale the image to 1080p and then upscale it to 4K, reducing image quality. To get the best results, add the 1080p image to your presentation/HTML and let the player upscale it from 1080p to 4K.

Also see [4K Video Quality](docId\:iqN3Si7i3oTm20ccgRPoX).

[title] Roles
[path] BrightSign Author/Admin/

This screen allows you to view the permissions of different roles and add new roles to your  network. You must be a BrightSign Author Plus user to access this page.&#x20;

![Screenshot 2024-10-31 at 11.15.48 AM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/YTuiULypprbYSHBXxuWll_screenshot-2024-10-31-at-111548-am.png "Image 1")

Image 1 shows a table where each row represents operations that users can execute in BrightSign Author Plus. Each operation is associated with one specific entity type (for example, **Content** or **Presentation**), on the first level you can see **Full Control** operations and when expanding the rows, you can find the child operations linked to them. System and Custom Roles are shown in the columns. You can choose which System Roles to display, or delete Custom Roles by clicking the gear button and choosing **Delete Role**.

Both allowing and denying permissions are inherited by child from the parent operation and may be overridden. For example, you can give **Presentation (Full Control)** permissions to a content publishing role but ensure that they cannot delete presentations by unchecking **Delete Presentations**.

To edit Custom Role permissions, expand the rows of the table to find the operation you are looking for. Each time you click on a checkbox in the main area, a system creates a new permission for an operation in that current row and a role in that current column. When the checkbox is set, members of the current role are given permission to execute that operation. When the checkbox is unchecked, the permission to execute that operation is denied.&#x20;

When reviewing the check boxes in the main area, you may notice the following statuses:

- **Active checkbox with a check** means that permission has been granted for this operation
- **Active checkbox with a dash** means that some permissions have been granted for child operations but not this operation
- **Grey checkbox with a check** means that permission have been granted for this operation and are not editable
- **Grey checkbox with a dash** means that some permissions have been granted for the child operations and are not editable
- **Grey checkbox without a check** means that permission is denied for this operation and this cannot be changed
- **No check at all** means that permission is denied for this operation

# Show/Hide Roles

To show or hide System Roles, click on the gear icon at the top right and selecting them under the **Show System Roles** menu item, as shown in Image 1.

::Image[]{src="https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/3wqoovHPzMt3KSOEB1yco-20260610-210352.png" size="44" width="1014" height="1089" darkWidth="1014" darkHeight="1089" position="center" showCaption="false"}

# Add Roles

## Add a System Role

Click the **Edit** icon (three gears icon) and select **Add Role** to add a new role to the network. 

- **Name**: Enter a name for the role
- **Description**: Enter a custom description for the role
- **Copy Permissions from an Existing Role**: Select this option to copy permissions from another role on the network. Use the **From Role** dropdown list to select the role. If you don't enable this option, the custom role will have no permissions by default.

## Add a Custom Role

Since there are many individual permissions, it is often easiest to base a Custom Role on one of the preexisting System Roles:

1. Go the **Admin** tab and select **Role** (you must be signed in to BrightSign Cloud).
2. Go to the **gear** icon at the top right of the page and select **Add** **Role**.
3. Enter a name and (optional) description for the role.
4. You can copy all permissions from a selected role, or define the new role permissions from scratch.
5. Select **Add Role.** Once the role has been created, you can select the check boxes to add or remove additional permissions.

![](https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/T9OjeyPGEbehVa0HA9Irn-20260610-211630.png "Image 2")

# Delete a Role

Click the **Edit** icon (three gears icon) and select **Delete Role** to delete a role from the network. Only custom roles can be deleted.

# Other

See [System Roles and Permissions](docId\:ziUqqCBob9oFaweaio6gy) for more general information about user roles and permissions.

See [Object Permissions & Custom Roles](docId\:arSvZyPzjxMP9Uh9v95H2) for information about using object permissions with custom roles


[title] Unsupported Features
[path] BrightSign Author/

We are constantly working to add features to BrightSign Author. However, the following features from legacy BrightAuthor are not yet supported:

| **Feature**                                      | **Notes / Workarounds**                                                                                                                                                                               |
| ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| BrightWall                                       | Synchronized presentation sets still work, you just cannot create a BrightWall as a single "packaged" presentation                                                                                    |
| Clock zones in Author Plus presentations         |                                                                                                                                                                                                       |
| Content Encryption                               |                                                                                                                                                                                                       |
| Custom local fonts in HTML5 states               | Include the custom font in a Ticker zone. There doesn't need to be content in the Ticker zone, just specify the font in the Zone Properties, then use the font in HTML assuming it's already defined. |
| Dynamic Playlist used outside of Author Plus     | This can be used in locally-published presentations                                                                                                                                                   |
| Image cache                                      |                                                                                                                                                                                                       |
| Interactive Menu State                           |                                                                                                                                                                                                       |
| Mosaic Mode                                      |                                                                                                                                                                                                       |
| Presentation Preview                             |                                                                                                                                                                                                       |
| Tagged Playlist use outside of Author Plus       | This can be used in locally-published presentations                                                                                                                                                   |
| User Stylesheet (CSS injection) for HTML5 states |                                                                                                                                                                                                       |


[title] Network
[path] BrightSign Author/

:::hint{type="info"}
The Network tab was updated in BrightSign Author version 1.37.1. Documentation for the older version of the Network tab is still available [here](docId:5y2MVSEU9yvaLZhVe27nG).
:::

The Network tab allows you to monitor players on your BrightSign Cloud network and modify them using the Remote [Diagnostic Web Server](docId\:qXt4YHey7IEj_M9dH73wM) (RDWS). You must have a BrightSign Cloud account to access the Network Tab (including the RDWS and Player Group features).&#x20;

![image-20241217-215945.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/-CgyO6VQuWSHimEx3L_M5_image-20241217-215945.png)

# Hierarchy

**Hierarchy** allows you to switch between **All Players** and **Player Group**.

## All Players

This is the default setting for **Hierarchy**. It allows you to view all of the players on your network independent of what group they are in.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/q2MntIB8KMkE-pNkVGP5m_image.png" size="40" width="1280" height="1069" position="center" darkWidth="1280" darkHeight="1069" showCaption="false"}

## Player Group

This setting allows you to view players according to their group. Players that are not in BrightSign Cloud are in the **Default** group and cannot be moved outside of that group.

Use the check boxes to select the group you want to view, or select **All Groups** to view all players on your network. The groups are listed in the order in which they were selected.

There are two sorting options for groups:

- Use the **arrow** icon to toggle between ascending and descending order.
- Use the **drop down** menu to switch between sorting by group **Name** and player **Count**.

# Player List

![image-20241219-200820.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/m7ZF0XfBB7kskg1Up0qpx_image-20241219-200820.png)

The **Player List** lists all players (if All Players has been selected) or players within the selected group (if Player Group has been selected).

**Expand All** and **Collapse All** expands or collapses the Player List. If the Hierarchy is set to Player Group, these buttons expand or collapse the selected groups.

**Disable Player(s)** moves a player or players to the **Disabled Players** group. Players in this group will display a message indicating that the player is disabled.

## Icons

Select the **two gear** icon to select the desired columns (Player ID, Player Name, Model, etc.) to display in the **Player List**.

Select the **funnel** icon to create custom filters to view only selected players. See [Filters](docId\:Uba8sfkMSAJsIBrbv4A6N) (below).

Select the **download** icon to download a CSV file of the current **Player List.** If a filter is applied, only the filtered players will be in the CSV. If no filter is applied, all players will be included in the file.

Select the **refresh** icon to update the list.

The **tag** icon is displayed if a player has a tag. Click the tag icon to see the tag name and value.

The **single gear** icon accesses the player’s remote [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM).

Select the **trashcan** icon to delete the player from your network.

- Players in the deleted group that were set up with BSN.cloud will be moved to the **Unassigned** group.
- Players in the deleted group that were set up with a non-BSN.cloud setup will be moved to the **Device Control** group. 

Players can be sorted in ascending/descending order by selecting the column name and then selecting the up/down arrow that appears.

Information (for example, **IP Address**) can be copied and pasted from these columns.

## Player Status

Players with network connections check in with BrightSign Cloud about every five min. The **Player Status** buttons enable sorting of players based on three levels of player status:

- **Healthy:&#x20;**&#x54;he player has successfully checked in within the last 12 minutes.
- **Idle:&#x20;**&#x54;he player has not successfully checked in within the last 36 minutes.
- **Inactive:&#x20;**&#x54;he player has not successfully checked in for over 36 minutes.

:::hint{type="info"}
Refer to [this FAQ](docId\:eQrdKoaOXVodhBi084Z4I) to troubleshoot players with a red status.
:::

# “All Players” Hierarchy

To have the **Player** **List** display all players in your network, select **All** **Players** from the drop-down menu:

![image-20241219-191505.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/8oRHLayPwJgZQPN0FGLZK_image-20241219-191505.png)

# “Player Group” Hierarchy

Both the **All Players** and **Player Group** hierarchies display the same player information. However, some additional functionality exists when **Player Group** is selected.

![image-20241219-200857.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/iya7q2IEp3Rhqi7mRx842_image-20241219-200857.png)

When **Hierarchy** is set to **Player Group**, a **plus** icon is available which adds a group to your BrightSign Author Plus network. This feature is only available for BrightSign Author Plus users.

## Group Properties

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/KlnxeYY_NC8OM6qcvQwhX_image-20241219-201742.png" size="70" width="779" height="227" position="center" alt="image-20241219-201742.png" darkWidth="779" darkHeight="227" showCaption="false"}

Select the **gear** icon (the one in the header, not the one next to the player) to view the **Group** **Name** and toggles for:

- **Serial Debugging**: Enables serial debugging for players in the group. This will output presentation-level log information (such as media playback, event information, and other presentation-specific data) to the serial port as well as over Telnet and SSH if these features are enabled.
- **System Log Debugging**: Enables system log debugging for players in the group. The player will output system log information to the **Log** tab in the Diagnostic Web Server (or the Serial/Telnet/SSH ports if these are enabled via the **Serial Debugging** option).

Select the **map** icon toggle between a list view or a map view of the players.

## Moving Players to Another Group

![image-20241219-202004.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/5x1X3dVk3TuCp2yVQW6v6_image-20241219-202004.png)

To move a single player to a different group, drag and drop the player to the desired group using the **Move** icon next to the desired player.

To move multiple players to another group, select the check boxes next to the desired players, and drag and drop the players to the desired group using the **Move** icon.

# Properties

:::hint{type="info"}
All player Properties controls will be disabled if Property Lock is on. See [Property Lock](docId\:a6Ali6u-szxHuansk6T3-) for more information.
:::

Select a player to view and edit its properties. These properties can be copy / pasted elsewhere.

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
- **Player Name**: The player name, which is designated during the [player setup process](docId:-GUga56hC2IJ-tLQLAAOo)&#x20;
- **Player ID**: The serial number of the player
- **Model**: The model number of the player
- **Publishing Mode**: The setup type of the player (called "Setup Type" in older versions)
- **Current Presentation**: The name of the presentation that is currently running on the selected player
- **Description**: The player description, which can be edited with the provided field
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/T850H8qmOcl7hMph6Tow4_image.png)
:::
::::

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
## Overview

- **Target Group**: This pull down menu lets you change the group assignment for the selected player.
- **Time Zone**: Change the configured time zone on the player
- **BrightSignOS Version**: The current OS version installed on the player
- **Autorun Version (Standard)**: The current autorun version of the BrightSign Author presentation assigned to the player
- **Remote Screenshot**: Enable or disable remote screenshots on the player. You can view snapshots on the [Remote Diagnostic Web Server](docId:6zVEBQJF7-9aGT11u3eqw).
- **Subscription** **Type**: The type of BrightSign Cloud subscription assigned to the player
- **Subscription Status**: The current status of the BrightSign Cloud subscription assigned to the player
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/7poFGUXsQlr6sMCU3aqnO_image.png)
:::
::::

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
## Player Configuration

- **Enable Diagnostic Web Server**: Enable or disable the access to the [Diagnostic Web Server](docId\:XUE20rJXhFt-Lq0RDmJbW).
- **Server Authentication (Optional) / Password**: Specify a password for the Diagnostic Web Server.
- **Download Window**:  Check this box to restrict player content downloads to a certain time of day. This is useful if you want to limit network traffic during peak hours. This option is not available on Standalone and Local Network setups as it is not applicable for those publishing modes.
- **Start time**: The start time of the content download window.
- **End time**: The end time of the content download window.
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/BBNMJ-M0mF_AghUdSCdes_image.png)
:::
::::

## Logs

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
- **Playback**: Record playback start and end times, zone names, media types, and file names.
- **Events**: Record timestamps, state names, zone names, event types, and event data.
- **Diagnostics**: Record timestamps, firmware and script versions, and the current presentation.
- **States**: Record current and last state names, timestamps, and media types.
- **Variables**: Record the current and default values of all [Variables](docId\:a6Ali6u-szxHuansk6T3-) in the presentation.
- **Upload Logs**: When to upload player logs
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/f1QcJAWS-Upn5xGet3Qma_image.png)
:::
::::

## Network Settings

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
Select **Save** to validate and apply the changes in **Network Settings** or **Reset** to reset to the current settings.

- **Interface Priority:** Interactive settings that allow you to prioritize Ethernet, WiFi, cellular, virtual, or other networks. The player will always attempt to download and upload data using the interface at the top of the list and will only use the next option if the first is unavailable, and so on to the bottom of the list.
- **Data Types Enable:** Use these check boxes to determine the data types that can be transferred using the selected interface:
  - **Content** (videos, images, and audio)
  - **Text Feeds** (tickers and live text)
  - **Media Feeds** (media RSS, dynamic playlists)
  - **Health** (player health status)
  - **Log Uploads** (logs)
:::

:::VerticalSplitItem


![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/W7GY6EIvSSg4HkH--_D53_image.png)
:::
::::

- **Connection Settings:** Specify advanced settings for the wired and/or wireless connection. If **DHCP Enabled** is selected, the player will obtain its IP address using DHCP. Otherwise you will need to enter the required parameters in these fields:
  - **IP Address:** Enter the player IP address
  - **Subnet Mask**: Enter the subnet mask
  - **Default Gateway**: Enter the default gateway
  - **DNS1:** Enter an IPv4 or IPv6 address in CIDR notation
  - **DNS2:** Enter an IPv4 or IPv6 address in CIDR notation (optional)
  - **DNS3:** Enter an IPv4 or IPv6 address in CIDR notation (optional)
- **Rate Limit Network Download Traffic:** Set rate limitations for downloading content. You can also set rate limitations for **During content download window** (the "content download window" is specified during the [Player Setup](docId\:XNnXywMV09iEgZIIt7RWA) process) and **During initial downloads**.
  - **Outside Content Download Window**
    - **Unlimited Download Rate**: Sets no limit on downloads.
    - **Default limit**: Sets the default limit (2000 Kbps) on downloads.
    - **Specify limit**: Sets a customized limit. Enter a limit in the text field (in Kbps).
  - **During Content Download Window**
    - **Unlimited Download Rate**: Sets no limit on downloads.
    - **Default limit**: Sets the default limit (2000 Kbps) on downloads.
    - **Specify limit**: Sets a customized limit. Enter a limit in the text field (in Kbps).
  - **During Initial Downloads**
    - **Unlimited Download Rate**: Sets no limit on downloads.
    - **Default limit**: Sets the default limit (2000 Kbps) on downloads.
    - **Specify limit**: Sets a customized limit. Enter a limit in the text field (in Kbps).
- **Network Authentication**: Use this section to configure the player for WPA Enterprise authentication.
  - **Enable 802.1X Authentication / Enable WPA Enterprise Authentication**: Check this box to enable authentication via 802.1x (for wired) or WPA Enterprise Authentication (for wireless).
  - **Choose Network Authentication Variant**: Select one of the following:
    - **EAP-TLS**: This authentication variant requires a client certificate and private key, which can be provided with one of the following certificate types which both enable protection of the client certificate using an optional passphrase in the **Enter passphrase&#xA0;**&#x66;ield.
      - **PKCS#12**: The client certificate and private key are both provided in a single PKCS#12 formatted file (usually with a *.p12&#xA0;*&#x66;ile extension). Select the first **Browse&#xA0;**&#x62;utton to locate the certificate file.
      - **X.509 PEM/DER**: The client certificate is provided as a X.509 certificate (using PEM or DER encoding), and the key is encoded separately. Use the first **Browse&#xA0;**&#x62;utton to locate the X.509 certificate and the second **Browse** button to locate the PEM/DER key.
    - **PEAP/MSCHAPv2**: This authentication variant requires a **Username** (i.e. identity) and **Passphrase**. The server must be configured to accept a username/password scheme instead of a client certificate for this method.
  - **Select Browse to add a CA Certificate**: This should be the root CA certificate for the CA which signed the authentication server certificate. If omitted, the server certificate will not be validated.

## Location

- **GPS Coordinates**: Specify the location of the player as a set of **Latitude** and **Longitude** coordinates.
- **Address**: Specify the location of the player using its **City**, **State / Prov.**, and **Country**.

:::hint{type="info"}
Cell modem locations may not be accurate due to issues with the processing of cell tower information.
:::

## Notes

Here you can add any additional info about the player.

## Downloads

The **Downloads** section allows you to monitor the player synchronization process. Here you can view the progress of individual file transfers.

Select **Refresh** to update the status of the file transfers.

## Error Logs

The **Error Logs** section provides detailed information about the last five reported errors. If the player is operating normally, the error list will be blank.

Select **Refresh** to update the error list.

## Security

This section contains object permissions that are useful for defining a baseline security policy which then can be adjusted by more granular object permissions. For example, when you select the **Network**, **Content**, or **Presentations** tab and chose a player, content, or presentation, you can view or change the permissions as shown in the image below.

![Screenshot 2024-10-31 at 11.29.29 AM.png](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/ZvdtsoTco7YYzwXT2IrFk_screenshot-2024-10-31-at-112929-am.png)

To get more information about object permission management, see [Object Permissions](docId\:arSvZyPzjxMP9Uh9v95H2).

# Filters

## Creating a Filter

Select the funnel icon in the header of the **Player** **List** to create a filter. In the pop-up that appears:

1. Select the **plus** icon to add a filter
2. Use the default category name (model, setup type, etc.) or select the **arrow** to pick a different category to add to the filter and add a value to create the filter.
3. If you want to add additional filter parameters, select the plus icon again to add another category and value. Repeat as needed.
4. Select **Apply** when you are done. Each component of the filter is displayed individually in the group header. See the image below which displays the results of a filter which selects for **Player** **Description**, **Setup** **Type**, and **Model**.

## Removing a Filter

To clear all filters, select **Clear all filters** on the right side of the group header.

To remove individual components of a filter, select the X next to the component name. For example, in the image below, the HD1025 group filters for Player Description, Setup Type, and Model, while the Player 1 group only filters for Player Description and Setup Type.

## Additional Info

Mousing over the filter name will display the filter value information.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/W0rbmE0IG-FaZ5B4m5NFX_groups2.png)


[title] Remote Input Event
[path] BrightSign Author/Presentation/Event Properties/

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/mNd7oo8CTnBzoK_Y_FUuA_remoteinputevent.png" size="10" width="83" height="79" position="center" darkWidth="83" darkHeight="79" showCaption="false"}

# Overview

The Remote Input event triggers when the BrightSign player receives the specified input from an IR remote control.

In the **Specify remote input** field, enter the NEC remote control code that will trigger the event. BrightSign Author supports the following NEC remote control codes:

:::ExpandableHeading
**NEC Remote Control Codes**

- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- Add
- Back
- Blue
- Brightness
- Channel Down
- Channel Up
- Down
- Exit
- Fast Forward
- Green
- Home
- Info
- Last
- Left
- Mute
- Ok
- Option
- Pause
- Period “.”
- Play
- Power
- Red
- Repeat
- Rewind
- Right
- Search
- Shuffle
- Source
- Stop
- Up
- Volume Down
- Volume Up
- Yellow
:::

# Using this Feature

![](https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/2gBX15YUa0VW1XT4HFRch-20251024-183653.png "Image 1")

1. Create an Advanced presentation
2. Add a widget ([Stream State](docId\:sv1TZMjVMqDTUgV6k3yPM) in this example)
3. Add a Remote Input event to your widget (see Image 1)
4. Go to **Presentation** **Settings** **>** **Interactive** in the right pane (see Image 2).
5. Select the remote control that you are using in the **Connectors** section (see Image 3)
6. Add the commands that you want to occur when certain buttons are pressed.&#x20;
   - To add a custom remote, you can add a CSV that maps your button name to the correct code (for example, [these codes](docId:2VCGHMSxhuRis4ojFTRZl)) if you are using a custom remote. See [Preferences](docId\:Y7kHm4hE_NXvTF3C3nhti).

![](https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/KfOQLtsGaLn-JnJwwI7uL-20251024-203817.png "Image 2")

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/zA7q-aRXrseLUU4kxFhnP_screenshot-2026-07-31-at-74018-am.png" size="40" isUploading="false" width="804" height="1740" darkWidth="804" darkHeight="1740" alt="Image 3" showCaption="false"}


[title] Quicktime for Looping Files
[path] How-tos/

For a video file to loop seamlessly, it must be encoded using [specific parameters](docId\:ez4Alm6KyBFcOAobifHIR). You can also use QuickTime Pro 7 to encode a file for seamless looping. To do this, you will need to export a movie using the "Movie to QuickTime Movie" feature.

:::::WorkflowBlock
:::WorkflowBlockItem
In Quicktime Pro, go to **File > Export ... > Export "Movie to QuickTime Movie" > Options**.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/yNZmRf_toJKk2FFzpGtyJ/TNJXGy7g4EOHnhnPmLQew_image.png" size="70" width="583" height="454" position="center" showCaption="false"}
:::

:::WorkflowBlockItem
Navigate to **Movie Settings > Video** and click **Settings**.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/yNZmRf_toJKk2FFzpGtyJ/oQCp1F3LTrDQ-hL-QbVub_image.png" size="50" width="358" height="455" position="center" showCaption="false"}
:::

::::WorkflowBlockItem
Set everything as shown in the below screenshot and play it back on your player before making any changes.

![](https://archbee-image-uploads.s3.amazonaws.com/yNZmRf_toJKk2FFzpGtyJ/NFafmUdUZ3J7YCV_B5Wwe_image.png)

:::hint{type="info"}
**Note**: Changing the **Encoding** from "Faster encode" to "Best Quality" will increase the file's profile and sometimes set it to a 5.0 H.264 profile. If you do decide to change this value, make sure to check that the profile of the encoded file is no higher then 4.2 (if you're using an XD or 4K player).
:::
::::

:::WorkflowBlockItem
Select **OK** to return to **Movie Settings**.
:::

:::WorkflowBlockItem
Under **Sound**, select **Settings**.
:::

:::WorkflowBlockItem
Ensure that the **Audio** **Format** is indeed set to **Linear PCM** with **Little Endian** enabled.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/yNZmRf_toJKk2FFzpGtyJ/zG5ymXZLvKZ6H53TRDdYG_image.png" size="50" width="444" height="593" position="center" showCaption="false"}
:::

:::WorkflowBlockItem
Click **OK**.
:::
:::::

The generated file should have approximately these specifications:

| Complete name     | F:\SalsaTriimmed15MbpsFasterEncode.mov |
| ----------------- | -------------------------------------- |
| Format            | MPEG-4                                 |
| Format profile    | QuickTime                              |
| Codec ID          | qt                                     |
| File size         | 17.9 MiB                               |
| Duration          | 9s 280ms                               |
| Overall bit rate  | 16.1 Mbps                              |
| Encoded date      | UTC 2014-06-20 18:01:27                |
| Tagged date       | UTC 2014-06-20 18:01:37                |
| Writing library   | Apple QuickTime                        |

### Video

| ID                        | 2                       |
| ------------------------- | ----------------------- |
| Format                    | AVC                     |
| Format/Info               | Advanced Video Codec    |
| Format profile            | Main\@L3.2              |
| Format settings, CABAC    | No                      |
| Format settings, ReFrames | 2 frames                |
| Format settings, GOP      | M=2, N=25               |
| Codec ID                  | avc1                    |
| Codec ID/Info             | Advanced Video Coding   |
| Duration                  | 9s 280ms                |
| Duration\_FirstFrame      | -28ms                   |
| Duration\_LastFrame       | -12ms                   |
| Bit rate                  | 14.5 Mbps               |
| Width                     | 1 280 pixels            |
| Height                    | 720 pixels              |
| Display aspect ratio      | 16:9                    |
| Frame rate mode           | Constant                |
| Frame rate                | 25.000 fps              |
| Color space               | YUV                     |
| Chroma subsampling        | 4:2:0                   |
| Bit depth                 | 8 bits                  |
| Scan type                 | Progressive             |
| Bits/(Pixel\*Frame)       | 0.631                   |
| Stream size               | 16.2 MiB (90%)          |
| Language                  | English                 |
| Encoded date              | UTC 2014-06-20 18:01:28 |
| Tagged date               | UTC 2014-06-20 18:01:37 |
| Color primaries           | BT.709                  |
| Transfer characteristics  | BT.709                  |
| Matrix coefficients       | BT.709                  |

### Audio

| ID                          | 1                       |
| --------------------------- | ----------------------- |
| Format                      | PCM                     |
| Format settings, Endianness | Little                  |
| Format settings, Sign       | Signed                  |
| Codec ID                    | sowt                    |
| Duration                    | 9s 280ms                |
| Bit rate mode               | Constant                |
| Bit rate                    | 1 536 Kbps              |
| Channel(s)                  | 2 channels              |
| Channel positions           | Front: L R              |
| Sampling rate               | 48.0 KHz                |
| Bit depth                   | 16 bits                 |
| Stream size                 | 1.70 MiB (10%)          |
| Language                    | English                 |
| Encoded date                | UTC 2014-06-20 18:01:28 |
| Tagged date                 | UTC 2014-06-20 18:01:37 |

You should check that the generated file is still within the required specs using [MediaInfo](http://mediaarea.net/en/MediaInfo/Download).

[title] Restrict/Allow Access in Author Plus
[path] How-tos/

You can hide almost anything on your network from a specific role or user so that even if the  network is shared, each person only sees the features, groups, players, presentations, or content you allow. The most common reason to do this is licensing or security.&#x20;

# Access Overview

Access works in three layers. Each layer is only able to further restrict what the layer above it allows:

::Image[]{src="https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/rx7K9O_AqqX6uvAXl3Khm_diagram.png" size="80" isUploading="false" width="1284" height="1324" darkWidth="1284" darkHeight="1324" showCaption="false"}

:::hint{type="warning"}
Note that:

- An object's switches only work if the role allows that type of object. If the role has that object turned off, the object switches are grayed out. The labels stay dark, so the switches look active even though they aren't.
- You can override higher level permissions if you change object level permissions. However, you must be an Administrator to do this.
- Folder access settings override the files settings in it; hide a folder and everything in it disappears, show a folder and you can still hide single files inside it.
:::

# Creating Custom Roles

When the preset roles are not specific enough for your user, you can create a custom role that has the restrictions needed for your use case.  Follow the steps below to create a custom role:

1. Go to **Admin > Roles** and create a new custom role. Do not copy permissions from an existing role, since it is quicker to grant access than take it away.

![](https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/_1nuh8jS-TEbcbcXjkxzC_screenshot-2026-10-07-at-85438-am.png)

2. Choose what the role can work with by checking each type of object the role should be able to use. Turn on every type the role might need - you can turn them off later. Open the arrow next to a row to see individual permissions. The **Content** row, for example, breaks out into **View**, **Upload**, **Update**, **Manage Tags**, **Assign**, **Unassign**, **Edit Permissions** and **Delete**.&#x20;

![](https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/5otoLDp9IJp83zKrmZ69Q_screenshot-2026-10-07-at-30204-pm.png)

:::hint{type="info"}
Here is how the rows on this page match what you see in the **Library**:

- Content = Media folders and files
- Dynamic Playlist, Tagged Playlist = Playlist components
- LiveText Feed, Live Media Feed = Live Data Feeds and Live Media Feeds
- Web Page, Device Web Page = HTML Sites / Node.js Apps and Device Web Pages
- Autorun Plugin = Scripts
- Presentation = Presentations
- Group, Tagged Group = Player groups
- Device, Device Setup, Device Subscription = Players
:::

3. Go to **Admin > Users** and click on the gear to assign a role to a person:

![](https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/3QfrcMNGvHGhs78Ac2n-1_screenshot-2026-10-07-at-32136-pm.png)

# Object Level Permissions

When you have assigned a role to many users, but you need to make a temporary or permanent exception, you can use object level permissions to modify access at the user level:

1. Select the object (folder, media, presentation, etc.). Its **Properties** panel opens on the right.
2. Under **Security > Assigned Users**, open **Custom** and select the user to modify the permissions for the user for the selected object.
3. Open **Permissions for \[the user]** and expand **Full Control** to see each switch.
4. When you first open an item's switches, they show the value inherited from the role. They are not active for this item yet. You can tell because there is no trash can icon next to them.
   1. Toggle the switch off, then back on. A trash can icon appears. The switch now applies to this item.
   2. Turn the view switch off to hide the item from the role. Leave it on to show it.

::Image[]{src="https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/IvM3F-wV3LOJGdcPpUgln_trash2.png" size="50" isUploading="false" width="1203" height="1238" darkWidth="1203" darkHeight="1238" showCaption="false"}

# Restricting Access

Here is what you can restrict and where you can set that access:

| **To hide**         | **Go to**                                                           | **Switch**                                      |
| ------------------- | ------------------------------------------------------------------- | ----------------------------------------------- |
| Media folders/files | Content > Library > Media > select it > Security                    | View Content                                    |
| Components          | Content > Library > Components > type folder > select it > Security | View \[type], for example View Dynamic Playlist |
| Presentations       | Presentation > Library > select it > Security                       | View Presentation                               |
| A player group      | Network > Player Group(s) > tick the group > gear icon > Security   | View Group                                      |
| Players in a group  | Network > Player Group(s) > tick the group > gear icon > Security   | View Devices                                    |
| A single player     | Network > All Players > select the row > Security                   | View Device                                     |

## Restrict Content

The Library has two top-level folders: **Media** and **Components**. Both work the same way.

**Media folders and files**

1. Go to **Content > Library > Media**.
2. Select the folder or file.
3. Under **Properties > Security**, select your role and expand **Full Control**.
4. Toggle **View Content** off and on, then turn it off.

::Image[]{src="https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/UcR1HopRvPLjWVbm6VPWZ_screenshot-2026-10-07-at-34051-pm.png" size="30" isUploading="false" width="672" height="1872" darkWidth="672" darkHeight="1872" showCaption="false"}

**Components**

1. Go to **Content > Library > Components**. Each type of component has its own folder.
2. Open the folder and select the component.
3. Under **Properties > Security**, select your role and expand **Full Control**.
4. Toggle the view switch off and on, then turn it off.

![](https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/8U3us7u5aPCLloSPeMSlJ_perm-16a-components-folder-copy.png)

Each component type has its own view switch. For a Dynamic Playlist it is **View Dynamic Playlist**.

::Image[]{src="https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/Bx_230sRkUhEZL1K5ed2F_screenshot-2026-10-07-at-34511-pm.png" size="30" isUploading="false" width="684" height="1878" darkWidth="684" darkHeight="1878" showCaption="false"}

## Restrict Presentations

1. Go to **Presentation > Library**.
2. Select the presentation.
3. Under **Properties > Security**, select your role and expand **Full Control**.
4. Toggle **View Presentation** off and on, then turn it off.

::Image[]{src="https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/75h5EPbAo4pfF9lbXKvom_screenshot-2026-10-07-at-33050-pm.png" size="30" isUploading="false" width="720" height="1893" darkWidth="720" darkHeight="1893" alt="View Presentation is shown because this role allows presentations on the Roles + Permissions page." showCaption="false"}

## Restrict Player Groups and Players

You have three options. Hide a whole group, hide the players inside a group, or hide one player at a time.

**Player Groups**

1. Go to **Network**.
2. In the **Hierarchy** panel, change **All Players** to **Player Group(s)**.
3. Tick the group. Its header appears in the player list.
4. Click the **gear icon** on the group header. The group's Security section opens.
5. Select your role and expand **Full Control**.
6. Toggle the switch you need off and on, then turn it off:
   - **View Group** hides the group itself.
   - **View Devices** hides the players in the group.
7. Leave the Network tab and come back.&#x20;

::Image[]{src="https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/90Oqu0_ePqGPwcMIuLBN-_screenshot-2026-10-07-at-33549-pm.png" size="30" isUploading="false" width="906" height="1884" darkWidth="906" darkHeight="1884" showCaption="false"}

**Single Player**

1. Go to **Network** and make sure the Hierarchy is set to **All Players**.
2. Select the player's row. Its Properties panel opens on the right.
3. Scroll down to **Security**, select your role and expand **Full Control**.
4. Toggle **View Device** off and on, then turn it off.
5. Leave the Network tab and come back.

:::hint{type="danger"}
Network changes don't show up right away. After you change a player or group, go to another area such as **Dashboard**, then come back to **Network**. (The refresh button won't help since it does not reload permissions.)

If you are still not seeing your changes, test in a separate browser or browser profile. Signing in as two people in the same browser can sign you out or mix up the accounts.
:::

::Image[]{src="https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/HlL74Kdzvqn2cjuTg_6C__screenshot-2026-10-07-at-33748-pm.png" size="30" isUploading="false" width="600" height="1881" darkWidth="600" darkHeight="1881" showCaption="false"}

# Known issues

You may notice the following issues:

- A person whose role hides groups still sees every group if their default network view is set to Groups. To fix this, set the default network view to **All Players&#x20;**&#x69;n that person's **Preferences.**
- The trash can icon looks like delete but it only resets the switch to the role's setting. It never removes the item.
- Switches look active when they are grayed out. To fix this, turn the type on in the Roles + Permissions page first.


[title] Sync Zones (old)
[path] How-tos/Sync Zones/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

The below applies to versions of BrightSignOS and BrightSign Author (BrightAuthor\:connected) earlier than 9.0.75 and 1.16.0, respectively.

To synchronize video states in zones in older versions of BrightSign presentations, and on players with older operating systems, you must send a **Link Synchronize** message in a leader zone and receive that message in an event that will listen for that message in follower zones. You must also synchronize player clocks.

# Sync Zones on a Single Player

## Create the Leader Zone Message

::::WorkflowBlock
:::WorkflowBlockItem
Create a presentation with content inside of zones. Make sure to toggle on **Interactive** in the top right corner.
:::

:::WorkflowBlockItem
Select the transition event in the leader zone in your presentation. It may be helpful to include “Leader” and “Follower” in the zone names.
:::

:::WorkflowBlockItem
Add a transition event to the content you want to display first, then drag that event to the other content in the presentation.
:::

:::WorkflowBlockItem
In **Event Properties > Advanced**, select **Add Command.**
:::

:::WorkflowBlockItem
Select the **Link** command and the **Synchronize** command parameter.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/ELmDO0TKIUJyzTye06Ra8_image-20230501-171811.png" size="60" width="411" height="219" position="center" darkWidth="411" darkHeight="219" showCaption="false"}
:::

:::WorkflowBlockItem
Toggle the down arrow to enter a **Keyword**. This will be used to trigger follower players to display content.
:::

:::WorkflowBlockItem
**Save** the presentation.
:::
::::

## Creating the Follower Zone Event Listener

::::WorkflowBlock
:::WorkflowBlockItem
Select the follower presentation zone.
:::

:::WorkflowBlockItem
Add a **Synchronize** event to the content you want to display first, then drag that event to the other content in the presentation.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/8pq6jjjrScQUWmO5v9rMc_sync.png)
:::

:::WorkflowBlockItem
In the **Event Properties** pane, under **Specify synchronization keyword**, enter the **Keyword** you selected in step 5, above. When the follower presentation zone receives this keyword from the leader zone, it will start to play.
:::

:::WorkflowBlockItem
Do this for all of the follower zones in the presentation then select **Save**. You can also select **Save as** to save the presentation with a different name for additional players (for example “Player 3 follower presentation”).
:::

:::WorkflowBlockItem
If you are publishing from a single player with multiple outputs (the XC4055, XC2055, or XT2145), the presentation clock does not need to be synchronized and you can now select **Publish** to publish the synced presentation. In all other cases, you must use the following section to synchronize the clocks of the players that will display your presentation.
:::
::::

:::hint{type="info"}
To synchronize between zones on the same player, use the **Link** command with the **Zone** command parameter.
:::

# Sync Player Clocks

In older versions of BrightSignOS and BrightSign Author, you must synchronize player clocks, and leader and follower players must be defined. To do this:

::::WorkflowBlock
:::WorkflowBlockItem
Select the transition event leading to the **Video State** in the leader zone.
:::

:::WorkflowBlockItem
In **Presentation Settings > Interactive > Synchronization** (under the **Networking** tab), select **Enable enhanced synchronization** and choose **Master**.
:::

:::WorkflowBlockItem
Select a transition event leading to the Video State in a follower zone in your presentation.
:::

:::WorkflowBlockItem
In **Presentation Settings > Interactive > Synchronization**, select **Enable enhanced synchronization** and choose **Slave**.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/cpbgY5uFLzOU3oAn2IxrY_master.png" size="50" width="545" height="742" position="center" darkWidth="545" darkHeight="742" showCaption="false"}
:::

:::WorkflowBlockItem
Do this for all the follower zones in your presentation, then **Save** and **Publish**. You can also select **Save as** and **Publish** the presentation with a different name for additional players (for example “Player 3 follower presentation”).
:::
::::




[title] Send a Serial Command on Receiving a UDP Message
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

This article shows how to send a serial command when a UDP message is received by the player.

::::WorkflowBlock
:::WorkflowBlockItem
In a new presentation, under **Layout** **> Zones,** select **Add Zone**.
:::

:::WorkflowBlockItem
Resize the zone, give it a name (for example, "Event Handler"), and under **Type**, select **Audio Only**.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/shY9Thx6WIGN8HjkwXqx2_image.png)
:::

:::WorkflowBlockItem
Switch to the **Content** tab and toggle from Simple presentation to Advanced presentation.
:::

:::WorkflowBlockItem
Go to **Widgets** and drag and drop the **Event Handler** widget into the playlist area.
:::

:::WorkflowBlockItem
Under **Events**, select the **UDP** event to activate it, and then select the **Event Handler** state (make sure to click on the Event Handler text; it will highlight when you hover over it) to attach it, as shown in the image below.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/yj9NvhDSZ4iwfke9QK3wD_image.png)
:::

:::WorkflowBlockItem
In **Event Properties > Specify UDP Input** enter the UDP input that the player will be listening for (for example, “AMX\_Command1").
:::

:::WorkflowBlockItem
With the state selected (notice that **Event** **Properties** turns to **State** **Properties**), select **Add Command** in the **Advanced** tab.

- Select the type of serial command to send - **Send serial string (EOL)**, **Send serial string (no EOL)**, **Serial byte,&#x20;**&#x6F;r **Serial byte (comma-separated)** -once the UDP input message is received.
- Enter the serial command string/value.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/2RYCX3SJkUYYSekJSuLKL_image.png)
:::

:::WorkflowBlockItem
Configure the serial port setting by navigating to **Presentation Settings > Interactive > Connectors**. The serial settings from this panel must match the serial settings of the device you would like the player to communicate with (i.e. Baud rate, Data bits, Parity, Stop bits, Protocol, Send EOL, Receive EOL). The 3.5mm serial connector on the player is referred to as "Port 0".
:::

:::WorkflowBlockItem
Go to **Presentation Settings > Interactive > Networking** and ensure the **UDP Destination Port** and **UDP Receiver Port** are set to the same value as your UDP controller (the AMX controller in these images).

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/S-NCMmeUoMebSKXcMvl4f_image-20240410-190746.png" size="50" width="621" height="1208" position="center" alt="image-20240410-190746.png" showCaption="false"}
:::
::::


[title] Sync Zones
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

You can synchronize playback across zones in one or more players and establish a leader / follower relationship between those zones in BrightSign Author. A synchronization command issued in the transition from any state to a video state will establish synchronization.

The synchronization process is different depending on the version of BrightSignOS and BrightSign Author being used. For the best synchronization experience, it is recommended to upgrade to the latest versions of BrightSignOS and BrightSign Author.

- See [this page](docId:8GMITkWM7-J8MhTo6nSeD) to sync zones on one or more players on BrightSignOS 9.0.101 or above, using BrightSign Author (BrightAuthor\:connected) 1.19.3 or above.
- See [this page](docId\:g-p2wpTMn6y6V2WDrpPwZ) to sync zones across one or more players on BrightSignOS 9.0.75 or below, using BrightAuthor\:connected 1.16.0 or below.


[title] Seamlessly Loop Videos
[path] How-tos/

Seamless looping essentially puts the video file into a circular buffer and you can seamlessly loop only a single video at a time in a zone, not multiple back-to-back videos.

All tracks in the file, even non-video/audio tracks, must be exactly the same length *down to the sample,* not just the metadata length value, or there will be a gap at the loop point.
*numberOfSamples* x *sampleDuration* must be the same for all tracks.  Any difference between tracks in the file will cause the loop to not be seamless.

# Media Encoding

Files should be encoded with Fast Start (Web-Optimized/Progressive Download) enabled so the MOOV header is at the front/top of the file.

## Seamless Video-Only Looping (No Audio)

- **XCx55, XTx45, XDx35, HDx25, LS445, XTx44/43, XDx34/33, HDx24, LS424, 4Kx42**: Supports seamless looping of H.265 or H.264 *.mp4* or *.mov* files.
- **LS425, XDx32/30, HDx23/22/20, LS423/22**: Supports seamless looping of H.264 *.mp4* or *.mov* files. These models *do not* support seamless looping of transport streams.
- **HDx10**: Can seamlessly loop an H.264 transport stream (which *does not* use an *.mp4* or *.mov* container). 

## Seamless Audio and Video Looping

- **XCx55, XTx45, XDx35, HDx25, LS445, XTx44/43, XDx34/XDx33, HDx24, LS424, 4Kx42**: Supports seamless audio/video looping of *.mov* files with H.265 or H.264 encoded video and PCM SOWT encoded audio.
- **LS425, XDx32/30, HDx23/22/20, LS423/22**: Supports seamless audio/video looping of *.mov* files with H.264 encoded video and PCM SOWT encoded audio.
- **HDx10**: Does not support seamless audio/video looping.

## Seamless Video Wall Looping

We recommend using BrightWall to create a seamless-looping video wall. 

- **XCx55, XTx45, XDx35, HDx25, LS445, XTx44/43, XDx34/33, HDx24, LS424, 4Kx42:** Supports seamless video looping of *.mp4* or *.mov* files with H.265 or H.264 encoded video. If audio is included, the audio/video should be formatted as an *.mov* file and the audio should be encoded as SOWT PCM for seamless audio.
- **LS425, XDx32/30, HDx23/22/20, LS423/22**: Supports seamless video looping of *.mp4* or *.mov* files with H.264 encoded video. If audio is included, the audio/video should be formatted as an *.mov* file and the audio should be encoded as SOWT PCM for seamless audio.

## BrightSign Author

See the [Media End Event](docId\:EjCqURFtsgp5Qw--rwrAy) documentation for information about specify behavior when a video or audio file reaches the end of playback.

## Custom Script

Copy the following script to a text file and rename it *autorun.brs*. Change the filename of *video.ts* in the script to match the video you wish to loop.

:::CodeblockTabs
BrightScript

```text
v=CreateObject("roVideoPlayer")
v.SetLoopMode(true)
v.PlayFile("video.ts")
while true
  sleep(10000)
end while
```
:::


[title] Sync Zones (latest)
[path] How-tos/Sync Zones/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

As of BrightSign Author (BrightAuthor\:connected) 1.19.3 and BrightSignOS 9.0.101, [Link](docId\:f-DZ9xXMKhxJkszr64fWp) command and its follower component, the [Synchronize Event](docId\:v02mEBLBoCntink_BERQb), are used to synchronize content across zones. Hardware (clock) synchronization is no longer needed.

This section has a video tutorial:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/TYAqEnq_Txckpox4eAKHe-E0AO-Bk0g-bc8Vz4egEr7-20250507-222706.mp4" label="Sychronization in 1.19.3 (720p).mp4"}

## Sync Zones on a Single Player

::::WorkflowBlock
:::WorkflowBlockItem
Create your zones and name the leader and follower zones.
:::

:::WorkflowBlockItem
Make the zones **Advanced** as shown:

![Screenshot 2025-02-20 at 11.40.29 AM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/o7EUitaSlL5rEKT1JGLTV_screenshot-2025-02-20-at-114029-am.png "Image 1")
:::

:::WorkflowBlockItem
Select the leader zone and add the content elements to synchronize.
:::

:::WorkflowBlockItem
Add your timeout and transition commands to the content.
:::

:::WorkflowBlockItem
Add UDP commands to the content with indications like “start” and “end” that can be used to trigger transitions as shown:

![Screenshot 2023-09-15 at 2.32.35 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/aU_VEF92wMvmhxjkZFb5x_screenshot-2023-09-15-at-23235-pm.png)
:::

:::WorkflowBlockItem
Select the timeout and transition commands on the initial content, and add the **Link** command and **Synchronize** command parameter under **Advanced**. Enter whatever **Keyword** you have chosen to start the content.
:::

:::WorkflowBlockItem
Do the same for the content that should play after the initial content. Use the keyword “end” (or whatever keyword you have selected) in the final command that returns you to the initial content.
:::

:::WorkflowBlockItem
Select all of the content and commands and copy them to each of the follower zones. Delete the events, since only **Synchronize** events are needed in the follower zones.
:::

:::WorkflowBlockItem
Now add **Synchronize** events to all of the content in the follower zones and specify the necessary **Keyword** (for example, “start” or “end”). Your presentation is now ready to publish.
:::
::::

## Sync Zones on Multiple Players

To synchronize clocks in multiple players on the same local network, you should have multiple presentations. The leader presentation must have a presentation setting that defines that player as the leader, and other presentations must be set as followers.

These instructions assume that you have set up the timeout and transition commands in your zones and added the **Link Synchronize** advanced command as described in steps 1-7 in the section above:

::::WorkflowBlock
:::WorkflowBlockItem
Select the leader presentation.
:::

:::WorkflowBlockItem
In **Presentation Settings > Interactive > Player Sync** (under the **Networking** tab), select **Enable** and choose **Leader**.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/v_aeGhjYmlPDp4bsKZuDV_newinteractivetab.png" size="50" width="804" height="1116" position="center" darkWidth="804" darkHeight="1116" showCaption="false"}
:::

:::WorkflowBlockItem
Select a follower presentation.
:::

:::WorkflowBlockItem
In **Presentation Settings > Interactive > Synchronization**, select **Enable** and choose **Follower**.
:::

:::WorkflowBlockItem
Make sure that **Domain** is set to the same value for both the leader and the follower presentations:

- For example, if the **Domain** of leader is set to 10 make sure that the follower(s) are also set to 10.
- The **Domain** value differentiates each set of synchronized players on the same network so multiple synchronized presentations sets can exist on the same network.
:::

:::WorkflowBlockItem
Do this for all follower presentations, then **Save** and **Publish**. You can also select **Save as** and **Publish** the presentation with a different name for additional players.
:::
::::


[title] Use Plugins & Parsers
[path] How-tos/

This page describes how to use two advanced BrightSign Author features: custom autorun plugins and parser scripts. These instructions assume a certain level of familiarity with [BrightScript](docId\:R7Xc0_ZE4u0BR662lI2Sj). This is not a comprehensive guide to writing custom scripts for BrightSign Author; it is meant to provide a general outline and best practices for writing those scripts.

# Plugins

Plugins allow you to add script extensions to a standard presentation autorun. For example, you can use plugins to change variable values, extract information from a *.txt*, *.csv*, *.xml*, or *.json* file to display it onscreen, change the contents of a playlist, or change how the presentation responds to external input.

Plugins have two primary benefits over custom autoruns:

- They can be easily inserted into multiple presentations, including newer and older versions of the same presentation.
- They are not dependent on a certain autorun or firmware version, greatly reducing the complexity involved in updating custom BrightScript deployments.

# Autorun Plugins

To designate one or more custom plugins in BrightSign Author:

1. If you are a BrightSign Author Plus user, upload your plugin to the server through the Content upload (see [Content > Scripts](docId\:gPjwF1LNjhau_EQZJMfUq)). If you are a BrightSign Author user, skip directly to step 2 to add a plugin to the presentation.
2. Attach it to your presentation (see [Presentation Settings > Script Plugin](docId\:a6Ali6u-szxHuansk6T3-)).
3. If needed, refer to [Plugin Message Event](docId\:J999ADmh_wDx3XWbbkZ0N) to trigger state changes.

See the [BrightSign GitHub page](https://github.com/brightsign/BrightAuthor-Plugins) for BrightSign Author and Author Plus plugin examples.

# Plugin Structure

Plug-in scripts must include an initialization function in the form of `<plugin_name>_Initialize()`. Actions that take a lot of time should not be done in the initialization routine, because actions in the routine are synchronous. Instead, start a timer that will be caught by the plugin event handler soon after the routine runs, and execute the longer code segment there. For example, instead of unzipping a file in the initialization routine, do it through the plugin event handler with a timer started in the routine.

The initialization function is passed three parameters:

- `msgPort As Object`
- `userVariables As Object`
- `o As Object`: This is the *.bsp* associative array from the autorun. It is required for the initialization function to return an associative array.

To process events, the plugin script must provide a `ProcessEvent()` function that is a member of the associative array returned by the initialization function described above. The `ProcessEvent()` function is passed a single event object. The function then returns a Boolean indicating whether or not the autorun should continue processing the event object: The function will return True if it handles the event and the standard autorun should not continue processing the event.

The associative array that defines the object must also include an `objectName` entry that defines the name of the object.

The following is an example of a script plugin file named *pizza.brs*:

:::CodeblockTabs
BrightScript

```text
Function pizza_Initialize(msgPort As Object, userVariables As Object, bsp As Object)
    
    print "pizza_Initialize - entry"
    print "type of msgPort is ";type(msgPort)
    print "type of userVariables is ";type(userVariables)
    
    PizzaBuilder = newPizzaBuilder(msgPort, userVariables, bsp)
    return PizzaBuilder
    
End Function

Function newPizzaBuilder(msgPort As Object, userVariables As Object, bsp as Object)

    PizzaBuilder = { }
    PizzaBuilder.msgPort = msgPort
    PizzaBuilder.bsp = bsp	
    PizzaBuilder.userVariables = userVariables
    PizzaBuilder.objectName = "PizzaBuilder_object"
    PizzaBuilder.ProcessEvent = pizza_ProcessEvent
    
    return PizzaBuilder
    
End Function

Function pizza_ProcessEvent(event As Object)

    print "pizza_ProcessEvent - entry"
    print "type of m is ";type(m)
    print "type of event is ";type(event)

' swallows timer events - telling the autorun not to process them
    if type(event)= "roTimerEvent" then
       return true
    else
       return false
    endif

End Function
```
:::

## Receive a Plugin Message

The following example code shows how to write a script that receives a [Send Plugin Message](docId\:lG8iLYdnIB0PL8tvxTKBo)  Command from the autorun. This code listens for a message sent to the plugin named “Pizza” and then prints the message. This example uses debug output instead of print statements. Print statements only show up in the serial console, while debug statements show up in the system log.

:::CodeblockTabs
BrightScript

```text
Function pizza_ProcessEvent(event As Object)

    m.bsp.diagnostics.printdebug("@@ pizza_ProcessEvent - entry")
    m.bsp.diagnostics.printdebug("@@  type of m is " +type(m))
    m.bsp.diagnostics.printdebug("@@  type of event is " +type(event))
    
    if type(event) = "roAssociativeArray" then
        if type(event["EventType"]) = "roString"
            if event["EventType"] = "SEND_PLUGIN_MESSAGE" then
                if lcase(event["PluginName"]) = "pizza" then 'the plugin name is case sensitive'
                    pluginMessage$ = event["PluginMessage"]
                    m.bsp.diagnostics.printdebug("@@ received pluginMessage " + pluginMessage$)
                    return true
                endif
            endif
        endif
    endif
    
    return false
    
End Function
```
:::

## Send a Plugin Message

The following example code shows how to write a script that sends a message string to trigger a [Plugin Message](docId\:afDHt43LrAH0tfu6hH_Tf) event.

:::CodeblockTabs
BrightScript

```text
print "pizza_ProcessEvent - entry"
    print "type of m is ";type(m)
    print "type of event is ";type(event)

    if type(event) = "roTimer" then

        pluginMessageCmd = CreateObject("roAssociativeArray")
        pluginMessageCmd["EventType"] = "EVENT_PLUGIN_MESSAGE"
        pluginMessageCmd["PluginName"] = "Pizza"
        pluginMessageCmd["PluginMessage"] = "toppings"
        m.msgPort.PostMessage(pluginMessageCmd)
        return true

    endif

    return false

End Function
```
:::

# Parsers

Parsers can perform many of the same custom functions as plugins (for example, extracting information from a *.txt*, *.csv*, *.xml*, or *.json* file to display it onscreen or changing the contents of a playlist); however, rather than being triggered by a command or being associated with an event, parsers are associated with a downloaded data feed or a file on the microSD card. This means that any function that is triggered by an event must be written as a plugin, not a parser.

A parser does not need to work exclusively with the data in the feed associated with it. Once the parser starts running, you can use it to delete a file on the storage, send a UDP command, or download another feed or file.

# Parser Scripts - RSS

Parser scripts allow you to manipulate data sets from incoming RSS feeds. You can create RSS parser scripts for a wide array of system and presentation functions. You can designate a parser for an RSS feed in BrightSign Author ([Support Content](docId\:a6Ali6u-szxHuansk6T3-)).

:::hint{type="danger"}
The parser file must have a *.brs* extension.
:::

The following parameters can be used with an RSS parser subroutine:

- `xmlFileName$`: The name of the XML file. This value is provided by the presentation autorun.
- `itemsByIndex`: An array of the descriptions. The script should fill in this array if the Live Text object is using the “item index” to display items from this feed.
- `itemsByTitle`: An associative array of titles, descriptions. The script should fill in this array if a Live Text object is using the “item title” to display items from this feed.
- `userVariables`: An associative array of current User Variables (which are provided by the autorun). This is provided in case you want to analyze or modify the User Variables.

The following piece of example code can be used to parse RSS text:

```text
        xml = CreateObject("roXMLElement")
        if not xml.Parse(ReadAsciiFile(xmlFileName$)) then
               print "xml read failed"
        else
               if type(xml.channel.item) = "roXMLList" then
                       index% = 0
                       for each itemXML in xml.channel.item
                               itemsByIndex.push(stri(index%) + " - " + itemXML.description.GetText())
                               index% = index% + 1
                       next
               endif
        endif

end Sub
```

## Parser Scripts - MRSS

You can use a script to parse non-MRSS feeds and provide the data in a format that can be used by [Media RSS Feeds](docId\:NwU8G3Cx7oSnce-82u6eC) in BrightSign Author.

To designate a parser for an MRSS feed in BrightSign Author, go to [Presentation Settings > Support Content > Data Feeds](docId\:a6Ali6u-szxHuansk6T3-).

:::hint{type="danger"}
The parser file must have a *.brs* extension.
:::

The following parameters can be used with an MRSS parser subroutine:

- `fileName$`: The name of the feed file to be parsed. This value is provided by the presentation autorun.
- `items`: An array of associative arrays representing MRSS items to be played by Media RSS Feed states. This array is empty upon entry to the parser subroutine and should be filled by the script. When the parser subroutine exits, the autorun will supply the data in the array to Media RSS Feed states for playback. See the **Item Array Specification** section below for a list of associative-array parameters.
- `metadata`: An associative array containing optional metadata items pertaining to the entire playlist/feed.

### Items Array Specification

The parser script should add associative arrays to the `items` array–each associative array represents a single media item to be played back. The order of items in the array specifies the order of playback.

Each associative array consists of one or more key-value pairs. All values must be strings–including numerical values. The following table outlines accepted key-value pairs:

| **Key**            | **Value**                                                   | **Example**                                     | **Notes**                                                                                                                            |
| ------------------ | ----------------------------------------------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `url`              | A download URL for the file                                 | brightsign.biz/images/myfeedpic1.jpg            | Required – The item will be ignored if this value is not present.                                                                    |
| `medium`           | video \| image \| audio \| document                         | "video"                                         | Suggested – If the `medium` and `type` values are not present, the `medium` value will default to "image".                           |
| `type`             | video/\*, audio/\*, image/\*, text/html, application/widget | "video/\*"                                      | Suggested – If the `medium` and `type` values are not present, the `type` value will default to "image/\*".                          |
| `duration`         | The display duration in seconds                             | "30"                                            | Optional – This value applies to images only, and has no effect on other media types. If not specified, this value defaults to "15". |
| `title`            | The value for the MRSS Title field                          | "myfeedpic1"                                    | Optional                                                                                                                             |
| `description`      | The value for the MRSS Description field                    | "$5.99"                                         | Optional                                                                                                                             |
| `size`             | The size of the file in bytes                               | "942061"                                        | Optional                                                                                                                             |
| `guid`             | A unique value for the file                                 | "ab05caf"                                       | Optional – When this value changes, the player will re-download the file.                                                            |
| `mrssCustomFields` | An associative array of arbitrary key-value pairs           | \{key1:"custom field A", key2:"custom field B"} | Optional – Use this associative array to include custom MRSS fields.                                                                 |

### Metadata Specification

The `metadata` object is an empty associative array when the parser subroutine is entered. This associative array can accept optional key-value pairs that represent properties for the entire feed. All values must be strings–including numerical values. The following table outlines accepted key-value pairs:

| **Key** | **Value**                   | **Example** | **Notes**                                                                                                                                                                                                                                                                                                                                    |
| ------- | --------------------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `title` | A title for the feed        | "myfeed1"   |                                                                                                                                                                                                                                                                                                                                              |
| `ttl`   | The time-to-live in minutes | "5"         | Represents how long the feed will be stored (whether it's used by the presentation or not) before being refreshed. The user will also set an **Update Interval** when adding the data feed to the  presentation; if the `ttl` value is specified, the presentation will use the lesser of the two values to determine the refresh frequency. |


[title] General FAQs
[path] FAQs/

# What happened to bsn.Content?

bsn.Content has be renamed to BrightSign Author Plus. It is the same product with a new name.&#x20;

# Should I use the desktop app or the web app?

The BrightSign Author desktop app, available for Mac or PC, is recommended for the vast majority of users. While much of the same functionality is available through both apps, the web app has some important limitations. The web app, *https\://bsn.cloud*,  requires an internet connection and cannot access players through the user's local network (i.e., players must be connected to the internet). In addition, files must first be uploaded to BrightSign Cloud before they can be used in presentations. The BrightSign Author desktop app does not have these limitations.

# How are Setup, Provision, & Activate different?

[Provisioning](docId\:yAszd9x1YB7Uwun3OxXmP) and [Default Setup File](docId\:J9wsBHJjZhW01fvh_nqfn)  explain these concepts in detail and is recommended reading.

***Setup***

Generally speaking, the process of setting up a player involves applying a Setup File to that player. The Setup File includes various player settings including the Publishing Mode which defines the method with which content will be delivered to the player. The Setup File also includes a Player App which, at a minimum, must contain an *autorun.brs* file (the *.brs&#x20;*&#x65;xtension denotes a BrightScript file) which instructs the player what to do upon startup.

***Provision***

Applying a Setup to a player using BrightSign Cloud (via Admin > Provision using BrightSign Author, BrightSign Cloud, or *control.bsn.cloud*) is known as provisioning. Since most situations involve using BrightSign Cloud to apply Setup Files to players, the term *provisioning* is often used to refer to the process of setting up a player.

Publishing presentation content is separate from provisioning, but these steps can be combined. For example, you can deliver the player app with the content as a single package via an autorun.zip file.

***Activate***

A QR code appears on the connected display when a player is first powered up. This code can be used to provision the player and automatically apply a default Setup File:

- If the player is using BrightSign Author, it will be configured for DHCP with the Local Network Publishing Mode and given a default name.
- If the player is using BrightSign Author Plus, it will be configured for DHCP with the BSN.Cloud Publishing Mode and given a default name.

If you do not want to use the default Setup File, first create a Setup File to apply to your player. If you use the QR code to set up your players and then try to change to a different Setup type, you will have to go through the re-provisioning process. See [this page](docId\:Cyl9kPm02CO5rgcB9WQQv) for more information about that process, and see [Activate](docId\:OOf-RmqHqFVLhokXI8ypJ) for more details about player activation.

:::hint{type="info"}
If a player has already been provisioned (that is, it already has a Setup assigned to it), the QR code will not be displayed.
:::

# Do I need BrightSign Author to create playlists?

Playlists can be created in the BrightSign Author **Presentation** tab (see [this page](docId:0Vm0UTpL2j8dss-DFNhMo) for a tutorial). To create simple presentations without BrightSign Author (or any other publishing software), see [this FAQ](docId\:q_9ZMIrnaMkCQY-oTyubl).

# Which Video Mode should I use?

The **Video Mode** option in BrightSign Author allows you to determine how videos will be scaled to fit in a **Video or Image** zone. This option has no effect if the video and the zone are the same size.

See [this page](docId\:v-EVnMU6c7K5NHUNs86qT) for more information about the BrightSign Author **Video Mode** types.

# How do I uninstall the app?

The [Windows process](https://support.microsoft.com/en-us/windows/uninstall-or-remove-apps-and-programs-in-windows-4b55f974-2cc6-2d2b-d092-5905080eaf98) and [Mac process](https://support.apple.com/en-us/102610) to uninstall applications does not delete all directories related to BrightSign Author. To delete these folders, first exit BrightSign Author, then remove the folders and files described below, depending on your operating system.

Windows users:

:::BlockQuote
%AppData%\BA connected\\
:::

Mac users:

:::BlockQuote
\~/Library/Application Support/BA connected
:::

:::BlockQuote
\~/Library/Caches/com.brightsign..
:::


[title] FAQs
[path] /

This section contains the most common questions about BrightSign Author:

- [What happened to bsn.Content?](docId\:ucA479qgY4bl9HXWRBPr-)&#x20;
- [Should I use the desktop or web app?](docId\:ucA479qgY4bl9HXWRBPr-)&#x20;
- [What is the difference between Setup, Provision, and Activate?](docId\:ucA479qgY4bl9HXWRBPr-)&#x20;
- [Do I need BrightSign Author to create playlists?](docId\:ucA479qgY4bl9HXWRBPr-)&#x20;
- [Which Video Mode should I use?](docId\:ucA479qgY4bl9HXWRBPr-)&#x20;
- [How do I uninstall the app?](docId\:ucA479qgY4bl9HXWRBPr-)&#x20;
- [Is BrightWall supported?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;
- [Are custom splash screens supported?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;
- [Is geofencing available?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;
- [Can you overlay text or images on video?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;
- [Can text & RSS feeds be displayed?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;
- [How do I create a playlist?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;
- [How does Media List shuffling work?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;
- [Can I ignore input in Advanced Playlist?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;
- [Can I rename my presentation?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;
- [How to resize images for playback?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;
- [Can a UDP command trigger playback of specified audio files?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;
- [Can I update content remotely?](docId\:aFO5gzmbid0IWyuUwKGTt)&#x20;


[title] Use GPIO on Players
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

GPIO (General Purpose Input/Output) pins allow you to connect devices like buttons or sensors to your BrightSign player to control presentation content. They are unique because they can be configured as either inputs to read signals from external devices or outputs to send power to external devices. For example, they can be used to trigger video playback when a button that is connected to a GPIO pin is pressed, or to perform actions based on temperature or light level sensor triggers connected to GPIO pins to adjust content based on environmental conditions. 

# GPIO Configuration

GPIO pins allow you to trigger content changes on the player based on input, or send advanced commands to change the state of the player GPIO switches and connected devices to on or off. The GPIO pins, which deliver about 3.3v 24mA\*, are ideal for lights, sensors, or buttons. See [Connect the GPIO](docId\:mg3qwZgZzfjTvU79s17uk) for more info on configuring your player hardware and external devices for GPIO.

To use GPIO functionality in BrightSign Author:

::::WorkflowBlock
:::WorkflowBlockItem
Define which GPIO pins are used as inputs or outputs. This is set under the [Presentation Settings > Connectors](docId\:a6Ali6u-szxHuansk6T3-) menu.

- When GPIO is set to input, the connected device should be a contact closure type switch/relay, completing a circuit between the GPIO button pin and Ground, so that when a switch is pressed, something happens.
- GPIO ports that are set to output only have digital output.
:::

:::WorkflowBlockItem
Set up event triggers to specify what actions should occur when a specific GPIO pin receives a signal. See [GPIO  Event](docId\:Z1gz3OcPzNZtXMABOAY1v) and [GPIO](docId\:RnfFmjRJ3EkQTwIVJ3XlC)[ ](https://brightsign.atlassian.net/wiki/spaces/DOC/pages/1636435131/GPIO)for more info.
:::
::::

# Example

In this example, we will use BrightSign Author to set up the player to receive input from buttons connected to GPIO ports 0, 1, 2, and 3 and we will issue commands that will turn on LEDs associated with GPIO ports 4, 5, 6, and 7 based on the video states. The main video will play until the user selects any of the three illuminated buttons associated with GPIOs 4, 5, or 6. In that case, the presentation will launch the associated video state, turn off the current LED buttons, and turn on the LED for the button that lets the user return to the main video.

::::WorkflowBlock
:::WorkflowBlockItem
Create an Advanced presentation with four videos, one main video state and three secondary video states named “A”, “B”, and “C” as shown:

![Image1b.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/zNH7bijTEPJybjRkO56Nn_image1b.png)
:::

:::WorkflowBlockItem
In **Presentation Settings > Interactive > Connectors**, set GPIO pins 0-4 to **Input** and 4-7 to **Output** as shown in the image.
:::

:::WorkflowBlockItem
Under the **Events** toolbar, select GPIO 0.
:::

:::WorkflowBlockItem
Connect the GPIO 0 icon to the main video state and then to the “A” video state. Do the same to connect GPIO 1 to the main video state and the “B” video state, and GPIO 2 to the main video state and “C” video state.
:::

:::WorkflowBlockItem
Select the “A”, “B”, and “C” video state in the sandbox and connect the GPIO 3 icon to all of them and then back to the main video state. Now your inputs are set up and we will set up the outputs/voltage.
:::

:::WorkflowBlockItem
Select the main video state. In **State** **Properties > Advanced**:

- Add an Entry Command. Select **GPIO** from the dropdown menu and set the **Command** **Parameters** to **On** and **4**.
- Do the same for GPIO ports **5** and **6** as shown.
- Add an **Entry Command**. Select **GPIO** from the dropdown menu and set the **Command** **Parameters** to **Off** and **7**.

![Image2.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/trl0A2KIg2wKDc7XpiaLF_image2.png)
:::

:::WorkflowBlockItem
Select the “A” video state. In **State** **Properties** **> Advanced**:

- Add an **Entry Command**. Select **GPIO** from the dropdown menu and set the **Command** **Parameters** to **Off** and **4**.
- Do the same for GPIO ports **5** and **6**.
- Add a&#x6E;**&#x20;Entry Command** and set the **Command** **Parameters** to **On** and **7** (so the user can return to the home video by pressing that illuminated LED when the “A” video is playing).
- Repeat these steps for video states “B” and “C”.
:::
::::

***

\* HS5, LS5, HD5, XD5 and XT5 players prior to Rev G deliver less than 3.3 volts.

[title] Send Hex Commands
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

You can easily send Hex values in a BrightSign Author presentation that is set to **Advanced**. For example, this is a "power on" command for a ViewSonic projector. These are hex values, indicated by the `0x` prefix. 

`0x06 0x14 0x00 0x04 0x00 0x34 0x11 0x00 0x00 0x5D`

To send this command to the projector using the serial port on a BrightSign player:

# Media State

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
1. Create an **Advanced** presentation.
2. Select the media state where you want to send the Hex command.
3. Go to **State Properties > Advanced**.
4. Add an **Entry Command** or **Exit Command** and set the C**ommand** to **Send** and the **Parameters** to **Serial bytes (comma separated)**.
5. Set the **Port** to 0 (this is the case for most standard serial devices).
6. Enter the command in the **Byte** field. Use a comma to separate each byte.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/uRJArh-fPQpVvwoTZvXsU_image.png" size="80" width="1280" height="1717" position="center" darkWidth="1280" darkHeight="1717" showCaption="false"}
:::
::::

# Event State

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
1. Create an **Advanced** presentation.
2. Open the event where you want to send the Hex command.
3. Go to **Event Properties > Advanced**. 
4. Click **Add Command** and set the **Command** to **Send** and the **Command Parameters** to **Serial bytes (comma separated)**. 
5. Set the **Port** to 0 (this is the case for most standard serial devices).
6. Enter the command in the **Byte** field. Use a comma to separate each byte.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/of6kRRGNRQZYB5CbsqRUp_image.png" size="80" width="1280" height="1100" position="center" darkWidth="1280" darkHeight="1100" showCaption="false"}
:::
::::

When sending serial bytes, you must use decimal values, not the Hex values listed above. For example:

Hex values: `06 00 04 00 34 11 00 00 5D`
Equivalent decimal values: `06 00 04 00 52 17 00 00 93`

You can convert Hex values to decimal values using any number of free websites.

[title] Set GPIO Outputs On/Off
[path] How-tos/

You can turn GPIO outputs on/off quickly when interacting with Media or Event States using the **Pause** command (for example, to flash buttons) in BrightSign Author.

When using GPIO output(s) the GPIO pin in use must be configured as an output pin. To do this go to **Presentation Settings > Interactive > Connectors > GPIO Configuration** and select **Output** for the GPIO pin connected to the LED.

# Media State

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
1. Create an [Advanced presentation](docId:0Vm0UTpL2j8dss-DFNhMo). 
2. Select the Media State where you want the GPIO pulse to occur.
3. In **State Properties**, go to **Advanced**.
4. Use the "+" to add three **Entry Commands** or three **Exit Commands** (depending on when you want the pulse to be triggered). 
5. Set the first **Command** to **GPIO** and the **Parameters** to **On**. Enter the GPIO pin that's connected to the LED. 
6. Set the second **Command&#x20;**&#x74;o **Other** and the **Parameters**  to **Pause**. Enter a short pause (in milliseconds).
7. Set the third **Command** to **GPIO** and the **Parameters** to **Off**. Select the GPIO pin used in step 5.
:::

:::VerticalSplitItem


::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/l6Rz8HFS2ThgrDS5c7sOQ_image.png" size="90" width="1280" height="1814" position="center" darkWidth="1280" darkHeight="1814" showCaption="false"}
:::
::::

# Event State

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
1. Create an [Advanced presentation](docId:0Vm0UTpL2j8dss-DFNhMo). 
2. Select the media state where you want the GPIO pulse to occur.
3. In **Event Properties**, select the **Advanced** tab.
4. Use **Add Command** to add three commands
5. Set the first **Command** to **GPIO** and the **Parameters** to **On**. Enter the GPIO pin that's connected to the LED. 
6. Set the second **Command** to **Other** and the **Parameters** to **Pause**. Enter a short pause (in milliseconds).
7. Set the third **Command** to **GPIO** and the **Parameters** to **Off**. Select the GPIO pin used in step 5.
:::

:::VerticalSplitItem


![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/9WDkLi6yBTZHmzKeSyGHH_image.png)
:::
::::




[title] Sleep / Wake a Display
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

You can enable or disable PowerSaveMode in BrightSign Author by attaching a wake or sleep command to a State or an Event like a [button press](docId\:zenUCDXD1jwOyRixmfm4t).

# CEC Commands

CEC commands can be used in various ways to turn the display on or off.

## Attaching to States

CEC commands can be attached to a State. In this example, a CEC command is attached to an Image State.

![Image 1](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/ht_lORSNefaVR_hZQpx55_image.png)

::::VerticalSplit{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/ht_lORSNefaVR_hZQpx55_image.png" size="100" width="1280" height="868" position="center" caption="Image 1" layout="middle"}
:::VerticalSplitItem
To schedule your screen to wake at a certain time:

1. Create an **Advanced** presentation.
2. Add a **Timeout Event** to the content and select the image (see above).
3. Open the **Advanced** window under **State Properties**
4. Add a **BrightControl** command. The settings, when applied to the example presentation shown above, will show the BrightSign at startup, then time out to the next image. Each time the scheduled presentation begins playback, it will enter the **Image State** (with the BrightSign logo) and power on the display.
:::

:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/SYYyuEJvrmDUb6GEU_iTc_image.png" size="90" width="1280" height="1411" position="center" darkWidth="1280" darkHeight="1411" showCaption="false"}
:::
::::

## Attaching to Events

CEC commands can be attached to Events. In this example, a CEC command is initiated from a GPIO Event, in this case a button press.

:::::VerticalSplit{layout="middle"}
::::VerticalSplitItem
To turn the monitor off at a certain time:

1. Create an interactive playlist with a logo or blank image.
2. Attach a **GPIO Event** to the content.
3. Set the **Event Properties** as shown in the image at right.
4. Open the **Advanced** panel and add a **BrightControl** command to turn off the display as shown in the image.

:::hint{type="warning"}
Note that the BrightControl command uses HDMI’s CEC commands and thus only works with HDMI-to-HDMI connections. It does not work for HDMI-to-DVI connections because DVI does not support CEC commands.
:::
::::

:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/2fFD-gNgxPBxE_YoWlsqO_image.png" size="80" width="1280" height="2798" position="center" darkWidth="1280" darkHeight="2798" showCaption="false"}
:::
:::::

## Monitor Power Save Mode

For HDMI-to-DVI connections where BrightControl commands don’t work, you may be able to use the “monitor power save mode” command to sleep or wake a display by turning player output on or off. These commands work with both HDMI-to-HDMI and HDMI-to-DVI connections.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/bFSvNsn3tK_ECJpRhQzi7_image-20240828-193546.png" size="50" width="518" height="458" position="center" alt="image-20240828-193546.png" darkWidth="518" darkHeight="458" showCaption="false"}

### Enable the monitor power save mode

This setting turns the player video output *off*.

### Disable the monitor power save mode

This setting turns the player video output back *on*.

:::hint{type="info"}
Note: With some displays, a “monitor power save mode” command may cause the display to switch to another input or produce an “idle” or “no signal” screen rather than making the display go to sleep. Be sure to test this functionality with the intended display to ensure it functions as desired.
:::


[title] Feature FAQs
[path] FAQs/

# Is BrightWall™ supported?

BrightWall™ for BrightSign Author  is on the roadmap but has not yet been implemented. We have improved video wall creation tools in BrightSign Author, and you can find that information at [Create a VideoWall](docId\:NP-Iuz6aWL1Pl439MECjK).

BrightWall™ is available for use in  versions 3.8.0.x or later. 

# Are custom splash screens supported?

Custom splash screens are not available in the current version of BrightSign Author but are available in . 

# Is geofencing available?

Yes. Geofencing is available as of BrightSign Author version 1.32.0. To use Geofencing on a BrightSign player, see [this How-to](docId\:XO7r66wOf5wCMFTWUQtKe).

# Can you overlay text or images on video?

Yes. All BrightSign players (except the HD600) support this.

- Image files that are displayed in a **Video or Image** or **Image** zone will automatically display over video zones. 
- Use a [Live Text State](docId\:zmRkcTVFWvLi8U1Z5fRVk) to layer text over a video in an **Image or Video** or **Image** zone (it cannot be used in a **Ticker** zone). The **Live Text State** also lets you switch between one or more text fields with background images.
- You can layer text over an image by placing a **Ticker** **Zone** over an **Image** zone.

# Can text & RSS feeds be displayed?

Text and RSS can be displayed as static, animated, or scrolling text within a [Ticker Zone](docId\:v-EVnMU6c7K5NHUNs86qT). The video in the [linked page](docId\:v-EVnMU6c7K5NHUNs86qT) provides a tutorial on this and other methods of displaying text. This feature is also available in BrightScript via the [roTextWidget](docId\:GQeNKTmmFazEjdlZHttIZ) object and JavaScript via the [BSTicker](docId\:EY8igCEgfbgUZ6edAOXAv) object.

# How do I create a playlist?

See [this page](docId:0Vm0UTpL2j8dss-DFNhMo) for information on how to build a Simple or Advanced playlist.

# How does Media List shuffling work?

If you enable the **Shuffle playback** option in a [Media List State](docId\:QA4WYTvulmrTKN30caj1y), the playlist will shuffle upon entering the media list state when it’s at the beginning of the list. If you are manually advancing through a media list using interactive input, then the playlist shuffles the Media List when it reaches the end of the list. It is also possible to advance to the next file in the list.

The Media List state is only available for use in an Advanced Zone.

# Can I ignore input in Advanced playlist?

In a BrightSign Author Advanced Zone, all input (for example, a button press) is automatically ignored unless it is manually defined in BrightSign Author. For an example of how to define input, see [Create GPIO Input](docId\:d0mS5AwZao9hGwW5_Aoap).

# Can I rename my presentation?

You should always rename your presentation in BrightSign Author (use **Save As...** in the File menu). If you try to rename the presentation by renaming the .bpfx file on the desktop (as you would any other file), it will cause the player to continuously reboot.&#x20;

# How to resize images for playback?

There are many applications and utilities that are available for editing and converting images. VSO Image Resizer, for example, does batch conversions.

See [this page](docId\:gZcaQrOoR8-ZaRNrEPKN1) for information on supported image resolutions for your player. You can increase the maximum allowed width of images by sacrificing height, or increase the maximum width/height by reducing the bpp value. For example, you could use a 4096x640x32bpp or a 4096x1280x16bpp image on non-4K players.

# Can a UDP command trigger playback of specified audio files?

Yes, you can do this either through BrightSign Author or a script.&#x20;

The [UDP Event](docId\:UGiCbbP6YX_8Te_bJDGe8) in BrightSign Author triggers when a player receives a matching UDP message string on a state with a UDP transition event attached to it. When the \<any> wildcard string is defined in a UDP transition event attached to an [On Demand State](docId:1hf2CfkXktf13BpYsi52T), it is possible to trigger playback of any media files added inside that state that match the key value of the received UDP message. See [this page](docId\:bSdmFhjelfvz8zVepqxya) for information on how to set this up.

Alternatively, you could write a standalone or plugin script using these two objects:

- [roDatagramReceiver](docId\:D3lIL84sO__uMKarlzk3a): Receives UDP packets; received packets are delivered to the message port as roDatagramEvent.
- [roAudioPlayer](docId\:KcsshYUYYNrAhPNNFnB-9): Plays back audio files asynchronously, so the script can continue running while audio plays and roAudioEvent are delivered to the message port.

Whatever device receives the UDP command must be listening on the specified port and must be able to parse the message format you define via roDatagramReceiver.

# Can I update content remotely?

Yes. BrightSign Author allows you to organize your players into groups and schedule content to be deployed to one or more groups at the same time (or on different dates at different times). 

[Web Folder Setup](docId\:CZiiGthX3J0k1cAIXC7cO) allows multiple players to check the same folder on your remote web server for content updates. To update your players using this method, publish changes locally in BrightSign Author, then transfer those changes to your web server. 


[title] Quick Publish
[path] How-tos/

This guide walks through the process of using BrightSign Author to create a simple presentation and then publishing that presentation to a player.

:::hint{type="warning"}
The player must already have been set up. If this has not yet been done, first go through the player setup process outlined in [Player Setup](docId\:rCuHsQUJj1ethBHvT46xi) or [Quick Setup](docId:-GUga56hC2IJ-tLQLAAOo).
:::

# What You Will Need

- A BrightSign player that has already been set up. If you have not set up your player yet, refer to [Player Setup](docId\:rCuHsQUJj1ethBHvT46xi) or [Quick Setup](docId:-GUga56hC2IJ-tLQLAAOo).
- Mac or PC with the BrightSign Author software installed. This software should have already been installed as part of the player setup process.
- For players configured with the Standalone Publishing Mode, you will also need a *blank* microSD card and a microSD card adapter (computers with SD card readers typically require an adapter to access microSD cards)
- Visual access to the display on which the presentation will be displayed.

# Create a Presentation

In the BrightSign Author app:

1. From the drop-down menu next to the **Presentation** tab, select **New**.
2. Select **Single Zone > Playlist** as the presentation type.
3. Enter the presentation **Name.**
4. Select a **Destination** folder.
5. Select your BrightSign player model under **Target Device.**
6. Select the **Connector** type that is used to connect the player to the display.
7. Select **Start.**

:::ExpandableHeading
### What are Zones?

Presentations can contain one or more media “zones”. A zone represents a defined section of the display. Each zone can play its own playlist of media content. For example, a presentation could have one zone with a looping series of videos, another zone that displays a slideshow of photos, and another zone with a scrolling market ticker of various stock prices. Each of these zones are simultaneously displayed. In this guide, a single zone presentation will be created. More detail about zones can be found [here](docId\:v-EVnMU6c7K5NHUNs86qT).
:::

![](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/tNb17yqqmwdosYEpsQGsH_image-20221222-203840.png)

You should see the following screen. From here, you can toggle between the presentation’s **Layout** (zone placement and positioning) and its **Content** (media files like video, images, etc.). Select the **Content** tab to add media files to the presentation. Alternatively, you can double-click on the zone (the green “Zone 1” box in the pic).

![](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/XD4gX2sRV4P5Lz7qNQKl1_image-20230810-195453.png)

From the **Content** tab:

1. Select **Open** (a) to view the file system on the Mac or PC. Select the *folder*, not the actual media file(s), where the desired media file(s) reside.
2. Media files within the selected folder will be shown in the **Assets** pane (b).
3. Drag and drop items from the **Assets** pane to the the zone’s **Content** pane (c).
4. Select the **Save** icon (d) to save the presentation to the presentation’s previously defined destination directory.
5. Select **Publish** (e).

:::hint{type="info"}
There is an important distinction between **Save** and **Publish**.

*Saving* the presentation saves any changes to the previously defined destination directory, similar to saving a typical text document or spreadsheet. The saved presentation file (.bpfx file) is not self-contained - it does not contain the various media files (images, videos, etc.). The presentation file is therefore insufficient on its own for display and requires access to the required media files.

When the presentation is *published*, BrightSign Author gathers all the necessary files (the .bpfx file, images, videos, etc.) and outputs it in a way that the player can read and process.

Generally speaking, you do not want to **Save** the presentation directly to the microSD card. Rather, you should **Publish** the presentation to the microSD card.
:::

![](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/BmkSWJRJ1_4XCSUqU8cu5_image-20230111-180430.png)

Selecting **Publish** will take you to the **Schedule** tab where you can define schedules to control when the presentation will play. In this example, the presentation will use the default schedule, which is to play all day, every day.

# Publish to a Standalone Player

::::ExpandableHeading
Steps for Standalone publishing

:::hint{type="warning"}
Make sure to erase the microSD card before copying the presentation and media files to it. If the setup files are left on the card, the player may attempt to run the setup process every time it is rebooted and not play the presentation.
:::

1. For **Destination Type**, select **Local System Storage** (a).
2. Insert a *blank* microSD card into the computer and select the card as the **Destination Local Directory** (b).
3. Select **Publish** (c). This will publish the presentation to the microSD card. Remove the card from the computer and plug it into the player. The presentation should then play on the display. If the presentation does not play after a few minutes, try rebooting the player.

![](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/x9zqIvNsTxJNV-L9N8PtM_image-20230111-181148.png)
::::

# Publish to a Local Network Player

:::ExpandableHeading
Steps for Local Network publishing

1. For **Destination Type**, select **Local Network** (a).
2. The player should appear in the **Networked Players** list. If not, select the **Refresh** icon (b). If the player still doesn’t appear, you may have to select the **+** icon (b) and manually enter the player’s IP address. The IP address will be shown on the “Congratulations, your BrightSign player is set up!” screen.
3. Select the player(s) to publish to (c).
4. Select **Publish** (d). The player may go through an automatic reboot cycle before playing the presentation.

![](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/HYcRjQwVvINEhwP4nvOiR_image-20230111-181726.png)
:::

# Publish to a Web Folder Player

:::ExpandableHeading
Steps for Web Folder publishing

### Web Folder Mapped to Local Directory

1. For **Destination Type**, select **Web Folder** (a). If you have a local directory that’s mapped as a volume to your web URL, select **Directory** (b) and select the folder icon to navigate to and select that local directory.
2. Select **Publish** (c) to publish the presentation to the directory you’ve selected. If set up properly, your Web Folder configured player should detect new content at the web URL, transfer that content to its microSD card, and play it.

![](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/jZoMlxHHKnk0uVWfcLTRg_image-20230111-190854.png)

### FTP

1. To transfer files to the web URL via FTP, select **FTP Site** (a) as the **Destination Type**.
2. Select the **+** icon (b) to enter a new FTP site.
3. Enter the required info for the FTP site and select **Submit** (c).
4. Enter the web URL again under **Options >** **Player Configuration** (d). Your web folder URL must match the URL you used when setting up the player.
5. Select **Publish** (e) to publish the presentation to the specified FTP site. If set up properly, your Web Folder configured player should detect new content at the web URL, transfer that content to its microSD card, and play it.

![New.png](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/LMdV5IIeJ1_LoTDkqnwh-_new.png)
:::

# Publish to Author Plus

:::ExpandableHeading
Steps for BrightSign Author Plus publishing

From the main **Dashboard** of BrightSign Author,**&#x20;Connect to BSN.cloud** by selecting either of the places shown.

![](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/O9plgVpbCt5kYhUHJtY5Q_image-20230111-191311.png)

You should have already created an account during the setup of your BSN.Cloud player. Enter your username and password to login. Once logged in, note the toggle for **Local Content** and **BSN.cloud Content**:

![](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/uqwwJggb4z4a58yRDdK8e_image-20230111-191522.png)

This toggle only appears if you are logged into BSN.Cloud and is thus only applicable to BSN.Cloud users. It governs what content you will see. **Local Content** mode displays the content stored on your local computer (the computer you are running BrightSign Author on) whereas **BSN.cloud Content** mode displays content stored on BSN.Cloud.

Presentations created in BrightSign Author Plus are stored in BSN.Cloud and are only accessible through BSN.Cloud. Presentations created in **Local Content** mode cannot be accessed in Author Plus and must first be uploaded in order to be used in Author Plus.&#x20;

### Upload Local Presentations to Author Plus

If you created a presentation prior to logging into BSN.Cloud and wish to use that presentation with BSN.Cloud, first select **Local Content** mode:

::Image[]{src="https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/qORRm2ZksQBNCdJAJ6iEP_image-20230105-183619.png" size="50" width="390" height="46" position="center" showCaption="false" darkWidth="390" darkHeight="46"}

Next, select **Presentation** and select the presentation you wish to use. You may get an “Open presentation error” where you are asked to resolve the location of the presentation’s media files. Select **Location** and select the folder where the the media files reside, then select **Continue**.

![](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/6aJoYtf2i97lsQSjf0RR6_image-20230105-184139.png)

Next, select the **Upload** icon to upload the presentation to Author Plus:

::Image[]{src="https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/dK6hY0Zd0x4PCLtrTrAdY_image-20230111-191806.png" size="80" width="916" height="118" position="center" showCaption="false" darkWidth="916" darkHeight="118"}

A progress bar should appear at the top of the window showing the transfer progress. When the transfer has been complete, toggle the mode to **BSN.cloud Content**. Select the **Presentation** tab and you should see the presentation you just uploaded. Double-click the presentation to open it and then select **Publish**.

This will take you to the **Schedule** tab. Select the **Group** that the player was assigned to. Unless the player was assigned to a different group, it will be part of the **Default** group.

![](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/DysOI5Q0wFxXcsHjlsK-R_image-20230111-191941.png)

Select **Publish** once again. You may see a message about a minimum OS and an OS being required. This message is in error. Select **OK**. Your presentation will be published to all players in the designated group.

### Create Presentations in Author Plus

Creating presentations directly in BrightSign Author Plus is similar to creating a presentation in **Local Content** mode with the important distinction being *where* the media files are located. With **Local Content** mode, media files are stored locally on the computer running BrightSign Author. As covered previously, presentations created in **Local Content** mode must first be uploaded before being able to be used in Author Plus.

Media files used for presentations created in Author Plus must first be uploaded to BSN.Cloud. From the **Content** tab drop-down menu, select **Upload New Media**.

![](https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/WaN0rHZco1diQjRuRuEVZ_image.png)

1. Select **Choose Files** to select content from your local computer’s file manager or simply drag and drop them onto the BrightSign Author window.
2. Select a folder on BSN.Cloud to upload the content to.
3. Select **Upload Content**.

![](https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/VjU_ZlE9woOOi7rzeNiM6_image-20230111-192413.png)

After uploading, the content will be available for use in any presentation. The steps to create a simple presentation are as covered previously in the [Creating a Presentation section](docId\:CZGuHZ_OMw1rSbPfddPaH) of this guide.
:::


[title] Switch Presentations
[path] How-tos/

:::hint{type="warning"}
This page / section pertains to BrightSign Author, our latest app for authoring and managing content and players. For the legacy  app, refer to our [Legacy Docs](docId\:i5zF53DX56wdWDFHlRot1).
:::

In BrightSign Author, you can use the [Switch Presentation](docId\:a6Ali6u-szxHuansk6T3-) functionality to switch from one presentation to another. This is useful if you want to change the zone layout without having to manually republish the presentation. All presentations must use the same resolution, otherwise the player will need to reboot to change its resolution. To do this:

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
1. Select the Zone in the **Presentation** tab. Go to **Zones > Properties** **> Type** to choose the zone type of the master presentation. 
2. Double click to edit the zone.
3. Change the Zone from **Simple** to **Advanced**. Any zone can be Advanced except for **Ticker** and **Background Image** zones.
4. Go to **Presentation Settings > Support Content > Switch Presentations**. Select the plus sign to add a presentation (see Image 1).
5. Enter a **Presentation Name** (this can be different from its saved name).
6. In the center panel, select the event  on which you want to switch presentations. Go to **Event Properties > Advanced**. In Image 2, a BP200 event is the trigger to switch from one presentation to another.
7. Select **Add Command** and select  **Other** as the Command. **Switch to Presentation** as the **Command Parameter**.
8. Use the **Specify a Presentation** drop down list to select the presentation to switch to, or select **Specify via user variable** to use a user variable to determine the presentation. 
:::

:::VerticalSplitItem
![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/rqyMWvq7mt3Odnb0Zpz6Z_image.png "Image 1")
:::
::::

You can use the **Switch to Presentation** command to link together as many presentations as needed. All presentations added to the **Switch Presentations** tab under **Support Content** will publish with the master presentation.

![Screenshot 2024-04-05 at 3.00.58 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/EuGRQKeToPTg97B52zXbN_screenshot-2024-04-05-at-30058-pm.png "Image 2")


[space] Develop (/develop)

[title] roSqliteDatabase
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This is the main SQLite object that "owns" the database. You can create as many of these objects as you need. The JavaScript equivalent is to use the IndexedDB.

## ifSqliteDatabse

### Open(path As String) As Boolean

Opens an existing database file. This method returns `True` upon success.

### Create(path As String) As Boolean

Creates a new, empty database file. This method returns `True` upon success.

Passing `":memory:"` to this method creates a database in non-persistent storage. This is useful for high-volume database applications that might cause wear issues on an SD card. 

### Close()

Closes an open database.

### CreateStatement(sql\_text As String) As Object

Creates a new *roSqliteStatement* object using the specified SQL string.

### RunBackground(sql\_text As String, associative\_array As Object) As Integer

Runs the specified SQL statement in the background and binds variables using the passed *roAssociativeArray*.

### SetMemoryLimit(limit As Integer)

Sets the "soft" memory limit under which SQLite will attempt to remain (see the SQLite documentation for details).

:::hint{type="info"}
The `SetMemoryLimit()` method sets global parameters. It must, therefore, be called before any other calls are made on the database object.
:::

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roSqliteEvent*  to the attached message port.

## Examples

Creating a database:

```text
db = CreateObject("roSqliteDatabase")
 
print db
 
openResult = db.Create("SD:/test.db")
 
if openResult
    print "Created OK"
else
    print "Creation FAILED"
    end
endif
```

Creating a table in a database:

```text
createStmt = db.CreateStatement("CREATE TABLE playback (md5 text PRIMARY KEY, path PATH, playback_count INT);")

print createStmt

if type(createStmt) <> "roSqliteStatement" then
    print "We didn't get a statement returned!!"
    end
endif

sqlResult = createStmt.Run()

print sqlResult

if sqlResult = SQLITE_COMPLETE
    print "Table Created OK"
else
    print "Table Creation FAILED"
endif

createStmt.Finalise()
```

[title] roNodeJs
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

*roNodeJs* is a BrightScript object that allows the launching of a Node.js® instance. These Node.js instances will have access to all BrightSign Node.js modules as built in modules. roNodeJs also provides mechanisms to communicate between JavaScript and BrightScript environments for more complex applications.

## Object Creation

*roNodeJs* is instantiated with a filename and optional parameters. 

```text
node = CreateObject("roNodeJs", "index.js", {message_port:my_message_port, arguments: ["arg1", "arg2"]})
```

In OS 8.2.17 and later versions, you can also pass an optional *node\_arguments* parameter which provides arguments to the node interpreter itself (as opposed to *arguments* which provides arguments to the JavaScript application being run inside Node):

```text
node = CreateObject("roNodeJs", "index.js", {message_port:my_message_port, node_arguments: ["arg"], arguments: ["arg1", "arg2"]})
```

- `message_port:` Optional. Allows communication with JavaScript applications. 
- `arguments:` Optional. Passes arguments to the node instance. 
- `node_arguments:` Optional. Passes arguments to the node.js executable, for example, to enable remote inspector for node.js. *Node\_arguments* can take multiple arguments.
- `env_vars:` Optional. Passes environment variables (supplied as an associative array) to the node.js application. *Note:* Environment variable names are case-sensitive, but *roAssociativeArray* is case-insensitive by default and the BrightScript literal syntax for associative arrays forces all key names to lower case. To ensure correct behavior, call `SetModeCaseSensitive()` and use the `AddReplace()` method to add variables to the array. Or you can use the following example, which is slightly less verbose than `AddReplace():`

```text
a={}
a.SetModeCaseSensitive()
a["KeY"] = 1
a["key"] = 2
print a  ' returns both key and KeY
```

## PostJsMessage()

`PostJsMessage (data as AssociativeArray) As Boolean`
Posts a collection of key\:value pairs to the BrightScript *MessagePort* JavaScript class. This method takes an associative array but it doesn't support nested associative arrays. See [this page](docId:5lt7hkSSemQlNIAU7kva3) for more details.

## roNodeJs Events

See [this page](docId:7NVhxjmwLbciI8dx4a4P3) for information about roNodeJs events.

## Examples

To enable inspector using node\_arguments:

```text
node_js = CreateObject("roNodeJs", "main.js", {message_port: msgPort, node_arguments: ["--inspect=0.0.0.0:2999"], arguments:["node_application_argument1", "node_application_argument2"})
```

To change a directory to the directory of the current JavaScript file:

```text
proc.chdir(__dirname)
```

To set a timer to stop node from exiting:

```text
setInterval(function(){console.log("ping"}, 10000)
```

To pass arguments to roNodeJs:

```text
node = CreateObject("roNodeJs", "index.js",
{node_arguments: ["-r", "dotenv/config"], arguments: ["dotenv_config_path=/storage/sd/.env"]})
```

Note that "node\_arguments" are arguments that come before the filename, while "arguments" come after the filename.

[title] Player APIs (BrightScript & JavaScript)
[path] /

## BrightScript vs. JavaScript

When developing for BrightSign players, you must write in BrightScript at some point (unless you are using BrightSign Author) though most users are not familiar with this language. Traditionally, every application, presentation, video, etc. that ran on a player was driven by BrightScript. Since most users today want to use JavaScript to develop applications and control the player, BrightSign has been working to accommodate that. Nevertheless, BrightScript remains integral because without an `autorun.brs` file, written in BrightScript, your player will not behave as intended.

The [BrightScript Language](https://marketplace.visualstudio.com/items?itemName=RokuCommunity.brightscript) extension in Visual Studio Code facilitates BrightScript coding and is used by thousands of developers around the world.

## Why BrightScript is Required

`autorun.brs` is the generic name for a file the BrightSign Operating System (BOS) searches for on the player’s configured storage device (see Image 1, below). If an `autorun.brs` is found, the player will execute it. It is the entry point for any application developed on a BrightSign player, and it can handle the entirety of an application (BrightSign Author), be a simple pointer to more complex programs (JavaScript applications), or any mix of the two.

The BrightSign `autorun.brs` also configures the player. Many player setup/configuration options must be set up immediately (such as SSH, logging level, some network interfaces, registry settings, video decoder routing, etc.). These settings are unique to media players, and because the `autorun.brs` is the first thing the player executes, it is the best (and sometimes only) place to set them.

When creating a JavaScript application or presentation, the `autorun.brs` will typically configure the player, instantiate an HTML widget, and give the HTML widget the correct HTML file or URL. The HTML widget will then take over and run your JavaScript files.

![Screenshot 2025-01-07 at 11.16.48 AM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/1fEuo_zkz9Kq_QD2mz_CI_screenshot-2025-01-07-at-111648-am.png)

## When to Use BrightScript

### BrightScript Required

BrightScript is required for these scenarios:

- Player setup/configuration that must be done before a JavaScript application or presentation is loaded
  - Setting up logging level
  - Instantiating the HTML widget
  - Setting up network interfaces (on certain ports)
  - Certain file system operations
- BrightSign Author plugins
- Autorun logging level and BOS logging (serial)
- Any BrightScript object that doesn’t have a JavaScript alternative. A list of BrightScript objects and their JavaScript alternatives is [here](docId:2KEwWxLmpYcwu8tffuf2Z).

### BrightScript Recommended

Though JavaScript can be used, BrightScript is recommended in these scenarios:

- Player setup/configuration that is not time dependent, such as setting up SSH/Telnet or setting up network interfaces on main ports
- Player sync


[title] Built-In Functions
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

BrightScript features a set of built-in, module-scope, intrinsic functions. A number of file I/O, string, mathematics, and system functions are also available via the *roGlobal* object.

## Type()

`Type(a As Variable) As String` 

This function returns the type of the passed variable and/or object.

## GetGlobalAA()

`GetGlobalAA() As Object`

This function fetches the global associative array for the current script.

## Rnd()

`Rnd(range As Integer) As Integer`
`Rnd(0) As Float`

If passed a positive, non-zero integer, this function returns a pseudo-random integer between 1 and the argument value. The range includes the argument value: For example, calling `Rnd(55)` will return a pseudo-random integer greater than 0 and less than 56.

If the argument is 0, this function returns a pseudo-random Float value between 0 and 1.

:::hint{type="info"}
**Note**
The `Rnd()` functions utilize a pseudo-random seed number that is generated internally and not accessible to the user.
:::

## Box()

`Box(type As Dynamic) As Object`

This function returns an object version of the specified intrinsic type. Objects will be passed through.

### Example

```text
b = box("string")
b = box(b)  ' b does not change
```

## Run()

`Run(file_name As String, [optional_arg As Dynamic, …]) As Dynamic`
`Run(file_names As roArray, [optional_arg As Dynamic, …]) As Dynamic`

This function runs one or more scripts from the current script. You may append optional arguments, which will be passed to the `Main()` function of the script(s). The called script may also return arguments to the caller script.

If a string file name is passed, the function will compile and run the corresponding file. If an array of files is passed, the function will compile each file, link them together, and run them.

### Example

```text
Sub Main()
       Run("test.brs")
       BreakIfRunError(LINE_NUM)
       Print Run("test2.brs", "arg 1", "arg 2")
       if Run(["file1.brs","file2.brs"])<>4 then stop
       BreakIfRunError(LINE_NUM)
       stop
End Sub


Sub BreakIfRunError(ln)
       el=GetLastRunCompileError()
       if el=invalid then
             el=GetLastRunRuntimeError()
             if el=&hFC or el=&hE2 then return  
             'FC==ERR_NORMAL_END, E2=ERR_VALUE_RETURN
             print "Runtime Error (line ";ln;"): ";el
             stop
       else
             print "compile error (line ";ln;")"
             for each e in el
                    for each i in e
                          print i;": ";e[i]
                    end for
             end for
      
             stop
       end if
End Sub
```

## Eval()

`Eval(code_snippet As String) As Dynamic`

This function runs the passed code snippet in the context of the current function. The function compiles the snippet, then executes the byte-code. If the code compiles and runs successfully, it will return zero. If the code compiles successfully, but encounters a runtime error, it will return an integer indicating the error code (using the same codes as the `GetLastRunRuntimeError()` function). If compilation fails, it will return an *roList* object; the *roList* structure is identical to that of the `GetLastRunCompileError()` function.

The `Eval()` function can be useful in two cases:

- When you need to dynamically generate code at runtime.
- When you need to execute a statement that could result in a runtime error, but you don’t want code execution to stop.

### Example

```text
PRINT Eval("1/0") 'Returns a divide by zero error.
```

## GetLastRunCompileError()

`GetLastRunCompileError() As roList`

This function returns an *roList* object containing compile errors (or Invalid if no errors occurred). Each *roList* entry is an *roAssociativeArray* object containing the following keys:

- `ERRSTR`: The compile error type (as String)
- `FILESPEC`: The file URI of the script containing the error (as String)
- `ERRNO`: The error number (as Integer)
- `LINENO`: The line number where the error occurs (as Integer)

The following are possible `ERRNO` values:

| **Error Code** |     | **Description**                  | **Expanded Description**                                        |
| -------------- | --- | -------------------------------- | --------------------------------------------------------------- |
| \&hBF          | 191 | ERR\_NW                          | `ENDWHILE` statement occurs without statement.                  |
| \&hBE          | 190 | ERR\_MISSING\_ENDWHILE           | `WHILE` statement occurs without `ENDWHILE` statement.          |
| \&hBC          | 188 | ERR\_MISSING\_ENDIF              | End of script reached without finding an `ENDIF` statement.     |
| \&hBB          | 187 | ERR\_NOLN                        | No line number found.                                           |
| \&hBA          | 186 | ERR\_LNSEQ                       | Line number sequence error.                                     |
| \&hB9          | 185 | ERR\_LOADFILE                    | Error loading file.                                             |
| \&hB8          | 184 | ERR\_NOMATCH                     | `MATCH` statement does not match.                               |
| \&hB7          | 183 | ERR\_UNEXPECTED\_EOF             | Unexpected end of string encountered during string compilation. |
| \&hB6          | 182 | ERR\_FOR\_NEXT\_MISMATCH         | Variable on `NEXT` does not match `FOR`.                        |
| \&hB5          | 181 | ERR\_NO\_BLOCK\_END              |                                                                 |
| \&hB4          | 180 | ERR\_LABELTWICE                  | Label defined more than once.                                   |
| \&hB3          | 179 | ERR\_UNTERMED\_STRING            | Literal string does not have end quote.                         |
| \&hB2          | 178 | ERR\_FUN\_NOT\_EXPECTED          |                                                                 |
| \&hB1          | 177 | ERR\_TOO\_MANY\_CONST            |                                                                 |
| \&hB0          | 176 | ERR\_TOO\_MANY\_VAR              |                                                                 |
| \&hAF          | 175 | ERR\_EXIT\_WHILE\_NOT\_IN\_WHILE |                                                                 |
| \&hAE          | 174 | ERR\_INTERNAL\_LIMIT\_EXCEDED    |                                                                 |
| \&hAD          | 173 | ERR\_SUB\_DEFINED\_TWICE         |                                                                 |
| \&hAC          | 172 | ERR\_NOMAIN                      |                                                                 |
| \&hAB          | 171 | ERR\_FOREACH\_INDEX\_TM          |                                                                 |
| \&hAA          | 170 | ERR\_RET\_CANNOT\_HAVE\_VALUE    |                                                                 |
| \&hA9          | 169 | ERR\_RET\_MUST\_HAVE\_VALUE      |                                                                 |
| \&hA8          | 168 | ERR\_FUN\_MUST\_HAVE\_RET\_TYPE  |                                                                 |
| \&hA7          | 167 | ERR\_INVALID\_TYPE               |                                                                 |
| \&hA6          | 166 | ERR\_NOLONGER                    | Feature no longer supported.                                    |
| \&hA5          | 165 | ERR\_EXIT\_FOR\_NOT\_IN\_FOR     |                                                                 |
| \&hA4          | 164 | ERR\_MISSING\_INITILIZER         |                                                                 |
| \&hA3          | 163 | ERR\_IF\_TOO\_LARGE              |                                                                 |
| \&hA2          | 162 | ERR\_RO\_NOT\_FOUND              |                                                                 |
| \&hA1          | 161 | ERR\_TOO\_MANY\_LABELS           |                                                                 |
| \&hA0          | 160 | ERR\_VAR\_CANNOT\_BE\_SUBNAME    |                                                                 |
| \&h9F          | 159 | ERR\_INVALID\_CONST\_NAME        |                                                                 |
| \&h9E          | 158 | ERR\_CONST\_FOLDING              |                                                                 |

## GetLastRunRuntimeError()

`GetLastRunRuntimeError() As Integer`

This function returns the error code that resulted from the last `Run()` function.

These codes indicate a normal result:

| **Error Code** |     | **Description**        | **Expanded Description**                                                                |
| -------------- | --- | ---------------------- | --------------------------------------------------------------------------------------- |
| \&hFF          | 255 | ERR\_OKAY              |                                                                                         |
| \&hFC          | 252 | ERR\_NORMAL\_END       | Execution ended normally, but with termination (e.g. END, shell "exit", window closed). |
| \&hE2          | 226 | ERR\_VALUE\_RETURN     | Return executed with value returned on the stack.                                       |
| \&hE0          | 224 | ERR\_NO\_VALUE\_RETURN | Return executed without value returned on the stack.                                    |

The following codes indicate runtime errors:

| **Error Code** |     | **Description**                | **Expanded Description**                                                                                |
| -------------- | --- | ------------------------------ | ------------------------------------------------------------------------------------------------------- |
| \&hFE          | 254 | ERR\_INTERNAL                  | Unexpected condition occurred.                                                                          |
| \&hFD          | 253 | ERR\_UNDEFINED\_OPCD           | Opcode could not be handled.                                                                            |
| \&hFB          | 251 | ERR\_UNDEFINED\_OP             | Expression operator could not be handled.                                                               |
| \&hFA          | 250 | ERR\_MISSING\_PARN             |                                                                                                         |
| \&hF9          | 249 | ERR\_STACK\_UNDER              | No value to pop off the stack.                                                                          |
| \&hF8          | 248 | ERR\_BREAK                     | `scriptBreak()` function called.                                                                        |
| \&hF7          | 247 | ERR\_STOP                      | STOP statement executed.                                                                                |
| \&hF6          | 246 | ERR\_RO0                       | bscNewComponent failed because object class not found.                                                  |
| \&hF5          | 245 | ERR\_R01                       | BrightScript member function call does not have right number of parameters.                             |
| \&hF4          | 244 | ERR\_RO2                       | BrightScript member function not found in object or interface.                                          |
| \&hF3          | 243 | ERR\_RO3                       | BrightScript interface not a member of the object.                                                      |
| \&hF2          | 242 | ERR\_TOO\_MANY\_PARAM          | Too many function parameters to handle.                                                                 |
| \&hF1          | 241 | ERR\_WRONG\_NUM\_PARAM         | Number of function parameters incorrect.                                                                |
| \&hF0          | 240 | ERR\_RVIG                      | Function returns a value, but is ignored.                                                               |
| \&hEF          | 239 | ERR\_NOTPRINTABLE              | Value not printable.                                                                                    |
| \&hEE          | 238 | ERR\_NOTWAITABLE               | `WAIT` statement cannot be applied to object because object does not have an *roMessagePort* interface. |
| \&hED          | 237 | ERR\_MUST\_BE\_STATIC          | Interface calls from rotINTERFACE type must be static.                                                  |
| \&hEC          | 236 | ERR\_RO4                       | "." Dot Operator used on object that does not contain legal object or interface reference.              |
| \&hEB          | 235 | ERR\_NOTYPEOP                  | Operation attempted on two type-less operands.                                                          |
| \&hE9          | 233 | ERR\_USE\_OF\_UNINIT\_VAR      | Uninitialized variable used illegally.                                                                  |
| \&hE8          | 232 | ERR\_TM2                       | Non-numeric index applied to array.                                                                     |
| \&hE7          | 231 | ERR\_ARRAYNOTDIMMED            |                                                                                                         |
| \&hE6          | 230 | ERR\_USE\_OF\_UNINIT\_BRSUBREF | Reference to uninitialized SUB.                                                                         |
| \&hE5          | 229 | ERR\_MUST\_HAVE\_RETURN        |                                                                                                         |
| \&hE4          | 228 | ERR\_INVALID\_LVALUE           | Left side of the expression is invalid.                                                                 |
| \&hE3          | 227 | ERR\_INVALID\_NUM\_ARRAY\_IDX  | Number of array indexes is invalid.                                                                     |
| \&hE1          | 225 | ERR\_UNICODE\_NOT\_SUPPORTED   |                                                                                                         |
| \&hE0          | 224 | ERR\_NOTFUNOPABLE              |                                                                                                         |
| \&hDF          | 223 | ERR\_STACK\_OVERFLOW           |                                                                                                         |
| \&h20          | 32  | ERR\_CN                        | Continue (`cont` or `c`) not allowed.                                                                   |
| \&h1C          | 28  | ERR\_STRINGTOLONG              |                                                                                                         |
| \&h1A          | 26  | ERR\_OS                        | String space has run out.                                                                               |
| \&h18          | 24  | ERR\_TM                        | A Type Mismatch (string /number operation mismatch) has occurred.                                       |
| \&h14          | 20  | ERR\_DIV\_ZERO                 |                                                                                                         |
| \&h12          | 18  | ERR\_DD                        | Attempted to re-dimension array.                                                                        |
| \&h10          | 16  | ERR\_BS                        | Array subscript out of bounds.                                                                          |
| \&h0E          | 14  | ERR\_MISSING\_LN               |                                                                                                         |
| \&h0C          | 12  | ERR\_OUTOFMEM                  |                                                                                                         |
| \&h08          | 8   | ERR\_FC                        | Invalid parameter passed to function/array (e.g. a negative matrix dim or square root).                 |
| \&h06          | 6   | ERR\_OD                        | Out of data (READ).                                                                                     |
| \&h04          | 4   | ERR\_RG                        | Return without Gosub.                                                                                   |
| \&h02          | 2   | ERR\_SYNTAX                    |                                                                                                         |
| \&h00          | 0   | ERR\_NF                        | `Next` without `For`.                                                                                   |


[title] roImagePlayer
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object displays static bitmap images on the video display. The simplest way to use *roImagePlayer* is to make calls to `DisplayFile()` with the filename as a String. Alternatively, you can use `PreloadFile()` in conjunction with `DisplayPreload()` to have more control. For more pleasing aesthetics when generating an image player, use the *roImageWidget* object. The JavaScript equivalent is the [\<img> tag in HTML](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img).

Object Creation: The image player is displayed by first creating *roRectangle* and *roImagePlayer* instances, then calling `SetRectangle()` using the *roRectangle* instance as the argument.

```text
rectangle = CreateObject("roRectangle", 0, 0, 1024, 768)
i = CreateObject("roImagePlayer")
i.SetRectangle(rectangle)
```

## ifImageControl 

### DisplayFile(image\_filename As String) As Boolean

Displays the image with the specified filename. The image\_filename string must point to a *.png*, *.jpeg*, or 8-bit, 24-bit, or 32-bit *.bmp* file. Note that *.jpeg* image files with CMYK color profiles are not supported.

### DisplayFile(parameters As roAssociativeArray) As Boolean

Displays an image using an associative array of display parameters:

- `Filename`: The name of the image file
- `Mode`: The image mode. See the entry for SetDefaultMode() below for more details.
- `Transition`: The image transition setting. See the entry for SetDefaultTransition() below for more details.
- `EncryptionAlgorithm`: The file-encryption algorithm. Currently the options are "AesCtr" and "AesCtrHmac".
- `EncryptionKey`: The key to decrypt the image file. This is a byte array consisting of 128 bits of key, followed by 128 bits of IV.

See the [Image Decryption](docId:0UMXqYvruY7DRNLuUZAFp) section below for details on displaying encrypted images.

:::hint{type="danger"}
&#x20;The image player no longer accepts "\{A|A}" AES encryption keys (i.e. where the top and bottom 64 bits of the key are identical).
:::

### PreloadFile(image\_filename As String) As Boolean

Loads the specified image file into an offscreen memory buffer.

### PreloadFile(parameters As roAssociativeArray) As Boolean

Loads an image file into an offscreen memory buffer. Image display properties are determined by an associative array of parameters:

- `Filename`: The name of the image file
- `Mode`: See the entry for SetDefaultMode() below for more details.
- `Transition`: See the entry for SetDefaultTransition() below for more details.

### DisplayPreload() As Boolean

Uses the on-screen memory buffer to display the image stored in the offscreen memory buffer using `PreloadFile()`. There are only two memory buffers: one is displayed on screen; and the other is used for preloading images. `PreloadFile()`can be called multiple times before `DisplayPreload()` is called, and will keep loading into the same off-screen buffer. The `DisplayFile()` method calls `PreloadFile()` followed immediately by `DisplayPreload()`, so any previously preloaded image will be lost. If no image is preloaded, `DisplayPreload()` will have no effect.

### StopDisplay() As Boolean

Removes an image from the display.

### DisplayFileEx(filename As String, mode As Integer, x As Integer, y As Integer) As Boolean

### PreloadFileEx(filename As String, mode As Integer, x As Integer, y As Integer) As Boolean

### SetDefaultMode(mode As Integer) As Boolean

Sets the default image display mode for DisplayFile() and PreloadFile(). If SetDefaultMode() is not called, then the default mode is set to 0 (equivalent to the image being centered without scaling). The supported display mode are listed below:

- **0 – Center image**: No scaling takes place. Cropping only occurs if the image is bigger than the window.
- **1 – Scale to fit**: The image is scaled so that it is fully viewable, with its aspect ratio maintained.
- **2 – Scale to fill and crop**: The image is scaled so that it completely fills the window, with its aspect ratio maintained.
- **3 – Scale to fill**: The image is stretched so that it fills the window and the whole image is viewable. The aspect ratio will not be maintained if it is different from the window.

### SetDefaultTransition(transition As Integer) As Boolean

Sets the transition to be used when the next image is displayed. The following are available transitions:

- 0: No transition: immediate blit
- 1-4: Wipes from top, bottom, left, or right.
- 5-8: Explodes from centre, top left, top right, bottom left, or bottom right.
- 10-11: Uses vertical or horizontal venetian-blind effect.
- 12-13: Combs vertical or horizontal.
- 14: Fades out to background color, then back in.
- 15: Fades between current image and new image.
- 16-19: Slides from top, bottom, left or right.
- 20-23: Slides entire screen from top, bottom, left, or right.
- 24-25: Scales old image in, then the new one out again (this works as a pseudo rotation around a vertical or horizontal axis).
- 26-29: Expands a new image onto the screen from right, left, bottom, or top.

### SetTransform(transform As String) As Boolean

Applies one of eight transforms to the image. Calls to this method only take effect when the next file is displayed. Note that the image rectangle itself does not change to accommodate the new height and width ratio of a transformed image. This method can be called separately on multiple *roImagePlayer* or *roImageWidget* instances.

- `identity`: No transformation (default behavior)
- `rot90`: 90 degree clockwise rotation
- `rot180`: 180 degree rotation
- `rot270`: 270 degree clockwise rotation
- `mirror`: Horizontal mirror transformation
- `mirror_rot90`: Mirrored 90 degree clockwise rotation
- `mirror_rot180`: Mirrored 180 degree clockwise rotation
- `mirror_rot270`: Mirrored 270 degree clockwise rotation

### OverlayImage(image\_filename As String, x As Integer, y As Integer) As Boolean

Composites the image with the specified filename on top of the primary `DisplayFile()` image. Use the `x` and `y` integers to specify its location within the image widget.

### SetRectangle(r As roRectangle) As Boolean

Changes the size and positioning of the image rectangle using the passed *roRectangle* object.

### GetRectangle() As roRectangle

Returns an *roRectangle* object that has the same location and dimensions as the *roRectangle* object used to define the image window.

### CreateTestHole(hole As roRectangle) As Boolean

Creates a hole in the image with the location and dimensions specified in the passed *roRectangle* instance. Any video windows located directly beneath the image will show through. This method will disrupt image playback and should be used for test purposes only.

### SetTransitionDuration(duration As Integer) As Boolean

Sets the amount of time it takes (in milliseconds) for a specified transition effect to take place. The default transition duration is 1000 milliseconds.

### DisplayBuffer(a As Object, b As Integer, c As Integer) As Boolean

### Hide() As Boolean

Hides the image currently being displayed by the *roImagePlayer* widget.

### Show() As Boolean

Shows the image currently being displayed by the *roImagePlayer* widget.

### Raise() As Void

Sends the widget to the top of the z-order on the graphics plane (i.e. in front of all other surfaces that implement the *ifWidget* interface). By default, new widgets are placed at the top of the graphics z-order.

:::hint{type="info"}
Some surfaces are always drawn at the top of the graphics z-order, including the mouse cursor, closed captions, and [scrolling tickers](docId\:GQeNKTmmFazEjdlZHttIZ).
:::

:::hint{type="success"}
You can use the `PauseGraphics()`/ `ResumeGraphics()` methods on the [roVideoMode](#) object to ensure multiple changes to the graphics z-order occur simultaneously.
:::

### Lower() As Void

Sends the widget to the bottom of the z-order on the graphics plane (i.e. behind all other surfaces that implement the *ifWidget* interface). By default, new widgets are placed at the top of the graphics z-order.

## X, Y

The x and y values indicate which position of the image to center as near as possible, or both x and y can be set to -1, which uses the center of the image as the point to position nearest to the center.

To display images in a zone, `SetRectangle()` must be called, and `EnableZoneSupport()` must be included in a script to use the zones functionality.

## Testing Display Modes

Here are some example shell commands you can use to test the different display modes:

```text
BrightSign> image filename.bmp 0
BrightSign> image filename.bmp 1
BrightSign> image filename.bmp 2
BrightSign> image filename.bmp 3

BrightSign> image filename.bmp 0 0 0
BrightSign> image filename.bmp 2 0 0
```

## Preloading Images

The following example script uses preloaded images to improve the UI speed when the user hits a key on the keyboard. As soon as a key is struck, the display switches to the new image, which has already been preloaded. The only possible delay occurs if the key is hit while the image is preloading. In this case, the image will display as soon as it is loaded.

```text
i = CreateObject("roImagePlayer")
p = CreateObject("roMessagePort")
k = CreateObject("roKeyboard")
k.SetPort(p)

i.PreloadFile("one.bmp")

loop:
i.DisplayPreload
i.PreloadFile("two.bmp")
Wait(0,p)
i.DisplayPreload
i.PreloadFile("one.bmp")
Wait(0,p)
goto loop
```

## Image Decryption 

The *roImagePlayer*, *roImageWidget*, *roClockWidget*, *roTextWidget*, and *roCanvasWidget* objects can be used to display encrypted images. Each object has an image playback method that accepts an associative array, which can include the `EncryptionAlgorithm` and `EncryptionKey` decryption parameters.

:::hint{type="info"}
Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.
:::

You can call `roDeviceInfo.HasFeature("media_decryption")`  to determine if a player model and firmware version supports image decryption.

Example:

```text
print "Play ENCRYPTED image in an image widget"

imagePlayer = CreateObject("roImageWidget", r1)

aa=CreateObject("roAssociativeArray")
aa.filename = "sd:/images_enc.jpg"
aa.encryptionalgorithm = "AesCtr"
aa.encryptionkey = CreateObject("roByteArray")
aa.encryptionkey.fromhexstring("01030507090b0d0f00020406080a0c0e00000000000000000000000000000000")

imagePlayer.DisplayFile(aa)
sleep(10000)
imagePlayer.Hide()

print "Play ENCRYPTED image with PlayStaticImage"

videoPlayer = CreateObject("roVideoPlayer")

aa=CreateObject("roAssociativeArray")
aa.filename = "sd:/images_enc.jpg"
aa.encryptionalgorithm = "AesCtr"
aa.encryptionkey = CreateObject("roByteArray")
aa.encryptionkey.fromhexstring("01030507090b0d0f00020406080a0c0e00000000000000000000000000000000")

videoPlayer.PlayStaticImage(aa)
sleep(10000)
videoPlayer = invalid

print "Show CLOCK image"

resourceManager = CreateObject("roResourceManager", "sd:/resources.txt")

clockWidget = CreateObject("roClockWidget", r1, resourceManager, {})

aa=CreateObject("roAssociativeArray")
aa.filename = "sd:/images_enc.jpg"
aa.encryptionalgorithm = "AesCtr"
aa.encryptionkey = CreateObject("roByteArray")
aa.encryptionkey.fromhexstring("01030507090b0d0f00020406080a0c0e00000000000000000000000000000000")

clockWidget.SetBackgroundBitmap(aa, True)
clockWidget.Show()
sleep(10000)
clockWidget.Hide()

print "Text widget with encrypted background image"

twParams = CreateObject("roAssociativeArray")
twParams.LineCount = 1
twParams.TextMode = 1
twParams.Rotation = 0
twParams.Alignment = 1

tw=CreateObject("roTextWidget",r1,1,2,twParams)
tw.SetBackgroundColor(&h00ff0000)
tw.SetForegroundColor(&hff00ff00)
tw.PushString("Encrypted Background")
'tw.SetRectangle(r)

aa=CreateObject("roAssociativeArray")
aa.filename = "sd:/images_enc.jpg"
aa.encryptionalgorithm = "AesCtr"
aa.encryptionkey = CreateObject("roByteArray")
aa.encryptionkey.fromhexstring("01030507090b0d0f00020406080a0c0e00000000000000000000000000000000")

tw.SetBackgroundBitmap(aa, True)
tw.Show()
sleep(10000)
tw.Hide()

cw=CreateObject("roCanvasWidget", rect)
canvas_aa=CreateObject("roAssociativeArray")
canvas_aa.Filename = "sd:/images_enc.jpg"
canvas_aa.Encryptionalgorithm = "AesCtr"
canvas_aa.EncryptionKey = CreateObject("roByteArray")
canvas_aa.EncryptionKey.FromHexString("01030507090b0d0f00020406080a0c0e00000000000000000000000000000000")
cw.SetLayer(canvas_aa, 1)
cw.Show() 
```


[title] Presentation and Widget Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/

This section describes objects that relate directly to audio/video playback on BrightSign players.

- [roAudioConfiguration](docId\:O-1m6gAZTvTBhVGpBodNE)
- [roAudioEventMx](docId\:L3uANCGdiVBO3RODZbtR7)
- [roAudioOutput](docId\:Olycd6IjE_FNAXDzJhDkR)
- [roAudioPlayer](docId\:KcsshYUYYNrAhPNNFnB-9)
- [roAudioPlayerMx](docId\:QitS73ICo2RXML_gq9fPA)
- [roCanvasWidget](docId\:u29Yo1Y1m5vrt0d4bN2Tb)
- [roCharDisplay](docId\:g1PLaJYkcj_cZ8EPZ6uFY)
- [roClockWidget](docId:8Peh493hEe_sdGRgfgLMS)
- [roHdmiInputChanged, roHdmiOutputChanged](docId\:XDORXW7WvzcNnu2-5UpuY)
- [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK)
- [roHtmlWidgetEvent](docId\:tR0KPcseO3i6m8jNMVEPa)
- [roImageBuffer](docId\:hvitUut6MSrs1YRZXh9_a)
- [roImagePlayer](docId:0UMXqYvruY7DRNLuUZAFp)
- [roImageWidget](docId\:LBu7-gHZP96nVa3uiOstj)
- [roNodeJs](docId\:x9c4JHn6rnqgryflY1wdQ)
- [roNodeJsEvent](docId:7NVhxjmwLbciI8dx4a4P3)
- [roRectangle](docId:3E73tPEmL1-OEbs2GoAUQ)
- [roStreamQueue](docId\:ViH_1nQEDu7xAa6auJjzP)
- [roStreamQueueEvent](docId\:U2nSQON05gA1AassH5dsO)
- [roTextField](docId\:nmKr12_weZv3Rci1Ju4Lf)
- [roTextWidgetEvent](docId\:Tu8cTRBpfVXJABLbbpZqZ)
- [roTextWidget](docId\:GQeNKTmmFazEjdlZHttIZ)
- [roTouchEvent, roTouchCalibrationEvent](docId\:BE2jUojXaHQxvyKVHi7j-)
- [roTouchScreen](docId\:wydFi-OEWp1UOFQJVyHhU)
- [roVideoEvent, roAudioEvent](docId\:G1ZeMm_Qk7FbCYNIuk6Fi)
- [roVideoInput](docId\:G1ZeMm_Qk7FbCYNIuk6Fi)&#x20;
- [roVideoMode](docId\:QQ734nQz0hCwNI0uNSdMP)&#x20;
- [roVideoPlayer](docId\:zTUZ0LdazCmL2kQmdBKCn)&#x20;


[title] Develop
[path] /

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/PRepch96G_W0HGMz5T2f1_developers-icon-lm.svg" darkSrc="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/f0qGZc3ewms3sX5qGhIjS_developers-icon-dm.svg" size="20" width="205" height="200" darkWidth="169" darkHeight="200" position="center" showCaption="false"}

Here you will find a rich set of resources for developers.

# <font color="#6B21A8">NEW!</font> [BrightDev](docId\:PhVWzFsXULybdaNkQMocQ)

Your starting point for BrightSign development. Complete SDK, working examples, and documentation that gets you to your first deployment in under 15 minutes.

# [Player APIs](docId:9zyp1wQ0CQwmsJQdyuWJM)&#x20;

BrightScript and JavaScript APIs provide direct access to players.

# [Cloud APIs](docId:7lwJKKuAb9KwoNqnKv06M)

APIs for accessing BSN.Cloud as well as the legacy BrightSign Network (BSN).

# [HTML Development](docId\:XA-PfJbjN_4Gm_f-KWw_k)

BrightSign players feature a full Chromium installation enabling players to display HTML content. Here you will find resources to help you develop HTML apps to run on our players.

# [Diagnostic Web Server APIs](docId\:Xxx6bD9sppYbFKoKKGA99)&#x20;

The Diagnostic Web Server (DWS) enables access to player info and settings and offers tools for troubleshooting players. These APIs provide direct access to the DWS.

# [BrightSign Partner Packet](docId\:WAb_BuceJlmaHSb6sfBRN)&#x20;

An introductory guide for the integration of a partner CMS with the BrightSign ecosystem&#x20;

# [BSN.Cloud for Partners](docId\:laM569Ozotem6uhlV-67m)&#x20;

Guidance for partners to help them integrate with BSN.Cloud

# [BrightSign Registry Keys](docId:8LUJ1vpF-ftLCBISBqBvZ)

Registry key settings.

# [BrightScript Debugger](docId\:NWBQJWdO43dYsqmHzYSCL)

Similar to the JavaScript console in web browsers, the BrightScript Debugger is a powerful command-line tool for troubleshooting and debugging issues with BrightScript scripts or interacting with BrightScript objects.

# [BrightSign Shell](docId\:FXXyu9jmocUtC6XE2p7l2)

The BrightSign Shell is a command-line interface (CLI) that enables interaction with the BrightSignOS (BOS). It can be used to troubleshoot and debug issues with the player as well as accessing things like network settings, display details, the BrightScript Interpreter, the BrightScript Debugger, a Node.js runtime, and player logs.

:::ExpandableHeading
# Additional Resources

## GitHub

The [BrightSign GitHub Repository](https://github.com/brightsign) contains additional resources for developers including plugins and custom scripts.

## MRSS Feed Generator

This [MRSS Feed Generator](https://brightsign.box.com/s/u4eefjhgdllocv7uhbsrf6hpu5qxrbbt) batch file for Windows will generate MRSS manifest (.xml) files for a set of audio/video/image files. Note that:

- The MRSS feed file will be written to the folder you run it from. 
- You must edit the batch file in a text editor to set configuration parameters.
- After the configuration parameters are set, the file can be run in interactive or automated mode. If you run it interactively it will provide diagnostic/usage information.

## Media List Feed Generator

This [Media List Feed Generator](https://brightsign.box.com/s/e8ybprvnjim8h26dtpwdvf1kmu1rbcxg) batch file for Windows will generate a Media List feed, which is a specially formatted RSS feed that can be used as a feed source for these states:

- Audio List
- Image List
- Video List
- Media List
- Audio Play File (BrightAuthor only)
- Image Play File (BrightAuthor only)
- Video Play File (BrightAuthor only)
- On Demand (BrightAuthor\:connected only)

Note that:

- It will contain the audio/video/image files in the folder it is run from.
- You must edit the batch file in a text editor to set configuration parameters.
- After the configuration parameters are set, the file can be run in interactive or automated mode. If you run it interactively it will provide diagnostic/usage information.
:::




[title] Program Statements
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

BrightScript supports the following statement types (note that BrightScript is not case sensitive). The syntax of each statement is documented in more detail later in this chapter.

- `Library`
- `Dim`
- `=` (assignment)
- `End`
- `Stop`
- `Goto`
- `Rem <or> '`
- `print`
- `For / To / End For / Step / Exit For <or> Next`
- `For Each / In / End For / Exit For <or> Next`
- `While / End While / Exit While`
- `Function / End Function / As / Return`

**Example**

```text
Function Main() As Void
 
       dim cavemen[10]
 
       cavemen.push("fred")
       cavemen.push("barney")
       cavemen.push("wilma")
       cavemen.push("betty")
 
       for each caveman in cavemen
             print caveman
       end for
 
End Function
```

## Statement Syntax

Each line may contain a single statement. However, a colon (:) may be used to separate multiple statements on a single line.

**Example**

```text
myname = "fred"
if myname="fred" then yourname = "barney":print yourname
```

## LIBRARY 

`LIBRARY Filename.brs`

The LIBRARY statement allows you to include your own BrightScript libraries (*.brs* files), which can then be utilized by your script. The LIBRARY statement(s) must occur at the beginning of a script, before any other statements, functions, operators, etc.

The system locates a library by searching the directory containing the current script, as well as the `SYS:/script-lib/` directory. Note that the `Run()` function does not currently change the path of a LIBRARY statement to that of the called script (i.e. the system will continue searching the directory of the caller script). On the other hand, running a script directly from the BrightSign shell does modify the library search path to that of the called script.

The first statement will include a library in the same folder as the script, while the second will include a library in a sub-folder.

```text
LIBRARY "myBSL1.brs"
LIBRARY "new_lib/myBSL2.brs"
```

The following statement will include the [bslCore.brs](docId\:lEOO6do_aRr2igzXcRipI) library, which has some useful BrightScript features, from the `SYS:/script-lib/` directory.

```text
LIBRARY "v30/bslCore.brs"
```

## DIM 

`DIM Name (dim1, dim2, …, dimK)`

The `DIM` (“dimension”) statement provides a shortcut for creating *roArray* objects. It sets the variable Name to type “roArray”. It can create arrays of arrays as needed for multi-dimensionality. The dimension passed to `DIM` is the index of the maximum entry to be allocated (i.e. the array initial size = dimension+1), though the array will be resized larger automatically if needed.

The following two lines create identical arrays.

```text
Dim array[5]
array = CreateObject("roArray", 6, true)
```

:::hint{type="info"}
The expression x\[a,b] is equivalent to x\[a]\[b].
:::

The following script demonstrates useful operations on a DIM array.

```text
Dim c[5, 4, 6]


For x = 1 To 5
   For y = 1 To 4
        For z = 1 To 6
           c[x, y, z] = k
           k = k + 1
       End for
   End for
End for


k=0
For x = 1 To 5
    For y = 1 To 4
       For z = 1 To 6
          If c[x, y, z] <> k Then print"error" : Stop
          k = k + 1
          End for
   End for
End for
```

## Assignment ("=")

`variable = expression`

The assignment statement (“=”) assigns a variable to a new value.

In each of the following lines, the variable on the left side of the equals operator is assigned the value of the constant or expression on the right side of the equals operator.

```text
a$="a rose is a rose"
b1=1.23
x=2.23
x=x-b1
```

## END

The `END` statement terminates script execution normally.

## STOP

The `STOP` statement interrupts script execution, returns a “STOP” error, and invokes the debugger. Use the `cont` command at the debugger prompt to continue execution of the script or the `step` command to execute a single step in the script.

## GOTO

`GOTO label`

The `GOTO` statement transfers program control to the line number specified by `label`. The `GOTO label` statement results in a branching operation. A `label` is an identifier terminated with a colon on a line that contains no other statements or expressions. 

**Example**

```text
mylabel:
print "Hello World"
goto mylabel
```

## RETURN

`RETURN expression`

The `RETURN` statement returns from a function back to its caller. If the function is not type Void, `RETURN` can also return a value to the caller.

## PRINT

`PRINT [#output_object], [@location], item list`

The PRINT statement prints an item or list of items in the console. The item(s) may be strings, integers, floats, variables, or expressions. An object with an *ifInt*, *ifFloat*, or *ifString* interface may also be printed. If the `output_object` is specified, this statement will print to an object with an *ifStreamSend* interface.

If the statement is printing a list of items, the items must be separated with semicolons or commas. If semicolons are used, spaces are not inserted between printed items; if commas are used, the cursor will automatically advance to the next print zone before printing the next item.

Positive numbers and zero are printed with a leading space (without a plus sign). Spaces are not inserted before or after strings.

**Example**

```text
x = 5 : print 25; " is equal to"; x ^2  
' prints "25 is equal to 25"
```

**Example**

```text
a$ = "string"
print a$;a$,a$;" ";a$
'prints "stringstring	string string"
```

Each print zone in the following example is 16 characters wide. The cursor moves to the next print zone each time a comma is encountered.

```text
> print "zone 1","zone 2","zone 3","zone 4"
'prints "zone 1          zone 2           zone 3           zone 4"
```

**Example**

```text
print "print statement #1 ";
print "print statement #2"
'prints "print statement #1 print statement #2"
```

In some cases, semicolons can be dropped. For example, the following statement is legal:

```text
Print "this is a five "5"!!"
```

A trailing semicolon overrides the cursor-return so that the next `PRINT` statement begins where the last left off. If no trailing punctuation is used with a `PRINT` statement, the cursor drops to the beginning of the next line.

**\[@location]**

If the console you are printing to has the *ifTextField* interface, you can use the `@` character to specify where printing will begin.

**Example**

```text
print #m.text_field,@width*(height/2-1)+(width-len(msg$))/2,msg$;
```

Whenever you use `PRINT @` on the bottom line of the display, an automatic line-feed causes all displayed lines to move up one line. To prevent this from happening, use a trailing semicolon at the end of the statement.

**TAB (expression)**

This statement moves the cursor to the specified position on the current line (modulo the width of the console if the TAB position is greater than the console width).

**Example**

```text
print tab(5)"tabbed 5";tab(25)"tabbed 25"
```

Note the following about the `TAB` statement:

- The `TAB` statement may be used several times in a `PRINT` list.
- No punctuation is required after a `TAB` statement.
- Numerical expressions may be used to specify a `TAB` position.
- The `TAB` statement cannot be used to move the cursor to the left.
- If the cursor is beyond the specified position, the `TAB` statement is ignored.

**POS(x)**

This statement returns an integer that indicates the current cursor position from 0 to the maximum width of the window. This statement requires a dummy argument in the form of any numeric expression.

```text
print tab(40) pos(0)   'prints 40 at position 40

print "these" tab(pos(0)+5)"words" tab(pos(0)+5)"are";
print tab(pos(0)+5)"evenly" tab(pos(0)+5)"spaced"
```

## FOR / END FOR

`FOR counter_variable = initial_value TO final_value STEP increment / END FOR <or> NEXT`

The `FOR` statement creates an iterative loop that allows a sequence of program statements to be executed a specified number of times.

The `initial_value`, `final_value`, and `increment` can be any expression. The first time the `FOR` statement is executed, these three variables are evaluated and their values are saved; changing the variables during the loop will have no affect on the operation of the loop. However, the `counter_variable` must not be changed, or the loop will not operate normally. The first time the `FOR` statement is executed, the counter is set to both the value and type of the `initial_value`.

At the beginning of each loop, the value of the `counter_variable` is compared with the `final_value`. If the value of the `counter_variable` is greater than the `final_value`, the loop will complete and execution will continue with the statement following the `END FOR` (or `NEXT`) statement. If, on the other hand, the counter has not yet exceeded the `final_value`, control passes to the first statement after the `FOR` statement. If increment is a negative number, the loop will complete when the value of the `counter_variable` is less than the `final_value`.

When program flow reaches the `END FOR` (or `NEXT`) statement, the counter is incremented by the specified increment amount (or decremented if increment is a negative value). If the `STEP [increment]` language is not included in the `FOR` statement, the increment defaults to 1.

Use `EXIT FOR` to exit a `FOR` block prematurely.

The following script decrements `i` at the beginning of each loop until it is less than 1.

```text
for i=10 to 1 step -1
       print i
end for
```

## FOR EACH IN / END FOR

`FOR EACH item IN object / END FOR <or> NEXT` 

The `FOR EACH` statement can iterate through a set of items in any object that has an *ifEnum* interface (i.e. an enumerator). The `FOR` block is terminated with the `END FOR` (or `NEXT`) statement. Objects that are ordered intrinsically (such as *roList*) are enumerated in order, while objects that have no intrinsic order (such as *roAssociativeArray*) are enumerated in apparent random order. It is possible to delete entries as they are enumerated.

Use `EXIT FOR` to exit a `FOR` block prematurely.

The following objects can be enumerated: *roList*, *roArray*, *roAssociativeArray*, *roMessagePort*.

The following script iterates over an associative array in random order, prints each key/value pair, then deletes it.

```text
aa={joe: 10, fred: 11, sue:9}
For each n in aa
   Print n;aa[n]
   aa.delete[n]
end for
```

### Nesting FOR EACH Statements

The `FOR EACH` statement can only track one pointer per object instance, so nesting `FOR EACH` loops that iterate on the same object may cause the series to terminate prematurely:

```text
values = {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6}

for each key_outer in values
	print "outer: ";key_outer;" : ";values[key_outer]
	for each key_inner in values 'THIS WILL CAUSE PROBLEMATIC BEHAVIOR
		print "inner: ";key_inner;" : ";values[key_inner]
	end for
end for
```

To work around this limitation with associative arrays, copy the keys to an array and iterate on the array in the nested `FOR EACH` loop:

```text
values = {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6}
valuesArray = []

for each key in values 'Copy the keys to an array
	valuesArray.push(key)
end for

for each key_outer in values
	print "outer: ";key_outer;" : ";values[key_outer]
	for each key_inner in valuesArray 'Iterate over the array of keys
		print "inner: ";key_inner;" : ";values[key_inner]
	end for
end for
```

## WHILE / EXIT WHILE

`WHILE expression / EXIT WHILE`

A `WHILE` loop executes until the specified expression is false. Use the `EXIT WHILE` statement to exit a `WHILE` block prematurely.

```text
k=0
while k<>0
   k=1
   Print "loop once"
end while
 
while true
   Print "loop once"
   Exit while
End while
```

## IF / THEN / ELSE

`IF expression THEN statements [ELSE statements]`

:::hint{type="info"}
This is the single-line form of the IF THEN ELSE statement; see the next section for more details about the block form of the IF THEN ELSE statement.
:::

The `IF` statement instructs the interpreter to test the following expression. If the expression is True, control will proceed to the statements immediately following the expression. If the expression is False, control will jump to either the matching `ELSE` statement (if there is one) or to the next program line after the block.

**Example**

```text
if x>127 then print "out of range" : end
```

`THEN` is optional in the above and similar statements. However, `THEN` is sometimes required to eliminate ambiguity, as in the following example:

```text
if y=m then m=o 'won't work without THEN
```

## Block IF / ELSEIF / THEN / ENDIF

The block (i.e. multi-line) form of IF / THEN / ELSE has the following syntax:

```text
If BooleanExpression [ Then ]
   [ Block ]
   [ ElseIfStatement+ ]
   [ ElseStatement ]
End If
 
ElseIfStatement ::=
   ElseIf BooleanExpression [ Then ]
   [ Block ]
 
ElseStatement ::=
   Else
   [ Block ]
```

**Example**

```text
vp_msg_loop:
        msg=wait(tiut, p)
        if type(msg)="rovideoevent" then                                            
            if debug then print "video event";msg.getint()
            if lm=0 and msg.getint() = meden then
                if debug then print "videofinished"
                retcode=5
                return
            endif
        else if type(msg)="rogpiobutton" then
            if debug then print "button press";msg
            if esc0 and msg=b0 then retcode=1:return
            if esc1 and msg=b1 then retcode=2:return
            if esc2 and msg=b2 then retcode=3:return
            if esc3 and msg=b3 then retcode=4:return
        else if type(msg)=" Invalid" then
            if debug then print "timeout"
            retcode=6
            return
        endif
 
        goto vp_msg_loop
```

## Function() As Type / End Function

`Function name(parameter As Type, …) As Type`

:::hint{type="info"}
Each function has its own scope.
:::

A function is declared using the `Function()` statement. The parentheses may contain one or more optional parameters; parameters can also have default values and expressions.

The type of each parameter may be declared. The return type of the function may also be declared. If a parameter type or return type is not declared, it is Dynamic by default. Intrinsic types are passed by value (and a copy is made), while objects are passed by reference. The `Sub` statement can be used instead of `Function` as a shortcut for creating a function with return type Void.

A parameter can be one of the following types:

- Integer
- Float
- Double
- String
- Object
- Dynamic

The function return can be one of the following types:

- Void
- Integer
- Float
- Double
- String
- Object
- Dynamic

**"M" Identifier** 

If a function is called from an associative array, then the local variable `m` is set to the associative array in which the function is stored. If the function is not called from an associative array, then its `m` variable is set to an associative array that is global to the module and persists across calls.

The `m` identifier should only be used for the purpose stated above: We do not recommend using `m` as a general-purpose identifier.

**Example**

```text
sub main()
   obj={
       add: add
       a: 5
       b: 10
       }
 
   obj.add()
   print obj.result
end sub
 
function add() As void
    m.result=m.a+m.b
end function
```

**Anonymous Functions**

A function without a name declaration is considered anonymous.

The following is a simple anonymous function declaration:

```text
myfunc=function (a, b)
       Return a+b
end function
 
print myfunc(1,2)
```

Anonymous functions can also be used with associative-array literals:

```text
q = {
 
starring : function(o, e)
str = e.GetBody()
print "Starring: " + str 
toks = box(str).tokenize(",")
for each act in toks
actx = box(act).trim()
if actx <> "" then
print "Actor: [" + actx + "]"
                o.Actors.Push(actx)
endif
end for
return 0
end function
}
 
q.starring(myobj, myxml)
```


[title] roReadFile
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

Object Creation: Creating an *roReadFile* object opens the specified file for reading only. Object creation fails if the file does not exist. 

```text
CreateObject("roReadFile", filename As String)
```

## ifStreamRead

### SetReceiveEol(eol\_sequence As String) As Void

Sets the EOL sequence when reading from the stream. The default EOL character is CR LF, (ASCII values 13 then 10). If you need to set this value to a non-printing character, use the `chr()` [global function](docId\:nSjXffR7OlFgDWgjFEbMe).

### ReadByte() As Integer

Reads a single byte from the stream, blocking if necessary. If the EOF is reached or there is an error condition, then a value less than 0 is returned.

### ReadByteIfAvailable() As Integer

Reads a single byte from the stream if one is available. If no bytes are available, it returns immediately. A return value less than 0 indicates either that the EOF has been reached or no byte is available.

### ReadLine() As String

Reads until it finds a complete end of the line sequence. If it fails to find the sequence within 4096 bytes, then it returns the 4096 bytes that are found. No data is discarded in this case.

### ReadBlock(size As Integer) As String

Reads the specified number of bytes. The number is limited to 65536 bytes. In the event of an EOF or an error, fewer bytes than requested will be returned. Any null bytes in the file will mask any further bytes.

### AtEof() As Boolean

Returns True if an attempt has been made to read beyond the end of the file. If the current position is at the end of the file, but no attempt has been made to read beyond it, this method will return False.

## ifStreamSeek

### SeekAbsolute(offset As Integer) As Void

Seeks the specified offset. If the offset is beyond the end of the file, then the file will be extended upon the next write and any previously unoccupied space will be filled with null bytes.

### SeekRelative(offset As Integer) As Void

Seeks to the specified offset relative to the current position. If the ultimate offset is beyond the end of the file, then the file will be extended as described in `SeekAbsolute()`.

### SeekToEnd() As Void

Seeks to the end of the file.

### CurrentPosition() As Integer

Retrieves the current position within the file.

[title] roStreamQueue
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object allows you to play a list of video files seamlessly (i.e. without any blank frames or interrupts between one video and the next). You can link *roStreamQueue* to an *roVideoPlayer* instance for seamless video playback or to an *roMediaStreamer* instance for seamless video streaming. 

Object Creation: This object is created with no parameters.

```text
CreateObject("roStreamQueue")
```

## File Requirements

Video files must meet the following requirements to work with the *roStreamQueue* object:

- Files must be Transport Stream (*.ts*) formatted.
- All files in a queue should have identical PIDs.
- Files must begin and end with a closed GOP.
- Files must have regular PCRs at intervals of 100ms or shorter. Note that the default interval for FFMPEG is 1000ms unless it is configured for CBR muxing (in which case the interval is set to 20ms). The following is an example of an appropriate command-line tp remux:

```text
avconv -i clip_short.ts -vcodec copy -acodec copy -muxrate 15M clip_short2.ts
```

## ifStreamQueue

### QueueFile(filename As String) As Boolean

Adds the specified video file to the queue.

### Loop(loop As Boolean) As Boolean

Specifies that playback/streaming should return to the beginning of the queue once it reaches the end. If `Loop(false)` and `LoopLast(false)` are both called, playback/streaming will stop once the end of the queue is reached. This is also the default behavior.

### LoopLast(loop\_last As Boolean) As Boolean

Specifies that playback/streaming should loop the last file in the queue once it reaches the end. This method has no effect if `Loop(true)` is called as well.

### SetPreferredAudio(description As String) As Boolean

Chooses a video stream from the video input based on the [parameters](docId\:zTUZ0LdazCmL2kQmdBKCn) in the passed string.

### SetPreferredVideo(description As String) As Boolean

Chooses an audio stream from the video input based on the [parameters](docId\:zTUZ0LdazCmL2kQmdBKCn) in the passed string.

### KeepPadding(enabled As Boolean)

If `enabled=true`, all PIDs in the input stream (including padding packets) are passed through to the output. This allows the CBR bitstream profile to be preserved when re-streaming to the network. It cannot be used when feeding a local decoder.

### NextFile(a As Boolean) As Boolean

### Start() As Boolean

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roStreamQueueEvent* to the attached message port. An event is raised whenever the end of the queue is reached.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

## ifIdentity

### GetIdentity() As Integer

Returns a unique number that can be used to identify when events originate from this object.

:::hint{type="info"}
The *ifIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::

## Playing and Streaming Queues

To use *roStreamQueue* as a streaming playlist, include it as the source component in an *roMediaStreamer.SetPipeline()* call. For video playback, use an *roVideoPlayer* instance as the destination component in the `SetPipeline()` call.

### Example (roVideoPlayer)

```text
q=createobject("rostreamqueue")
q.queuefile("sd:/Test_Count_Up_Blue_Frames.ts")
q.queuefile("sd:/Test_Count_Up_Green_Frames.ts")
q.loop(true)
c=createobject("romediastreamer")
r=createobject("rorectangle",0,0,1920,1080)
v=createobject("rovideoplayer")
v.setrectangle(r)
c.setpipeline([q, v])
c.start()
```

### Example (roMediaStreamer)

```text
queue = CreateObject("roStreamQueue")
queue.queueFile("file1.ts")
queue.queueFile("file2.ts")
queue.loop(true)
m = CreateObject("roMediaStreamer")
m.setpipeline([queue, "udp://239.0.156.101:5000/?maxbitrate=0"])
m.Start()
```

:::hint{type="danger"}
We strongly suggest appending the "maxbitrate=0" parameter to UDP streams when using *roStreamQueue.* This prevents the *roMediaStreamer* instance from rate-limiting an *roStreamQueue* stream that is already running at a precise, correct rate.
:::


[title] roXMLElement
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

This object is used to contain an XML tree. The JavaScript equivalent is `DOMParser()`.

The *roXMLElement* object is created with no parameters: 

```text
CreateObject("roXMLElement")
```

The following examples illustrate how XML elements are parsed in BrightScript:

```text
<tag1>This is example text</tag1>
```

- Name = tag1
- Attributes = Invalid
- Body = *roString* containing "This is example text"

```text
<tag2 caveman="barney"/>
```

- Name = tag2
- Attributes = *roAssociativeArray* with one entry, `{caveman, barney}`
- Body = Invalid

If the tag contains other tags, the body will be of type *roXMLList*.

To generate XML content, create an *roXMLElement* and call the `SetBody()` and `SetName()` methods to build it–then call the `GenXML()` method to generate it.

### Example

```text
root.SetName("myroot")
root.AddAttribute("key1","value1")
root.AddAttribute("key2","value2")
ne=root.AddBodyElement()
ne.SetName("sub")
ne.SetBody("this is the sub1 text")
ne=root.AddBodyElement()
ne.SetName("subelement2")
ne.SetBody("more sub text")
ne.AddAttribute("k","v")
ne=root.AddElement("subelement3")
ne.SetBody("more sub text 3")
root.AddElementWithBody("sub","another sub (#4)")
PrintXML(root, 0)
print root.GenXML(false)
```

## ifXMLElement

### GetBody() As Object

### GetAttributes() As Object

### GetName() As String

### GetText() As String

### GetChildElements() As Object

### GetNamedElements(a As String) As Object

### GetNamedElementsCi(a As String) As Object

### SetBody(a As Object)

Generates an *roXMLList* for the body if needed. The method then adds the passed item (which should be an *roXMLElement* tag).

### AddBodyElement() As Object

### AddElement(a As String) As Object

### AddElementWithBody(a As String, b As Object) As Object

### AddAttribute(a As String, b As String)

### SetName(a As String)

### Parse(a As String) As Boolean

Parses the XML content passed to it. In the event of failure, this method returns False. However, it also populates *roXMLElement* with whatever text could be successfully parsed. To avoid passing along erroneous strings, it is always best to have the script check the return value of `Parse()` before using them.

### GenXML(a As Boolean) As String

Generates XML content. This method takes a single Boolean parameter, indicating whether or not the XML should have an `<?xml …>` tag at the top.

### Clear() As Void

### GenXMLHdr(a As String) As String

### IsName(a As String) As Boolean

### HasAttribute(a As String) As Boolean

### ParseFile(a As String) As Boolean

## Example

This subroutine example prints out the contents of an *roXMLElement* tree:

```text
PrintXML(root, 0)

Sub PrintXML(element As Object, depth As Integer)
    print tab(depth*3);"Name: ";element.GetName()
    if not element.GetAttributes().IsEmpty() then
        print tab(depth*3);"Attributes: ";
        for each a in element.GetAttributes()
            print a;"=";left(element.GetAttributes()[a], 20);
            if element.GetAttributes().IsNext() then print ", ";
        end for
        print
    end if
    if element.GetText()<>invalid then
        print tab(depth*3);"Contains Text: ";left(element.GetText(), 40)
    end if
    if element.GetChildElements()<>invalid
        print tab(depth*3);"Contains roXMLList:"
        for each e in element.GetChildElements()
            PrintXML(e, depth+1)
        end for
    end if
    print
end sub
```


[title] roXMLList
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

The JavaScript equivalent to this object is `DOMParser()`.

## ifXMLList

### Simplify() As Object

Returns an *roXmlElement* if the list contains exactly one element. Otherwise, it will return itself.

### GetAttributes() As Object

### GetText() As String

### GetChildElements() As Object

### GetNamedElements(a As String) As Object

Returns a new XMLList that contains all *roXmlElements* that match the name of the passed element. This action is the same as using the dot operator on an *roXmlList*.

### GetNamedElementsCi(a As String) As Object

## ifList

### Count() As Integer

Returns the number of elements in the list.

### ResetIndex() As Boolean

Resets the current index or position in the list to the head element.

### AddTail(obj As Object) As Void

Adds a typed value to the tail of the list.

### AddHead(obj As Object) As Void

Adds a typed value to the head of the list.

### RemoveIndex() As Object

Removes an entry from the list at the current index or position and increments the index or position in the list. It returns `Invalid` when the end of the list is reached.

### GetIndex() As Object

Retrieves an entry from the list at the current index or position and increments the index or position in the list. It returns `Invalid` when the end of the list is reached.

### RemoveTail() As Object

Removes the entry at the tail of the list.

### RemoveHead() As Object

Removes the entry at the head of the list.

### GetTail() As Object

Retrieves the entry at the tail of the list and keeps the entry in the list.

### GetHead() As Object

Retrieves the entry at the head of the list and keeps the entry in the list.

### Clear() As Void

Removes all elements from the list.

## ifEnum

### Reset()

Resets the position to the first element of enumeration.

### Next() As Dynamic

Returns a typed value at the current position and increment position.

### IsNext() As Boolean

Returns `True` if there is a next element.

### IsEmpty() As Boolean

Returns `True` if there is not an exact statement.

## ifArray

### Peek() As Dynamic

Returns the last (highest index) array entry without removing it.

### Pop() As Dynamic

Returns the last (highest index) entry and removes it from the array.

### Push(a As Dynamic)

Adds a new highest index entry to the end of the array.

### Shift() As Dynamic

Removes index zero from the array and shifts all other entries down by one unit.

### Unshift(a As Dynamic)

Adds a new index zero to the array and shifts all other entries up by one unit.

### Delete(a As Integer) As Boolean

Deletes the indicated array entry and shifts all above entries down by one unit.

### Count() As Integer

Returns the index of the highest entry in the array plus one (i.e. the length of the array).

### Clear() As Void

Deletes every entry in the array.

### Append(a As Object) As Void

Appends one *roArray* to another. If the passed *roArray* contains entries that were never set to a value, they are not appended.

:::hint{type="info"}
The two appended objects must be of the same type.
:::

## ifArrayGet 

### GetEntry(a As Integer) As Dynamic

Returns an array entry of a given index. Entries start at zero. If an entry that has not been set is fetched, Invalid is returned.

## ifArraySet

### SetEntry(a As Integer, b As Dynamic) As Void

Sets an entry of a given index to the passed type value.

[title] roHtmlWidgetEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

If an *roMessagePort* is attached to an *roHtmlWidget*, it will receive *roHtmlWidgetEvent* objects when something happens to the parent *roHtmlWidget* instance. 

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

## ifHTMLWidgetEvent

### GetData() As roAssociativeArray

Returns the event data as an associative array with the following key/value pairs:

- `reason` <font color="#6B21A8">string</font>: The cause of the event, which can be one of the following:
  - `"load-started"`: The HTML widget has started loading a page.
  - `"load-finished"`: The HTML widget completed loading a page.
  - `"load-error"`: The HTML widget failed to load a page. Use the `uri` key to identify the failing resource and the `message` key to retrieve some explanatory text.
  - `"download-request"`: The HTML widget instance has received a download request. The Chromium instance does not process download requests for MIME types it doesn't recognize (e.g. PDFs); instead, it passes this event, along with the `mime-type` and `url` parameters to the BrightScript autorun for processing.
  - `"new-window-request"`: The HTML widget instance has received a request to open a URI in a new window. This request will normally come from HTML anchors with `"target=_blank"`/`"target=_top"` or the JavaScript `Window.open()` method. The requested URI is specified in the `uri` parameter.
- `javascript-dialog` <font color="#6B21A8">string</font>: If the HTML widget instance has received a JavaScript alert, confirmation, etc., BrightScript will respond by calling the roHtmlWidget `acceptdialog(responseasString)` and `rejectdialog()` methods. See [roHtmlWidget#roHtmlWidget.acceptdialog(responseasString)](docId\:xljq5_YhDmA2SSmpZimtK). If no response is provided within one second, roHtmlWidget auto rejects the dialog attempt, and if these APIs are called when there is no dialog request on roHtmlWidget, they have no effect. This parameter was added in BOS 8.5.16.
- `message` <font color="#6B21A8">string</font>: The message that the JavaScript dialog will display (applicable for `reason:"javascript-dialog"` only), or explanatory text related to the load failure (applicable for reason:"load-error" only). This property exists for multiple event types, but it has different meanings for different event types.
- `default_text` <font color="#6B21A8">string</font>:  If a JavaScript prompt dialog asks the user to enter text, this default text will be displayed in the input field. This field will be empty for other dialog types (applicable for `reason:"javascript-dialog"` only). This parameter was added in BOS 8.5.16.
- `type` <font color="#6B21A8">int</font>: The dialog type for the `“javascript-dialog”` event: either 0 for alert, 1 for confirm, 2 for prompt, 3 for an "onbeforeunload Event" (applicable for `reason:"javascript-dialog"` only). This parameter was added in BOS 8.5.16.
- `security_origin` <font color="#6B21A8">string</font>: The security origin of the request (applicable for `reason:"javascript-dialog"` only). This parameter was added in BOS 8.5.16.
- `uri` <font color="#6B21A8">string</font>: The URI of the failing resource or new-window request (applicable for `reason:"load-error"` or `reason:"new-window-request"`)
- `mime-type` <font color="#6B21A8">string</font>: The MIME type of the download request (applicable for `reason:"download-request"` only)
- `url` <font color="#6B21A8">string</font>: The URL of the download request (applicable for `reason:"download-request"` only)

## Example

The following event loop waits for an HTML widget event. If the event indicates that a PDF download request has been received, the script passes the relevant data to a *CreatePdfRenderer()* function that is not defined here:

```text
while true
	ev = wait(0, gaa.mp)
	print "=== BS: Received event ";type(ev)
	if type(ev) = "roHtmlWidgetEvent" then
		eventData = ev.GetData()
		if type(eventData) = "roAssociativeArray" and type(eventData.reason) = "roString" then
			if eventData.reason = "load-error" then
				print "=== BS: HTML load error: "; eventData.message
			else if eventData.reason = "load-finished" then
				print "=== BS: Received load finished"
				receivedLoadFinished = true
			else if eventData.reason = "message" then
				' To use this: msgPort.PostBSMessage({text: "my message"});
			else if eventData.reason = "load-started" then
				print "=== BS: Received load started"
			else if eventData.reason = "download-request" then
				print "=== BS: Received a download request"
				if eventData.mime_type = "application/pdf" then
					CreatePdfRenderer("file:///index.html?file=" + eventData.url)
				endif
			else
				print "======= UNHANDLED HTML EVENT ========="
				print eventData.reason
			endif
		else
			print "=== BS: Unknown eventData: "; type(eventData)
		endif
	endif
endwhile
```


[title] roRectangle
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object is passed to various video and graphics widgets (*roVideoPlayer*, *roImageWidget*, *roHtmlWidget*, etc.) to specify their size and positioning.

Object Creation: This object is created with coordinate and dimension parameters.

```text
CreateObject("roRectangle", x As Integer, y As Integer, width As Integer, height As Integer)
```

`SetRectangle()` calls made by widget objects (e.g. *roImageWidget.SetRectangle()*) honor the view-mode or aspect-ratio conversion mode set by the user. If the user has set the video player for letterboxing, it will occur if the video does not fit in the new rectangle exactly.

### Rectangles with 4K Video Modes 

When the player is using a 4K video mode (e.g. 3840x2160x60p), rectangles still operate as if the total screen area is 1920x1080 (unless [full resolution graphics](docId\:QQ734nQz0hCwNI0uNSdMP) is enabled). They are then scaled by a factor of 2 when the video is output. For example, to display a full-screen 4K video, set the *roRectangle* instance to `0,0,1920,1080`; to display an additional HD video in the top-right quadrant of the screen, set another *roRectangle* instance to `960,0,960,540`.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/_rY2lOBdrns1MyNe6F0e4_4k-coordinates.png" size="80" width="790" height="407" position="center" showCaption="false"}

Note that, while 4K video is output at a 1:1 pixel ratio, graphics elements (*roImageWidget*, *roCanvasWidget*, etc.) are upscaled to match the size of the 4K video output. This occurs irrespective of the size of the original image and widget rectangle: For example, an image in a 960x540 rectangle will first be downscaled to 960x540, then upscaled to 1920x1080. If you want to display images without upscaling on 4K video modes, display them in a video window using the *roVideoPlayer.PlayStaticImage()* method (or enable full-resolution graphics).

## ifRectangle

### SetX(x As Integer) As Void

Specifies a new x coordinate for the rectangle

### SetY(y As Integer) As Void

Specifies a new y coordinate for the rectangle

### SetWidth(width As Integer) As Void

Specifies a new width value for the rectangle

### SetHeight(height As Integer) As Void

Specifies a new height value for the rectangle

### GetX() As Integer

Returns the x coordinate of the rectangle

### GetY() As Integer

Returns the y coordinate of the rectangle

### GetWidth() As Integer

Returns the width of the rectangle

### GetHeight() As Integer

Returns the height of the rectangle

[title] roImageBuffer
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object allows you to access decoded image-file data. You can then copy or manipulate that data.

Object Creation: An *roImageBuffer* object is instantiated with an *roImagePlayer* object and a string specifying the file path of an image file. If an *roImagePlayer* object is not needed, `Invalid` can be substituted for it.

```text
CreateObject("roImageBuffer", image_player As Object, file_path As String)
```

Example:

```text
imgBuffer = CreateObject("roImageBuffer", Invalid, "SD:/content/image.png")
```

## ifImageBufferControl

### DisplayBuffer(x As Integer, y As Integer) As Boolean

Displays the image on screen. The `x` and `y` integers specify the coordinates of the top-left corner of the image.

:::hint{type="danger"}
**Important**
The `DisplayBuffer()` method has been deprecated. As of OS8, the end point exists but does not perform any function.
:::

### GetBufferByteArray() As roByteArray

Returns the decoded image-file data as an *roByteArray*.

### GetBufferMetadata() As roAssociativeArray

Returns an associative array containing information about the image file. The associative array contains the following keys:

- `width`: The width of the image file
- `height`: The height of the image file
- `acceptable`: A Boolean integer value indicating whether the image can be displayed by the *roImagePlayer* instance
- `format`: The color space (ARGB/CMYK) of the image file

### ConvertFormat(a As String) As Object

###


[title] BrightScript Core Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/

This section describes objects that provide core BrightScript functionality.

- [roArray](docId\:jCCThRXWWSw3hozenbE-h)
- [roAssociativeArray](docId\:sb0Om1Y-OQlapFqNFS0XY)
- [roBoolean](docId:1zT0kabQE2V2KG02eRPIj)
- [roByteArray](docId:9XVZITNMurdLAayfgIacu)
- [roDouble, roIntrinsicDouble](docId:3jqbvhpP6ZaMw0H30Wpsw)
- [roFunction](docId\:p3ukvgpQyJStxINNlnDF9)
- [roInt, roFloat, roString](docId\:LBHO0lM71T5OJmdhwJ-1i)
- [roJRE](docId\:XQgFaOr4IKbVWHjb2iucz)
- [roList](docId\:lEOpePZ51dsTAZH9TJHUQ)
- [roMessagePort](docId\:F388tKxuD3qAgPRX8-AVp)
- [roRegex](docId:2QAVkhw0NkC1smBMcGLvX)
- [roXMLElement](docId\:BPztmgVGzyXUaanNFZ9M5)
- [roXMLList](docId\:qOMyDWRD1wzU_Lmiv9lJQ)


[title] roAudioConfiguration
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object allows for mixing and leveling of audio streams before they are passed to audio outputs.

Object Creation: The *roAudioConfiguration* object is created with no parameters.

```text
CreateObject("roAudioConfiguration")
```

## ifAudioConfiguration

### ConfigureAudio(audio\_routing As roAssociativeArray) As Boolean

Configures the audio routing. This method will fail if called when audio resources are in use (i.e. there are active *roVideoPlayer* or *roAudioPlayer* instances). It returns `true` on success and `false` on failure. The passed associative array can have the following parameters:

- `mode` <font color="#6B21A8">string</font>: Sets the audio routing mode:
  - `"dynamic"`: The default mode. Mixing audio streams with differing sampling rates will cause playback to fail; differing volume levels will not be normalized; and audio streams cannot be added to an output that currently has audio playing on it. Other parameters in the associative array are ignored.
  - `"prerouted"`: This setting was implemented in firmware 7.0. You can add and remove audio streams on an output that currently has audio playing on it; additional audio routing behavior is determined with the `autolevel`, `pcmonly`, and `srcrate` parameters. 
- `autolevel` <font color="#6B21A8">string</font>: Enables (`"on"`) or disables (`"off"`) volume leveling for audio outputs in the `"prerouted"` audio mode. When this setting is enabled, all PCM audio streams on a particular output will play at a similar volume.
- `pcmonly` <font color="#6B21A8">string</font>: Enables (`"true"`) or disables (`"false"`) compressed audio support in the `"prerouted"` audio mode.
- `srcrate` <font color="#6B21A8">int</font>: Sets the sample rate to which all PCM audio streams are converted in the the `"prerouted"` audio mode. This value can be either 44100 or 48000.

### GetConfiguration() As roAssociativeArray

Returns audio configuration information as an associative array:

- `mode` <font color="#6B21A8">string</font>: The audio routing mode (`"dynamic"` or `"prerouted"`)
- `decoder_count` <font color="#6B21A8">int</font>: The number of available decoders
- `compressed_capable_count` <font color="#6B21A8">int</font>: The number of decoders that can route compressed audio
- `autolevel` <font color="#6B21A8">bool</font>: A flag indicating whether the volume leveling setting is enabled
- `pcmonly` <font color="#6B21A8">bool</font>: A flag indicating whether the compressed audio support setting is enabled
- `srcrate` <font color="#6B21A8">int</font>: The sample rate to which all PCM audio streams are converted

:::hint{type="info"}
If the mode is `"dynamic"`, the associative array will contain the `mode` and `decoder_count` parameter only.
:::

### GetClockStatus() As roAssociativeArray

Returns audio clock information about the I2C, SPDIF, and HDMI® outputs.

[title] roVideoPlayer
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object is used to play back video files (using the generic *ifMediaTransport* interface). If the message port is set, the object will send events of the type *roVideoEvent*. All object calls are asynchronous. That is, video playback is handled in a different thread from the script, and the script will continue to run while video is playing. Decoded video will be scaled to the output resolution specified by *roVideoMode*. The JavaScript equivalent is to use \<video> elements with [BrightSign properties](docId\:e6uJleH69Q0JmMv8kyTrp).

To display video in a zone/window, you must call `SetRectangle()`. In firmware versions 6.0.x and later, zone support is enabled by default.

## ifVideoControl

**PlayStaticImage(filename As String) As Boolean**

Uses the video decoder to display an image. On 4Kx42, XT3, XD3, HD4, XD4, XT4, XC5, XT5, XD5, HD5, and LS445 models, you can use the video decoder to display 4K images.

**PlayStaticImage(parameters As roAssociativeArray) As Boolean**

Uses the video decoder to display an image. The passed associative array can contain the following parameters:

- `Filename`: The name of the image file
- `EncryptionAlgorithm`: The file-encryption algorithm. Currently the options are "AesCtr" and "AesCtrHmac".
- `EncryptionKey`: The key to decrypt the image file. This is a byte array consisting of 128 bits of key, followed by 128 bits of IV.

See [this page](docId:0UMXqYvruY7DRNLuUZAFp) for details on displaying encrypted images.

:::hint{type="warning"}
The video player no longer accepts "\{A|A}" AES encryption keys (i.e. where the top and bottom 64 bits of the key are identical).
:::

**SetViewMode(mode As String) As Boolean**

Sets the scaling of the video in relation to the video window. The passed string can be one of the following values:

- `"ScaleToFit"`: Scales the video to fill the window. The aspect ratio of the source video is ignored, so the video may appear stretched/squashed.
- `"LetterboxedAndCentered"`: Letterboxes and centers the window. The aspect ratio of the source window is maintained.
- `"FillScreenAndCentered"`: Scales the video to fill the window. The aspect ratio is maintained, so the video may appear cropped. This is the default behavior.
- `"Centered"`: Centers the window.

:::hint{type="info"}
View modes rely on correct aspect-ratio marking from video files, and some files may be marked incorrectly.
:::

**SetRectangle(r As roRectangle) As Void**

Specifies the placement and dimensions of the video window using a passed *roRectangle&#x20;*&#x69;nstance.

**Hide() As Boolean**

Hides the video window.

**Show() As Boolean**

Shows the video window.

**EnableSafeRegionTrimming(enable As Boolean) As Boolean**

**AdjustVideoColor(parameters As roAssociativeArray) As Boolean**

Adjusts the video and graphics output of the player using the following parameters, which can be passed to the method as an associative array: "brightness", "hue", "contrast", "saturation". Each parameter has a default value of 0 and can accept a range of values between -1000 and 1000.

**SetKeyingValue(keying\_settings As roAssociativeArray) As Boolean&#xA0;**

Applies a mask to each pixel in the video window. If the pixel value falls within the specified range of chroma and luma key values, the pixel will appear transparent, allowing video and graphics behind it to show through. If the pixel value does not fall within the specified range, the pixel is unaltered. The chroma and luma key values are set using integers contained in the passed associative array:

- `luma`
- `cr`
- `cb`

Each integer value is arranged as follows:` [8 bits of mask][8 bits of high-end range][8 bits of low-end range]`. For example, an 0xff8040 value for luma would mask luma at 0xff (no change) and then apply a range from 0x40 to 0x80 for changing to transparent alpha. Note that chroma and luma keying work well with simple shapes and patterns, while complex patterns like hair or grass will not be masked effectively.

**SetTransform(transform As String) As Boolean**

Applies one of eight transforms to the video plane. This method works equally well with all video sources (files, streams, HDMI® input) and can be called separately on multiple *roVideoPlayer&#x20;*&#x69;nstances. Calls to this method only take effect when the next file/source is played, and transitions to a transformed video do not take place seamlessly.

- `"identity"`: No transformation (default behavior)
- `"rot90"`: 90 degree anticlockwise rotation
- `"rot180"`: 180 degree anticlockwise rotation
- `"rot270"`: 270 degree anticlockwise rotation
- `"mirror"`: Horizontal mirror transformation
- `"mirror_rot90"`: Mirrored 90 degree clockwise rotation
- `"mirror_rot180"`: Mirrored 180 degree clockwise rotation
- `"mirror_rot270"`: Mirrored 270 degree clockwise rotation

:::hint{type="info"}
The coordinates and dimensions of the *roRectangle&#x20;*&#x69;nstance containing the video are not affected by rotation.
:::

**GetFilePlayability(filename As String) As roAssociativeArray**

Returns an associative array indicating the playability of the video file. For the following keys, a `"playable"` value indicates that the component is playable, while a `"no media"` value indicates that there is no media—any other value indicates that the media is unplayable.

- `audio`: The audio file associated with the video
- `video`: The video file associated with the video
- `file`: The video container file

**GetProbePlayability(probe\_string As String) As roAssociativeArray**

Returns an associative array indicating the playability of the probe string. For the following keys, a `"playable"` value indicates that the component is playable, while a `"no media"` value indicates that there is no media—any other value indicates that the media is unplayable.

- `audio`: The audio file associated with the video
- `video`: The video file associated with the video
- `file`: The video container file

**GetStreamInfo() As roAssociativeArray**

Returns an associative array containing information about the current video. To retrieve metadata about a video file that is not currently playing, use the `ProbeFile()`method instead. The associative array can contain the following parameters:

- `Source` <font color="#704ae0">string</font>: The URI of the video file
- `SrcAddress` <font color="#704ae0">string</font>: The source IP address of the video stream
- `DstAddress` <font color="#704ae0">string</font>: The multicast address on which the IP stream is being transmitted. This value may be absent if the RTSP service has not redirected the stream (in this case, the IP address of the player may be displayed instead).
- `Encapsulation` <font color="#704ae0">string</font>: The encapsulation of the video. This value can be "ES" (elementary stream), "TS" (transport stream), or "UNKNOWN" for streaming video.
- `AudioFormat` <font color="#704ae0">string</font>: The format of the audio file
- `AudioSampleRate` <font color="#704ae0">int</font>: The audio sample rate (in hertz)
- `AudioChannelCount` <font color="#704ae0">int</font>: The number of audio channels
- `AudioDuration` <font color="#704ae0">int</font>: The duration of the audio track (in milliseconds)
- `VideoFormat` <font color="#704ae0">string</font>: The format of the video file
- `VideoFramerate` <font color="#704ae0">int</font>: The video frame rate (in frames per second)
- `VideoColorDepth` <font color="#704ae0">int</font>: The color depth of the video (in bits)
- `VideoWidth` <font color="#704ae0">int</font>: The width of the video (in pixels)
- `VideoHeight` <font color="#704ae0">int</font>: The height of the video (in pixels)
- `VideoAspectRatio` <font color="#704ae0">float</font>: The aspect ratio of the video
- `VideoDuration` <font color="#704ae0">int</font>: The duration of the video (in milliseconds)
- `PreferredVideo` <font color="#704ae0">int</font>: The current preferred video track, as determined by the SetPreferredVideo() method
- `PreferredAudio` <font color="#704ae0">int</font>: The current preferred audio track, as determined by the SetPreferredAudio() method
- `PreferredSubtitle` <font color="#704ae0">int</font>: The current preferred subtitle track, as determend by the SetPreferredCaptions() method
- `Programs` <font color="#704ae0">roArray</font>: A list of programs that are part of the video. Each entry contains the program ID, along with indicies of video, audio, and subtitle tracks that are part of the program. These track lists can be used–along with the `Video`, `Audio`, and `Subtitle` parameters and the `SetPreferred<>()` methods to scan and select tracks. Each entry can contain the following parameters:
  - `ProgramId` <font color="#704ae0">int</font>: The program ID
  - `Video`  <font color="#704ae0">roArray</font>: An index of integers corresponding to video tracks that are part of the program
  - `Audio`  <font color="#704ae0">roArray</font>: An index of integers corresponding to audio tracks that are part of the program
  - `Subtitle`  <font color="#704ae0">roArray</font>: An index of integers corresponding to subtitle tracks that are part of the program. To retrieve more information about an individual video/audio/subtitle track, use the integer value to look up the associated `Video`/`Audio`/`Subtitle` index (e.g. `print streaminfo.subtitle[streaminfo.programs[0].subtitle[1]]`)
- `Video` <font color="#704ae0">roArray</font>: A list of video tracks that are part of the video. Each entry in the list is an associative array with the following parameters:
  - `AspectRatio` <font color="#704ae0">float</font>: The aspect ratio of the video track
  - `Name` <font color="#704ae0">string</font>: The name of the video track
  - `Width` <font color="#704ae0">int</font>: The video width (in pixels)
  - `Height` <font color="#704ae0">int</font>: The video height (in pixels)
  - `ColorDepth` <font color="#704ae0">int</font>: The aspect ratio of the video track
  - `Duration` <font color="#704ae0">int</font>: The duration of the video track (in milliseconds)
  - `Program` <font color="#704ae0">int</font>: The ID of the program to which the video track belongs
  - `FrameRate` <font color="#704ae0">float</font>: The framerate of the video track
  - `Pid` <font color="#704ae0">int</font>: The packet identifier (PID) of the video track
  - `Format` <font color="#704ae0">string</font>: The format of the video track
- `Audio` <font color="#704ae0">roArray</font>: A list of audio tracks that are part of the video. Each entry in the list is an assocative array with the following parameters:
  - `Name` <font color="#704ae0">string</font>: The name of the audio track
  - `ChannelCount` <font color="#704ae0">int</font>: The number of audio channels
  - `Format` <font color="#704ae0">string</font>: The format of the audio track
  - `Pid` <font color="#704ae0">int</font>: The packet identifier (PID) of the audio track
  - `Program` <font color="#704ae0">int</font>: The ID of the program to which the audio track belongs
  - `Duration` <font color="#704ae0">int</font>: The duration of the audio track (in milliseconds)
  - `SampleRate` <font color="#704ae0">int</font>: The audio sample rate (in hertz)
  - `Language` <font color="#704ae0">string</font>:  A code specifying the language of the audio track (e.g. "eng", "spa"). The language codes are specified in the ISO 639-2 standard.
- `Subtitle` <font color="#704ae0">roArray</font>:  A list of subtitle tracks that are part of the video. Each entry in the list is an assocative array with the following parameters:
  - `Language` <font color="#704ae0">string</font>: A code specifying the language of the subtitle track (e.g. "eng", "spa"). The language codes are specified in the ISO 639-2 standard.
  - `Program` <font color="#704ae0">int</font>: The ID of the program to which the subtitle track belongs
  - `Pid` <font color="#704ae0">int</font>: The packet identifier (PID) of the subtitle track
  - `Type` <font color="#704ae0">string</font>: The encoding standard of the subtitles (e.g. "CEA708", "DVB")

**GetStreamStatistics() As roAssociativeArray**

Returns an associative array containing statistics associated with the IP stream. The associative array contains the following parameters:

:::hint{type="info"}
All counters are reset every time PlayFile() is called. The audio keys will not be included in the associative array if there is no audio in the stream.
:::

- `Bitrate` <font color="#704ae0">int</font>: The video bitrate
- `NumDisplayed` <font color="#704ae0">int</font>: The number of video frames displayed. This is based on the refresh rate of the monitor.
- `NumUnderflowed` <font color="#704ae0">int</font>: The number of times the video FIFO has under-flowed. This usually indicates that the [buffer size](docId:0Tioy9PJdGG4G25yGBnib) needs to be increased.
- `NumDecodeErrors` <font color="#704ae0">int</font>: The number of video frames with decode errors
- `NumDecoded` <font color="#704ae0">int</font>: The total number of video frames decoded
- `NumAudioDecoded` <font color="#704ae0">int</font>: The total number of audio frames decoded
- `NumAudioDecodeErrors` <font color="#704ae0">int</font>: The number of audio frames with decode errors
- `NumAudioDummy` <font color="#704ae0">int</font>: The total number of missing audio frames. This value will increment when an audio frame goes missing or a timestamp is incorrect. A couple of frames will often be registered when streaming begins.
- `NumAudioUnderflows` <font color="#704ae0">int</font>: The number of times the audio FIFO has under-flowed. This usually indicates that the [buffer size](docId:0Tioy9PJdGG4G25yGBnib) needs to be increased.
- `VideoFramesPerSecond` <font color="#704ae0">int</font>: The video frame rate (in frames per second)
- `VideoInterlaced` <font color="#704ae0">int</font>: Indicates whether the video frames are interlaced or progressive
- `HardwareDecode` <font color="#704ae0">bool</font>:  Indicates whether or not the player is using hardware acceleration. This is always true for Series 4 players, but Series 5 players may report false if the player can’t use hardware acceleration for the media. Software decode is not recommended and is only used when the player can’t use hardware acceleration for a media file.

:::hint{type="info"}
Note that GetStreamStatistics() only returns valid data after the PLAYING event has been sent to a script.
:::

**GetCrc() As Integer**

Returns the CRC of the Y and Cb signals as a single integer. This method allows the script to compare two moments in the video-window output: If the return values differ, then the output is not identical.

**SetPreferredVideo(description As String) As Boolean**

Chooses a video stream from the video input based on the parameters in the passed string.

**SetPreferredAudio(description As String) As Boolean**

Chooses an audio stream from the video input based on the parameters in the passed string.

**SetPreferredCaptions(description As String) As Boolean**

Chooses a data stream from the video input based on the parameters in the passed string.

**SetOpacity(opacity As Integer) As Boolean**

The range of opacities from 0 to 255 (fully transparent to fully opaque).

## ifMediaTransport

**PlayFile(source As Object) As Boolean**

Plays a video file or HDMI Input. To play a file, pass a string specifying the file name and path. To play HDMI Input, pass an *roVideoInput&#x20;*&#x69;nstance.

**PlayFile(parameters As roAssociativeArray) As Boolean**

Plays video using the parameters passed as an associative array. All settings specified with this method are transient: They will only last for the duration of the file/stream playback. To specify persistent settings, use the `SetProperties()` method or the equivalent "Set" methods (`SetTransform()`, `SetViewMode()`, etc.).

- `AudioDelay`: A user-controllable delay for audio in milliseconds.
- `Decoder`: The decoder\_hint used by mosaic mode to suggest which [decoder](docId\:QQ734nQz0hCwNI0uNSdMP)  to use.
- `EncryptionAlgorithm`: The encryption algorithm to use for [encrypted playback](docId\:zTUZ0LdazCmL2kQmdBKCn) &#x20;
- `EncryptionKey`: The encryption key to use for [encrypted playback](docId\:zTUZ0LdazCmL2kQmdBKCn) &#x20;
- `FadeInLength`: The length (in milliseconds) of fade-in at the beginning of the media
- `FadeOutLength`: The length (in milliseconds) of fade-out at the end of the media
- `Filename`: The name/path of a file to be used for playback
- `LoopMode`: The looping mode for media playback. See the `SetLoopMode()` entry for a list of applicable values.
- `NoForceCapture`: A boolean value. If true, video capture to DRAM is bypassed when frame-rate conversion is not required. This reduces decode-to-display latency but introduces the following limitations:
  - Transform values other than "identity" will not work.
  - Screenshots may not be correct.
- `NoReordering`: Improves latency but disables playback of B-slices
- `Preload`: Start playback paused at the start.
- `ProbeString`: Used by BrightSign Author to supply a probe hint which may accelerate stream startup in some cases.
- `StreamFadeIn`: The length (in milliseconds) of audio/video fade-in for streams. This operates independently of [HWZ "fade"](docId\:e6uJleH69Q0JmMv8kyTrp).
- `Transform`: The rotation of the video. See the `SetTransform()` entry for a list of applicable values.
- `VideoDelay`: A user-controllable delay for video in milliseconds.
- `ViewMode`: The view mode of the video window. See the `SetViewMode()` entry for a list of applicable values.
- `ZIndex`: Control the z-index of the video layers.

These parameters are specifically used for streaming:

- `AudioFifoSize`: Set the audio FIFO size (ACDB).
- `StreamBufferSize`: Demux input buffer size (in bytes).
- `StreamJitter`: The jitter threshold for the stream in milliseconds. If the timing of incoming packets exceeds this value then the stream STC will be re-centered so as to remain in sync.
- `StreamLatency`: The amount of deviation (in milliseconds) from the default latency value: For example, a value of -500 will reduce the latency by half a second; a 500 value will increase the latency by half a second; and a 0 value will specify the default latency. Specifying a negative value will not change the buffer size; instead, it will give the buffer less time to fill up before playback begins. Usable values extend to approximately -750, though this value may differ depending on the network environment. Reducing the latency too much will result in obvious playback stutter.
- `StreamLowLatency`: Low-latency mode for RTSP streams. Setting this parameter to True will achieve the lowest possible latency for a stream, but at a reduced maximum bitrate.
- `StreamMaxBitrate`: Sets the maximum allowed bitrate (in bytes) for adaptive (HLS) playback.
- `StreamPollInterval`: Gives fine control of how often streams are polled (checked for freezing)
- `StreamProbe`: The stream probe type. This parameter can be set to "deep" (to include video dimensions, audio sample rate, etc.) or "shallow".
- `StreamTimeout`: Stop searching for the stream after this amount of time (in milliseconds).
- `StreamTrace`: Turns on stream debugging
- `StreamUsePcrClock`: Use recovered PCR as timebase for unrecognized stream protocols. This should be selected when using an external GStreamer component where the PCRs arrive at the correct time similar to RTP or UDP.
- `Url`: The URL of the video stream to be used for playback
- `VideoFifoSize`: Set the video FIFO size (VCDB).

These parameters are for MJPEG only:

- `Greyscale`: Boolean. Sets MJPEG stream to greyscale.
- `Rotate`: 0, 90, 180, or 270 degrees. If possible, use `Transform` instead.

These parameters are used to set they keying value of the video (see the [SetKeyingValue()](docId\:zTUZ0LdazCmL2kQmdBKCn) entry for more details)

- `CbKey`
- `CrKey`
- `LumaKey`

These parameters are used to [play encrypted video](docId\:zTUZ0LdazCmL2kQmdBKCn):

- `EncryptionAlgorithm`
- `EncryptionKey`

These parameters are used to parse [preferred streams](docId\:zTUZ0LdazCmL2kQmdBKCn):

- `PreferredAudio`
- `PreferredCaptions`
- `PreferredVideo`

These parameters are used in conjunction with th&#x65;*&#xA0;*[roSyncManager](docId\:Wwc22ZsPhu1e689xe7en6)*&#xA0;*&#x6F;bject to synchronize playback:

- `SyncDomain`
- `SyncId`
- `SyncIsoTimestamp`

These parameters are used for [multiscreen](docId\:zTUZ0LdazCmL2kQmdBKCn) playback:

- `MultiscreenHeight`
- `MultiscreenWidth`
- `MultiscreenX`
- `MultiscreenY`
- `SourceHeight`
- `SourceWidth`
- `SourceX`
- `SourceY`

**DropErrorFrames() As Boolean**

Configure whether to show frames with errors or drop them (which can cause pauses). By default, these errors are shown on Series 4 and earlier players. On Series 5 and later players, errors are hidden by default. Error concealment (extrapolating between good frames) performance varies between platforms. This method is available as of BOS 9.1.137.

**SetProperties(parameters As roAssociativeArray) As Boolean&#xA0;**

Sets persistent properties for video playback. These properties can be temporarily overridden by the parameters in a `PlayFile()`  call. See the [PlayFile()](docId\:zTUZ0LdazCmL2kQmdBKCn) entry for a list of available parameters.

**GetProperties() As roAssociativeArray**

Returns the current video-playback properties as an associative array. See the [PlayFile()](docId\:zTUZ0LdazCmL2kQmdBKCn) entry for a description of parameters.

**SetPropertiesString(parameters As String) As Boolean**

Sets persistent properties for video playback using a comma-separated list. These properties can be temporarily overridden by the parameters in a `PlayFile()` call. See the [PlayFile()](docId\:zTUZ0LdazCmL2kQmdBKCn) entry for a list of available parameters.

**Example**

:::BlockQuote
vp = CreateObject("roVideoPlayer")
vp.SetPropertiesString("Transform=rot90,StreamLowLatency=true") 
:::

**GetPropertiesString() As String**

Returns the current video-playback properties as a string (e.g. `"<key>=<value>, <key>=<value>"`). See the [PlayFile()](docId\:zTUZ0LdazCmL2kQmdBKCn) entry for a description of parameters.

**SetPlaybackSpeed(speed as Float) As Boolean**

Modulates the playback speed of the video, using the float 1.0 as the value for standard playback speed. To fast-forward the video, pass a value greater than 1.0; to rewind the video, pass a negative value. A value between 0 and 1.0 will the play the video in slow motion.

**PreloadFile(parameters As roAssociativeArray) As Boolean**

See the [PlayFile()](docId\:zTUZ0LdazCmL2kQmdBKCn) entry for a description of parameters.

**Play() As Boolean**

Plays the currently loaded file or stream.

**Stop() As Boolean**

Stops playback of the currently loaded file or stream.

**StopClear() As Boolean**

Stops video playback and clears the currently loaded file or stream.

**Pause(parameters As roAssociativeArray) As Boolean**

Pauses the video file or stream. This method accepts an optional associative array containing the following parameter:

- `SyncIsoTimeStamp`: The time stamp for pausing synchronized video. This value is provided by the `roSyncManager.Synchronize()`*&#xA0;*&#x6D;ethod on the leader unit and the `roSyncManagerEvent.GetIsoTimeStamp()`*&#xA0;*&#x6D;ethod on follower unit(s).

**Resume(parameters As roAssociativeArray) As Boolean**

Resumes a paused video file or stream. This method accepts an optional associative array containing the following parameter:

- SyncIsoTimeStamp: The time stamp for resuming synchronized video. This value is provided by the `roSyncManager.Synchronize()`*&#xA0;*&#x6D;ethod on the leader unit and the `roSyncManagerEvent.GetIsoTimeStamp()`*&#xA0;*&#x6D;ethod on follower unit(s). 

**SetLoopMode(mode As Dynamic) As Boolean&#xA0;**

Specifies the looping mode for media playback. This method can also accept one of the following strings:

- `"NoLoop"`: Looping is disabled in all cases. This is the default behavior, allowing for playback of multiple files in a playlist—with noticeable gaps between the end and beginning of the file.
- `"AlwaysLoop"`: The video is looped seamlessly if possible; otherwise, it is looped with seams.
- `"SeamlessLoopOrNotAtAll"`: The video is looped seamlessly if possible; otherwise, it is not looped at all.
- `"LoopButNotSeamless"`: The video is looped with seams.

Alternatively, this method can accept a Boolean argument: 

- `true`: A single media file will loop seamlessly if possible. If the video file cannot be looped seamlessly, then the video will loop with seams. 
- `false`: Looping is disabled in all cases. This is the default behavior, allowing for playback of multiple files in a playlist—with noticeable gaps between the end and beginning of the file.

:::hint{type="info"}
Media End events are only sent if seamless looping is disabled, or if the mode is set to `"SeamlessLoopOrNotAtAll"` and the file cannot be looped seamlessly.
:::

**AddEvent(user\_data As Integer, time\_in\_ms As Integer) As Boolean**

Adds a trigger that will generate an `roVideoEvent` when it reaches the specified time. The user data will be passed with the event and can be retrieved using the `roVideoEvent.GetData()` method. See the [Video Timecode Events](docId\:zTUZ0LdazCmL2kQmdBKCn) section below for more details.

**ClearEvents() As Boolean**

Removes all timecode events that have been added using the `AddEvent()`method.

**GetEvents() As roArray**

Returns an array of timecode events added to the *roVideoPlayer&#x20;*&#x69;nstance using the `AddEvent()` method. Each entry in the array consists of an associative array with the following values:

- `id`: The `user_data` of the event (as an Integer)
- `timestamp`: The timestamp (in milliseconds)

**PlayEx(a As Object) As Boolean**

This object has been deprecated. We suggest using the `PlayFile()`method for video playback instead.

**GetPlaybackPosition() As Integer**

Returns the amount of time the current file or IP stream has been playing (in milliseconds). If `SetLoopMode()` is set to true, the value will not reset when playback loops. If looping playback or IP streaming continues uninterrupted for approximately 25 days, the value will wrap around and become negative.

**GetDuration() As Integer**

Returns the total playback duration (in milliseconds) of the current file.

**Seek(position As Integer) As Boolean**

Seeks to the specified position in the audio/video file(measured in milliseconds). If the file is currently playing, then it will continue to play; otherwise, it will remain paused after seeking. This method only supports the MP4/MOV video container; all standard audio formats are supported.

**SetFade(parameters As roAssociativeArray) As Boolean**

Fades out both the video and audio when the method is called. When the fade completes, an `roVideoEvent` object with the `18 – FadeOut` value will be posted to the message port. This method accepts an associative array, which can currently contain only one parameter:

- `FadeOutLength`: The length of time (in milliseconds) over which the audio/video fades out.

**ProbeFile(filename As String) As roAssociativeArray**

Returns an associative array containing metadata about the specified video file. To retrieve metadata about a file that is currently playing, use the `GetStreamInfo()` method instead. The returned associative array can contain the following parameters:

- `Source`: The URI of the file
- `Encapsulation`: The encapsulation of the video
- `AudioFormat`: The format of the audio file
- `AudioSampleRate`: The audio sample rate (in hertz)
- `AudioChannelCount`: The number of audio channels
- `AudioDuration`: The duration of the audio track (in milliseconds)
- `VideoFormat`: The format of the video file
- `VideoColorDepth`: The color depth of the video (in bits)
- `VideoWidth`: The width of the video (in pixels)
- `VideoHeight`: The height of the video (in pixels)
- `VideoAspectRatio`: The aspect ratio of the video
- `VideoDuration`: The duration of the video (in milliseconds)

## ifZorderControl

**ToFront() As Boolean**

Places the video layer of the *roVideoPlayer&#x20;*&#x69;nstance in front of the other video player.

**ToBack() As Boolean**

Places the video layer of the *roVideoPlayer &#x20;*&#x69;nstance behind the other video player.

:::hint{type="info"}
This feature is not available on HD/LS players, which only support a single video player. For more information on ordering video layers relative to the graphics layer, refer to the *roVideoMode.SetGraphicsZOrder()&#x20;*&#x65;ntry.
:::

## ifAudioControl

Se&#x65;*&#xA0;*[roAudioPlayer](docId\:KcsshYUYYNrAhPNNFnB-9) for documentation of *ifAudioControl*.

## ifAudioAuxControl

**MapStereoOutputAux(mapping As Integer) As Boolean**

**SetVolumeAux(a As Integer) As Boolean**

**SetChannelVolumesAux(channel\_mask As Integer, b As Integer) As Boolean&#xA0;**

**SetAudioOutputAux(audio\_output As Integer) As Boolean&#xA0;**

**SetAudioModeAux(audio\_mode As Integer) As Boolean**

**SetAudioStreamAux(stream\_index As Integer) As Boolean**

**SetUsbAudioPortAux(a As Integer) As Boolean**

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

## ifIdentity

**GetIdentity() As Integer**

:::hint{type="info"}
The *ifIdentity&#x20;*&#x69;nterface has been deprecated. We recommend using the *ifUserData &#x20;*&#x69;nterface instead.
:::

## ifMessagePort

**SetPort(port As roMessagePort)**

Posts messages of type *roVideoEvent&#x20;*&#x74;o the attached message port.

## Timecode Events 

You can use the `AddEvent()` method to add triggers for *roVideoEvent* events, which will generate the `12 – Timecode Hit` value at the specified millisecond times in a video file. Use the *roVideoEvent.GetData()&#x20;*&#x6D;ethod to retrieve the user data passed with `AddEvent()`.

The following example script uses timecode events. The script prints 2, 5, and 10 at 2 seconds, 5 seconds, and 10 seconds into the video, respectively. The "msg" is approaching frame accurate.

:::CodeblockTabs
Example

```typescript
v = CreateObject("roVideoPlayer")
p = CreateObject("roMessagePort")
v.SetPort(p)
 
ok = v.AddEvent(2, 2000) ' Add timed events to video
ok = v.AddEvent(5, 5000)
ok = v.AddEvent(10, 10000)
ok = v.AddEvent(100, 100000)
ok = v.PlayFile("SD:/C5_d5_phil.vob")
 
waitloop:
msg = Wait(0,p) ' Wait for all events
if msg.GetInt() = 8 then stop ' End of file
if msg.GetInt() <> 12 goto waitloop      ' I only care about time events
print msg.GetData() ' Print out index when the time event happens
goto waitloop
```
:::

## Multiscreen Video Playback 

The `PreloadFile()` and `PlayFile()` methods can be used in conjunction with *roSyncManager&#x20;*&#x20; to stretch an image across multiple screens in an array or display windowed portions of a video.

The following example script uses the `PreloadFile()` method for multiscreen display:

:::CodeblockTabs
Example

```typescript
v=CreateObject("roVideoPlayer")
a=CreateObject("roAssociativeArray")
a["Filename"] = "test.ts"
a["MultiscreenWidth"] = 3
a["MultiscreenHeight"] = 2
a["MultiscreenX"] = 0
a["MultiscreenY"] = 0
v.PreloadFile(a)
...
...
v.Play()
```
:::

The `MultiscreenWidth` and `MultiscreenHeight` values specify the width and height of the multiple-screen matrix. For example, 3x2 would be 3 screens wide and 2 high. `MultiscreenX` and `MultiscreenY` specify the position of the current screen within that matrix. In the case above, on average only 1/6th of the video is drawn on each screen (though the view mode still applies), so depending on the shape of the video, it may have black bars on the side screens. In this way, it is relatively simple for a video player to display part of an image based on its position in the multiscreen array.

`PreloadFile()` does all of the preliminary work to get ready to play the specified video clip, including stopping the playback of the previous video file. The call to "Play" starts the playback. This is good for synchronizing video across multiple players as they can all be prepared ready to play and then will immediately start playing when the "Play" command is issued. This reduces synchronization latencies.

The following are the default values for the parameters:

- `MultiscreenWidth`= 1
- `MultiscreenHeight`= 1
- `MultiscreenX`= 0
- `MultiscreenY`= 0

This script uses `PlayFile()`to display a portion of a video. This displays a windowed portion of the *test.ts* video file starting at coordinates SourceX, SourceY, and SourceWidth by SourceHeight in size. The `SetViewMode()`setting is still honored as if displaying the whole file.

:::CodeblockTabs
Example

```typescript
v=CreateObject("roVideoPlayer")
a=CreateObject("roAssociativeArray")
a["Filename"] = "test.ts"
a["SourceX"] = 100
a["SourceY"] = 100
a["SourceWidth"] = 1000
a["SourceHeight"] = 500
v.PlayFile(a)
```
:::

### Multiscreen with Portrait Mode

To create a multiple-screen matrix in portrait mode, call `SetTransform("rot90")` or `SetTransform("rot270")` before calling `PlayFile()`.

This script creates a 2x1 portrait-mode multiscreen display:

:::CodeblockTabs
Example

```typescript
v1=CreateObject("roVideoPlayer")
v1.SetViewMode("LetterboxedAndCentered")
r=CreateObject("roRectangle", 0, 0, 1920, 1080)
v1.SetRectangle(r)
v1.SetTransform("rot90")

aa1=CreateObject("roAssociativeArray")
aa1.MultiscreenWidth = 2
aa1.MultiscreenHeight = 1
aa1.MultiscreenX = 1
aa1.MultiscreenY = 0
aa1.Filename = "example.mp4"
v1.PlayFile(aa1)
```
:::

## RF Channel Scanning

The `PlayFile()` method can be used for channel scanning and handling functionality similar to *roChannelManager*. To use `PlayFile()` for channel scanning, pass an *roAssociativeArray&#x20;*&#x77;ith the following possible parameters:

- VirtualChannel
- RfChannel
- SpectralInversion
  - INVERSION\_ON
  - INVERSION\_OFF
  - INVERSION\_AUTO
- ModulationType
  - QAM\_64
  - QAM\_256
  - QAM\_AUTO
  - 8VSB
- VideoCodec
  - MPEG1-Video
  - MPEG2-Video
  - MPEG4Part2-Video
  - H264
  - H264-SVC
  - H264-MVCAVSC
- AudioCodec
  - MPEG-Audio
  - AAC
  - AAC+
  - AC3AC3+DTS
- VideoPid
- AudioPid
- PcrPid

The `VirtualChannel` and `RfChannel` parameters must be present for `PlayFile()` to scan correctly. If you specify only these parameters, the player will scan the RF channel for a QAM/ATSC signal and attempt to retrieve the specified virtual channel from the results. The results from this action are cached so that subsequent calls to `PlayFile()` will take much less time. Providing the `SpectralInversion` and/or `ModulationType` parameters will further speed up the scanning process.

If all parameters are supplied, then no scanning is required and the player can tune to the channel immediately. If one or more of the optional parameters is missing, then the player must parse the transport stream metadata to find the appropriate values for the supplied `VirtualChannel` and `RfChannel`.

## Video Decryption 

The *roVideoPlayer&#xA0;*&#x6F;bject can be used to play audio/video files or streams that have been encrypted using AES. 

:::hint{type="info"}
Streaming decryption requires firmware version 6.2.x and is currently only supported with the UDP protocol and the HTTP protocol (when HTTP is paired with an MPEG2 transport stream). If using a UDP multicast MPEG2 transport stream, one of the elemental streams should provide the PCR to the player.
:::

The associative array passed to the `PlayFile()` method can accept two parameters for file decryption:

- `EncryptionAlgorithm`: The file-encryption algorithm. The following are the current options:
  - "AesCtr": The AES algorithm in CTR mode
  - "AesCtrHmac": The AES algorithm in CTR mode with HMAC
  - "TsAesEcb": The AES algorithm in ECB mode (e.g. with a Harmonic Prostream) with front residual termination. This algorithm is used for streaming encryption/decryption.
  - "TsAesEcbRrt": The AES algorithm in ECB mode (e.g. with a Harmonic Prostream) with rear residual termination. This algorithm is used for streaming encryption/decryption. Available from 9.1.164 on all players except LS3, HD3, HS3, HO3, XD3, XT3, LS4, HS4 and HD4.
  - "TsAesCbcRbt": The AES algorithm in CBC mode with residual block termination. This algorithm is used for streaming encryption/decryption.
  - "TsAesCbcCbt": The AES algorithm in CBC mode with clear block termination. This algorithm is used for streaming encryption/decryption.
- `EncryptionKey`: A byte array consisting of 128 bits of key. If the encryption algorithm is AES-CTR or AES-CTR-HMAC, this is followed by 128 bits of IV.

:::hint{type="info"}
Contact *support\@brightsign.biz* to learn more about generating a key for obfuscation and storing it on the player.
:::

:::hint{type="warning"}
The video player no longer accepts "\{A|A}" AES encryption keys (i.e. where the top and bottom 64 bits of the key are identical).
:::

:::CodeblockTabs
Example

```typescript
v = CreateObject("roVideoPlayer")
aa=CreateObject("roAssociativeArray")
aa.filename = "wall-sync2.mp4"
aa.encryptionalgorithm = "AesCtr"
aa.encryptionkey = CreateObject("roByteArray")
aa.encryptionkey.fromhexstring("01030507090b0d0f00020406080a0c0e00000000000000000000000000000000")


v.PlayFile(aa)
```
:::

## Preferred Streams

If multiple video, audio, or data streams are encapsulated in the video input, you can use the `SetPreferredVideo()`, `SetPreferredAudio()`, and `SetPreferredCaptions()` methods to determine which stream to use. For example, if a video may contain English and Spanish audio tracks, you can call `SetPreferredAudio()` to specify that the Spanish track should be played if it exists, with the video defaulting to English otherwise.

Preferred streams are chosen by matching the patterns in the passed string(s) against the textual description of the stream:

1. The passed string is a semicolon-separated list of templates.
2. Each template is a comma-separated list of patterns.
3. Each pattern is a `[field_name]=[field_value]` pair that is matched directly against the stream description.

**SetPreferredVideo(description As String) As Boolean**

Each template in the passed video description string can contain the following patterns:

- `pid=[integer]`: The packet identifier (PID) of the video stream you wish to display
- `program=[integer]`: The program number of the video stream
- `codec=[video_codec]`: The preferred video codec, which can be any of the following:
  - `MPEG1`
  - `MPEG2`
  - `MPEG4Part2`
  - `H263`
  - `H264`
  - `VC1`
  - `H265`
- `width=[integer]`: The preferred video width
- `height=[integer]`: The preferred video height
- `aspect=[float(x.yy)]`: The preferred aspect ratio of the video stream as a floating-point number with two fractional digits.
- `colordepth=[integer]`: The preferred color depth of the video.

Example:

:::BlockQuote
"pid=7680, codec=H264, width=1280, height=720, aspect=1.78, colordepth=8;"
:::

**SetPreferredAudio(description As String) As Boolean**

Each template in the passed description string can contain the following patterns:

- `pid=[integer]`: The packet identifier (PID) of the audio stream you wish to play
- `program=[integer]`: The program number of the audio stream
- `codec=[audio_codec]`: The preferred audio codec, which can be any of the following:
  - `MPEG`
  - `MP3`
  - `AAC`
  - `AAC-PLUS`
  - `AC3`
  - `AC3-PLUS`
  - `DTS`
  - `PCM`
  - `FLAC`
  - `Vorbis`
- `channels=[integer]`: The preferred number of audio channels (from 1 to 8)
- `freq=[frequency]`: The preferred sample frequency of the audio track, which can be any of the following:
  - `32000`
  - `44100`&#x20;
  - `48000`
- `lang=[language]`: A code that determines the preferred language of the audio track (e.g. eng, spa). The language codes are specified in the ISO 639-2 standard.
- `type=[audio_type]`: The preferred audio type, which can be one of the following:
  - `Main audio`
  - `Clean effects`
  - `Hearing impaired`
  - `Visual impaired commentary`

Example:

:::BlockQuote
"pid=4192, codec=AC3, channels=5, freq=48000, lang=eng, type=Main audio;"
:::

**SetPreferredCaptions(description As String) As Boolean**

Each template in the passed description string can contain the following patterns:

- `pid=[integer]`: The packet identifier (PID) of the caption stream you wish to play
- `type=[subtitle_type]`: The encoding standard of the subtitles. This value can be one of the following:
  - `CEA708`: If the CEA-708 standard is not present, the subtitle\_type will default to CEA-608 (if it is present).
  - `CEA608`
  - `DVB`
- `lang=[language]`: A code that determines the preferred language of the subtitles (e.g. eng, spa). The language codes are specified in the ISO 639-2 standard.
- `service=[integer]`: The preferred service number of the caption stream

Example:

:::BlockQuote
"pid=0, type=Cea708, lang=eng service=1;"
:::

### Pattern Matching Rules

Note the following rules when matching templates to video, audio, or caption stream descriptions:

- For a template to match a stream description, every pattern within the template must match.
- The first listed template to match the stream description (if any) will be used.
- An empty template string will match any stream description.
- All value comparisons are case-insensitive.
- Numerical values must match the stream description exactly (without leading zeroes). For example, the pattern `pid=016` will never match the stream PID value of 16.
- To indicate logical negation, apply the "!" exclamation mark to the beginning of a pattern. For example, specifying `SetPreferredVideo("!codec=H265"`) will match only streams that are not encoded using H.265.
- Apply the ">" greater-than symbol before an integer to indicate that, for a successful match, the value in the stream description must be *greater than&#x20;*&#x74;he value following the symbol. For example, specifying `SetPreferredVideo("width=<1921,height=<1081"`) will match only videos that are no larger than full-HD.
- Apply the "\<" less-than symbol before an integer to indicate that, for a successful match, the value in the stream description must be *less than&#x20;*&#x74;he value following the symbol.

### Pattern Matching Examples

The following examples illustrate some of the pattern matching behavior described above:

- The following template list contains three patterns: `lang=eng`, `lang=spa`, and an empty template. The first pattern specifies an English language channel; if the English channel does not exist, the second pattern specifies a Spanish language channel. The third pattern specifies any other channel if the first two don't exist (the empty template matches anything).

:::BlockQuote
SetPreferredAudio("lang=eng;lang=spa;;")
:::

- Since the following template list is empty, no captions are specified. This can be used to disable captions altogether.

:::BlockQuote
SetPreferredCaptions("")
:::

- The following template list contains an empty template. Since an empty template matches anything, the first video stream encountered will be played. This is the default behavior of all attributes.

:::BlockQuote
SetPreferredVideo(";")
:::

- The following template list specifies a 48KHz audio stream if there is one; otherwise, no audio stream will be played. Observe that the list is not correctly terminated with a semicolon; in this case, the semi-colon is implicitly supplied.

:::BlockQuote
SetPreferredAudio("freq=48000")
:::

- The following template list contains two templates. Note that all patterns within a template must match the stream description for the entire template to match. In this example, an AAC-encoded English track is preferred; an MP3-encoded English track is designated as the second option; and any track will be chosen if neither template is matched.

:::BlockQuote
SetPreferredAudio("codec=aac,lang=eng;codec=mp3,lang=eng;;")
:::

## Examples

The following script selects a program from a video and sets preferred video and audio tracks for playback: 

:::CodeblockTabs
Example

```typescript
v1 = CreateObject("roVideoPlayer")
v1.PlayFile("example.ts")
si = v1.GetStreamInfo()


' Pick the program
prog = si.Programs[2].ProgramId
v1 = CreateObject("roVideoPlayer")

' Select the program
v1.SetPreferredVideo("prog=" + prog.ToStr() + ";")
v1.SetPreferredAudio("prog=" + prog.ToStr() + ";")

' Play the stream/file
v1.PlayFile("example.ts")
```
:::

This script enables only HDMI-4 at 3840x2160x60p:

:::CodeblockTabs
Example

```typescript
mode=CreateObject("roVideoMode")
sm = CreateObject("roArray", 1, 1)
sm[0] = CreateObject("roAssociativeArray")
sm[0].name = "HDMI-4"
sm[0].video_mode="3840x2160x60p"
sm[0].transform="normal"
sm[0].display_x=0
sm[0].display_y=0
sm[0].enabled=true
mode.SetScreenModes(sm)

' Play full screen video with audio going to HDMI-4
rect = createobject("roRectangle",0,0,3840,2160)
output = createObject("roAudioOutput", "hdmi:4")
vplayer = createobject("roVideoPlayer")
vplayer.setrectangle(rect)
vplayer.setcompressedaudiooutputs(output)
vplayer.playfile("Example.mp4")
```
:::


[title] roHtmlWidget
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object embeds the Chromium HTML rendering engine, which can be rendered at full screen or as a widget. You can display multiple *roHtmlWidget* instances at the same time. The JavaScript equivalent is [htmlwidget](docId\:pMpuH3A0VR8OhjoPsJwo7).

:::hint{type="success"}
**Tip**
Use the [roKeyStore](docId\:GhSZNW9eS8TEMURQXq-DU) object to provide client certificates for websites. Use the [roVirtualMemory](docId\:M2dQxiY5mGorAOSA8MVNi) object to set up a virtual memory repository for Chromium.
:::

## Object Creation 

The *roHtmlWidget* object is initialized with an *roRectangle* object, which specifies the size and positioning of the widget on the screen, and an optional associative array, which defines properties for the widget. 

```text
CreateObject("roHtmlWidget", rect As roRectangle, properties As roAssociativeArray)
```

The properties of an *roHtmlWidget* instance can be set with an associative array at initialization or with equivalent methods after initialization. Because many *roHtmlWidget* properties cannot be changed without reloading the page (and can produce unpredictable results if changed while the page is running), we recommend setting properties at initialization when possible, rather than using the equivalent methods.

:::hint{type="danger"}
Defining initialization properties for an *roHtmlWidget* instance disables some methods for that instance (e.g. `SetTransform()`, `AddFont()`, `SetUserStylesheet()`). See the “Available Methods with Initialization” section below for a list of available methods.
:::

## Initialization Parameters

The associative array passed during initialization can have the following parameters: 

- `nodejs_enabled` <font color="#6B21A8">bool</font>: Enables [Node.js](docId\:vlSKfVzeQu04pD58rvXam)® on the widget. This value is `false` by default.

:::hint{type="info"}
Reloading a page which has Node.js enabled can be classified as an undefined behavior. The recommended method for restarting a Node instance is to destroy and rebuild the *roHtmlWidget*
:::

- `focus_enabled` <font color="#6B21A8">bool</font>: Enables focus for mouse/touchscreen events. This value is `true` by default.
- `mouse_enabled` <font color="#6B21A8">bool</font>: Enables mouse/touchscreen/USB keyboard events. This value is `false` by default.
- `scrollbar_enabled` <font color="#6B21A8">bool</font>: Enables automatic scrollbars for content that does not fit into the viewport. This value is `false` by default. The browser defaults to desktop-style scrollbars, but they can be [configured for mobile](docId\:qA8gmAIaHgVG5Gc6KdhF2) as well.
- <font color="#0C121D">`enable_pdf_viewer` </font><font color="#6B21A8">bool</font>: <font color="#0C121D">If this flag is not defined, or `false`, the default behavior is to generate a roHtmlWidgetEvent with `download-request` reason (legacy behavior). If the flag is enabled, the browser will render the PDF. </font>This parameter is available as of BOS 9.1.116 and later versions.
- `pinch_to_zoom_enabled` <font color="#6B21A8">bool</font>: Enables pinch-to-zoom functionality. This value is `false` by default.
- `force_gpu_rasterization_enabled` <font color="#6B21A8">bool</font>: Enables GPU rasterization for HTML graphics. By default, the decision to use GPU rasterization is based on [internal Chromium logic](https://www.chromium.org/developers/design-documents/chromium-graphics/how-to-get-gpu-rasterization).

:::hint{type="info"}
This setting has been deprecated. As of OS8, GPU rasterization is enabled by default and setting this property has no effect.
:::

- `canvas_2d_acceleration_enabled` <font color="#6B21A8">bool</font>: Enables 2D canvas acceleration. This will improve the framerate of most HTML pages that use 2D animations, but can cause out-of-memory issues with pages that use a large number of off-screen canvas surfaces.

:::hint{type="info"}
This setting has been deprecated. As of OS8, Canvas acceleration is enabled by default and can be disabled by setting this flag to `false`.
:::

- `javascript_enabled` <font color="#6B21A8">bool</font>: Enables JavaScript on the widget. This value is `true` by default.
- `brightsign_js_objects_enabled` <font color="#6B21A8">bool</font>: Enables [BrightScript-JavaScript objects](docId\:URrXhU7L-V9ea-Zhy0JV3). This value is `false` by default.In OS 8.2.55.4 and later, html widgets that are loaded from HTTP/HTTPS protocols do not share the same local storage database (html widgets that are loaded via file protocol act as they did in previous releases). These flags allow you to change the default behavior of widgets loaded through HTTP/HTTPS from "unshared" to "shared", or to change the default behavior of widgets with locally loaded files to "unshared" from "shared":
- `force_shared_storage` <font color="#6B21A8">bool</font>: Allows HTML widgets loaded via HTTP/HTTPS protocol to share local storage if they are loaded from the same domain.
- `force_unshared_storage` <font color="#6B21A8">bool</font>: Prevents HTML widgets loaded via FILE protocol from sharing storage.
- `transform` <font color="#6B21A8">string</font>: Sets the screen orientation of content in the widget (note that the coordinates and dimensions of the *roRectangle* containing the widget are not affected by rotation). The following values are accepted:
  - `"identity"`: There is no transform (i.e. the widget content is oriented as landscape). This is the default setting.
  - `"rot90"`: The widget content is rotated anticlockwise to portrait at 90 degrees.
  - `"rot180"`: The widget content is rotated anticlockwise to portrait at 180 degrees.
  - `"rot270"`: The widget content is rotated anticlockwise to portrait at 270 degrees.
  - The following additional transforms are supported from BOS 9.1.145 and 10.0.15:
    - `mirror`: Horizontal mirror transformation
    - `mirror_rot90`: Mirrored 90 degree clockwise rotation
    - `mirror_rot180`: Mirrored 180 degree clockwise rotation
    - `mirror_rot270`: Mirrored 270 degree clockwise rotation
- `user_agent` <font color="#6B21A8">string</font>: Modifies the default user-agent string for the *roHtmlWidget*  instance.
- `url` <font color="#6B21A8">string</font>: The URL to use for display. See the [SetUrl()](docId\:xljq5_YhDmA2SSmpZimtK) entry below for more information on using URIs to access files from local storage.
- `language` <font color="#6B21A8">string</font>: Specifies the language to load the web page in.
- `user_stylesheet` <font color="#6B21A8">string</font>: Applies the specified user stylesheet to pages in the widget. The parameter is a [URI](docId\:xljq5_YhDmA2SSmpZimtK) specifying any `file:` resource in the storage, unless you are using a CSS stylesheet saved to the SD card, in which case you should use `sd:/path/filename.css`. The stylesheet can also be specified as inline data.
- `hwz_default` <font color="#6B21A8">string</font>: Specifies the default [HWZ](docId\:e6uJleH69Q0JmMv8kyTrp) behavior. This value is `off` by default. To enable it, set it to `on`.
- `storage_path` <font color="#6B21A8">string</font>: Creates a "Local Storage" subfolder in the specified directory. This folder is used by local storage applications such as the JavaScript *storage* class. 
- `storage_quota` <font color="#6B21A8">string</font> or <font color="#6B21A8">double</font>: Sets the total size (in bytes) allotted to all local storage applications (including IndexedDB). A BrightScript integer is only guaranteed to be able to represent a count of bytes up to 2GB so avoid using integers when calculating the size: Use float or double instead since they can represent values over 2GB (string can also be used but is not recommended). If the storage path is specified without a storage quota, Chromium defaults to reserving 1GB plus 10% of the total size of the storage device.
- `port` <font color="#6B21A8">roMessagePort</font>: Configures the message port to which the *roHtmlWidget* instance will send events. When using initialization parameters, the `port` parameter should be used instead of the `SetPort()` method to ensure the script can catch `load-started`, `load-finished`, and `load-error` events.
- `fonts` <font color="#6B21A8">roArray</font>: Specifies a list of font files that can be accessed by the webpage. Font files are specified as an array of string filenames. Supported font types include TrueType Font files (*.ttf*) and Web Open Font files (*.woff*). See [this page](docId\:XleiD0O22LAz9SpXtbd8V) for more information about supported fonts.
- `pcm_audio_outputs` <font color="#6B21A8">roArray</font>: Configures the PCM audio output for the HTML widget. Outputs are specified as an array of strings, each string being the name of an output. (See [roAudioOutput documentation](docId\:Olycd6IjE_FNAXDzJhDkR) for a list of acceptable names.)
- `compressed_audio_outputs` <font color="#6B21A8">roArray</font>: Configures compressed audio output (e.g. Dolby AC3 encoded audio) for the HTML widget. Outputs are specified as an array of *roAudioOutput* instances. 
- `multi_channel_audio_outputs` <font color="#6B21A8">roArray</font>: Configures multi-channel audio output for the HTML widget. Outputs are specified as an array of *roAudioOutput* instances.
- `inspector_server` <font color="#6B21A8">roAssociativeArray</font>: Configures the [Chromium Inspector](docId:4qlK1krr1cnx7xypWXRY5) for the widget. Starting in BrightSign OS 8.5.31 you will need to also set the enable\_web\_inspector registry key (in the "html" section) to enable the JavaScript console. In “enable\_web\_inspector”, "1" will allow the inspector and "0" or not present will disable it.  A reboot will be needed for these changes to take effect (if you enable/disable this through the LDWS UI it may trigger a reboot to apply the changes).
  - `ip_addr` <font color="#6B21A8">string</font>: The Inspector IP address. This value is useful if the player is assigned more than one IP address (i.e. there are multiple network interfaces) and you wish to limit the Inspector server to one. The default value is `"0.0.0.0"`, which allows the Inspector to accept connections using either IP address.
  - `port` <font color="#6B21A8">int</font>: The port for the Inspector server. Note that the BOS 9.1.47 Beta release always uses port 2999. In the official 9.1 GA release, this parameter will be configurable with registry settings. Set the html > enable\_web\_inspector registry flag to change the web inspector port from the default value of 2999.

:::hint{type="danger"}
For security reasons, *enable\_web\_inspector* should only be used in non-production presentations. Make sure to disable JavaScript console before publishing to a production environment. In the Chromium version found in BOS 8.5.31 and beyond, the JavaScript console will log information in memory even when you are not connected to the inspector. This will consume memory until the player runs out, which will result in a crash.
:::

- `security_params` <font color="#6B21A8">roAssociativeArray</font>: Enables or disables Chromium security checks for cross-origin requests, local video playback from HTTP, etc. 
  - `websecurity` <font color="#6B21A8">bool</font>: Enables Chromium security checks for cross-origin requests. 
  - `camera_enabled` <font color="#6B21A8">bool</font>: Enables webpage access to USB cameras connected to the player (access is disabled by default). This allows support for WebRTC applications.
  - `insecure_https_enabled` <font color="#6B21A8">bool</font>: Instructs the widget to ignore security errors when connecting to insecure HTTPS hosts (insecure HTTPS is disabled by default). Enabling this feature makes the player insecure; it is not suitable for production environments and should only be used for testing.]
  - `audio_capture_enabled` <font color="#6B21A8">bool</font>: Gives access to audio input devices and lets Chromium enumerate all audio input and output devices
  - `trusted_iframes_enabled` <font color="#6B21A8">bool</font>: Controls if content loaded in iframes is permitted access to Node.js, JavaScript APIs, and BrightSign-JavaScript objects.
    - To enable Node in iframes,  initialize `nodejs_enabled` and `security_params.trusted_iframes_enabled` to be `true`.
    - To enable both [JavaScript APIs](docId\:o2uIyNVKbsyd1qXCvhVCN) and [BrightSign-JavaScript](docId\:URrXhU7L-V9ea-Zhy0JV3) objects in iframes, initialize `brightsign_js_objects_enabled` and `security_params.trusted_iframes_enabled` to be `true`.

:::Paragraph{indent="3"}
This flag will be available for BOS versions 9.1.75.3 and later. It will result as a failure to load HTML widget if used in earlier versions.
:::

- With BOS 8.2 and later (Chromium69 and later), several new CORS checks have been added: `security_params.websecurity` or `enableSecurity(false)` do not disable all these checks. Use the following registry setting instead: `registry write html disable-web-security 1` . To write this to the registry using [roRegistrySection](docId\:FfM73tjd_BThW4-P-0JVG):

```text
RegHtml = CreateObject("roRegistrySection", "html")
RegHtml.Write("disable-web-security", "1")
RegHtml.Flush()
```

- This flag will take effect on all `roHtmlWidget` instances, as opposed to previous flags which are only effective on the instance they are called on.

:::hint{type="info"}
The `camera_enabled` parameter is currently supported on the XTx44/43, XDx34/33, HDx24/23, LS424/LS423, and 4Kx42 models.
:::

- `javascript_injection` <font color="#6B21A8">roAssociativeArray</font>: Specifies JavaScript code to inject at different initialization points (JavaScript code can also be injected during runtime using the `InjectJavaScript()` method). The associative array can contain three parameters (described below). Each parameter value is an array of associative arrays, each containing a single key/value pair. The array must contain a `source` key. The `source` value is a string that can contain any of the following: pure JavaScript code, a path to a JavaScript file, or a base64-encoded string (i.e. beginning with  `data:text/javascript;charset=utf-8;base64,` ). Mutliple `source` keys can be included, but the load order will be unpredictable. The array can also contain the optional `world` key, which can be assigned one of the following values: `"application"`, `"user"`, or `"main"` (see [this page](http://doc.qt.io/archives/qt-5.6/qwebenginescript.html#ScriptWorldId-enum) for more details); if the `world` parameter is not included in the array, `"application"` is selected by default.
  - `document_creation`: The script will run as soon as the document is created. This behavior is not suitable for any DOM operation.
  - `document_ready`: The script will run as soon as the DOM is ready. This behavior is equivalent to the `DOMContentLoaded` event firing in JavaScript. 
  - `deferred`: The script will run when the page load finishes.

:::hint{type="warning" indent="1"}
The path to the JavaScript file(s) must be relative to the root of the default storage. The JavaScript file(s) must be present in the filesystem, and can also be an asset in the assetpool. Data URLs are also accepted.
:::

```text
config = {
      javascript_injection: { 
         document_creation: [{source: "0.js" }], 
         document_ready: [{source: "1a.js" }, {source: "1b.js" }], 
         deferred: [{source: "2.js" }] 
      },
      url: "..."
   }
```

- `assets` <font color="#6B21A8">roArray</font>: Allows the *roHtmlWidget* instance to [access one or more asset pools](docId\:xljq5_YhDmA2SSmpZimtK). If a file exists in multiple specified asset pools, the asset pool with the lowest index in the array has precedence. Each array entry is an associative array containing information about an asset pool:
  - `pool` <font color="#6B21A8">roAssetPool</font>: An asset pool containing files 
  - `collection` <font color="#6B21A8">roAssetCollection</font>: A manifest identifying the files in the pool
  - `uri_prefix` <font color="#6B21A8">string</font>: The URI prefix of the webpage resources to retrieve from the pool
  - `pool_prefix` <font color="#6B21A8">string</font>: The pool prefix that will replace the URI prefix when looking up the resource in the pool
- `user_data` <font color="#6B21A8">object</font>: Sets the user data that will be returned when events are raised. This is available as of BOS version 9.1.84 and later.

## ifHtmlWidget

### GetFailureReason() As String

Gives more information when a member function returns `false`.

### Hide() As Boolean

Hides the widget.

### Show() As Boolean

Shows the widget.

### raise()

Raises the html widget above all other graphical elements on screen (including other html widgets).

### lower()

Lowers the html widget below all graphical elements on screen.

### SetRectangle(r As roRectangle) As Boolean

Changes the size and positioning of the widget rectangle using the passed *roRectangle* object.

### SetURL(URL As String) As Boolean 

Displays content from the specified URL. When using this method to retrieve content from local storage, specify the file location as follows: `"file:/<drive>:/<directory>/<filename>"`. For example, an *index.html* file in the "Content" folder on the SD card can be selected with the string  `"file:/SD:/Content/index.html"`. You can also omit the drive specification to select the currently active drive (i.e. whichever drive the current autorun as loaded from).

### AddAuthenticationCredentials (url As String, username As String, password As String) As Boolean

Tells Chromium to use  the specified username and password when retrieving the given URL.

### MapFilesFromAssetPool(asset\_pool As roAssetPool, asset\_collection As roAssetCollection, pool\_prefix As String, uri\_prefix As String) As Boolean 

Sets the mapping between the URL space and the pool files. HTML content that has been deployed via BrightAuthor will typically reside in the pool and have encrypted SHA1-based filenames. A mapping mechanism is required to allow any relative URIs contained in the HTML content to continue working and to locate the appropriate resources in their respective pool locations.

You can use this method to bind part of the resource URI space onto pool locations. This method accepts the following arguments: an *roAssetPool* object containing assets, an *roAssetCollection* object identifying the assets, and two semi-arbitrary strings (URI\_PREFIX and POOL\_PREFIX).

Any URI in the form `"file:/[URI_PREFIX][RESOURCE_ID]"` will be rewritten into the form `"[POOL_PREFIX][RESOURCE_ID]"`. It will then be located in the pool as if that name had been passed to the *roAssetPoolFiles.GetPoolFilePath()* method. This binding occurs for every instance of *roHtmlWidget*, so different mappings can be used for different bundles of content.

### SetZoomLevel(scale\_factor as Float) As Boolean

Adjusts the scale factor for the displayed page (the default equals 1.0).

### EnablePinchToZoom(enable as Boolean) As Boolean

Enables or disables pinch-to-zoom functionality, which is disabled by default.

### EnableSecurity(enable As Dynamic) As Boolean 

Deprecated. Use `security_params` in initialization parameters instead.

### EnableMouseEvents(enable As Boolean) As Boolean

Deprecated. Use `mouse_enabled` in initialization parameters instead.

### SetPortrait(portrait\_mode As Boolean) As Boolean

Deprecated. Use `transform` in initialization parameters instead.

### SetTransform(transform As String) As Boolean

Sets the screen orientation of content in the widget (note that the coordinates and dimensions of the *roRectangle* containing the widget are not affected by rotation). This method accepts the following strings:

- `"identity"`: There is no transform (i.e. the widget content is oriented as landscape). This is the default setting.
- `"rot90"`: The widget content is rotated to portrait at 90 degrees (clockwise).
- `"rot270"`: The widget content is rotated to portrait at 270 degrees (counter-clockwise).

The following additional transforms are supported from BOS 9.1.145 and 10.0.15:

- `mirror`: Horizontal mirror transformation
- `mirror_rot90`: Mirrored 90 degree clockwise rotation
- `mirror_rot180`: Mirrored 180 degree clockwise rotation
- `mirror_rot270`: Mirrored 270 degree clockwise rotation

:::hint{type="info"}
The JavaScript `onload` event will report landscape dimensions for a window that is rotated with the `SetPortrait()` or `SetTransform()` method. If your application relies on the `onload` event to retrieve window dimensions, we recommend instead using the roHtmlWidget `transform` initialization parameter, which ensures the HTML window is initialized with portrait dimensions.
:::

### SetAlpha(alpha As Integer) As Boolean

Sets the overall alpha level for the widget (the default equals 255).

### EnableScrollbars(scrollbars As Boolean) As Boolean

Deprecated. Use `scrollbar_enabled` in initialization parameters instead.

### AddFont(filename As String) As Boolean

Deprecated. Use `fonts` in initialization parameters instead.

### SetPcmAudioOutputs(outputs As roArray) As Boolean

Deprecated. Use `pcm_audio_outputs` in initialization parameters instead.

### SetCompressedAudioOutputs(outputs As roArray) As Boolean

Deprecated. Use `compressed_audio_outputs` in initialization parameters instead.

### SetMultichannelAudioOutputs(outputs As roArray) As Boolean

Deprecated. Use `multi_channel_audio_outputs` in initialization parameters instead. 

### SetHWZDefault(default As String) As Void 

Deprecated. Use `hwz_default` in initialization parameters instead.

### SetVideoPlayerDefaults(defaults As roAssociativeArray) As Boolean

Sets default playback settings for `<video>` elements in the widget. Available parameters are identical to the [roVideoPlayer.PlayFile()](docId\:zTUZ0LdazCmL2kQmdBKCn) method. Default settings will be overwritten by parameters specified in individual `<video>` elements.

### ForceGpuRasterization(enable As Boolean) As Boolean

Deprecated. As of OS8, GPU rasterization is enabled by default and calling this method has no effect.

### EnableCanvas2dAcceleration(enable As Boolean) As Boolean

Deprecated. Use [canvas\_2d\_acceleration\_enabled](docId\:xljq5_YhDmA2SSmpZimtK) in initialization parameters instead.

### SetUserStylesheet(URI As String) As Boolean 

Deprecated. Use `user_stylesheet` in initialization parameters instead.

### FlushCachedResources() As Boolean

Discards any resources that Chromium has cached in memory.

:::hint{type="danger"}
Changing the storage path after an URL is loaded can cause the storage database to be irretrievably lost and/or damaged. Users should avoid using SetLocalStorageDir, SetWebDatabaseDir and SetAppCacheDir APIs when writing BrightScript applications.
Since the BOS 6.0 release, BrightSign uses a single storage path for WebDatabase, LocalStorage and AppCache. This should be set by the `storage_path` parameter in roHtmlWidget static initialization parameters.
With the BOS 8.2.35.4 release, if SetLocalStorageDir, SetWebDatabaseDir, or SetAppCacheDir are called, roHtmlWidget will use the path as the first one that is set. This directory will only set once and will be used for the subsequent use of roHtmlWidget as well.
:::

### SetLocalStorageDir(file\_path As String) As Boolean

Configures the HTML storage path. This method takes effect when a new *roHtmlWidget* instance is created; it doesn't apply to the *roHtmlWidget* instance on which it is called.

:::hint{type="info"}
As of OS8, the `SetLocalStorageDir()`, `SetWebDatabaseDir()`, and `SetAppCacheDir()` methods all configure the same HTML database. See the [HTML Storage](docId\:RALvpEudEblvgwdJo6AtL)  page for more details.
:::

### SetWebDatabaseDir(file\_path As String) As Boolean

Configures the HTML storage path. See the `SetLocalStorageDir()` entry above for details.

This method takes effect when a new *roHtmlWidget* instance is created; it doesn't apply to the *roHtmlWidget* instance on which it is called.

### SetAppCacheDir(file\_path As String) As Boolean 

Configures the HTML storage path. See the `SetLocalStorageDir()` entry above for details.

This method takes effect when a new *roHtmlWidget* instance is created; it doesn't apply to the *roHtmlWidget* instance on which it is called.

### SetLocalStorageQuota(maximum As Dynamic) As Boolean

Sets the total size (in bytes) for all persistent HTML storage on the player. This method can accept a string, double, or integer. A number literal can only represent byte numbers up to 2GB; use a string to specify larger amounts. If the storage path is specified without a storage quota, Chromium defaults to reserving 1GB plus 10% of the total size of the storage device.

This method takes effect when a new *roHtmlWidget* instance is created; it doesn't apply to the *roHtmlWidget* instance on which it is called.

:::hint{type="info"}
As of OS8, the `SetLocalStorageQuota()`, `SetWebStorageQuota()`, and `SetAppCacheQuota()` methods all configure a single storage quota, which applies to all persistent HTML storage on the player. See [HTML Storage](docId\:RALvpEudEblvgwdJo6AtL) for more details.
:::

### SetWebDatabaseQuota(maximum As Dynamic) As Boolean

Sets the total size (in bytes) for all persistent HTML storage on the player. See the `SetLocalStorageQuota()` entry above for details.

This method takes effect when a new *roHtmlWidget* instance is created; it doesn't apply to the *roHtmlWidget* instance on which it is called.

### SetAppCacheSize(maximum As Integer) As Boolean

Sets the maximum size (in bytes) for the application cache. Changing the storage size of the application cache will clear the cache and rebuild the cache storage. Depending on database-specific attributes, you will only be able to set the size in units that are equal to the page size of the database, which is established at creation. These storage units will occur only in the following increments: 512, 1024, 2048, 4096, 8192, 16384, 32768.

### EnableJavaScript(enable As Boolean) As Boolean

Deprecated. Use `javascript_enabled` in initialization parameters instead.

### AllowJavaScriptURLs(url\_collection As roAssociativeArray)

Deprecated.  If `javascript_enabled` is set to `true` in the initialization parameters, JavaScript objects are enabled for all sites.

### PostJSMessage(data As roAssociativeArray) As Boolean

Posts a collection of key\:value pairs to the *BSMessagePort* JavaScript class (see [BSMessagePort](docId\:SlN9XQgLDM3dNfEgF847b) for more details). This method does not support passing nested associative arrays.

### InjectJavaScript(code As String) As Boolean

Immediately injects a user script into the JavaScript engine. The passed string can contain any of the following: pure JavaScript code, a path to a JavaScript file, or a base64-encoded string (i.e. beginning with  `data:text/javascript;charset=utf-8;base64,` ). 

This method can be used to simulate the `bind_ready` option:

```text
if type(event) = "roHtmlWidgetEvent" then               
   if event.GetData().reason = "load-finished" then
      h.InjectJavascript("fillPasswordFields()")      
  end if
end if
```

:::hint{type="info"}
Changing the DOM is only possible at `bind_dom_loaded` and `bind_ready`. Also, since JavaScript is only guaranteed to be ready at `bind_ready`, your callbacks must use this event if they invoke any global functions.
:::

### StartInspectorServer(port As Integer) As Boolean

Deprecated. Use `inspector_server` in initialization parameters instead.

### SetUserAgent(user\_agent As String) As Boolean

Deprecated. Use `user_agent` in initialization parameters instead.

### GetUserAgent() As String

Returns the currently active `user-agent` string for the *roHtmlWidget* instance.

### SetUserAgentSuffix(suffix As String) As Boolean

Deprecated. Use `user_agent` in initialization parameters instead.

### SetProxy(proxy as String) As Boolean

Sets the name or address of the proxy server that the *roHtmlWidget* instance will use to make HTTP requests. This method takes effect immediately. It does not affect network operations performed by other components in the firmware. The string can be used to specify either the proxy URL or the location of a *.pac* proxy file:

- **Proxy URL**: The proxy address should be formatted as "http\://user\:password\@hostname\:port". The hostname can contain up to four "\*" characters; each "\*" character can be used to replace one octet from the current IP address. For example, if the IP address is currently 192.168.1.2, and the proxy is set to "proxy-\*-\*", then the player will attempt to use a proxy named "proxy-192.168".
- **Proxy File**: The *.pac* proxy file can be located on either the local file system or the network. If the file is local, there are no file-name restrictions; if the file is located on the network, the file name should have a *.pac* extension. If the URL is a hostname only, it will be considered a proxy-server address rather than a file URL.

:::hint{type="success"}
The following are examples of valid location formats for *.pac* files:

- file:///storage/sd/asset\_pool/a/b/ababababababa
- http\://example:8080/setup/proxy.pac
- https\://example/encrypted/proxy.pac
- https\://example:433/encrypted/proxy.pac
- ftp\://example/files/proxy.pac
- file:///storage/sd/myproxypac.txt
:::

### SetProxyBypass(hostnames As String) As Boolean

Exempts the specified hosts from the proxy configuration on the *roHtmlWidget* instance. The passed array should consist of one or more hostnames. The player will attempt to reach the specified hosts directly rather than using the proxy that has been specified with the `SetProxy()` method. For example, the hostname "example.com" would exempt "example.com", "example.com:80", and "www\.example.com" from the proxy setting.

### AddProxyAuthenticationCredentials(hostname As String, username As String, password As String)

Allows the user to set up one or more proxies. If proxy pac files are included, this method must be used to specify authentication parameters.

### roHtmlWidget.acceptdialog(response as String) 

Accept any dialog request with the given string, if there is any such request. This parameter was added in BOS 8.5.16.

### roHtmlWidget.rejectdialog()

Reject any dialog request. This parameter was added in BOS 8.5.16.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roHtmlWidgetEvent* to the attached message port.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

## Available Methods with Initialization 

If the properties of an *roHtmlWidget* object are configured at initialization, most *ifHtmlWidget* methods will be disabled. However, the following methods are still functional:

- `Hide()`
- `Show()`
- `EnablePinchToZoom()`
- `FlushCachedResources()`
- `SetUserAgent()`
- `GetUserAgent()`
- `SetUserAgentSuffix()`
- `PostJSMessages()`

## Examples 

The following examples show how to use either an associative array or object methods to configure an *roHtmlWidget* instance using local storage to cache the files.

Note that these techniques are mutually exclusive.

Example (with initialization properties):

```text
x = 0
y = 0
width = 1920
height = 1080
url = "http://www.brightsign.biz"
 
rect = CreateObject("roRectangle", x, y, width, height)
 
config = {
url: url,
mouse_enabled: true,
storage_path: "/local/",
}
 
html = CreateObject("roHtmlWidget", rect, config)
 
html.Show()
```

Example (with methods):

```text
x = 0
y = 0
width = 1920
height = 1080
url = "http://www.brightsign.biz"

rect = CreateObject("roRectangle", x, y, width, height)
html = CreateObject("roHtmlWidget", rect)


html.SetUrl(url)
html.EnableMouseEvents(true)
html.SetLocalStorageDir("/local/")
html.Show()
```


[title] roArray
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

This object stores objects in a continuous array of memory locations. Since an *roArray* contains BrightScript components, and there are object wrappers for most intrinsic data types, entries can either be different types or all of the same type. 

Object Creation: The *roArray* object is created with two parameters. 

```text
CreateObject("roArray", size As Integer, resize As Boolean)
```

- `size`: The initial number of entries allocated for the array.
- `resize`: If true, the array will be resized larger to accommodate more entries if needed. If the array is large, this process might take some time.

The [DIM](docId\:xjNCz5P2xsv5j9GEofi13) statement may be used instead of the `CreateObject()` function to create a new array. The `DIM` statement can be advantageous because it automatically creates array-of-array structures for multi-dimensional arrays. 

## ifArray

### Peek() As Dynamic

Returns the last (highest index) array entry without removing it.

### Pop() As Dynamic

Returns the last (highest index) entry and removes it from the array.

### Push(entry As Dynamic)

Adds a new highest-index entry to the end of the array.

### Shift() As Dynamic

Removes index zero from the array and shifts all other entries down by one unit.

### Unshift(entry As Dynamic)

Adds a new index zero to the array and shifts all other entries up by one unit.

### Delete(index As Integer) As Boolean

Deletes the indicated array entry and shifts all above entries down by one unit.

### Count() As Integer

Returns the length of the array (i.e. the index of the highest entry in the array plus one).

### Clear()

Deletes every entry in the array.

### Append(array As roArray)

Appends one *roArray* to another. If the passed *roArray* contains entries that were never set to a value, they are not appended.

:::hint{type="info"}
The two appended objects must be of the same type.
:::

## ifEnum

### Reset()

Resets the position to the first element of enumeration.

### Next() As Dynamic

Returns a typed value at the current position and increments the position.

### IsNext() As Boolean

Returns True if there is a next element.

### IsEmpty() As Boolean

Returns True if there is not an exact statement.

## ifArrayGet

### GetEntry(index As Integer) As Dynamic

Returns an array entry of a given index. Entries start at zero. If the entry at the specified index has not been set, this method will return Invalid.

## ifArraySet

### SetEntry(a As Integer, b As Dynamic)

Sets an entry of a given index to the passed type value.

[title] roHashGenerator
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This object allows you to generate a variety of message digests. The JavaScript equivalent is the Node.js Crypto API.

Object Creation: The hashing algorithm is specified when creating the *roHashGenerator* object.

```text
CreateObject("roHashGenerator", algorithm As String)
```

The algorithm parameter accepts the following strings:

- "SHA256"
- "SHA384"
- "SHA512"
- "SHA1"
- "MD5"
- "CRC32"

:::hint{type="info"}
CRC32 is only available on firmware versions 4.4.x or later.
:::

## ifHashGenerator

### Hash(obj As Object) As Object

Hashes the payload, which can be supplied in the form of a string (or any object implementing *ifString*) or an *roByteArray*. The hash is returned as an *roByteArray*.

### SetHmacKey(key As Dynamic) As Boolean

Supplies a cryptographic key for the hashing function. This method accepts a plain-text key.

### SetObfuscatedHmacKey(key As String) As Boolean

Supplies a cryptographic key for the hashing function. This method accepts a key that is obfuscated using a shared secret.

### GetFailureReason() As String

[title] roRegistrySection
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This object represents a section of the registry, enabling the organization of settings within the registry. It allows the section to be read or written. The JavaScript equivalent is [registry](docId\:tXWoOMbD2-u12dfegX7gA) (see [BrightScript-JavaScript Migration Guide](docId:2KEwWxLmpYcwu8tffuf2Z) for the method equivalents).

Object Creation: This object must be supplied with a registry-section name upon creation.

```text
CreateObject("roRegistrySection", section As String)
```

Writes do not always take effect immediately to prevent the system from exceeding the maximum number of writes on the onboard persistent storage. At most, 60 seconds after a write to the registry, the newly written data will be automatically written out to persistent storage. If, for some reason, the change must be written immediately, then the `Flush()` method should be called. All changes will be written automatically prior to exiting the application.

## ifRegistrySection

### Read(key As String) As String

Reads and returns the value of the specified key. Performing `Read()` on an entry that does not exist, or on a key within a section that does not exist, will return an empty string ("").

### Write(key As String, value As String) As Boolean

Replaces the value of the specified key.

### Delete(key As String) As Boolean

Deletes the specified key.

### Exists(key As String) As Boolean

Returns True if the specified key exists.

### Flush() As Boolean

Flushes the contents of the registry out to persistent storage.

### GetKeyList() As roList

Returns a list containing one entry per registry key in this section.

### Example

```text
registrySection = CreateObject("roRegistrySection", "widget-usage")
' An empty entry will read as an empty string and therefore be converted to zero.
hits = val(registrySection.Read("big-red-button-hits"))
hits = hits + 1
registrySection.Write("big-red-button-hits", strI(hits))
```


[title] roByteArray
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

This object contains functions for converting strings to or from a byte array, as well as to or from ASCII hex or ASCII base64. 

:::hint{type="info"}
If you are converting a byte array to a string, and the byte array contains a zero, the string conversion will end at that point.
:::

The byte array will automatically resize to become larger as needed. If you wish to disable this behavior, use the `SetResize()` method. If an uninitialized index is read, Invalid is returned. 

Since *roByteArray* supports the *ifArray* interface, it can be accessed with the `[]` array operator. The byte array is always accessed as unsigned bytes while this interface is being used. This object also supports the *ifEnum* interface, and so can be used with a `FOR EACH` statement. 

The JavaScript equivalent is `Blob()`. Note that JavaScript now has [typed arrays](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) (for example, [Uint8Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array)) . 

## ifByteArray

### WriteFile(file\_path As String) As Boolean

Writes the bytes contained in the byte array to the specified file. This method returns True if successful.

### WriteFile(file\_path As String, start\_index As Integer, length As Integer) As Boolean

Writes a subset of the bytes contained in the byte array to the specified file. This method writes `length` bytes, beginning at `start_index` of the byte array.

### ReadFile(file\_path As String) As Boolean

Reads the specified file into the byte array. This operation will discard any data currently contained in the byte array.

### ReadFile(file\_path As String, start\_index As Integer, length As Integer) As Boolean

Reads a section of the specified file into the byte array. This method reads `length` bytes, beginning at `start_index` of the file. This operation will discard any data currently contained in the byte array.

### AppendFile(file\_path As String) As Boolean

Appends the contents of the byte array to the specified file.

### SetResize(minimum\_allocation\_size As Integer, autoresize As Boolean)

Expands the size of the byte array to the `minimum_allocation_size` if it is less than the `minimum_allocation_size`. This method also accepts a Boolean parameter that specifies whether the byte array should be resized automatically or not.

### ToHexString() As String

Returns a hexadecimal string representation of the contents of the byte array. Each byte is represented as two hex digits.

### FromHexString(hex\_string As String)

Writes the contents of the passed hexadecimal string to the byte array. The passed string must contain an even number of hex digits. This operation will discard any data currently contained in the byte array.

### ToBase64String() As String

Returns the contents of the byte array as a base64-formatted string.

### FromBase64String(base\_64\_string As String)

Writes the contents of a valid base64-formatted string to the byte array. This operation will discard any data currently contained in the byte array.

### ToAsciiString() As String

Returns the contents of the byte array as an ASCII-formatted string.

### FromAsciiString(ascii\_string As String)

Writes the contents of a valid ASCII-formatted string to the byte array. This operation will discard any data currently contained in the byte array.

### GetSignedByte(index As Integer) As Integer

Returns the signed byte at the specified zero-based index in the byte array. To read an unsigned byte within a byte array, use the *ifArrayGet.GetEntry()* method or the `[]` array operator.

### GetSignedLong(index As Integer) As Integer

Retrieves the integer located at the specified long-word index of the byte array. Note that this method cannot accept a byte index as its parameter.

### IsLittleEndianCPU() As Boolean

Returns True if the CPU architecture is little-endian.

## ifArray

### Peek() As Dynamic

Returns the last (highest index) array entry without removing it.

### Pop() As Dynamic

Returns the last (highest index) entry and removes it from the array.

### Push(entry As Dynamic)

Adds a new highest index entry to the end of the array.

### Shift() As Dynamic

Removes index zero from the array and shifts all other entries down by one unit.

### Unshift(entry As Dynamic)

Adds a new index zero to the array and shifts all other entries up by one unit.

### Delete(index As Integer) As Boolean

Deletes the indicated array entry and shifts all above entries down by one unit.

### Count() As Integer

Returns the index of the highest entry in the array plus one (i.e. the length of the array).

### Clear()

Deletes every entry in the array.

### Append(array As roArray)

Appends one *roArray* to another. If the passed *roArray* contains entries that were never set to a value, they are not appended.

:::hint{type="info"}
The two appended objects must be of the same type.
:::

## ifEnum

### Reset()

Resets the position to the first element of enumeration.

### Next() As Dynamic

Returns a typed value at the current position and increment position.

### IsNext() As Boolean

Returns True if there is a next element.

### IsEmpty() As Boolean

Returns True if there is not an exact statement.

## ifArrayGet

### GetEntry(index As Integer) As Dynamic

Returns an array entry of a given index. Entries start at zero. If this method attempts to fetch an entry that has not been set, it will return Invalid.

## ifArraySet

### SetEntry(index As Integer, entry As Dynamic)

Sets an entry of a given index to the passed type value.

[title] Intrinsic Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

In general, this manual uses the term “object” to refer to “BrightScript components”, which are C or C++ components with interfaces and member functions that BrightScript uses directly. With the exception of some core objects (*roArray*, *roAssociativeArray*, *roInt*, *roMessagePort*, etc.), BrightScript objects are platform specific.

You can create intrinsic objects in BrightScript, but these objects are not BrightScript components. There is currently no way to create a BrightScript component in BrightScript or to create intrinsic objects that have interfaces (intrinsic objects can only contain member functions, properties, and other objects).

A BrightScript object is simply an *roAssociativeArray*: When a member function is called from an associative array, a “this” pointer is set to “m”, and “m” is accessible inside the Function code to access object keys. A “constructor” in BrightScript is simply a normal function at a global scope that creates an *roAssociativeArray* instance and fills in its member functions and properties 

See the “snake” game in [Example Script](docId\:Y0Kc8rImhidp_FotmgZtR) for examples of creating intrinsic objects.

[title] roAssetCollection
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Content Management Objects/

This object is used to represent a collection of assets.

Object Creation: The *roAssetCollection* object is created with no parameters.

```text
CreateObject("roAssetCollection")
```

You can populate an asset collection with individual calls to `AddAsset()` or `AddAssets()`. You can also populate an asset collection using the *roSyncSpec.GetAssets()* method, as shown below:

```text
assetCollection = CreateObject("roAssetCollection")
 
localCurrentSync = CreateObject("roSyncSpec")
if localCurrentSync.ReadFromFile("local-sync.xml") then
	assetCollection = localCurrentSync.GetAssets("download")
endif
```

## ifFailureReason

### GetFailureReason() As String

Returns additional information if a method fails. 

## ifAssetCollection 

### AddAsset(asset\_info As Dynamic) As Boolean

Adds a single asset from an associative array or JSON-formatted string. If the argument is a string, it should match the format used for a single asset in a JSON sync spec. Returns true to indicate success and false to indicate failure. If false is returned more detailed information is available by calling the `GetFailureReason` method.

### AddAssets(asset\_info\_array As Dynamic) As Boolean

Adds multiple assets from an enumerable object (an *roList*, *roArray*, or string containing a JSON-formatted array) that contains compatible associative arrays. Returns true to indicate success and false to indicate failure. If false is returned more detailed information is available by calling the `GetFailureReason` method.

### GetAssetList() As roList

Returns an *roList* instance containing associative arrays of asset metadata. This method is not efficient and is, therefore, recommended for debugging and diagnostic purposes only.

Each associative array contains the following:

|                  |                |          |                                                                                                                                                         |
| ---------------- | -------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| name             | String         | Required | The name of the asset. For a file to be realized, it must have a valid filename (i.e. no slashes).                                                      |
| link             | String         | Required | The download location of the asset                                                                                                                      |
| size             | Integer/String | Optional | The size of the asset. Use a string if you want to specify a number that is too large to fit into an integer (this allows file sizes larger than 2 GB). |
| hash             | String         | Optional | A string in the form of "hash\_algorithm\:hash". See the next table for available hash algorithms.                                                      |
| change\_hint     | String         | Optional | Any string that will change in conjunction with the file contents. This is not necessary if the link or hash is supplied and always changes.            |
| auth\_inherit    | Boolean        | Optional | Indication of whether or not this asset uses *roAssetFetcher* authentication information. The default is set to True.                                   |
| auth\_user       | Boolean        | Optional | User to utilize for authentication when downloading only this asset. This automatically disables "auth\_inherit".                                       |
| auth\_password   | Boolean        | Optional | Password to use when downloading only this asset. This automatically disables "auth\_inherit".                                                          |
| headers\_inherit | Boolean        | Optional | The command to pass any header supplier to *roAssetFetcher* when fetching this asset. The default is true.                                              |

:::hint{type="danger"}
Any "optional" fields that are specified when populating the pool must also be specified when retrieving assets from the pool (i.e. they become "mandatory" once they are used for an asset). For example, if the hash value is specified when fetching into the pool, then it must also be specified when attempting to refer to files in the pool.
:::

Hash algorithms:

|        |                                                                                                                                                                                                                                                                                  |
| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| sha1   | If a sha1 is available, you can validate the hash as the file is downloaded. If such a hash is available, it should be used. The link and change\_hint properties have no effect on the pool file name, so the file is shared even if it is downloaded from different locations. |
| besha1 | This algorithm hashes some of the file along with the file size in order to verify the contents. It also moves the link and change\_hint properties into the pool filename.                                                                                                      |
| MD5    | Uses the MD5 hash algorithm to validate files.                                                                                                                                                                                                                                   |
| (none) | Without any hash, the file cannot be verified as it is downloaded, and the system will rely on the link and change\_hint properties to give the pool a unique filename.                                                                                                          |


[title] Garbage Collection
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

BrightScript automatically frees strings when they are no longer used, and it will free objects when their reference count goes to zero. This is carried out at the time the object or string is no longer used; there is no background garbage collection task. The result is a predictable garbage-collection process, with no unexpected stalls in execution. 

Objects may enter a state of circular reference counting: Objects that reference each other will never reach a reference count of zero and will need to be freed manually using the `RunGarbageCollector()` method. This method is useful when destroying old presentation data structures and creating a new presentation.

[title] roVideoInput
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object allows playback of HDM&#x49;**®** input or video provided by a video capture dongle. Note that the *ifVideoInput&#x20;*&#x6D;ethods do not apply to HDMI input, which can be achieved by passing an unmodified *roVideoInput&#x20;*&#x69;nstance to the *roVideoPlayer.PlayFile()&#x20;*&#x6D;ethod (see below for examples). The JavaScript equivalent is `MediaDevices.getUserMedia()`.

Object Creation: *roVideoInput* is created with no parameters:

:::BlockQuote
CreateObject("roVideoInput")
:::

## ifVideoInput

**GetStandards() As roArray**

**GetInputs() As roArray**

These return an array of strings describing the various inputs and video standards that the video capture device supports. The following are the possible standards that can be returned: PAL-D/K, PAL-G, PAL-H, PAL-I, PAL-D, PAL-D1, PAL-K, PAL-M, PAL-N, PAL-Nc, PAL-60, SECAM-B/G, ECAM-B, SECAM-D, SECAM-G, SECAM-H, SECAM-K, SECAM-K1, SECAM-L, SECAM-LC, SECAM-D/K, NTSC-M, NTSC-Mj, NTSC-443, NTSC-Mk, PAL-B and PAL-B1. Inputs returned are s-video and composite.

**SetStandard(standard As String) As Boolean**

**GetCurrentStandard() As String**

**SetInput(input As String) As Boolean**

**GetCurrentInput() As String**

Use the above to get and set the input and video standard.

**GetControls() As roArray**

Returns the possible controls on the input. These include "Brightness," "Contrast," "Saturation," "Hue," and others.

**SetControlValue(control\_name As String, value As Integer) As Boolean**

Sets the value of the specified control.

**GetCurrentControlValue(control\_name As String) As roAssociativeArray**

Returns an associative array with 3 members: "Value," "Minimum," and "Maximum." "Value" is the current value, and the possible range is specified by "Minimum" and "Maximum."

**GetFormats() As Object**

**SetFormat(a As String, b As Integer, c As Integer) As Boolean**

**GetCurrentFormat() As String**

## Example

This script uses the HDMI Input as the video source to create a full-screen display.

:::BlockQuote
v = CreateObject("roVideoPlayer")
i = CreateObject("roVideoInput")
p = CreateObject("roMessagePort")


vm = CreateObject("roVideoMode")
vm.SetMode("1920x1080x60p")


r = CreateObject("roRectangle", 0, 0, 1920, 1080)
v.SetRectangle(r)


v.PlayFile(i)
:::

This script uses the video capture dongle as the video source to create a full-screen display.

:::BlockQuote
v=CreateObject("roVideoPlayer")
i=CreateObject("roVideoInput")
p=CreateObject("roMessagePort")


vm=CreateObject("roVideoMode")
vm.SetMode("1280x720x60p")


r = CreateObject("roRectangle", 0, 0, 1280, 720)
v.SetRectangle(r)


i.SetInput("s-video")
i.SetStandard("ntsc-m")


v.PlayFile(i)&#x20;
:::


[title] Operators
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

Operations in the innermost level of parentheses are performed first. Evaluation then proceeds according to the precedence in the following table. Operations on the same precedence are left-associative, except for exponentiation, which is right-associative.

| **Description**                   | **Symbol(s)**           |
| --------------------------------- | ----------------------- |
| Function Calls or Parentheses     | ()                      |
| Array Operators                   | . , \[]                 |
| Exponentiation                    | ^                       |
| Negation                          | –, +                    |
| Multiplication, Division, Modulus | \*, /, MOD              |
| Addition, Subtraction             | +, -                    |
| Comparison                        | \<, >, = , \<>, \<=, >= |
| Logical Negation                  | NOT                     |
| Logical Conjunction               | AND                     |
| Logical OR                        | OR                      |

**String Operators**: The following operators work with strings: `<, >, =, <>, <=, >=, +`

**Function References**: The `=` and `<>` operators work on variables that contain function references and function literals.

## Logical and Bitwise Operators

The `AND`, `OR`, and `NOT` operators are used for logical (Boolean) comparisons if the arguments for these operators are Boolean:

```text
a = 20
b = 20
c = 20
if a = c and not(b > 40) then print "success"
```

On the other hand, if the arguments for these operators are numeric, they will perform bitwise operations:

```text
x = 1 and 2   ' x is zero
y = true and false  ' y is false
```

When the `AND` or `OR` operator is used for a logical operation, only the necessary amount of the expression is executed. For example, the first statement below will print "True", while the second statement will cause a runtime error (because "invalid" is not a valid operand for `OR`):

```text
print true or invalid
print false or invalid
```

## Dot Operator

The "." Dot Operator can be used on any BrightScript object. It also has special meaning when used on an *roAssociativeArray* object, as well as *roXMLElement* and *roXMLList* objects. When used on a BrightScript object, it refers to an interface or method associated with that object. In the following example, `IfInt` refers to the interface and `SetInt()` refers to a method that is part of that interface:

```text
i = CreateObject("roInt")
i.ifInt.SetInt(5)
i.SetInt(5)
```

Every object method is part of an interface. However, specifying the interface with the "." Dot Operator is optional. If the interface is omitted, as in the third line of the above example, each interface that is part of the object will be searched for the specified member. If there is a naming conflict (i.e. a method with the same name appears in two interfaces), then the interface should be specified.

### Associative Arrays

When the "." Dot Operator is used on an Associative Array, it is the same as calling the `Lookup()` or `AddReplace()` methods, which are member functions of the [roAssociativeArray](docId\:sb0Om1Y-OQlapFqNFS0XY) object:

```text
aa = {}
aa.newkey = "the value"
print aa.newkey
```

Note that the parameters of the "." Dot Operator are set at compile time; unlike the `Lookup()` and `AddReplace()` methods, they are not dynamic.

The "." Dot Operator is always case insensitive: For example, the statement `aa.NewKey=55` will create the entry "newkey" in the associative array. To generate case-sensitive keys, instantiate an *roAssociativeArray* object and use the `SetModeCaseSensitive()` method.

## Array and Function-Call Operators

The \[ ] operator is used to access an array (i.e. any BrightScript object that has an *ifArray* interface, such as *roArray* and *roList* objects). It can also be used to access an associative array. The \[ ] operator takes expressions that are evaluated at runtime, while the "." Dot Operator takes identifiers at compile time.

The ( ) operator can be used to call a function. When used on a function literal (or variable containing a function reference), that function will be called.

The following code snippet demonstrates the use of both array and function-call operators.

```text
aa = CreateObject("roAssociativeArray")
aa["newkey"] = "the value"
print aa["newkey"]

array = CreateObject("roArray", 10, true)
array[2] = "two"
print array[2]
 
fivevar = five
print fivevar()
 
array[1] = fivevar
print array[1]()   ' print 5
 
function five() As Integer
   return 5
end function
```

### Array Dimensions

Arrays in BrightScript are one dimensional. Multi-dimensional arrays are implemented as arrays of arrays. The \[ ] operator will automatically map multi-dimensionality. For example, the following two fetching expressions are the same:

```text
dim array[5,5,5]
item = array[1][2][3]
item = array[1,2,3]
```

:::hint{type="info"}
If a multi-dimensional array grows beyond its hint size, the new entries are not automatically set to *roArray*.
:::

## Equals Operator

The = operator is used for both assignment and comparison:

```text
a = 5
If a = 5 then print "a is 5"
```

Unlike the C language, BrightScript does not support use of the = assignment operator inside an expression. This is meant to eliminate a common class of bugs caused by confusion between assignment and comparison.

When assignment occurs, intrinsic types are copied, while BrightScript objects are reference counted.

[title] roBlockCipher
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This object provides a means for symmetric block encryption. It currently supports AES and CBC ciphers, at block sizes of 128, 192, or 256 bits. The JavaScript equivalent is the Node.js Crypto API.

Object Creation: The *roBlockCipher* object is created with an associative array representing a set of parameters.

```text
CreateObject("roBlockCipher", parameters As roAssociativeArray)
```

The associative array should contain the following parameters:

- mode: `"aes-128-cbc"`, `"aes-192-cbc"`, or `"aes-256-cbc"`
- padding: `"zero"` or `"pkcs7"`. The object defaults to zero padding if this parameter is omitted.

Padding is required for inputs that are not an exact multiple of the cipher block size. Specifying `"zero"` will add padding only when needed, while specifying `"pkcs7"` always adds padding, even if the data is already a multiple of the block size (in this case, an entire block will be added). PKCS#7 padding is automatically removed upon decryption, and zero padding will be retained since there are no means to unambiguously distinguish pad values from data.

## ifBlockCipher

### SetIV(iv As Object) As Void

Sets the Initialization Vector (IV) for CBC (Cipher-Block-Chaining) modes. If the supplied IV is shorter than required, then it will be zero padded (passing an empty string will set the vector to all zeroes). The IV will typically contain arbitrary characters and be in the form of an *roByteArray*, though it can also be a string.

### Encrypt(key As Object, plaintext As Object) As roByteArray

Uses the specified key to encrypt the plaintext parameter, which can be passed as either a string or an *roByteArray*.

### Decrypt(key As Object, cipher\_text As Object) As roByteArray

Uses the specified key to decrypt cipher text, which should be passed as an *roByteArray*. Because the cipher text is encrypted, it can contain any character.

### Example

```text
' This is Case#4 from RFC3602
key = CreateObject("roByteArray")
iv = CreateObject("roByteArray")
plain = CreateObject("roByteArray")
key.FromHexString("56e47a38c5598974bc46903dba290349")
iv.FromHexString("8ce82eefbea0da3c44699ed7db51b7d9")   plain.FromHexString("a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedf")
c = CreateObject("roBlockCipher", { mode: "aes-128-cbc" })
c.SetIV(iv)
crypt = c.Encrypt(key, plain)
result = crypt.ToHexString()
expected = UCase("c30e32ffedc0774e6aff6af0869f71aa0f3af07a9a31a9c684db207eb0ef8e4e35907aa632c3ffdf868bb7b29d3d46ad83ce9f9a102ee99d49a53e87f4c3da55")


' Decrypt example to recover the encrypted data
c.SetIV(iv)
roundtrip = c.Decrypt(key, crypt)


' Second example selecting PKCS#7 padding
c = CreateObject("roBlockCipher", { mode: "aes-128-cbc", padding: "pkcs7" })
```


[title] roRegex
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

This object allows the implementation of the regular-expression processing provided by the PCRE library. The JavaScript equivalent is `RegExp()`.

This object is created with a string to represent the matching-pattern and a string to indicate flags that modify the behavior of one or more matching operations: 

```text
CreateObject("roRegex", "[a-z]+", "i") 
```

The match string (in the example above, `"[a-z]+"`, which matches all lowercase letters) can include most Perl compatible regular expressions found in the [PCRE documentation](http://pcre.org/). 

This object supports any combination of the following behavior flags (in the example above, "i", which can be modified to match both uppercase and lowercase letters):

- `"i"`: Case-insensitive match mode.
- `"m"`: Multiline mode. The start-line ("^") and end-line ("$") constructs match immediately before or after any newline in the subject string. They also match at the absolute beginning or end of a string.
- `"s"`: Dot-all mode, which includes a newline in the ".\*" regular expression. This modifier is equivalent to "/s" in Perl.
- `"x"`: Extended mode, which ignores whitespace characters except when escaped or inside a character class. This modifier is equivalent to "/x" in Perl.

## ifRegex

### IsMatch(string As String) As Boolean

Returns `True` if the string is consistent with the matching pattern.

### Match(string As String) As roArray

Returns an *roArray* of matched substrings from the string. The entire match is returned in the form `array[0]`.This will be the only entry in the array if there are no parenthetical substrings. If the matching pattern contains parenthetical substrings, the relevant substrings will be returned as an array of length n+1, where `array[0]` is the entire match and each additional entry in the array is the match for the corresponding parenthetical expression.

### Replace(string As String, subset As String) As String

Replaces the first occurrence of a matching pattern in the string with the subset and returns the result.

The subset may contain numbered back-references to parenthetical substrings.

**Example**

```text
 > r = CreateObject("roRegex", "(\d+)\s+(\w+)", "")
 > ? r.Replace("123 abc", "word:\2 number:\1")
 > word:abc number:123
```

### ReplaceAll(string As String, subset As String) As String

Replaces the all occurrences of a matching pattern in the string with the subset and returns the result.

Example

```text
 > r = CreateObject("roRegex", "a", "i")
 > ? r.ReplaceAll("Abracadabra", "x")
 xbrxcxdxbrx
```

### Split(string As String) As roList

Uses the matching pattern as a delimiter and splits the string on the delimiter boundaries. The function returns an *roList* of strings that were separated by the matching pattern in the original string.

[title] BrightScript
[path] Player APIs (BrightScript & JavaScript)/

BrightScript is a powerful scripting language for building media and networked applications for BrightSign players. Through a library of lightweight BrightScript objects, BrightScript enables access to the player’s API (Application Programming Interface) so that users can utilize the player’s underlying components for networking, media playback, UI screens, and interactive interfaces. As an interpreted language (rather than a compiled one), BrightScript is optimized for generating feature-rich applications in an efficient and user-friendly way.

See the [Language Reference](docId\:xAeRJmfEzfzy63dgykGi_) to understand characteristics of the BrightScript language such as syntax, operators, statements, types, core library, etc.

See the [Object Reference](docId\:YlhbUaX_eQfA5sqFjUKpn) for a directory of publicly available objects, interfaces, and methods that comprise the BrightScript API.

See [Plugins & Parsers](docId\:uWsz22b8BpJF6DQq_ioq2) for info about plugins and parsers.

## Migrating from BrightScript to JavaScript

Refer to the [BrightScript-JavaScript Migration Guide](docId:2KEwWxLmpYcwu8tffuf2Z) for info on mapping between BrightScript and JavaScript APIs.

## Documentation for Older BrightScript Versions

See these pages for PDF documentation of older versions:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/UYN0e7nQaLvDEe7SlbGEr_brightscriptreferencemanual-ver9.pdf" label="BrightScriptReferenceManual_ver9.pdf" isUploading="false"}

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/RSODMMulxm3vzSTTaK6zB_brightscriptreferencemanual-ver-8-pdf.zip" label="BrightScriptReferenceManual (ver 8).pdf.zip" isUploading="false"}

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/wWgI50ksQN1AGh_klGY4f_brightscript-reference-manual-ver-71-pdf.zip" label="BrightScript Reference Manual (ver 7.1).pdf.zip" isUploading="false"}

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/pfxxvH8RS8z7NwZrrWLj3_brightscript-reference-manual-ver-70-pdf.zip" label="BrightScript Reference Manual (ver 7.0).pdf.zip" isUploading="false"}

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/d6yDqi1PfZCQfJ_ZSUm7Q_brightscript-reference-manual-ver-62-pdf.zip" label="BrightScript Reference Manual (ver 6.2).pdf.zip" isUploading="false"}

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/Jl6IgmBw1jA6G1Q6Vttz6_brightsignreferencemanual-v61-1pdf.zip" label="BrightSignReferenceManual_V6.1-1.pdf.zip" isUploading="false"}


[title] roFunction
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

## ifFunction

### GetSub() As Function

### SetSub(value As Function)

[title] Hashing and Storage Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/

This section describes objects related to local storage and the player registry, as well as generating data structures and hashing files.

- [roBlockCipher](docId\:SfteIwKcq7v_eKaN7CuQN)
- [roBrightPackage](docId:1Dr98_7Il7GYneOwnX2cr)
- [roDiskErrorEvent](docId\:L8uyKsY_8dUnTb51f5_nH)
- [roDiskMonitor](docId\:T-wtIIjOj_U_Njqk7m_x_)
- [roHashGenerator](docId\:AGtZJi7tXgTyKFKyUVT_I)
- [roPassKey](docId\:wdkSQQ9q_FZzsXkT4UlfD)
- [roRegistry](docId\:YTpSfntswYFMXx8PCqJLf)
- [roRegistrySection](docId\:FfM73tjd_BThW4-P-0JVG)
- [roSqliteDatabase](docId\:k_hc9Sf1jPYRcuit3XYkA)
- [roSqliteEvent](docId\:D_vJ4tF880eHeZ_tmnDHq)
- [roSqliteStatement](docId\:cGqVi8DVgKsN8PFFWDvkW)
- [roStorageAttached, roStorageDetached](docId:5r7JbeYJXyNqfwjVNglBy)
- [roStorageHotplug](docId\:sntoWmoFUC1plbVQ_pSzO)
- [roStorageInfo](docId\:BczooenmOIfNRbeny6ZKI)
- [roVirtualMemory](docId\:M2dQxiY5mGorAOSA8MVNi)


[title] roDouble, roIntrinsicDouble
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

## ifDouble

### GetDouble() As Double

### SetDouble(a As Double)

[title] roAssetPool
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Content Management Objects/

An *roAssetPool* instance represents a pool of files for synchronization. You can instruct this object to populate the pool based on a sync spec and then realize it in a specified directory when required. The JavaScript equivalent is [assetpool](docId\:NY8nhRk1-740WPRYL_p8d).

Object Creation: The *roAssetPool* object is created with a single parameter representing the rooted path of the pool.

```text
CreateObject("roAssetPool", pool_path As String)
```

Example:

```text
pool = CreateObject ("roAssetPool", "SD:/pool")
```

## ifAssetPool

### GetFailureReason() As String

### ProtectAssets(name As String, collection As Object) As Boolean

Requests that the files specified in the "download" section of a sync spec receive a certain amount of protection. Specified files will not be deleted when the system software needs to reduce the size of the pool to make space.

### UnprotectAssets(name As String) As Boolean

Removes the protected status placed on the specified files by the `ProtectAssets()` method. Asset collections are reference counted at the system-software level. As a result, when calling `UnprotectAssets()`, you must pass the same object that you previously passed to `ProtectAssets()`.

### UnprotectAllAssets() As Boolean

Removes the protected status placed on any files in the asset pool using the `ProtectAssets()` method. 

### ReserveMegabytes(size As Integer) As Boolean

Reserves the specified amount of storage space. This method is dynamic: The system software attempts to keep the space free even when parallel processes are filling up the storage.

### SetMaximumPoolSizeMegabytes(maximum\_size As Integer) As Boolean

Specifies the maximum size of an *roAssetPool* instance in megabytes. This method is more resource-intensive than `ReserveMegabytes()`, but it is useful when creating multiple pools on a storage device.

### GetPoolSizeInMegabytes() As Integer

Returns the current size of the asset pool (in megabytes). 

### Validate(sync\_spec As Object, options As roAssociativeArray) As Boolean

Checks the SHA1, BESHA1, or MD5 hash value of files that are in the sync spec and are currently present in the pool. This method returns True if all checks pass and False if one or more checks fail. Calling `GetFailureReason()` will return information about the corrupt file(s). Note that a True return may not mean that all files in the sync spec are currently present in the pool. The second parameter represents a table of validation options: The key specifies the option and the value specifies whether the option is enabled or not (as a Boolean value). Currently, the only option is "DeleteCorrupt", which determines whether the method should automatically delete corrupt files or not.

### QueryFiles(sync\_spec As roAssociativeArray) As roAssociativeArray

Determines whether the specified files are present in the asset pool. This method returns an associative array with filename keys and corresponding Boolean values.

### AssetsReady(collection As Object) As Boolean

Returns `true` if the specified files are ready in the asset pool.

[title] roSqliteEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This event object is returned when a `RunBackground()` operation is called by the associated *roSqliteDatabase* object.

## ifSqliteEvent

### GetTransactionId() As Integer

Returns an integer that matches the result of the originating `RunBackground()` operation.

### GetSqlResult() As Integer

Returns the result code returned by the *roSqliteStatement.Run()* method. The possible return values are identical to the `Run()` method:

- 100: Statement complete
- 101: Busy
- 102: Rows available

:::hint{type="info"}
This method can be used as the asynchronous alternative to the `Run()` method.
:::

[title] Objects and Interfaces
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

## BrightScript Objects

Though BrightScript operates independently of its object architecture and library, they are both required for programming BrightScript applications. The API of a BrightSign platform is exposed to BrightScript as a library objects: Platforms must register a new BrightScript object to expose some part of its API.

BrightScript objects are written in C (or a compatible language such as C++), and are robust against version changes: Scripts are generally backwards compatible with objects that have undergone revisions. 

BrightScript objects keep a reference count; they delete themselves when the reference count reaches zero.

## Wrapper Objects

All intrinsic BrightScript types (Boolean, Integer, Float, Double, String, and Invalid) have object equivalents. If one of these intrinsic types is passed to a function that expects an object, the appropriate wrapper object will be created, assigned the correct value, and passed to the function (this is sometimes referred to as "autoboxing"): This allows, for example, *roArray* objects to store values (e.g. integers and strings) as well as objects.

Any expression that expects one of the above types will work with the corresponding wrapper object as well: *roBoolean*, *roInt*, *roFloat*, *roDouble*, *roString*.

The following examples illustrate how wrapper objects work:

```text
Print 5.tostr()+"th"
Print "5".toint()+5
 
-5.tostr()    'This will cause an error. Instead, use the following:
(-5).tostr()
 
if type(5.tostr())<> "String" then stop
if (-5).tostr()<>"-5" then stop
if (1+2).tostr()<>"3" then stop
i=-55
if i.tostr()<>"-55" then stop
if 100%.tostr()<>"100" then stop
if (-100%).tostr()<>"-100" then stop
y%=10
if y%.tostr()<>"10" then stop
      
if "5".toint()<>5 or type("5".toint())<>"Integer" then stop
if "5".tofloat()<>5.0 or type("5".tofloat())<>"Float" then stop
fs="-1.1"
if fs.tofloat()<>-1.1 or fs.toint()<>-1 then stop
      
if "01234567".left(3)<>"012" then stop
if "01234567".right(4)<>"4567" then stop
if "01234567".mid(3)<>"34567" then stop
if "01234567".mid(3,1)<>"3" then stop
if "01234567".instr("56")<>5 then stop
if "01234567".instr(6,"56")<>-1 then stop
if "01234567".instr(0,"0")<>0 then stop
```

## Interfaces

Interfaces in BrightScript operate similarly to Java or Microsoft COM: An interface is a known set of member functions that implement a set of logic. In some ways, an interface is similar to a virtual base class in C++; any script or program that is compatible with C can use an object interface without regards to the type of object it belongs to: For example, the *roSerialPort* object, which controls the standard serial interface, implements three interfaces: *ifSerialControl*, *ifStreamReceive*, and *ifStreamSend*. Since the print statement sends its output to any object that has an *ifStreamSend* interface, it works with the *roSerialPort* object, as well as any other object with the *ifStreamSend* interface.

## Statement and Interface Integration

Some BrightScript statements have integrated functionality with interfaces. This section describes how to use statements with interfaces.

### PRINT

Using the `PRINT` statement in the following format will print into an object that has an *ifStreamSend* interface, including the *roTextField* and *roSerialPort* objects:

```text
port = CreateObject("roSerialPort",0,115200)
print port, "string"
```

If the expression being printed evaluates to an object with an *ifEnum* interface, the `PRINT` statement will print every item that can be enumerated.

In addition to printing the values of intrinsic types, the `PRINT` statement can also be used to print any object that exposes one of the following interfaces: *ifString*, *ifInt*, *ifFloat*.

### WAIT

The `WAIT` statement can work in conjunction with any object that has an *ifMessagePort* interface.

### Expression Parsing

Any expression that expects a certain type of variable—including Integer, Float, Double, Boolean, or String—can accept an object with an interface equivalent of that type: *ifInt*, *ifFloat*, *ifDouble*, *ifBoolean*, *ifString*.

### Array Operator

The \[ ] array operator works with any object that has an *ifArray* or *ifAssociativeArray* interface, including arrays, associative arrays, and lists.

### Member Access Operator

The member access operator (i.e. [Dot Operator](docId\:Pl6ydtPGCTYDCA5q2bw45)) works with any object that has an *ifAssociativeArray* interface. It also works with any object when used to call a member function (i.e. method). It also has special meaning when used on an *roXMLElement* or *roXMLList* object.

[title] BrightScript Debug Console
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

The BrightScript language, which is interpreted and not compiled, has two available CLIs:

- The BrightSign shell which allows you to start scripts and some other device management tasks (see [What is the BrightSign Shell?](docId\:FXXyu9jmocUtC6XE2p7l2) for more information).
- The BrightScript debugger which is used to examine and manipulate a running BrightScript process

This page describes how to access these CLIs and the BrightScript debugger tool set.

## Connecting to the BrightScript Interpreter

To access both of these interfaces, you need to associate a terminal session from your local machine with the input and output of the BrightScript interpreter process. In a standard operating environment, the only interaction possible with the BrightScript interpreter is monitoring it’s output, since it will not accept input including interrupts.

To interact with either CLI, you must first set `script debug on`, which can be done in multiple ways. For example, in the DWS Registry tab, enter `registry write brightscript debug 1` (which is equivalent to the BrightSign shell command `script debug on`). When a physical connection to the player is available, these interfaces can be accessed via the primary serial port by using a terminal program and a null-modem cable (more details on [this page](docId\:FXXyu9jmocUtC6XE2p7l2)).

The BrightSign shell and debugger interfaces can also be routed over [Enable Telnet & SSH](docId\:L0L_gyiHAvtdBci9FFcQh).

## Accessing the Debugger

:::hint{type="info"}
If you haven’t turned on script debug, any interruption to the BrightScript interpreter execution will not give access to the debugger but will instead reboot the player to attempt a clean execution.
:::

### Automatic Access

If, while a script is running, a runtime error occurs or a `STOP` statement is encountered, the BrightSign application will enter the BrightScript debug console.

### Access at Bootup

You can also access the debug console at bootup:

1. Power off the player. 
2. Power on the player and wait between 5 and 15 seconds.
3. Press and hold the **SVC** button on the side of the player.
4. If you are using Telnet, you will need to restart Telnet by running `telnet {{your player IP address}} 23` on the command line.
5. Wait until the `BrightSign>` prompt appears in the serial/Telnet/SSH terminal (which indicates that you are in the [BrightSign Shell](docId\:FXXyu9jmocUtC6XE2p7l2)). You can now release the **SVC** button.
6. Enter `script` at the prompt while in the BrightSign Shell. This will take you to the BrightScript debug console.

### Access if the Player doesn’t have an Autorun.brs

The BrightSign OS does not register the **SVC** button event if there is no `autorun.brs` on the storage device. If this is the case, one of the following methods can be used to access the BrightSign prompt or BrightScript Debugger:

- If the serial console has been enabled (either temporarily or persistently), a `Starting BrightSign Application...` message will appear after the player reboots (which can take up to 30 seconds). Press and hold the **SVC** button until the BrightSign prompt displays.
- Put an `autorun.brs` that only contains `end` on the storage device. A single line of `end` is sufficient. The script will execute and when it ends as instructed you’ll be left at the BrightSign shell prompt.
- If you have removable storage such as a microSD card, eject it. Reboot the player and press the **SVC** button. If you are accessing the player through Telnet, you will have to restart the Telnet connection after the player reboots using the `telnet {{your player IP address}} 23` command.

## BrightScript Console

:::hint{type="info"}
The BrightScript console should only be used in development environments when writing software or debugging your player’s application software. It should be disabled for production deployments.
When the BrightScript debug console is enabled, if a runtime error is encountered from a BrightScript script, the BrightSign OS breaks on the line of the runtime error, allowing you to step through the file.
:::

### Console Scope

The console scope is set to the function that was running when the BrightScript debugger is invoked, either by choice or automatically. While in the console, you can type in any BrightScript statement; it will then be compiled and executed in the current context. If the interpreter has exited the running script, you can instead use the BrightSign shell command set.

### Commands

The following console commands are currently available in the BrightScript debug console:

| **Command**                   | **Description**                                            |
| ----------------------------- | ---------------------------------------------------------- |
| `bt`                          | Print a backtrace of call-function context frames.         |
| `classes`                     | List all public classes.                                   |
| `cont` or `c`                 | Continue script execution.                                 |
| `counts`                      | List count of BrightScript Component instances.            |
| `da`                          | Show disassembly and bytecode for this function.           |
| `down` or `d`                 | Move one position down the function context chain.         |
| `exit`                        | Exit the debug shell.                                      |
| `gc`                          | Run the garbage collector and show collection statistics.  |
| `hash`                        | Print the internal hash-table histograms.                  |
| `last`                        | Show the last line that executed.                          |
| `methods <class>`             | List methods provided by specified class.                  |
| `methods <class>.<interface>` | List methods provided by the specified interface or class. |
| `list`                        | List the current source of the current function.           |
| `ld`                          | Show line data (source records)                            |
| `next`                        | Show the next line to execute.                             |
| `bsc`                         | List all allocated BrightScript Component instances.       |
| `stats`                       | Show statistics.                                           |
| `step` or `s`                 | Step one program statement.                                |
| `t`                           | Step one statement and show each executed opcode.          |
| `up` or `u`                   | Move one function up the context chain.                    |
| `var`                         | Display local variables and their types/values.            |
| `print` or `p` or `?`         | Print variable value or expression.\*                      |

\*BrightScript `print` messages are routed to the BrightSign application console, which is accessible via the primary serial port or Telnet/SSH, as noted above.

[title] roJRE
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

This object allows you to load Java applications using the Java Runtime Environment (JRE) on the player. Java Runtime is no longer built into the firmware and roJRE is not invokable unless you run a BSFW file extension to add JRE to the player. After you install JRE, you must then invoke it to use roJRE. Contact BrightSign customer support to get the BSFW file extension.

The JRE uses OpenJDK 8 and is available on XTx44/43, XDx34/33, HDx24/23, LS424/423, and 4Kx42 models.

Object Creation: The *roJRE* object is instantiated with the Java package filename and an optional associative array that specifies JVM system properties and program arguments. You can use the `Type()` global function to determine if the package was successfully loaded.

```text
CreateObject("roJRE", filename As String, options As roAssociativeArray)
```

The associative array can contain two entries:

- `defines`: An associative array specifying system properties.
- `arguments` : An array specifying command-line arguments.

All property/argument values must be passed as strings. Note that associative-array keys are case insensitive (i.e. converted to all lowercase) by default; use the *roAssociativeArray.SetModeCaseSensitive()* method to enable case-sensitive keys.

### Example

```text
props = {}
props.SetModeCaseSensitive()
props["SYS_PROP_1"] = "system prop 1"
props["SYS_PROP_2"] = "system prop 2"
props["java.io.tmpdir"] = "/var/tmp"
 
jre = CreateObject("roJRE", "app.jar", { defines: props, arguments: [ "arg 1", "arg 2" ] })
if type(jre)="roJRE" then
	print "Successfully started Java runtime"
else
	print "Unable to start Java runtime"
end if
```


[title] roTouchScreen
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object accepts inputs from touchscreen panels or mice. For each recognized input, the object will generate an *roTouchEvent* object. See the "roTouchScreen" section of the [BrightScript-JavaScript Migration Guide](docId:2KEwWxLmpYcwu8tffuf2Z) for the equivalent methods in JavaScript.

Not all touchscreens are supported. Please see [this page](docId\:ACL5V8_jQiuq3SntxSNfO) for a full list of supported touchscreens. The *roTouchScreen* object responds to the clicks of a USB mouse in the same way it responds to touch events on a touchscreen.

To set up touchscreen/mouse interactivity, follow this outline:

1. Create an *roTouchScreen* instance.
2. Use `SetPort()` to specify an *roMessagePort* instance to receive the *roTouchScreen* events.
3. Define one or more touch regions.
   1. A touch region may be rectangular or circular.
   2. When a touch or click occurs anywhere inside the area of a touch region, an event will be sent to the message port.
   3. If touch regions overlap such that a click or touch hits multiple regions, an event for each affected region will be sent.
4. Process the events.

The *roTouchScreen* object supports rollover regions. Rollovers are based around touch regions. When a rectangular or circular region is added, it defaults to having no rollover. You can use the `EnableRollover()` method to add an *on* and *off* image for a region. Whenever the mouse cursor is within that region, the *on* image is displayed. In all other cases, the *off* image is displayed. This allows buttons to be highlighted as the mouse cursor moves over them.

## ifTouchScreen

### SetResolution(x As Integer, y As Integer) As Void

### AddRectangleRegion(x As Integer, y As Integer, w As Integer, h As Integer, region\_id As Integer) As Void

Adds a rectangular touch region to the screen. The region\_id is used to associate the touch region with *roTouchEvent* events and to link the region with rollover images.

### AddCircleRegion(x As Integer, y As Integer, radius As Integer, region\_id As Integer) As Void

Adds a circular touch region to the screen. The `region_id` is used to associate the touch region with *roTouchEvent* events and to link the region with rollover images.

### ClearRegions() As Void

Clears the list of regions added using `AddRectangleRegion()` or `AddCircleRegion()` so that any contacts in those regions no longer generate events. This call has no effect on the rollover graphics.

### GetDeviceName() As String

### SetCursorPosition(x As Integer, y As Integer) As Void

### SetCursorBitmap(filename As String, x As Integer, y As Integer) As Void 

Specifies a BMP or PNG file as the mouse cursor icon. This method also accepts a "hot spot" (i.e. the point within the icon rectangle that will trigger events when the mouse is clicked) as a set of **x,y** coordinates. The icon can be a rectangle of any width or height.

### EnableCursor(enable As Boolean) As Void

Displays a cursor on screen if passed `True`.

### EnableRollover(region\_id As Integer, on\_image As String, off\_image As String, cache\_image As Boolean, image\_player As Object) As Void

Enables a rollover for a touch region. This method accepts the ID of the touch region, as well as two strings specifying the names of the *on* and *off* bitmap images, a cache setting, and the image player that draws the rollover. The `cache_image` parameter simply tells the script whether to keep the bitmaps loaded in memory or not. This setting uses up memory very quickly, so we recommend that `cache_image` normally be set to 0.

### SetRollOverOrigin(region\_id As Integer, x As Integer, y As Integer) As Void

Changes the origin so that more (or less) of the screen changes when the mouse rolls in and out of the region. This means that bitmaps that are larger than the region can be drawn. The default requirement is that rollover bitmaps be the same size and position as the touch region. Note that the bitmap is square for circular regions. The default origin for circular regions is \[x - r]**,** \[y – r], where &#x78;**,** y is the center of the circle, and r is the radius.

:::hint{type="danger"}
The `EnableRollover()` and `SetRollOverOrigin()` methods have been deprecated. As of OS8, the end points exist but do not perform any function.
:::

### EnableRegion(region\_id As Integer, enabled As Boolean) As Void

Enables or disables a rollover region. This method accepts the ID of the touch region, as well as a Boolean value (True or False). The rollover regions default to "enabled" when created, but you can set up all of the regions at the start of your script and then enable regions as required.

### IsMousePresent() As Boolean

Returns `True` if a relative pointing device is attached to the player. This does not work for absolute devices like touchscreens.

### SetMouseRotation(rotation As Integer) As Boolean

Transforms mouse-movement inputs to account for screen rotation. This method can accept the following integers:

- 0: Inputs are unchanged (i.e. landscape orientation).
- 1, 90: Rotated 90 degrees (i.e. clockwise portrait orientation).
- 2, 180: Rotated 180 degrees.
- 3, 270: Rotated 270 degrees (i.e. counter-clockwise portrait orientation).

### EnableSerialTouchscreen(a As Integer) As Boolean

### SetSerialTouchscreenConfiguration(a As String) As Boolean

### GetDiagnosticInfo() As String

Returns an HTML string with captured information describing hardware that was connected and events that occurred during the calibration process. This method is used by the calibration script to diagnose touchscreen issues.

## ifSetMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roTouchEvent* and *roTouchCalibrationEvent* to the attached message port.

## ifTouchScreenCalibration

### StartCalibration() As Boolean

### GetCalibrationStatus() As Integer

### GetDiagnosticInfo() As String

### ClearStoredCalibration() As Boolean

### StartEventLogging() As Boolean

### StopEventLogging() As Boolean

### ClearEventLogs() As Boolean

### SetCalibrationRanges(x-min As Integer, x-max As Integer, y-min As Integer, y-max As Integer) As Boolean

Overrides the screen range values provided by the touchscreen. This method is useful when the entirety of the video output is not being displayed on the touch surface. Practical use of this method usually requires a custom calibration script, appropriate images, and a calibration setting matched to a particular setup.

## ifSerialControl

### SetBaudRate(baud\_rate As Integer) As Boolean

Sets the baud rate of the device. The supported baud rates are as follows: 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400.

### NotUsed1(a As String)

### SetMode(a As String) As Boolean

### NotUsed2(a As Boolean) As Boolean

## Examples

This script loops a video and waits for a mouse click or touchscreen input. It outputs the coordinates of the click or touch to the shell if it is located within the defined region.

```text
v=CreateObject("roVideoPlayer")
t=CreateObject("roTouchScreen")
p=CreateObject("roMessagePort")

v.SetPort(p)
t.SetPort(p)
v.SetLoopMode(True)
v.PlayFile("testclip.mp2v")

t.AddRectangleRegion(0,0,100,100,2)

loop:
    msg=Wait(0, p)
    print "type: ";type(msg)
    print "msg=";msg
    if type(msg)="roTouchEvent" then
        print "x,y=";msg.GetX();msg.GetY()
    endif
    goto loop:
```

This script includes mouse support:

```text
t=CreateObject("roTouchScreen")
t.SetPort(p)
REM Puts up a cursor if a mouse is attached
REM The cursor must be a 16 x 16 BMP
REM The x,y position is the "hot spot" point
t.SetCursorBitmap("cursor.bmp", 16, 16)
t.SetResolution(1024, 768)
t.SetCursorPosition(512, 389)
REM
REM Pass enable cursor display:  TRUE for on, and FALSE for off
REM The cursor will only enable if there is a mouse attached
REM
t.EnableCursor(true)
```

This script includes a rollover region and mouse support:

```text
img=CreateObject("roImagePlayer")
t=CreateObject("roTouchScreen")
p=CreateObject("roMessagePort")
t.SetPort(p)


t.SetCursorBitmap("cursor.bmp", 16, 16)
t.SetResolution(1024, 768)
t.SetCursorPosition(512, 389)
t.EnableCursor(true)


img.DisplayFile("\menu.bmp")


REM Adds a rectangular touch region
REM Enables rollover support for that region
REM Sets the rollover origin to the same position as the touch region REM
t.AddRectangleRegion(0, 0, 100, 100, 1)
t.EnableRollOver(1, "on.bmp", "off.bmp", true, img)
t.SetRollOverOrigin(1, 0, 0)
```

###


[title] Example Script
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

The following code uses GPIO buttons 1, 2, 3, 4 for controls. It will work on any BrightSign model that has a video output and a GPIO port.

```text
REM
REM The game of Snake
REM demonstrates BrightScript programming concepts
REM June 22, 2008
 
REM
REM Every BrightScript program must have a single Main()
REM
 
Sub Main()
 
    game_board=newGameBoard()
 
    While true
        game_board.SetSnake(newSnake(game_board.StartX(), game_board.StartY()))
        game_board.Draw()
        game_board.EventLoop()
        if game_board.GameOver() then ExitWhile
    End While
End Sub
 
 
REM *******************************************************
REM *******************************************************
REM ***************                   *********************
REM *************** GAME BOARD OBJECT *********************
REM ***************                   *********************
REM *******************************************************
REM *******************************************************
 
 
REM
REM An example BrightScript constructor.   "newGameBoard()" is regular Function of module scope
REM BrightScript Objects are "dynamic" and created at runtime.  They have no "class". 
REM The object container is a BrightScript Component of type roAssocitiveArray (AA).  
REM The AA is used to hold member data and member functions.
REM
 
Function newGameBoard() As Object
    game_board=CreateObject("roAssociativeArray")       ' Create a BrightScript Component of type/class roAssociativeArray
    game_board.Init=gbInit                         ' Add an entry to the AA of type roFunction with value gbDraw (a sub defined in this module)
    game_board.Draw=gbDraw
    game_board.SetSnake=gbSetSnake
    game_board.EventLoop=gbEventLoop
    game_board.GameOver=gbGameOver
    game_board.StartX=gbStartX
    game_board.StartY=gbStartY
    game_board.Init()                                   ' Call the Init member function (which is gbInit)
 
    return game_board
 
End Function
 
 
REM
REM gbInit() is a member function of the game_board BrightScript Object.
REM When it is called, the "this" pointer "m" is set to the appropriate instance by
REM the BrightScript bytecode interpreter
REM   
Function gbInit() As Void
    REM
    REM button presses go to this message port
    REM
    m.buttons = CreateObject("roMessagePort")
    m.gpio =  CreateObject("roGpioControlPort") 
    m.gpio.SetPort(m.buttons)
 
    REM
    REM determine optimal size and position for the snake gameboard
    REM
    CELLWID=16     ' each cell on game in pixels width
    CELLHI=16      ' each cell in pix height
    MAXWIDE=30    ' max width (in cells) of game board
    MAXHI=30      ' max height (in cells) of game board
    vidmode=CreateObject("roVideoMode")
    w=cint(vidmode.GetResX()/CELLWID)
    if w>MAXWIDE then w = MAXWIDE
    h=cint(vidmode.GetResY()/CELLHI)
    if h>MAXHI then h=MAXHI
 
    xpix = cint((vidmode.GetResX() - w*CELLWID)/2)     ' center game board on screen
    ypix = cint((vidmode.GetResY() - h*CELLHI)/2)      ' center game board on screen
 
    REM
    REM Create Text Field with square char cell size
    REM
    meta=CreateObject("roAssociativeArray")
    meta.AddReplace("CharWidth",CELLWID)
    meta.AddReplace("CharHeight",CELLHI)
    meta.AddReplace("BackgroundColor",&H202020)   'very dark grey
    meta.AddReplace("TextColor",&H00FF00)   ' Green
    m.text_field=CreateObject("roTextField",xpix,ypix,w,h,meta)
    if type(m.text_field)<>"roTextField" then
        print "unable to create roTextField 1"
        stop
    endif
End Function
 
REM
REM As Object refers to type BrightScript Component
REM m the "this" pointer
REM
Sub gbSetSnake(snake As Object)
    m.snake=snake
End Sub
 
 
Function gbStartX() As Integer
    return cint(m.text_field.GetWidth()/2)
End Function
 
 
Function gbStartY() As Integer
    return cint(m.text_field.GetHeight()/2)
End Function
 
 
Function gbEventLoop() As Void
 
    tick_count=0
 
    while true
        msg=wait(250, m.buttons)   ' wait for a button, or 250ms (1/4 a second) timeout
        if type(msg)="roGpioButton" then
            if msg.GetInt()=1 m.snake.TurnNorth()
            if msg.GetInt()=2 m.snake.TurnSouth()
            if msg.GetInt()=3 m.snake.TurnEast()
            if msg.GetInt()=4 m.snake.TurnWest()
        else  'here if time out happened, move snake forward
            tick_count=tick_count+1
            if tick_count=6 then
                tick_count=0
                if m.snake.MakeLonger(m.text_field) then return
            else
                if m.snake.MoveForward(m.text_field) then return
            endif
        endif
    end while
 
End Function
 
 
Sub gbDraw()
    REM
    REM given a roTextField Object in "m.text_field", draw a box around its edge
    REM
 
    solid=191   ' use asc("*") if graphics not enabled
    m.text_field.Cls()
 
    for w=0 to m.text_field.GetWidth()-1
        print #m.text_field,@w,chr(solid);
        print #m.text_field,@m.text_field.GetWidth()*(m.text_field.GetHeight()-1)+w,chr(solid);
    end for
 
    for h=1 to m.text_field.GetHeight()-2
        print #m.text_field,@h*m.text_field.GetWidth(),chr(solid);
        print #m.text_field,@h*m.text_field.GetWidth()+m.text_field.GetWidth()-1,chr(solid);
    end for
 
    m.snake.Draw(m.text_field)
 
End Sub
 
Function gbGameOver() As Boolean
    msg$= " G A M E    O V E R "
    msg0$="                    "
    width = m.text_field.GetWidth()
    height = m.text_field.GetHeight()
 
    while true
        print #m.text_field,@width*(height/2-1)+(width-len(msg$))/2,msg$;
        sleep(300)
        print #m.text_field,@width*(height/2-1)+(width-len(msg$))/2,msg0$;
        sleep(150)
        REM  GetMessage returns the message object, or an int 0 if no message available
        If m.buttons.GetMessage() <> invalid Then Return False
    endwhile
 
End Function
 
 
REM *******************************************************
REM *******************************************************
REM ******************              ***********************
REM ****************** SNAKE OBJECT ***********************
REM ******************              ***********************
REM *******************************************************
REM *******************************************************
 
REM
REM construct a new snake BrightScript object
REM
Function newSnake(x As Integer, y As Integer) As Object
 
' Create AA BrightScript Component; the container for a "BrightScript Object"
    snake=CreateObject("roAssociativeArray")   
    snake.Draw=snkDraw
    snake.TurnNorth=snkTurnNorth
    snake.TurnSouth=snkTurnSouth
    snake.TurnEast=snkTurnEast
    snake.TurnWest=snkTurnWest
    snake.MoveForward=snkMoveForward
    snake.MakeLonger=snkMakeLonger
    snake.AddSegment=snkAddSegment
    snake.EraseEndBit=snkEraseEndBit
 
    REM
    REM a "snake" is a list of line segments
    REM a line segment is an roAssociativeArray that conains a length and direction (given by the x,y delta needed to move as it is drawn)
    REM
 
    snake.seg_list = CreateObject("roList")
    snake.AddSegment(1,0,3)
 
    REM
    REM The X,Y pos is the position of the head of the snake
    REM
    snake.snake_X=x
    snake.snake_Y=y
    snake.body=191   ' use asc("*") if graphics not enabled.
    snake.dx=1      ' default snake direction / move offset
    snake.dy=0      ' default snake direction / move offset
 
    return snake
 
End Function
 
 
Sub snkDraw(text_field As Object)
    x=m.snake_X
    y=m.snake_Y
    for each seg in m.seg_list
        xdelta=seg.xDelta
        ydelta=seg.yDelta
        for j=1 to seg.Len
            text_field.SetCursorPos(x, y)
            text_field.SendByte(m.body)
            x=x+xdelta
            y=y+ydelta
        end for
    end for
End Sub
 
 
Sub snkEraseEndBit(text_field As Object)
    x=m.snake_X
    y=m.snake_Y
    for each seg in m.seg_list
        x=x+seg.Len*seg.xDelta
        y=y+seg.Len*seg.yDelta
    end for
 
    text_field.SetCursorPos(x, y)
    text_field.SendByte(32)    ' 32 is ascii space, could use asc(" ")
 
End Sub
 
 
Function snkMoveForward(text_field As Object)As Boolean
    m.EraseEndBit(text_field)
    tail=m.seg_list.GetTail()
    REM
    REM the following shows how you can use an AA's member functions to perform the same
    REM functions the BrightScript . operator does behind the scenes for you (when used on an AA).
    REM there is not point to this longer method other than illustration
    REM
    len=tail.Lookup("Len")          ' same as len = tail.Len (or tail.len, BrightScript syntax is not case sensative)
    len = len-1
    if len=0 then
        m.seg_list.RemoveTail()
    else
        tail.AddReplace("Len",len)  ' same as tail.Len=len
    endif
 
    return m.MakeLonger(text_field)
 
End Function
 
Function snkMakeLonger(text_field As Object) As Boolean
    m.snake_X=m.snake_X+m.dx
    m.snake_Y=m.snake_Y+m.dy
    text_field.SetCursorPos(m.snake_X, m.snake_Y)
    if text_field.GetValue()=m.body then return true
    text_field.SendByte(m.body)
    head = m.seg_list.GetHead()
    head.Len=head.Len+1
    return false
End Function
 
Sub snkAddSegment(dx As Integer, dy As Integer, len as Integer)
 
    aa=CreateObject("roAssociativeArray")
    aa.AddReplace("xDelta",-dx)  ' line segments draw from head to tail
    aa.AddReplace("yDelta",-dy)
    aa.AddReplace("Len",len)
    m.seg_list.AddHead(aa)
 
End Sub
 
 
Sub snkTurnNorth()
    if m.dx<>0 or m.dy<>-1 then m.dx=0:m.dy=-1:m.AddSegment(m.dx, m.dy, 0)      'north
End Sub
 
Sub snkTurnSouth()
     if m.dx<>0 or m.dy<>1 then m.dx=0:m.dy=1:m.AddSegment(m.dx, m.dy, 0)       'south
End Sub
 
Sub snkTurnEast()
     if m.dx<>-1 or m.dy<>0 then m.dx=-1:m.dy=0:m.AddSegment(m.dx, m.dy, 0)     'east
End Sub
 
Sub snkTurnWest()
     if m.dx<>1 or m.dy<>0 then m.dx=1:m.dy=0:m.AddSegment(m.dx, m.dy, 0)       'west
End Sub
```


[title] roStorageHotplug
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This object provides *roStorageAttached* messages when storage devices appear and *roStorageDetached* messages when storage devices disappear. An *roStorageAttached* event is not delivered until the filesystem is mounted. The JavaScript equivalent is Node.js `fs.watch()`. 

There is currently no way to poll for media. 

:::hint{type="info"}
See [this page](docId\:qcEvA3OCMVeT4jzT5L6PE) for more information about device storage paths.
:::

Object Creation: The *roStorageHotplug* object is created with no parameters.

```text
CreateObject("roStorageHotplug")
```

## ifStorageHotplug

### GetStorages() as Object

Returns an ordered array of strings where each string is a drive specifier where the OS will look for an autorun script. For example: `[ "USB1:/", "SD:/", "SD2:/", "SSD:/", "Flash:/" ]`. Note that note all drive specifiers may be present or even possibly present on the particular player.

### GetStorageStatus(drive As String) As roAssociativeArray

Returns the current status of a storage device ("USB:", "SD:", "SSD:", "SD2:/", "Flash:"), even if it is not mounted. This method returns an associative array containing the following:

| **Key**    | **Value Type** | **Description**                                                    |
| ---------- | -------------- | ------------------------------------------------------------------ |
| `present`  | Boolean        | Indicates whether the specified device is present.                 |
| `mounted`  | Boolean        | Indicates whether the specified device is mounted.                 |
| `corrupt`  | Boolean        | Indicates whether the specified device is believed to be corrupt.  |
| `checking` | Boolean        | Indicates whether the specified device is currently being checked. |

:::hint{type="info"}
The results of the `GetStorageStatus()` method are unreliable when called with a "USBn:" parameter, where "n" is a positive integer indicating a USB storage device when multiple USB devices are connected to the player.
:::

Example:

```text
 status = CreateObject("roStorageHotplug").GetStorageStatus("SSD:")
 if not status.mounted and not status.checking and status.present then
    ' Should ask for confirmation here
    FormatDrive("SSD:")
 end if 
```

## ifFailureReason

### GetFailureReason() As String

Returns additional diagnostic information if a method returns `False`.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via SetUserData(). It will return Invalid if no data has been set.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roStorageAttached* and *roStorageDetached*  to the attached message port.

:::hint{type="info"}
In order to avoid race conditions at startup, you should check for any storage devices that might have existed prior to the message port being set. We recommend doing this after the object is created and the message port is set, but before instructing the script to wait for any events.
:::

## Example

```text
Sub Main()
    mp = CreateObject("roMessagePort")
    sh = CreateObject("roStorageHotplug")
    gpio = CreateObject("roControlPort", "brightsign")

    sh.SetPort(mp)
    gpio.SetPort(mp)

    finished = false
    while not finished
    ev = mp.WaitMessage(0)
    if type(ev) = "roControlDown"
        finished = true
    else if type(ev) = "roStorageAttached"
        print "ATTACHED "; ev.GetString()
    else if type(ev) = "roStorageDetached"
        print "DETACHED "; ev.GetString()
    else
        print type(ev)
        stop
    end if
    end while
End Sub 
```


[title] roAudioPlayerMx
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object allows you to mix audio files, as well as HLS audio streams. Each roAudioPlayerMx object contains two internal audio players: The main audio playlist consists of queued audio tracks that play sequentially, while the audio overlay plays files on top of the main playlist. A fade will not occur if it is called while an overlay is playing, but the next audio track will start playing as expected. 

Tracks are queued to `PlayFile()` with their fade parameters specified in an [associative array](docId\:sb0Om1Y-OQlapFqNFS0XY). These are the parameters you can pass to `PlayFile()`:

- `Filename`: The filename of the track
- `FrontPorch`: The length (in milliseconds) to skip from the start of the track. This value is 0 by default.
- `FadeOutLocation`: The location (in milliseconds) of the fade out relative to the value of the `FrontPorch`. If the `FrontPorch` value is `0` (which is the default setting), and the `FadeOutLength` value is non-zero, then the fade out is calculated back from the end of the file.
- `FadeOutLength`: The length of the fade out (in milliseconds). This value is 0 by default.
- `SegueLocation`: The location (in milliseconds) of the event that triggers the next audio file to play. This location is relative to the first audio file that is played. If the `SegueLocation` parameter is not included, the value defaults to the `FadeOutLocation`.
- `BackPorchLocation`: The location (in milliseconds) of the termination point for the audio track. This location is relative to the first audio file that is played. If the `BackPorchLocation` parameter is not included, the audio file plays to the end. The value is 0 by default, which disables the back porch.
- `TrackVolume`: The relative volume of of the audio track, measured as a percentage. Specify the percentage using values between 0 and 100.
- `EventID`: The ID for an audio event.
- `EventTimeStamp`: The timestamp for the audio event. There can only be one event per audio file.
- `QueueNext`: The queuing of an audio track. Set the parameter value to 1 to queue an audio file to play after the current track.
- `Overlay`: The overlay specification of an audio track. Set the parameter value to 1 to fade down the main audio playlist while playing the audio track as an overaly. Overlays have additional parameters:
  - `AudioBedLevel`: The volume-level percentage of the main audio playlist while the overlay is playing. Specify the percentage using values between 0 and 100.
  - `AudioBedFadeOutLength`: The fade-out length of the main audio playlist.
  - `AudioBedFadeInLength`: The fade-in lenth for the length of the underlying audio track once the segue is triggered.
- `FadeCurrentPlayNext`: A fade command. Set the parameter value to 1 to fade out the current main audio playlist track and fade in the designated audio file.
- `CrossfadeCurrentPlayNext`: A crossfade command. Set the parameter value to 1 to force an immediate crossfade between the current main audio playlist track and the designated audio file.
- `UserString`: A string that can be set to a unique value for each *roAudioPlayerMx* instance. This string is returned with every event generated by the instance. Since all current platforms can support multiple *roAudioPlayerMx* instances running at the same time, the UserString allows the script to distinguish between event returns.

The following diagram illustrates how some of these timing parameters work together:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/gl6WpSStMN95R89anRs4K_ormroaudioplayermx.png" size="60" width="864" height="274" position="center" darkWidth="864" darkHeight="274" showCaption="false"}

The following script illustrates a simple crossfade between audio tracks:

```text
a = CreateObject("roAudioPlayerMx")
 
track1 = CreateObject("roAssociativeArray")
track1["Filename"] = "file1.mp3"
track1["FadeInLength"] = 4000
track1["FadeOutLength"] = 4000
track1["QueueNext"] = 1
 
track2 = CreateObject("roAssociativeArray")
track2["Filename"] = "file2.mp3"
track2["FadeInLength"] = 4000
track2["FadeOutLength"] = 4000
track2["QueueNext"] = 1
 
a.PlayFile(track1)
a.PlayFile(track2)
```

## ifMediaTransport

See *roVideoPlayer* for a description of *ifMediaTransport* methods.

## ifAudioControl

See *roAudioPlayer* for a description of *ifAudioControl* methods.

## ifSetMessagePort

### SetPort(a As Object)

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

## ifIdentity

### GetIdentity() As Integer

:::hint{type="info"}
The *ifIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::

## ifAudioControlMx

### SetDecoderCount(a As Integer) As Boolean


[title] roSqliteStatement
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This object is created by calling the `CreateStatement()` method on an *roSqliteDatabase* object. The JavaScript equivalent is to use the IndexedDB.

## ifSqliteStatement

All *bind* methods return True upon success.

### BindByName(associative\_array As Object) As Boolean

Binds the SQL variable(s) using the names contained in the SQL statement.

### BindByOffset(associative\_array/enumerable As Object) As Boolean

Binds the SQL variable(s) using the index contained in the SQL statement. If passed an associative array, this method will convert the keys of the associative array into numeric offsets when binding. If passed an enumerable object (e.g. *roArray*), it will bind the values of the enumerable in the order that they are stored.

### BindText(variable/index As Object, value As String) As Boolean

Binds the SQL variable indicated by the name or index parameter to the passed string value.

### BindInteger(variable/index As Object, value As Integer) As Boolean

Binds the SQL variable indicated by the name or index parameter to the passed integer value.

### Run() As Integer

Runs the SQL statement immediately and waits for the integer result. The following are possible integer result codes:

- 100: Statement complete
- 101: Busy
- 102: Rows available

### RunBackground() As Integer

Runs the SQL statement in the background. You can use *roSqliteDatabase.SetPort()* to set a message port that will receive an *roSqliteEvent* message at a later point. The RunBackground() call will result in an integer transaction ID, which will appear in the *roSqliteEvent* message that matches the transaction.

### GetData() As Object

Returns an associative array of name/value pairs that are available after a SELECT (or similar) operation.

### Finalise()

Finalizes the statement. This method should be applied to statements before the parent database is closed. The object should not be used after this method is called. Also note that objects are automatically finalized when they are deleted.

## Examples

The following script inserts into a table using the `BindByName()` method:

```text
insertStmt = db.CreateStatement("INSERT INTO playback (md5,path,playback_count) VALUES(:md5_param,:path_param,:pc_param);")

print insertStmt

if type(insertStmt) <> "roSqliteStatement" then
    print "We didn't get a statement returned!!"
    end
endif

params = { md5_param: "ABDEF12346",  path_param: "/foo/bar/bing/bong", pc_param: 11 }

bindResult = insertStmt.BindByName(params)

if bindResult
    print "BindByName OK"
else
    print "BindByName FAILED"
    end
endif

sqlResult = insertStmt.Run()

print sqlResult

if sqlResult = SQLITE_COMPLETE
    print "Table Insertion OK"
else
    print "Table Insertion FAILED"
endif

insertStmt.Finalise()
```

The following script inserts into a table in the background:

```text
' This examples assume you have set a message port on your roSqliteDatabase instance
'

insertStmt = db.CreateStatement("INSERT INTO playback (md5,path,playback_count) VALUES(:md5_param,:path_param,:pc_param);")

print insertStmt

if type(insertStmt) <> "roSqliteStatement" then
    print "We didn't get a statement returned!!"
    end
endif

params = { md5_param: "ABDEF12348",  path_param: "/foo/bar/bing/bong", pc_param: 13 }

bindResult = insertStmt.BindByName(params)

if bindResult
    print "BindByName OK"
else
    print "BindByName FAILED"
    end
endif

expectedId = insertStmt.RunBackground()

e = mp.WaitMessage(10000)
if e <> invalid then
    if type(e) = "roSqliteEvent" then
        transId = e.GetTransactionId()
        sqlResult = e.GetSqlResult()
        print transId
        print sqlResult
        if transId <> expectedId then
            print "Incorrect transaction Id"
            end
        endif
        if sqlResult <> SQLITE_COMPLETE then
            print "SQL Insertion Failed"
            end
        endif
    else
        print "RunBackground() - Wrong event - FAILED"
        end
    endif
else
    print "RunBackground() - No Response - FAILED"
    end
endif

' You don't need to call Finalise() since that'll be done by the background processor.
```

The following script queries from a table:

```text
selectStmt = db.CreateStatement("SELECT * FROM playback;")

if type(selectStmt) <> "roSqliteStatement" then
    print "We didn't get a statement returned!!"
    end
endif

sqlResult = selectStmt.Run()

print sqlResult

while sqlResult = SQLITE_ROWS
    resultsData = selectStmt.GetData()
    print resultsData;
    sqlResult = selectStmt.Run()
end while

selectStmt.Finalise()
```

[title] roAssetFetcherProgressEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Content Management Objects/

This event is generated by the *roAssetFetcher* object at regular intervals during file downloads. Use the *roAssetFetcher.SetFileProgressIntervalSeconds()* method to customize how often progress events are generated. 

## ifAssetFetcherProgressEvent

### GetFileName() As String

Returns the name of the file associated with the event. The file name is retrieved from the sync spec associated with the *roAssetFetcher* that generated the event.

### GetFileIndex() As Integer

Returns the zero-based index from the sync spec of the file associated with the event.

### GetFileCount() As Integer

Returns the total number of files within the sync spec.

### GetCurrentFileTransferredMegabytes() As Integer

Returns the number of transferred megabytes belonging to the file associated with the event.

### GetCurrentFileSizeMegabytes() As Integer

Returns the size of the file associated with the event.

### GetCurrentFilePercentage() As Float

Returns a floating-point number representing the download percentage of the file associated with the event.

:::hint{type="info"}
The file size/percentage returned by the methods above is derived from the asset `size` in the associated *roAssetCollection* or sync spec–not from the HTTP "Content-Length" header. Specifying an asset `size` of zero will cause these methods to return zero.
:::

## ifUserData

### SetUserData(user\_data As Object) As Void

Sets the user data.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` (on either the event or source object). It will return Invalid if no data has been set.

[title] roAssetCollectionView
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Content Management Objects/

Th&#x65;*&#x20;roAssetCollectionView* method lets you mount an asset collection as a file system. It is much more lightweight than using roAssetRealizer, which copies the files and avoids the need to look up pool file names using `roAssetPoolFiles`.

Object Creation: The *roAssetCollectionView* constructor takes two parameters, an *roAssetPool* and an *roAssetCollection*:

:::BlockQuote
CreateObject("roAssetCollectionView", pool As roAssetPool, collection As roAssetCollection)
:::

Once the object is created, the device creates a temporary file system in the */storage/POOL&#x20;*&#x64;irectory on the player (the *POOL* directory is determined at runtime). To be able to get the real path of a file in *roAssetPool*, the application should call the *GetPath&#x20;*&#x6D;ethod.&#x20;

**ifAssetCollectionView**

**GetPath() as String**

This method returns a drive name that contains the viewed files. For example:

:::BlockQuote
print view\.GetPath()
:::

might yield `` `POOL1:` `` or some other drive name.

HTML, JavaScript, or BrightScript applications can refer to the files in the asset collection by name relative to this root path. Note that you will need to call `MapFilenameToNative()` to convert filenames to a form that they can be used from JavaScript and HTML.


[title] roMessagePort
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

A message port is the destination where messages (events) are sent. See the explanation of [Event Loops](docId\:YlhbUaX_eQfA5sqFjUKpn) for more details. You do not call these functions directly when using BrightScript. Instead, use the `Wait()` [global function](docId\:nSjXffR7OlFgDWgjFEbMe).

## ifMessagePort

### GetMessage() As Object

Returns the event object if available. Otherwise, `Invalid` is returned. In either case, this method returns immediately without waiting.

### WaitMessage(timeout As Integer) As Object

Waits until an event object is available or the specified amount of milliseconds have passed. When an event object becomes available, it will be returned. If the timeout is reached, Invalid will be returned. Passing a zero timeout value instructs this method to wait indefinitely for a message.

You can also use the `Wait()` global function to retrieve event objects over a specified interval. The following two statements have the same effect:

```text
msg = port.WaitMessage(timeout)
msg = wait(timeout, port)
```

### PostMessage(msg As Object) As Void

### PeekMessage() As Object

Returns the event object if available (or Invalid if otherwise), but does not remove the event object from the message queue; a later call to `GetMessage()`, `WaitMessage()`, or `PeekMessage()` will return the same event object. 

### SetWatchdogTimeout(seconds As Integer) As Integer

Enables a watchdog timeout on the *roMessagePort* instance if passed a positive integer. The watchdog will crash and reboot the player if the script does not call `GetMessage()` or `WaitMessage()` after the specified number of seconds (the timeout is blocked while the script waits on the message port). Passing zero to this method disables the watchdog.

Some BrightScript operations (e.g. *roAssetRealizer.Realize()*) can take a long time to return. In these cases, it may be better to use a short watchdog timeout in general but switch to a longer timeout before calling such operations.

The watchdog timeout only applies to its associated *roMessagePort* instance, so enabling the watchdog on one *roMessagePort* instance, then calling `WaitMessage()` on another, may cause the watchdog to trigger unexpectedly. The watchdog will not trigger while waiting on the BrightScript debugger prompt. 

### DeferWatchdog(seconds As Integer)

Defers the watchdog timeout set by the `SetWatchdogTimeout()` method. Passing an integer to this method defers the timeout for the specified number of seconds.

### DeferWatchdog()

Defers the watchdog timeout by the amount of seconds set in the `SetWatchdogTimeout()` method.

:::hint{type="info"}
Calls to either `DeferWatchdog()` method cannot cause the watchdog to trigger earlier than it already will. For example, calling `DeferWatchdog(100)` followed by `DeferWatchdog(10)` will still cause the watchdog to trigger after 100 seconds.
:::

## ifEnum

### Reset()

Resets the position to the first element of enumeration.

### Next() As Dynamic

Returns the typed value at the current position and increment position.

### IsNext() As Boolean

Returns `True` if there is a next element.

### IsEmpty() As Boolean

Returns `True` if there is not a next element.

[title] roImageWidget
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object can be used in place of *roImagePlayer* in cases where the image is displayed within a rectangle. Using an *roImageWidget* can result in more pleasing aesthetics for image player creation; it can also be used to display images in a multi-screen array. Beyond this, *roImageWidget* behaves identically to *roImagePlayer*. The JavaScript equivalent is the [`<img>`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img) tag in HTML

Object Creation: The image widget area is generated using an *roRectangle* object.

```text
rectangle = CreateObject("roRectangle", 0, 0, 1024, 768)
i = CreateObject("roImageWidget", rectangle)
```

## ifImageControl 

### DisplayFile(image\_filename As String) As Boolean

Displays the image with the specified filename. The image\_filename string must point to a *.png*, *.jpeg*, or 8-bit, 24-bit, or 32-bit *.bmp* file. Note that *.jpeg* image files with CMYK color profiles are not supported.

### DisplayFile(parameters As roAssociativeArray) As Boolean

Displays an image using an associative array of display parameters:

- `Filename`: The name of the image file
- `Mode`: The image mode. See the entry for SetDefaultMode() below for more details.
- `Transition`: The image transition setting. See the entry for SetDefaultTransition() below for more details.
- `EncryptionAlgorithm`: The file-encryption algorithm. Currently the options are "AesCtr" and "AesCtrHmac".
- `EncryptionKey`: The key to decrypt the image file. This is a byte array consisting of 128 bits of key, followed by 128 bits of IV.

See the [Image Decryption](docId:0UMXqYvruY7DRNLuUZAFp) descrption in the *roImagePlayer* entry for details on displaying encrypted images.

### PreloadFile(image\_filename As String) As Boolean

Loads the specified image file into an offscreen memory buffer.

### PreloadFile(parameters As roAssociativeArray) As Boolean

Loads an image file into an offscreen memory buffer. Image display properties are determined by an associative array of parameters:

- `Filename`: The name of the image file
- `Mode`: See the entry for SetDefaultMode() below for more details.
- `Transition`: See the entry for SetDefaultTransition() below for more details.

### DisplayPreload() As Boolean

Uses the on-screen memory buffer to display the image stored in the offscreen memory buffer using `PreloadFile()`. There are only two memory buffers: one is displayed on screen; and the other is used for preloading images. `PreloadFile()`can be called multiple times before `DisplayPreload()` is called, and will keep loading into the same off-screen buffer. The `DisplayFile()` method calls `PreloadFile()` followed immediately by `DisplayPreload()`, so any previously preloaded image will be lost. If no image is preloaded, `DisplayPreload()` will have no effect.

### StopDisplay() As Boolean

Removes an image from the display.

### DisplayFileEx(filename As String, mode As Integer, x As Integer, y As Integer) As Boolean

### PreloadFileEx(filename As String, mode As Integer, x As Integer, y As Integer) As Boolean

### SetDefaultMode(mode As Integer) As Boolean

Sets the default image display mode for DisplayFile() and PreloadFile(). If SetDefaultMode() is not called, then the default mode is set to 0 (equivalent to the image being centered without scaling). The supported display mode are listed below:

- **0 – Center image**: No scaling takes place. Cropping only occurs if the image is bigger than the window.
- **1 – Scale to fit**: The image is scaled so that it is fully viewable, with its aspect ratio maintained.
- **2 – Scale to fill and crop**: The image is scaled so that it completely fills the window, with its aspect ratio maintained.
- **3 – Scale to fill**: The image is stretched so that it fills the window and the whole image is viewable. The aspect ratio will not be maintained if it is different from the window.

### SetDefaultTransition(transition As Integer) As Boolean

Sets the transition to be used when the next image is displayed. The following are available transitions:

- 0: No transition: immediate blit
- 1-4: Wipes from top, bottom, left, or right.
- 5-8: Explodes from centre, top left, top right, bottom left, or bottom right.
- 10-11: Uses vertical or horizontal venetian-blind effect.
- 12-13: Combs vertical or horizontal.
- 14: Fades out to background color, then back in.
- 15: Fades between current image and new image.
- 16-19: Slides from top, bottom, left or right.
- 20-23: Slides entire screen from top, bottom, left, or right.
- 24-25: Scales old image in, then the new one out again (this works as a pseudo rotation around a vertical or horizontal axis).
- 26-29: Expands a new image onto the screen from right, left, bottom, or top

### SetTransform(transform As String) As Boolean

Applies one of eight transforms to the image. Calls to this method only take effect when the next file is displayed. Note that the image rectangle itself does not change to accommodate the new height and width ratio of a transformed image. This method can be called separately on multiple *roImagePlayer* or *roImageWidget* instances.

- `identity`: No transformation (default behavior)
- `rot90`: 90 degree clockwise rotation
- `rot180`: 180 degree rotation
- `rot270`: 270 degree clockwise rotation
- `mirror`: Horizontal mirror transformation
- `mirror_rot90`: Mirrored 90 degree clockwise rotation
- `mirror_rot180`: Mirrored 180 degree clockwise rotation
- `mirror_rot270`: Mirrored 270 degree clockwise rotation

### OverlayImage(image\_filename As String, x As Integer, y As Integer) As Boolean

Composites the image with the specified filename on top of the primary `DisplayFile()` image. Use the `x` and `y` integers to specify its location within the image widget.

### SetRectangle(r As roRectangle) As Boolean

Changes the size and positioning of the image rectangle using the passed *roRectangle* object.

### GetRectangle() As roRectangle

Returns an *roRectangle* object that has the same location and dimensions as the *roRectangle* object used to define the image window.

### CreateTestHole(hole As roRectangle) As Boolean

Creates a hole in the image with the location and dimensions specified in the passed *roRectangle* instance. Any video windows located directly beneath the image will show through. This method will disrupt image playback and should be used for test purposes only.

### SetTransitionDuration(duration As Integer) As Boolean

Sets the amount of time it takes (in milliseconds) for a specified transition effect to take place. The default transition duration is 1000 milliseconds.

### DisplayBuffer(a As Object, b As Integer, c As Integer) As Boolean

### Hide() As Boolean

Hides the image currently being displayed by the *roImageWidget* instance.

### Show() As Boolean

Shows the image currently being displayed by the *roImageWidget* instance.

## Multiscreen Images

This object includes overloaded `PreloadFile()` and `DisplayFile()` methods. These methods receive an *roAssociativeArray* object that stores various options to be passed. They must be used when displaying images across multiple screens in an array, or displaying a portion of an image—though they can also be used in place of the original method calls in all cases.

The following code uses the `PreloadFile()` method for a multiscreen display:

```text
i=CreateObject("roImageWidget")
a=CreateObject("roAssociativeArray")
a["Filename"] = "test.jpg"
a["Mode"] = 1
a["Transition"] = 14
a["MultiscreenWidth"] = 3
a["MultiscreenHeight"] = 2
a["MultiscreenX"] = 0
a["MultiscreenY"] = 0
i.PreloadFile(a)
i.DisplayPreload
```

The `filename`, `mode`, and `transition` values are the same as those documented for the `DisplayFile()` and `PreloadFile()` methods above. The `MultiscreenWidth` and `MultiscreenHeight` parameters specify the width and height of the multi-screen matrix. For example, 3x2 would be three screens wide and two screens high. The `MultiscreenX` and `MultiscreenY` specify the position of the current screen within that matrix.

In the above case, on average only 1/6 of the image is drawn on each screen, though the image mode still applies so that, depending on the shape of the image, it may have black bars on the side screens. It is relatively simple, therefore, for an image widget to display part of an image based on its position in the multiscreen array. The following are default values for the parameters:

- Mode = 0
- Transition = 0
- MultiscreenWidth = 1
- MultiscreenHeight = 1
- MultiscreenX = 0
- MultiscreenY = 0

This code uses `DisplayFile()` to display a portion of an image:

```text
i=CreateObject("roImageWidget")
a=CreateObject("roAssociativeArray")
a["Filename"] = "test.JPG"
a["Mode"] = 0
a["MultiscreenX"] = 600
a["MultiscreenY"] = 600
a["MultiscreenWidth"] = 400
a["MultiscreenHeight"] = 400
i.DisplayFile(a)
```

This displays just a portion of the image test JPG starting at coordinates `SourceX`, `SourceY`, and `SourceWidth` by `SourceHeight` in size. The `viewmode` is still honored as if it were displaying the whole file.

[title] roAssetRealizerEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Content Management Objects/

This event object is returned by the *roAssetRealizer.Realize()* method. It yields information about the success or failure of the realization process.

## ifAssetRealizerEvent

### GetEvent() As Integer 

Returns an integer value indicating the type of the event:

|      |                                |                                                                                                                                                                                                                                                      |
| ---- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 101  | EVENT\_REALIZE\_SUCCESS        | The specified sync list was successfully realized.                                                                                                                                                                                                   |
| -102 | EVENT\_REALIZE\_INCOMPLETE     | Realization could not begin because at least one of the required files is not available in the pool.                                                                                                                                                 |
| -103 | EVENT\_REALIZE\_FAILED\_SAFE   | Realization has failed. Nothing has been written to the destination, so it is likely safe to continue the realization process. More information is about the failure is available via the `GetFailureReason()` and `GetName()` methods.              |
| -104 | EVENT\_REALIZE\_FAILED\_UNSAFE | Realization has failed while running, and changes have been made to destination files. It may not be safe to continue the realization process. More information about the failure is available via the `GetFailureReason()` and `GetName()` methods. |

### GetName() As String

Retrieves the name of the affected file if the realization process fails.

### GetResponseCode() As Integer

Retrieves the *roUrlTransfer* response code associated with the event (if any).

### GetFailureReason() As String

Returns additional information if the realization process fails.

### GetFileIndex() As Integer

Retrieves the zero-based index number of the the file in the sync spec.

## ifUserData

### SetUserData(user\_data As Object) As Void

Sets the user data.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` (on either the event or source object). It will return Invalid if no data has been set.

[title] roAssetFetcher
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Content Management Objects/

This object contains functions for downloading files to the pool. BrightSign enables the *http\://, https\://, ftp\://,* and *file://* protocols.

The JavaScript equivalent is [assetpoolfetcher](docId\:hg03EuSH_xKKpfoFWdgCz).

Object Creation: The *roAssetFetcher* object must be passed an *roAssetPool* instance upon creation.

```text
CreateObject("roAssetFetcher", pool As roAssetPool)
```

### Example

```text
Pool = CreateObject("roAssetPool", "pool")
Fetcher = CreateObject("roAssetFetcher", Pool)
```

## ifAssetFetcher

### GetFailureReason() As String

Returns an error string if an *roAssetFetcher* method has failed (this is usually indicated by returning False). The error string may help diagnose the failure.

### SetUserAndPassword(user As String, password As String) As Boolean

Sets the default user and password strings to be used for all download requests that are not otherwise marked using the following attributes: `<auth inherit=”no”>` or `<auth user=”user” password =”password”>`.

### EnableUnsafeAuthentication(enable As Boolean) As Boolean

Supports basic HTTP authentication if `True`. HTTP authentication uses an insecure protocol, which might allow others to easily determine the password. The *roAssetFetcher* object will still prefer the stronger digest HTTP if it is supported by the server. If this method is `False` (which is the default setting), it will refuse to provide passwords via basic HTTP authentication, and any requests requiring this authentication will fail.

### EnableUnsafeProxyAuthentication(enable As Boolean) As Boolean

Supports basic HTTP authentication against proxies if `True` (which, unlike `EnableUnsafeAuthentication()`, is the default setting). HTTP authentication uses an insecure protocol, which might allow others to easily determine the password. If this method is `False`, it will refuse to provide passwords via basic HTTP authentication, and any requests requiring this authentication type will fail.

### EnableEncodings(enable As Boolean) As Boolean

Enables HTTP compression, which communicates to the server that the system can accept any encoding that the *roAssetFetcher* object is capable of decoding by itself (this behavior is enabled by default). Supported encodings currently include "deflate" and "gzip", which allow for transparent compression of responses. Clients of the *roAssetFetcher* instance see only the decoded data and are unaware of the encoding being used.

### AsyncDownload(assets As roAssetCollection) As Boolean

Begins populating the asset pool using the files listed in the passed *roAssetCollection* instance. Files that are not already in the pool will be downloaded automatically. Events are raised during the download process to indicate whether individual file downloads have succeeded or failed; finally, a single event will be raised indicating whether the entire asset collection has been downloaded successfully or not. See the *roAssetFetcherEvent* and *roAssetFetcherProgressEvent* entries for more details.

### AsyncSuggestCache(spec As roAssetCollection) As Boolean 

Begins downloading the required files from the passed *roAssetCollection* instance, then disconnects shortly afterward. If the player is set to use a suitably configured proxy (either globally or via the `SetProxy()` method), then the proxy will continue to download the files, making them readily available for `AsyncDownload()` calls in the future.

This method generates an *roAssetFetcherEvent* message with response code 202 ("Accepted") to indicate success. Other errors will be reported as usual. The final all-files-complete event code will always be -2 ("EVENT\_ALL\_FAILED") because the download does not complete.

### AsyncCancel() As Boolean

Cancels any pending “Async” requests. Note that, prior to and during this method call, events associated with an asynchronous action may be queued. No more events will be queued once this call returns. We recommend collecting any pending events prior to calling any further “Async” methods on the same object to avoid confusion.

### EnablePeerVerification(verification As Boolean) As Boolean

Enables checking of TLS/SSL certificates. This method is set to `true` by default. Disabling peer verification allows you to bypass an expired certificate check.

### EnableHostVerification(verification As Boolean) As Boolean

Enables checking of the TLS/SSL certificate for the correct hostname. This method is set to `true` by default. Disabling host verification allows you to accept a certificate being sent for the wrong hostname.

:::hint{type="danger"}
Peer verficiation and host verification are important security checks that prevent "man-in-the-middle" attacks. These features should only be disabled after careful consideration of the security implications.
:::

### SetCertificatesFile(filename As String) As Boolean

Configures an alternative set of CA certificates for the connection. This method is useful if the connection certificates are signed by a CA that is not on the the default trusted list (for example, if your organization uses a private CA hierarchy that is not signed by a well known root CA). This method replaces the default list, so the passed certificate file must contain all acceptable CA certificates required for the connection.

### AddHeader(name As String, value As String) As Boolean

Specifies a header that will be passed to HTTP requests made by the *roAssetFetcher* instance. A particular download will not include the header if it has the `<headers inherit=”no”>` attribute in the sync spec.

### SetHeaders(headers As roAssociativeArray) As Boolean

Specifies all headers that will be passed to HTTP requests made by the *roAssetFetcher* instance. This method removes any previously set headers. A particular download will not include the headers if it has the `<headers inherit=”no”>` attribute in the sync spec.

### SetProxy(proxy As String) As Boolean

Sets the name or address of the proxy server that will be used by the *roAssetFetcher* instance. The proxy string should be formatted as "http\://user\:password\@hostname\:port". It can contain up to four "\*" characters; each "\*" character can be used to replace one octet from the current IP address. For example, if the IP address is currently 192.168.1.2, and the proxy is set to "proxy-\*-\*", then the player will attempt to use a proxy named "proxy-192.168".

### SetProxyBypass(hostnames As Array) As Boolean

Exempts the specified hosts from the proxy setting. The passed array should consist of one or more hostnames. The *roAssetFetcher* instance will attempt to reach the specified hosts directly rather than using the proxy that has been specified with the `SetProxy()` method. For example, the hostname "http\://example.com " would exempt "http\://example.com ", "http\://example.com:80 ", and "http\://www\.example.com " from the proxy setting.

### SetFileProgressIntervalSeconds(interval As Integer) As Boolean

Specifies the interval (in seconds) between progress events when an individual file is being downloaded. Setting the interval to -1 disables all progress events. Setting the interval to 0 specifies that events should be generated as often as possible, though this will slow down the transfer process. If the interval is set to 0 or any positive integer, events will always be generated at the start and end of the file download irrespective of elapsed time. The default interval is 300 seconds.

### SetFileRetryCount(count As Integer) As Boolean

Specifies the maximum number of times each file download will be retried before moving on to the next file download. The default retry count is five.

### SetRelativeLinkPrefix(prefix As String) As Boolean

Specifies a prefix that will be appended to the front of relative links in the sync spec. Normally, this method is used to make file:/// URIs drive agnostic, but it can also be used to reduce the size of the sync spec if all files are stored in the same place. Non-relative links are not affected by this method.

### BindToInterface(interface As Integer) As Boolean

Ensures that the HTTP request goes out over the specified network interface (0 for Ethernet or 1 for WiFi). The default behavior (which can be specified by passing -1) is to send requests using the most appropriate network interface, which may depend on the routing metric configured via the *roNetworkConfiguration* object. If both interfaces are on the same layer 2 network, this method may not work as expected due to the Linux weak-host model.

### SetMaximumReceiveBytesPerSecond(bytes\_per\_second as Double) As Boolean

Limits the rate at which downloads are performed by the *roAssetFetcher* instance. The source data rate isn't under the direct control of the BrightSign player, but download rates should average below the specified value over time. 

This method returns `true` on success and `false` on failure. In event of failure, the `GetFailureReason()` method may provide more information.

### SetMinimumTransferRate(bytes\_per\_second As Integer, period\_in\_seconds As Integer) As Boolean

Sets the minimum transfer rate for each file download. A transfer will be terminated if the rate drops below *bytes\_per\_second* when averaged over *period\_in\_seconds*. Note that if the transfer is over the Internet, you may not want to set `period_in_seconds` to a small number in case network problems cause temporary drops in performance. For large file transfers and a small `bytes_per_second` limit, averaging fifteen minutes or more may be appropriate.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roAssetFetcherEvent* and *roAssetFetcherProgressEvent* to the attached message port.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` . It will return `Invalid` if no data has been set.

[title] roInt, roFloat, roString
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

The [intrinsic types](docId:5b4V8U6r1zWdk71zYGdc5) `Int32`, `Float`, and `String` have object and interface equivalents. These are useful in the following situations:

- An object is needed instead of a typed value (e.g. the *roList* object maintains a list of objects). When a function that expects a BrightScript object as a parameter is passed an integer, float, or string, BrightScript automatically creates the equivalent object.
- If any object exposes the *ifInt*, *ifFloat*, or *ifString* interfaces, that object can be used in any expression that expects a typed value. For example, an [roVideoEvent](docId\:G1ZeMm_Qk7FbCYNIuk6Fi) can be used as an integer with a value representing the event ID.

**Integer Operations**

If "o" is of type *roInt*, then these statements will have the following effects:

- `print o`: Prints the value of `o.GetInt()`
- `i%=o`: Assigns the integer `i%` the value of `o.GetInt().`
- `k=o`: Presumably `k` is automatically typed, so it becomes another reference to the *roInt* `o.`
- `o=5`: This is NOT the same as `o.SetInt(5)`. Instead it releases `o`, changes the type of `o` to *roINT32* (`o` is automatically typed), and assigns it to 5.

## ifInt

*roInt* contains the *ifInt* interface, which provides the following:

### GetInt() As Integer

Returns the integer value of the object. 

### SetInt(value As Integer) As Void

Sets the integer value of the object. 

## ifIntOps

*roInt* also contains the *ifIntOps* interface, which provides the following:

### ToStr() As String

Returns the integer value as a string. A space is not appended to the front for positive numbers.

## ifFloat

*roFloat* contains *the ifFloat* interface, which provides the following:

### GetFloat() As Float

Returns the float value of the object. 

### SetFloat(value As Float) As Void

Sets the float value of the object. 

## ifString

*roString* contains the *ifString* interface, which provides the following:

### GetString() As String

Returns the string value of the object.

### SetString(value As String) As Void

Sets the string value of the object.

## ifStringOps

*roString* also contains the *ifStringOps* interface, which provides the following:

:::hint{type="info"}
Some [global functions](docId\:nSjXffR7OlFgDWgjFEbMe) offer the same functionality as *ifStringOps* methods. The function indexes of *ifStringOps* methods start at zero, while those of global functions start at one.
:::

### SetString(str As String, str\_len As Integer)

Sets the string value of the object using the specified string and string-length values. This is similar to the `SetSeting()` method, which does not accept a parameter for string length.

### AppendString(str As String, str\_len As Integer)

Appends to the string value of the object using the specified string and string-length values. This method modifies itself—this can cause unexpected results when you pass an intrinsic string type, rather than a string object.

### Example

```text
x="string"
x.ifstringops.appendstring("ddd",3)
print x 'will print 'string' 
y=box("string")
y.ifstringops.appendstring("ddd",3)
print y 'will print 'stringddd'
```

### Len() As Integer

Returns the number of characters in a string.

### GetEntityEncode() As String

Returns the string with certain characters replaced with HTML entity encoding sequences:

| **Character**    | **Replaced** **with** |
| ---------------- | --------------------- |
| " (double quote) | "                     |
| ' (single quote) | '                     |
| \<               | \<                    |
| >                | >                     |
| &                | &                     |

### Tokenize(delim As String) As roList

Splits a string into substrings using the specified delimiter character(s). The `delim` parameter can contain one or more characters to treat as delimiters. If the string object contains multiple contiguous delimiters, they will be treated as a single delimiter. This method returns the substrings as an *roList* object; the delimiters are not returned with the substrings.

### Example

```text
BrightScript> s = "one&&two"
BrightScript> print s.Tokenize("&")
one
two
```

### Trim() As String

Returns the string with any leading and trailing whitespace characters (e.g. TAB, LF, CR, VT, FF, NO-BREAK SPACE) removed.

### ToInt() As Integer

Returns the value of the string as an integer number.

### ToFloat() As Float

Returns the value of the string as a floating point number.

### Left(n As Integer) As String

Returns the first `n` characters of the string.

### Right(n As Integer) As String

Returns the last `n` characters of the string.

### Mid(start\_index As Integer) As String

Returns a subset of the string that begins at the zero-based `start_index` and terminates at the end of the string.

### Mid(start\_index As Integer, n As Integer) As String

Returns a subset of the string, beginning at the zero-based `start_index` and consisting of `n` characters. If the string contains fewer than `n` characters after the specified `start_index`, this method will return all characters after the `start_index`.

### Instr(substring As String) As Integer 

Returns the zero-based index of the first occurence of the substring in the string. If the substring does not occur in the string, this method returns -1. 

### Instr(start\_index As Integer, substring As String) As Integer

Returns the zero-based index of the first occurence of the substring after the specified `start_index` in the string. If the substring does not occur after the specified `start_index`, this method returns -1.

:::hint{type="success"}
`Instr()` is also offered as a [global function](docId\:nSjXffR7OlFgDWgjFEbMe) (note that the string index of the global function starts at 1).
:::

## Examples

```text
BrightScript> o=CreateObject("roInt")
BrightScript> o.SetInt(555)
BrightScript> print o
555
BrightScript> print o.GetInt()
555
BrightScript> print o-55
500 
```

An integer value of 5 is converted to type *roInt* automatically because the `AddTail()` method expects a BrightScript object as its parameter:

```text
BrightScript> list=CreateObject("roList")
BrightScript> list.AddTail(5)
BrightScript> print type(list.GetTail()) 
```

Here the `ListDir()` method returns an *roList* object containing *roString* objects:

```text
BrightScript> l=ListDir("/")
BrightScript> for i=1 to l.Count():print l.RemoveHead():next
test_movie_3.vob
test_movie_4.vob
test_movie_1.vob
test_movie_2.vob
```


[title] Reserved Words
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

|              |           |           |       |
| ------------ | --------- | --------- | ----- |
| AND          | ENDSUB    | LINE\_NUM | RND   |
| CREATEOBJECT | ENDWHILE  | M\*       | STEP  |
| DIM          | EXIT      | NEXT      | STOP  |
| EACH         | EXITWHILE | NOT       | SUB   |
| EACH         | FALSE     | OBJFUN    | TAB   |
| ELSE         | FOR       | OR        | THEN  |
| END          | FUNCTION  | POS       | TO    |
| ENDFOR       | GOTO      | PRINT     | TRUE  |
| ENDFUNCTION  | IF        | REM       | TYPE  |
| ENDIF        | INVALID   | RETURN    | WHILE |

\* Although `M` is not strictly a reserved word, it should not be used as an identifier outside of its [intended purpose](docId\:xjNCz5P2xsv5j9GEofi13).

[title] roAssociativeArray
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

This object allows you to store objects in an associative array (also known as a map, dictionary, or hash table), a data structure that associates objects with string keys. 

:::hint{type="info"}
Using nested `FOR EACH` loops to iterate over the same *roAssociativeArray* instance can lead to unexpected behavior. See the [FOR EACH statement description](docId\:xjNCz5P2xsv5j9GEofi13) for more details.
:::

The *roAssociativeArray* object is created with no parameters: 

```text
CreateObject("roAssociativeArray")
```

Alternatively, an associative array can be created using brackets:

```text
aa1 = {}
aa2 = {key1:"value", key2: 55, key3: 5+3 }
```

## ifEnum

### Reset() As Void

Resets the position to the first element of enumeration.

### Next() As Dynamic

Returns a typed value at the current position and increments the position.

### IsNext() As Boolean

Returns `true` if there is a next element.

### IsEmpty() As Boolean

Returns `true` if the associative array contains no elements.

## ifAssociativeArray

### AddReplace(key As String, value As Object) As Void

Adds a new entry to the associative array, associating the supplied object with the supplied key string. Only one object may be associated with a key, so any existing object linked to that key is discarded. This method is always case-sensitive when creating keys, whereas object-literal syntax (e.g. `aa={bright:"Sign"}`) is case-insensitive when creating keys unless `SetModeCaseSensitive()` is called.

### Lookup(key As String) As Dynamic

Looks up the specified key and returns the associated object. If there is no object associated with the key string, then this method will return `Invalid`.

:::hint{type="success"}
In many cases, the [Dot Operator](docId\:Pl6ydtPGCTYDCA5q2bw45) can be used as shorthand for the `Lookup()` and `AddReplace()` methods when working with associative arrays.
:::

### DoesExist(key As String) As Boolean

Looks up the specified key in the associative array. If the key exists, `true` is returned; otherwise, `false` is returned.

### Delete(key As String) As Boolean

Looks for an object in the associative array linked to the specified key. If there is such an object, it is deleted and `true` is returned; otherwise, `false` is returned.

### Clear() As Void

Removes all objects from the associative array.

### SetModeCaseSensitive() As Void

Makes all subsequent actions case sensitive. All lookups and created keys (with the exception of the `AddReplace()` method) are case insensitive by default.

### LookupCi(key As String) As Dynamic

Looks for an object in the array associated with the specified key. This method functions similarly to `Lookup()`, with the exception that key comparisons are always case insensitive, regardless of case mode.

### Append(aa As roAssociativeArray) As Void

Appends a second associative array to the first.

## Examples

```text
aa = CreateObject("roAssociativeArray") 
aa.AddReplace("Bright", "Sign")
aa.AddReplace("TMOL", 42) 
print aa.Lookup("tmol")
print aa.Lookup("bright") 
```

The above script returns the following: 

```text
42
Sign
```

Alternatively, you can use the [Dot Operator](docId\:Pl6ydtPGCTYDCA5q2bw45) in place of the `AddReplace()` and `Lookup()` methods:

```text
aa = {}
aa.bright = "Sign"
aa.tmol = 42 
print aa.tmol
print aa.bright
```

You can also specify an associative array as a multiline object literal:

```text
aa = {
bright : "Sign",
tmol : 42,
pie : 3.14
}

```


[title] roClockWidget
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object places a clock on the screen. It has construction arguments only.

Object Creation: The *roClockWidget* object is created with several parameters.

```text
CreateObject("roClockWidget", rect As roRectangle, res As roResourceManager, display_type As Integer)
```

- `rect`: The rectangle in which the clock is displayed. The widget picks a font based on the size of the rectangle.
- `res`: A *resources.txt* file that allows localization via the *roResourceManager* object (see below for further details).
- `display_type`: Use 0 for date only, and 1 for clock only. To show both on the screen, you need to create two widgets.

**Example**

```text
rect=CreateObject("roRectangle", 0, 0, 300, 60)
res=CreateObject("roResourceManager", "resources.txt")
c=CreateObject("roClockWidget", rect, res, 1)
c.Show()
```

The resource manager is passed into the widget, which uses the following resources within the *resources.txt* file to display the time and date correctly. Here are the "eng" entries:

```text
[CLOCK_DATE_FORMAT]
eng "%A, %B %e, %Y"
[CLOCK_TIME_FORMAT]
eng "%l:%M"
[CLOCK_TIME_AM]
eng "AM"
[CLOCK_TIME_PM]
eng "PM"
[CLOCK_DATE_SHORT_MONTH]
eng "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec"
[CLOCK_DATE_LONG_MONTH]
eng
"January|February|March|April|May|June|July|August|September|October|November|December"
[CLOCK_DATE_SHORT_DAY]
eng "Sun|Mon|Tue|Wed|Thu|Fri|Sat"
[CLOCK_DATE_LONG_DAY]
eng "Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday"
```

## Control Characters

The following are the control characters for the date/time format strings:

```text
// Date format
//
// %a Abbreviated weekday name
// %A Long weekday name
// %b Abbreviated month name
// %B Full month name
// %d Day of the month as decimal 01 to 31
// %e Like %d, the day of the month as a decimal number, but without leading zero
// %m Month name as a decimal 01 to 12
// %n Like %m, the month as a decimal number, but without leading zero
// %y Two digit year
// %Y Four digit year

// Time format
//
// %H The hour using 24-hour clock (00 to 23)
// %I The hour using 12-hour clock (01 to 12)
// %k The hour using 24-hour clock (0 to 23); single digits are preceded by a blank.
// %l The hour using 12-hour clock (1 to 12); single digits are preceded by a blank.
// %M Minutes (00 to 59)
// %S Seconds (00 to 59)
```

## ifWidget

### SetForegroundColor(color As Integer) As Boolean

Sets the foreground color in ARGB format. Hex color values should be converted to integers before being passed to this method (e.g. the value `&hFFFFFFFF` should be passed as 4294967295). You can use the `HexToInteger()` method (available in the [core library extension](docId\:lEOO6do_aRr2igzXcRipI)) to convert a hex string to an integer.

### SetBackgroundColor(color As Integer) As Boolean

Sets the background color in ARGB format. Hex color values should be converted to integers before being passed to this method (e.g. the value `&hFFFFFFFF` should be passed as 4294967295). You can use the `HexToInteger()` method (available in the [core library extension](docId\:lEOO6do_aRr2igzXcRipI)) to convert a hex string to an integer.

:::hint{type="info"}
The top 8 bits of the `SetForegroundColor()` and `SetBGackgroundColor()` values are "alpha" parameters. Zero is equivalent to fully transparent and 255 to fully non-transparent. This feature allows for effects similar to subtitles. For example, you can create a semi-transparent black box containing text over video.
:::

### SetFont(font\_filename As String) As Boolean

Sets the *font\_filename* using a TrueType font (for example, `SD:/Arial.ttf`).

### SetBackgroundBitmap(bitmap\_filename As String, stretch As Boolean) As Boolean

Sets the background bitmap image. If stretch is True, then the image is stretched to the size of the window.

### SetBackgroundBitmap(parameters As roAssociativeArray, stretch As Boolean) As Boolean

Sets the background bitmap image. If *stretch* is True, then the image is stretched to the size of the window. The associative array can contain the following parameters:

- `Filename`: The name of the image file
- `EncryptionAlgorithm`: The file-encryption algorithm. Currently the options are "AesCtr" and "AesCtrHmac".
- `EncryptionKey`: The key to decrypt the image file. This is a byte array consisting of 128 bits of key, followed by 128 bits of IV.

:::hint{type="info"}
See [Image Decryption](docId:0UMXqYvruY7DRNLuUZAFp) for details on displaying encrypted images.
:::

### SetSafeTextRegion(region As roRectangle) As Boolean

Specifies the rectangle within the widget where the text can be drawn safely.

### Show() As Boolean

Displays the widget. After creation, the widget is hidden until `Show()` is called.

### Hide() As Boolean

Hides the widget.

### Raise() As Void

Sends the widget to the top of the z-order on the graphics plane (i.e. in front of all other surfaces that implement the *ifWidget* interface). By default, new widgets are placed at the top of the graphics z-order.

:::hint{type="info"}
Some surfaces are always drawn at the top of the graphics z-order, including the mouse cursor, closed captions, and [scrolling tickers](docId\:GQeNKTmmFazEjdlZHttIZ).
:::

:::hint{type="success"}
**Tip**
You can use the `PauseGraphics()`/ `ResumeGraphics()` methods on the [roVideoMode](docId\:QQ734nQz0hCwNI0uNSdMP) object to ensure multiple changes to the graphics z-order occur simultaneously.
:::

### Lower() As Void

Sends the widget to the bottom of the z-order on the graphics plane (i.e. behind all other surfaces that implement the *ifWidget* interface). By default, new widgets are placed at the top of the graphics z-order.

### GetFailureReason() As String

Yields additional useful information if a function return indicates an error.

### SetRectangle(r As roRectangle) As Boolean

Changes the size and positioning of the widget rectangle using the passed *roRectangle* object.

[title] roAudioPlayer
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

An audio player is used to play back audio files using the generic *ifMediaTransport* interface. If the message port is set, the object will send events of the type *roAudioEvent*. All object calls are asynchronous. In other words, audio playback is handled in a different thread from the script. The script may continue to run while audio is playing. The JavaScript equivalent is to use the HTML audio tag.

## ifMessagePort

### SetPort(port As roMessagePort) As Void

Posts messages of type *roAudioEvent* to the attached message port.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via SetUserData(). It will return Invalid if no data has been set.

## IfIdentity

### GetIdentity() As Integer

:::hint{type="info"}
The *ifIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::

## ifMediaTransport 

See [roVideoPlayer](docId\:zTUZ0LdazCmL2kQmdBKCn) for a description of *ifMediaTransport* methods.

## ifAudioControl

### SetPcmAudioOutputs(outputs As Dynamic) As Boolean

Specifies which audio connectors should output PCM audio. This method accepts an *roAudioOutput* instance or an array of *roAudioOutput* instances.

### SetCompressedAudioOutputs(outputs As Dynamic) As Boolean

Specifies which audio connectors should output compressed audio (e.g. Dolby AC3 encoded audio). This method accepts an *roAudioOutput* instance or an array of *roAudioOutput* instances. 

:::hint{type="info"}
When the `SetPcmAudioOutputs()`, `SetMultichannelAudioOutputs()`,  or `SetCompressedAudioOutputs()` method is  called, it will override the settings of the following *ifAudioControl* methods: `SetAudioOutput()`, `MapStereoOutput()`, `SetUsbAudioPort()`, `MapDigitalOutput()`.
:::

### SetMultichannelAudioOutputs(array As Object) As Boolean

Specifies which audio connectors should output multichannel PCM audio. It is
designed for playing audio content that has more than two stereo channels, such
as 5.1 or 7.1 surround sound. The method accepts an *roAudioOutput* or an array
of *roAudioOutput* instances. &#x20;

NOTE, you must also call *SetAudioMode* with parameter set to 0, i.e. AC3 surround.&#x20;

:::CodeblockTabs
Example

```none
video_player = CreateObject("roVideoPlayer")
output = CreateObject("roAudioOutput", "hdmi")
video_player.SetMultichannelAudioOutputs(output)
video_player.SetAudioMode(0)
```
:::

### SetAudioMode(audio\_mode As Integer) As Boolean

Sets the audio mode of the *roAudioPlayer* object. This method accepts the following values:

- `0`: AC3 Surround 
- `1`: AC3 mixed down to stereo 
- `2`: No audio
- `3`: Left
- `4`: Right 

Options 0 and 1 only apply to video files, while options 2, 3, and 4 apply to all audio sources.

### SetVolume(volume As Dynamic) As Boolean

Specifies the volume of the audio output as either a percentage or decibel amount. To use a percentage measurement, pass an integer value between `0` and `100`. To use a decibel measurement, pass an *roAssociativeArray* containing a single `{db:<value As Float>}` parameter. The decibel measurement is an absolute value: passing `0` specifies no change to the audio output, and the effective range of measurements is from approximately -80 to 20 decibels.

The volume value is clipped prior to use (i.e. `SetVoume(101)` will set the volume to 100 and return `True`). The volume is the same for all mapped outputs and USB/SPDIF/analog.

:::hint{type="info"}
Separate volume levels are stored for *roAudioPlayer* and *roVideoPlayer*.
:::

### SetChannelVolumes(channel\_mask As Integer, volume As Integer) As Boolean

You can control the volume of individual audio channels. This volume command takes a hex channel mask, which determines the channels to apply the volume to, and a level, which is a percentage of the full scale. The volume control works according to audio channel rather than the output. The channel mask is a bit mask with the following bits for MP3 output:

- `&H01`: Left
- `&H02`: Right
- `&H03`: Both left and right

### SetPreferredAudio(description As String) As Boolean

Selects which audio track to use if there are multiple audio tracks in the stream. See [Preferred Streams](docId\:zTUZ0LdazCmL2kQmdBKCn) for more details.

### ConfigureAudioResources() As Boolean

### SetAudioDelay(delay\_in\_milliseconds As Integer) As Boolean

Adds a presentation time stamp (PTS) offset to the audio. This makes it possible to adjust for file multiplexing differences. Delays are limited to 150ms or less. Currently, the system software only supports positive delays; therefore, if you need to set the audio ahead of the video, you will need to use `SetVideoDelay()` instead.

### SetVideoDelay(delay\_in\_milliseconds As Integer) As Boolean

Adds a presentation time stamp (PTS) offset to the video. This makes it possible to adjust for file multiplexing differences. Delays are limited to 150ms or less.

### StoreEncryptionKey(a As String, b As String) As Boolean

### StoreObfuscatedEncryptionKey(a As String, b As String) As Boolean

### Deprecated Methods

### SetAudioOutput(audio\_output As Integer) As Boolean

### MapStereoOutput(mapping As Integer) As Boolean

### MapDigitalOutput(mapping As Integer) As Boolean

### SetStereoMappingSpan(a As Integer) As Boolean

### SetAudioStream(stream\_index As Integer) As Boolean

### SetSpdifMute(a As Boolean) As Boolean

### SetUsbAudioPort(a As Integer) As Boolean

### SetAudioOutputAux(audio\_output As Integer) As Boolean

### SetAudioModeAux(audio\_mode As Integer) As Boolean

### MapStereoOutputAux(mapping As Integer) As Boolean

SetVolumeAux(volume As Integer) As Boolean

### SetChannelVolumesAux(channel\_mask As Integer, volume As Integer) As Boolean

### SetAudioStreamAux(stream\_index As Integer) As Boolean

## Configuring Audio Outputs

If a audio/video file is playing or has played, you need to call `Stop()` before changing the audio output.

The following script shows how to use the `SetPcmAudioOutputs()` and `SetCompressedAudioOutputs()` methods in conjunction with [roAudioOutput](#). The audio/video player is configured to output decoded audio to the analog output or compressed audio to the HDM&#x49;**®** and SPDIF outputs.

```text
ao1=CreateObject("roAudioOutput", "Analog")
ao2=CreateObject("roAudioOutput", "HDMI")
ao3=CreateObject("roAudioOutput", "SPDIF")

a1=CreateObject("roAudioPlayer")
a1.SetPcmAudioOutputs(ao1)
 
ar = CreateObject("roArray", 2, true)
ar[0] = ao2
ar[1] = ao3
a1.SetCompressedAudioOutputs(ar)
```

:::hint{type="danger"}
In most cases, rerouting audio outputs during audio/video playback will cause playback to stop. The system software will still be responsive, so you can use commands to exit playback during or after an audio output modification.
:::

This script sets audio output to the third analog audio port:

```text
analog3 = CreateObject("roAudioOutput", "analog:3")
video = CreateObject("roVideoPlayer")
video.SetPcmAudioOutputs(analog3)
```

This script configures multiple outputs for an audio player:

```text
analogOut = CreateObject("roAudioOutput", "analog")
hdmiOut = CreateObject("roAudioOutput", "hdmi")

audio = CreateObject("roAudioPlayer")
audio.SetPcmAudioOutputs([analogOut, hdmiOut])
```

This script sets the volume level for individual channels:

```text
audio = CreateObject("roAudioPlayer")
audio.SetChannelVolumes(&H01, 60)      'left channel to 60%
audio.SetChannelVolumes(&H02, 75)      'right channel to 75%
audio.SetChannelVolumes(&H03, 65)      'all channels to 65%
```

## Playing Multiple Audio Files Simultaneously

Multiple MP3 files, as well as the audio track of a video file, can be played to any combination of the following:

- Analog outputs
- SPDIF / HDMI
- USB

Only a single file can be sent to an output at any given time. For example, two *roAudioPlayers* cannot simultaneously play to the SPDIF output. The second one to attempt a *PlayFile* will get an error. To free an output, the audio or video stream must be stopped (using the *ifMediaTransport* `Stop` or `StopClear` calls).

Note the following about multiple audio-file functionality:

- The onboard analog audio output and HDMI output are clocked by the same sample-rate clock. Therefore, if different content is being played out of each, the content must have the same sample rate.
- Currently, only a single set of USB speakers is supported.
- Each audio and video stream played consumes some of the finite CPU resources. The amount consumed depends on the bitrates of the streams. Testing is the only way to determine whether a given set of audio files can be played at the same time as a video. The maximum recommended usage is a 16Mbps video file with three simultaneous MP3 160kbps streams.

This script plays a video with audio over HDMI and an MP3 file to the onboard analog port:

```text
hdmiOut = CreateObject("roAudioOutput", "hdmi")
analogOut = CreateObject("roAudioOutput", "analog")

video = CreateObject("roVideoPlayer")
video.SetPcmAudioOutputs(hdmiOut)

audio = CreateObject("roAudioPlayer")
audio.SetPcmAudioOutputs(analogOut)

video.PlayFile("video.mpg")
audio.PlayFile("audio.mp3")
```


[title] Global Functions
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/

BrightScript provides a set of standard, module-scope functions that are stored in the global object. If a global function is referenced, the compiler directs the runtime to call the appropriate global object member. When calling a global function, you do not need to use the [dot operator](docId\:Pl6ydtPGCTYDCA5q2bw45) to reference the *roGlobal* object.

:::hint{type="info"}
Global trigonometric functions accept and return values in radians, not degrees.
:::

## ifGlobal

### CreateObject(name As String) As Object

Creates a BrightScript object corresponding to the specified class name. This method returns invalid if object creation fails. Some objects have parameters in their constructor, which must be passed after the class `name` in a comma-separated list.

```text
sw = CreateObject("roGpioControlPort")
serial = CreateObject("roSerialPort", 0, 9600)
```

### RestartScript() As Void

Exits the current script. The system then scans for a valid *autorun.brs* file to run.

### RestartApplication() As Void

Restarts the BrightSign application.

### Sleep(milliseconds As Integer)

Instructs the script to pause for a specified amount of time without wasting CPU cycles. The sleep interval is specified in milliseconds.

### asc(letter As String) As Integer

Returns the ASCII code for the first character of the specified string. A null-string argument will cause an error.

### chr(character As Integer) As String

Returns a one-character string containing a character reflected by the specified ASCII or control. For example, because quotation marks are normally used as string delimiters, you can pass ASCII code 34 to this function to add quotes to a string.

### len(target\_string As String) As Integer

Returns the number of characters in a string

### str(value As Double) As String

Converts a specified float value to a string. This method also returns a string equal to the character representation of a value. For example, if A is assigned a value of 58.5, then calling `str(A)` will return "58.5" as a string.

### strI(value As Integer) As String

Converts a specified integer value to a string. This method returns a string equal to the character representation of a value, and it will always add a leading space to non-negative numbers. For example, if A is assigned a value of 58.5, then calling `stri(A)` will return " 58" as a string.

See [roInt, roFloat, roString](docId\:LBHO0lM71T5OJmdhwJ-1i) if you need an alternate method that will return the string without the prepended space.

### val(target\_string As String) As Double

Returns a number represented by the characters in the string argument. This is the opposite of the `str()` function. For example, if A is assigned the string "58", and B is assigned the string "5", then calling `val(A+"."+B)` will return the float value 58.5.

### strtoi(target\_string As String) As Integer

Converts the target string to an integer. Any non-integer characters (including decimal points and spaces), and any numbers to the right of a non-integer character, will not be part of the integer output.

### abs(x As Double) As Double

Returns the absolute value of the argument `x`

### atn(x As Double) As Double

Returns the arctangent (in radians) of the argument `x` (i.e. `Atn(x)` returns "the angle whose tangent is `x`"). To get the arctangent in degrees, multiply `Atn(x)` by 57.29578.

### csng(x As Integer) As Float

Returns a single-precision float representation of the argument `x`

### cdbl(x As Integer) As Double

Returns a double-precision float representation of the argument `x`

### cint(x As Double) As Integer

Returns an integer representation of the argument `x` by rounding to the nearest whole number.

### cos(x As Double) As Double

Returns the cosine of the arugment `x`. The argument must be in radians. To obtain the cosine of `x` when `x` is in degrees, use `Cos(x*.01745329)`.

### exp(x As Double) As Double

Returns the natural exponential of `x`. This is the inverse of the `log()` function.

### fix(x As Double) As Integer

Returns a truncated representation of the argument `x`. All digits to the right of the decimal point are removed so that the resultant value is an integer. For non-negative values of *x*, `fix(x)` is equal to `int(x)`. For negative values of `x`, `fix(x)` is equal to `int(x)+1`.

### int(x As Double) As Integer

Returns an integer representation of the argument `x` using the largest whole number that is not greater than the argument. For example, `int(2.2)` returns 2, while `int(-2.5)` returns -3.

### log(x As Double) As Double

Returns the natural logarithm of the argument `i` (i.e. *loge(x)*). This is the inverse of the `exp()` function. To find the logarithm of a number to a base *b*, use the following formula\*: logb(x) = loge(x)/loge(b)\*.

### sgn(x As Double) As Integer

Returns an integer representing how the float argument *x* is signed: -1 for negative, 0 for zero, and 1 for positive.

### sgnI(x As Integer) As Integer

Returns an integer representing how the integer argument *x* is signed: -1 for negative, 0 for zero, and 1 for positive.

### sin(x As Double) As Double

Returns the sine of the argument `x`. The argument must be in radians. To obtain the sine of `x` when `x` is in degrees, use `sin(x*.01745329)`.

### tan(x As Double) As Double

Returns the tangent of the argument `x`. The argument must be in radians. To obtain the tangent of *x* when *x* is in degrees, use `tan(x*.01745329)`.

### sqr(x As Double) As Double

Returns the square root of the argument `x`. This function is the same as *x^(1/2)*, but calculates the result faster.

### StableEnumeration(array as Object) As Object

Returns an object that represents the iteration. This function does not affect the original object. Must use this function to safely enumerate containers more than once in parallel.

### Left(target\_string As String, n As Integer) As String

Returns the first `n` characters of the specified string.

### Right(target\_string As String, n As Integer) As String

Returns the last `n` characters of the specified string.

### StringI(n As Integer, character As Integer) As String

Returns a string composed of a character symbol repeated `n` times. The character symbol is passed to the method as an ASCII code integer.

### String(n As Integer, character As String) As String

Returns a string composed of a character symbol repeated `n` times. The character symbol is passed to the method as a string.

### Mid(target\_string As String, start\_position As Integer, length As Integer) As String

Returns a substring of the target string. The first integer passed to the method specifies the starting position of the substring, and the second integer specifies the length of the substring. The start position of a string begins with 1.

### Instr(start\_position As Integer, search\_text As String, substring As String) As Integer 

Returns the position of a substring within a string. This function is case sensitive and returns 0 if the specified substring is not found. The start position of a string begins with 1.

:::hint{type="success"}
The string object also offers an `Instr()` method (though it uses a zero-based index). See the [roString](docId\:LBHO0lM71T5OJmdhwJ-1i) documentation for more details.
:::

### FindMemberFunction(object as Object, funName as String) As Interface

Returns the interface from the object that provides the specified function, or else returns `invalid`. It is only available if `roDeviceInfo.HasFeature("FindMemberFunction")` returns `true`.

It can be used as shown below:

```text
print FindMemberFunction({}, "Count") '= <Interface: ifAssociativeArray>
```

### GetInterface(object As Object, ifname As String) As Interface

Returns a value of the type Interface. All objects have one or more interfaces. In most cases, you can skip interface specification when calling an object component. This will not cause problems as long as the method names within a function are unique.

### Wait(timeout As Integer, port As Object) As Object

Instructs the script to wait on an object that has an *ifMessagePort* interface. This method will return the event object that was posted to the message port. If the timeout is specified as zero, `Wait()` will wait indefinitely; otherwise, `Wait()` will return Invalid after the specified number of milliseconds if no messages have been received.

```text
p =   CreateObject("roMessagePort")
sw =  CreateObject("roGpioControlPort")
sw.SetPort(p)
msg=wait(0, p)      
print type(msg)     ' should be roGpioButton
print msg.GetInt()  ' button number
```

### ReadAsciiFile(file\_path As String) As String

Reads the specified text file and returns it as a string.

### WriteAsciiFile(file\_path As String, buffer As String) As Boolean

Creates a text file at the specified file path. The text of the file is passed as the second parameter. This method cannot be used to edit files: A preexisting text file will be overwritten if it has the same name and directory path as the one being created.

:::hint{type="info"}
The [roCreateFile](docId\:CXCLdkjSnyDZW4I-ve-aC) object provides more flexibility if you need to create or edit files.
:::

### ListDir(path As String) As Object

Returns an [roList](docId\:lEOpePZ51dsTAZH9TJHUQ) object containing the contents of the specified directory path. File names are converted to all lowercase.

### MatchFiles(path As String, pattern\_in As String) As Object

Takes a directory to look in (it can be as simple as "." or "/") and a pattern to be matched and then returns an [roList](docId\:lEOpePZ51dsTAZH9TJHUQ) containing the results. Each listed result contains only the part of the filename that is matched against the pattern, not the full path. The match is only applied in the specified directory; you will get no results if the pattern contains a directory separator. The pattern is a case insensitive wildcard expression. It may contain the following special characters:

- ? – Matches any single character.
- \* – Matches zero or more arbitrary characters.
- \[…] – Matches any single character specified within the brackets. The closing bracket is treated as a member of the character class if it immediately follows the opening bracket (i.e. "\[]]" matches a single closed bracket). Within this class, "-" can be used to specify a range unless it is the first or last character (e.g. "\[A-Cf-h"] is equivalent to "\[ABCfgh]"). A character class may be negated by specifying "^" as the first character. To match a literal of this character, place it elsewhere in the class.

:::hint{type="info"}
The special characters "?", "\*", and "\[" lose their function if preceded by a single "\\", and a single "\\" can be matched using "\\\\".
:::

### LCase(target\_string As String) As String

Converts the specified string to all lowercase.

### UCase(target\_string As String) As String

Converts the specified string to all uppercase.

### DeleteFile(file\_path As String) As Boolean

Deletes the file at the specified file path. This method returns False if the delete operation fails or if the file does not exist.

### DeleteDirectory(directory As String) As Boolean

Deletes the specified directory. This method will recursively delete any files and directories that are necessary for removing the specified directory. This method returns `False` if it fails to delete the directory, but it may still delete some of the nested files or directories.

For example:

```text
dir = DeleteDirectory("/directory")
' Check if directory deletion was successful
print dir; ' true if successful
```

or

```text
dir = DeleteDirectory("/directory")
if not dir then
  print "Could not delete directory"
end if
```

### CreateDirectory(directory As String) As Boolean

Creates the specified directory. Only one directory can be created at a time. This method returns `True` upon success and `False` upon failure.

For example:

```text
dir = CreateDirectory("/directory")
' Check if directory creation was successful
print dir; ' true if successful
```

or

```text
dir = CreateDirectory("/directory")
if not dir then
  print "Could not create directory"
end if
```

### RebootSystem() As Void

Instructs the player to perform a soft reboot.

### ShutdownSystem() As Void

### UpTime(dummy As Integer) As Double

Returns the uptime of the system (in seconds) since the last reboot.

### FormatDrive(drive As String, fs\_type As String) As Boolean 

Formats the specified drive using one of the file systems listed below. This function returns True upon success and False upon failure:

- `vfat` (FAT32, DOS/Windows file system): Readable and writable by Windows, Linux, and MacOS.
- `exfat` (DOS/Windows file system): Supported on Series 3 (XTx43, XDx33, HDx23, LS423, HO523) and Series 4 (XTx44, XDx34, HDx24, LS424) players with firmware versions 6.2.94 and later. Secure boot is not supported with the exFAT filesystem on firmware version 6.2.94.
- `ext2` (Linux file system): Writable by Linux and readable by Windows and MacOS with additional software.
- `ext3` (Linux file system): Writable by Linux and readable by Windows and MacOS with additional software. 
- `ext4` (Linux file system): Writable by Linux and readable by Windows and MacOS with additional software. This is the recommended file system for SSD devices and USB hard drives.

### EjectDrive(drive As String) As Boolean

Ejects the specified drive (e.g. "SD:") and returns True if successful. If the script is currently accessing files from the specified drive, the ejection process will fail.

### CopyFile(source As String, destination As String) As Boolean

Copies the file at the specified source file-path to the specified destination directory. The function returns True if successful and False in the event of failure.

### MoveFile(source As String, destination As String) As Boolean

Moves the specified source file to the specified destination directory. The function returns True if successful and False in the event of failure.

:::hint{type="info"}
Both path names must be on the same drive.
:::

### MapFilenameToNative(path As String) As String

Converts the specified BrightScript-style path to the corresponding native path and returns it as a string (e.g. the path "SD:/mydir" will be returned as "/storage/sd/mydir").

### rnd(a As Dynamic) As Dynamic

### RunGarbageCollector() As roAssociativeArray

Destroys objects that are currently in a state of circular reference counting. BrightScript normally removes any objects that become unreferenced as part of its automated garbage collection algorithm. However, objects that reference each other will never reach a reference count of zero, and will need to be destroyed manually using this method.

This method is useful when destroying old presentation data structures and generating a new presentation. This method returns an associative array outlining the results of the garbage-collection process.

### GetDefaultDrive() As String

Returns the current default drive complete with a trailing slash. When running as *autorun.brs*, the drive containing the autorun is designated as the current default.

### SetDefaultDrive(drive As String)

Sets the current default drive, which does not need to include a trailing slash. This method does not fail; however, if the specified default drive does not exist, it will not be possible to retrieve anything.

This method accepts the following values:

- `"USB1:"` – The drive for USB storage devices connected to the player
- `"SD:"` – The primary SD or microSD drive on the player.
- `"SD2:"` – The internal microSD drive on players that support this (see [Storage Devices](docId\:mGdEFc6YvkIbeiUxH9J1O))
- `"SSD:"` – The internal SSD on players that support this (see [Storage Devices](docId\:mGdEFc6YvkIbeiUxH9J1O))

### EnableZoneSupport(enable As Boolean)

Allows for display of multiple video, HTML, image, and text zones. As of firmware 6.0.x, zone support is enabled by default.

### EnableAudioMixer(enable As Boolean)

### Pi() As Double

Returns the value of pi as a double-precision floating-point number.

### ParseJson(json\_string As String) As Object

Parses a string formatted according to the RFC4627 standard and returns an equivalent BrightScript object, which can consist of the following: Booleans, integers, floating point numbers, strings, *roArray* objects, and *roAssociativeArray* objects. The  `ParseJson()` method has the following properties:

- Invalid will be returned if the string is not syntactically correct.
- Any *roAssociativeArray* objects that are returned will be case sensitive.
- An error will be returned if an *roArray* or *roAssociativeArray* is nested more than 256 levels deep.

The following script demonstrates how to use `ParseJson()` to process a JSON object containing the titles and URLs of a set of images.

### JSON Script

```json
{
"photos" : [
        { 
              "title" : "View from the hotel",
              "url" : "http://example.com/images/00012.jpg" 
        },
        { 
              "title" : "Relaxing at the beach",
              "url" : "http://example.com/images/00222.jpg" 
        },
        { 
              "title" : "Flat tire",
              "url" : "http://example.com/images/00314.jpg" 
        }
]
}
```

### BrightScript

```text
searchRequest = CreateObject("roUrlTransfer")
searchRequest.SetURL("http://api.example.com/services/rest/getPhotos")
response = ParseJson(searchRequest.GetToString())
For Each photo In response.photos
        GetImage(photo.title, photo.url)
End For
```

### FormatJson(json As roAssociativeArray, flags As Integer) As String

Converts an associative array to a JSON string (i.e. formatted according to the RFC4627 standard). The following are supported data types: Boolean, Integer, Float, String, *roArray*, and *roAssociativeArray*. If the `flags` parameter is set to 0 or not specified, non-ASCII characters are escaped in the output string as “\uXXXX”, where “XXXX” is the hexadecimal representation of the Unicode character value. If the `flags` parameter is set to 1, non-ASCII characters are not escaped.

If arrays or associative arrays are nested more than 256 levels deep, an error will occur. If an error occurs, an empty string will be returned.

:::hint{type="danger"}
By default, using object-literal syntax (e.g. `aa={relativePath:"Foo"}`) to generate an associative array will convert keys to all lower case. To preserve camel case for JSON, use the *roAssociativeArray.AddReplace()* method instead of object literals or call *roAssociativeArray.SetModeCaseSensitive()* before adding entries.
:::


[title] roReadWriteFile
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

The object opens a file and allows both reading and writing operations on that file.

Object Creation: Creating an *roReadWriteFile* object opens an existing file for both reading and writing. Object creation fails if the file does not exist. The current position is set to the beginning of the file.

```text
CreateObject("roReadWriteFile", filename As String)
```

## ifReadStream

### SetReceiveEol(eol\_sequence As String) As Void

Sets the EOL sequence when reading from the stream.

### ReadByte() As Integer

Reads a single byte from the stream, blocking if necessary. If the EOF is reached or there is an error condition, then a value less than 0 is returned.

### ReadByteIfAvailable() As Integer

Reads a single byte from the stream if one is available. If no bytes are available, it returns immediately. A return value less than 0 indicates either that the EOF has been reached or no byte is available.

### ReadLine() As String

Reads until it finds a complete end of the line sequence. If it fails to find the sequence within 4096 bytes, then it returns the 4096 bytes that are found. No data is discarded in this case.

### ReadBlock(size As Integer) As String

Reads the specified number of bytes. The number is limited to 65536 bytes. In the event of an EOF or an error, fewer bytes than requested will be returned. Any null bytes in the file will mask any further bytes.

### AtEof() As Boolean

Returns `True` if an attempt has been made to read beyond the end of the file. If the current position is at the end of the file, but no attempt has been made to read beyond it, this method will return `False`.

## ifStreamSend

### SetSendEol(eol\_sequence As String) As Void

Sets the EOL sequence when writing to the stream. The default value is CR+LF. If you need to set this value to a non-printing character, use the `chr()` [global function](docId\:nSjXffR7OlFgDWgjFEbMe).

### SendByte(byte As Integer) As Void

Writes the specified byte to the stream.

### SendLine(string As String) As Void

Writes the specified characters to the stream followed by the current EOL sequence.

### SendBlock(a As Dynamic) As Void

Writes the specified characters to the stream. This method can support either a string or an *roByteArray*. If the block is a string, any null bytes will terminate the block.

### Flush() As Void

Writes the stream to the file, blocking execution until all data is written out.

### AsyncFlush() As Void

Writes the stream to the file within a few seconds. The system will not block execution while writing to the file.

:::hint{type="info"}
The system performs an asynchronous flush automatically when the object instance is destroyed (for instance, when the the variable containing it is reassigned). The stream is first written to the kernel, which then writes it to the file system when resources are available.
:::

## ifStreamSeek

### SeekAbsolute(offset As Integer) As Void

Seeks the specified offset. If the offset is beyond the end of the file, then the file will be extended upon the next write and any previously unoccupied space will be filled with null bytes.

### SeekRelative(offset As Integer) As Void

Seeks to the specified offset relative to the current position. If the ultimate offset is beyond the end of the file, then the file will be extended as described in `SeekAbsolute()`.

### SeekToEnd() As Void

Seeks to the end of the file.

### CurrentPosition() As Integer

Retrieves the current position within the file.

[title] roDiskErrorEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This object is returned while waiting on a message port that is connected to an *roDiskMonitor* object.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set

## ifDiskErrorEvent

### GetDiskError() As Object

Returns an *roAssociativeArray* containing the following parameters:

| **Key** | **Type**     | **Description**                                                             |
| ------- | ------------ | --------------------------------------------------------------------------- |
| source  | *roString*   | The error type                                                              |
| time    | *roDateTime* | The time at which the error occurred (with millisecond accuracy)            |
| device  | *roString*   | The internal name for the device generating the error                       |
| error   | *roString*   | A description of the error (e.g."Timeout")                                  |
| param   | *roString*   | The error parameter (use depends on type of error (e.g. the sector number)) |

Example:

```text
aa = msgp.GetDiskError()
report = "Time: " + aa["Time"] + "Error: " + aa["source"] + " " + aa["error"] + " " + aa["device"] + " " + aa["param"]
```

:::hint{type="info"}
This example uses an implicit conversion of *roDateTime*. You could also use *roDateTime.GetString()*.
:::


[title] roAssetPoolFiles
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Content Management Objects/

This object allows for interacting with files in an asset pool. The JavaScript equivalent is [assetpoolfiles](docId\:NhoCAmfrJ0AvAHJ-Vearr).

Object Creation: The *roAssetPoolFiles* object is created with two parameters.

```text
CreateObject("roAssetPoolFiles", pool As roAssetPool, assets As Dynamic)
```

The `assets` argument can be either an *roAssetCollection* or *roSyncSpec* object. If multiple object instances requires use of an *roAssetCollection* instance, it will be more efficient to convert *roSyncSpec* to *roAssetCollection* by calling `GetAssets()` once and then passing that collection to all object instances requiring it.

This object works similarly to the *roSyncPoolFiles* object.

## ifAssetPoolFiles

### GetFailureReason() As String

Returns explanatory text if `GetPoolFilePath()` returns an empty string or `GetPoolFileInfo()` returns Invalid.

### MoveFileIntoPool(source\_filename As String, asset\_name As String) As Boolean

Moves an arbitrary file into the appropriate location in the asset pool. The source file must be in the same filesystem as the asset pool. This method accepts two parameters:

- `source_filename` <font color="#6B21A8">string</font>: The path of an existing file in the filesystem
- `asset_name` <font color="#6B21A8">string</font>: The name of an asset within the asset collection associated with the *roAssetPoolFiles* instance. If the asset size is known, it will be checked against the source file. The move operation will fail if the `asset_name` does not match any asset in the pool or if the file size does not match the known asset size.

This method returns `true` on success and `false` on failure. Use the `GetFailureReason()` method to retrieve an error description.

### GetPoolFilePath(asset\_name As String) As String

Looks up the specified file name in the asset collection and uses the information to determine the actual name of the file in the pool. This method returns an empty string if the name is not found in the asset collection, or if the file is not found in the pool.

### GetPoolFileInfo(asset\_name As String) As Object

Looks up the specified file name in the asset collection and returns all available information, including the pool file path, as an associative array. This method returns Invalid if the asset name is not found in the asset collection. If the file is not found in the pool, information from the asset collection will be returned without the pool path. See the table below for a description of assets in the associative array.

| **Field**        | **Value** | **Description**                                                                     |
| ---------------- | --------- | ----------------------------------------------------------------------------------- |
| name             | String    | Asset name                                                                          |
| link             | String    | Asset URL                                                                           |
| size             | String    |                                                                                     |
| hash             | String    | Hash in algorithm ":" hash format                                                   |
| change\_hint     | String    | Only present if set                                                                 |
| auth\_user       | String    | Only present if set                                                                 |
| auth\_password   | String    | Only present if set                                                                 |
| auth\_inherit    | Boolean   |                                                                                     |
| headers\_inherit | Boolean   |                                                                                     |
| probe            | String    | Probe data                                                                          |
| path             | String    | Absolute path of the file in the pool (or "invalid" if the file is not in the pool) |


[title] roStorageInfo
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This object is used to report usage information for storage devices.

:::hint{type="info"}
See [this page](docId\:qcEvA3OCMVeT4jzT5L6PE) for more information about device storage paths.
:::

Object Creation: The *roStorageInfo* object is created with a parameter that specifies the path of the storage device. The path does not need to extend to the root of the storage device. The JavaScript equivalent is [filesysteminfo](docId\:QulnL7zrhwc5FGokcGAi7)  and [storageinfo](docId\:RoZ3o77EuxtyZvj_dSPin)  (see [BrightScript-JavaScript Migration Guide](docId:2KEwWxLmpYcwu8tffuf2Z) for the method equivalents).

```text
CreateObject("roStorageInfo", path As String) 
```

### Drive Specifications 

Use the following string values to specify different storage drives:

- `"USB1:"` – The drive for USB storage devices connected to the player
- `"SD:"` – The primary SD or microSD drive on the player.
- `"SD2:"` – The internal microSD drive on the player (XD6, HD6, XS6, 4Kx42, and XDx32 models only)
- `"SSD:"` – The internal SSD on the player (XTx44, XTx43, XDx34, and XDx33 models only)
- `"Flash:"` - The flash storage of the player

## ifStorageInfo

### GetFailureReason() As String

Yields additional useful information if a function return indicates an error.

### GetBytesPerBlock() As Integer

Returns the size of a native block on the filesystem used by the specified storage device.

### GetSizeInMegabytes() As Integer

Returns the total size (in mebibytes) of the storage device.

:::hint{type="danger"}
On some filesystems that have a portion of space reserved for the super user, the following expression may not be true:  GetUsedInMegabytes() + GetFreeInMegabytes() == GetSizeInMegabytes()
:::

### GetUsedInMegabytes() As Integer

Returns the amount (in mebibytes) of space currently used on the storage device. This amount includes the size of the pool because this class does not integrate pools into its calculations.

### GetFreeInMegabytes() As Integer

Returns the available space (in mebibytes) on the storage device.

### GetFileSystemType() As String

Returns a string describing the type of filesystem used on the specified storage or whether it is encrypted (“+ecryptfs”). The following are potential values:

- "exfat"
- "ext3"
- "ext4"
- "fat12"
- "fat16"
- "fat32"
- "hfs"
- "hfsplus"
- "ntfs"
- “+ecryptfs” (as of BOS version 9.0.145.1)

### GetStorageCardInfo() As roAssociativeArray

Returns an associative array containing details of the storage device hardware. For SD cards, the returned data may include the following:

|                   |         |                                                                                   |
| ----------------- | ------- | --------------------------------------------------------------------------------- |
| `sd_mfr_id`       | Integer | Card manufacturer ID as assigned by the SD Card Association                       |
| `sd_oem_id`       | String  | Two-character card OEM identifier as assigned by the SD Card Association          |
| `sd_product_name` | String  | Product name, assigned by the card manufacturer (5 bytes for SD, 6 bytes for MMC) |
| `sd_spec_vers`    | Integer | Version of SD spec to which the card conforms                                     |
| `sd_product_rev`  | String  | Product revision assigned by the card manufacturer                                |
| `sd_speed_class`  | String  | Speed class (if any) declared by the card                                         |
| `sd_au_size`      | Integer | Size of the SD AU in bytes.                                                       |

Example:

```text
si=CreateObject("roStorageInfo", "SD:/")
Print si.GetFreeInMegabytes(); "MiB free"
```


[title] roCreateFile
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This object can be used to write a new file or overwrite an existing file.

Object Creation: Creating an *roCreateFile* object opens an existing file or creates a new file. If the file exists, it is truncated to a size of zero.

```text
CreateObject("roCreateFile", filename As String)
```

## ifReadStream

### SetReceiveEol(eol\_sequence As String) As Void

Sets the EOL sequence when reading from the stream.

### ReadByte() As Integer

Reads a single byte from the stream, blocking if necessary. If the EOF is reached or there is an error condition, then a value less than 0 is returned.

### ReadByteIfAvailable() As Integer

Reads a single byte from the stream if one is available. If no bytes are available, it returns immediately. A return value less than 0 indicates either that the EOF has been reached or no byte is available.

### ReadLine() As String

Reads until it finds a complete end of the line sequence. If it fails to find the sequence within 4096 bytes, then it returns the 4096 bytes that are found. No data is discarded in this case.

### ReadBlock(size As Integer) As String

Reads the specified number of bytes. The number is limited to 65536 bytes. In the event of an EOF or an error, fewer bytes than requested will be returned. Any null bytes in the file will mask any further bytes.

### AtEof() As Boolean

Returns True if an attempt has been made to read beyond the end of the file. If the current position is at the end of the file, but no attempt has been made to read beyond it, this method will return False.

## ifStreamSend

### SetSendEol(eol\_sequence As String) As Void

Sets the EOL sequence when writing to the stream. The default value is CR+LF. If you need to set this value to a non-printing character, use the `chr()` [global function](docId\:nSjXffR7OlFgDWgjFEbMe).

### SendByte(byte As Integer) As Void

Writes the specified byte to the stream.

### SendLine(string As String) As Void

Writes the specified characters to the stream followed by the current EOL sequence.

### SendBlock(a As Dynamic) As Void

Writes the specified characters to the stream. This method can support either a string or an *roByteArray*. If the block is a string, any null bytes will terminate the block.

### Flush() As Void

Writes the stream to the file, blocking execution until all data is written out.

### AsyncFlush() As Void

Writes the stream to the file within a few seconds. The system will not block execution while writing to the file.

:::hint{type="info"}
The system performs an asynchronous flush automatically when the object instance is destroyed (for instance, when the the variable containing it is reassigned). The stream is first written to the kernel, which then writes it to the file system when resources are available.
:::

## ifStreamSeek

### SeekAbsolute(offset As Integer) As Void

Seeks the specified offset. If the offset is beyond the end of the file, then the file will be extended upon the next write and any previously unoccupied space will be filled with null bytes.

### SeekRelative(offset As Integer) As Void

Seeks to the specified offset relative to the current position. If the ultimate offset is beyond the end of the file, then the file will be extended as described in `SeekAbsolute()`.

### SeekToEnd() As Void

Seeks to the end of the file.

### CurrentPosition() As Integer

Retrieves the current position within the file.

[title] BrightDev
[path] /

::Image[]{src="https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/vniF2Etd49qnVcH7VSWjt-20260130-185530.svg" darkSrc="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/gRlsfpn1mf80J7z-w2YlW-20260130-185506.svg" size="30" width="284" height="140" darkWidth="284" darkHeight="140" position="center" showCaption="false"}

:::hint{type="success"}
The content below is pulled from the BrightDev README.md in GitHub and may not be current. For the most up-to-date README.md, click [here](https://github.com/BrightDevelopers/BrightDev/blob/main/README.md).
:::

# BrightDev

**Build your BrightSign integration in hours, not weeks.**

<font color="#6B21A8"></font>

<font color="#4283c7"></font>

[`DISCUSSIONS`](https://github.com/orgs/BrightDevelopers/discussions)

BrightDev is your starting point for BrightSign development. Complete SDK, working examples, and documentation that gets you to your first deployment in under 15 minutes.

## Getting Started

### Install the Brightsign MCP Server

We wrote this for AI assistants as much as for you. Connect your editor to our MCP server and get working BrightSign code on the first try.

**Claude Code:**

:::BlockQuote
claude mcp add brightdeveloper-docs --transport http https\://brightdeveloper-mcp.bsn.cloud/mcp
:::

**VS Code / Cursor:** Add to your MCP settings:

:::BlockQuote
\{
&#x20; "servers": \{
&#x20;   "brightdeveloper": \{
&#x20;     "type": "http",
&#x20;     "url": "https\://brightdeveloper-mcp.bsn.cloud/mcp"
&#x20;   }
&#x20; }
}
:::

An example prompt for generating BrightSign applications is provided in the [AI-Assisted Development](https://github.com/BrightDevelopers/BrightDev/blob/main/README.md#ai-assisted-development) section below.

## Integrating with BrightSign

Here's the recommended path to go from zero to production:

| **Stage**                                | **Goal**                             | **Start here**                                                                                        |
| ---------------------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------------------------- |
| **1. Hello BrightSign on Single Player** | Deploy content in under 15 minutes   | [Hello BrightSign](https://github.com/BrightDevelopers/BrightDev/blob/main/examples/hello-brightsign) |
| **2. Single Player Deployment**          | Get your MVP deployed on 1 player    | 🚧 Coming Soon                                                                                        |
| **3. Multi-Player Deployment**           | Scale to a fleet                     | 🚧 Coming Soon                                                                                        |
| **4. Production**                        | Monitoring, metrics, and maintenance | 🚧 Coming Soon                                                                                        |

## Migration Guides

Already have an application built for another platform? Our migration guides help you port existing codebases to BrightSign.

| **Platform**             | **Description**                           | **Guide**                                                                                                             |
| ------------------------ | ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| **Kotlin**               | Migrate Kotlin applications to BrightSign | [Kotlin Migration Guide](https://github.com/BrightDevelopers/BrightDev/blob/main/migration-guides/kotlin)             |
| **Progressive Web Apps** | Migrate Progressive Web Applications      | [PWA Migration Guide](https://github.com/BrightDevelopers/BrightDev/blob/main/migration-guides/progressive-web-app)   |
| **Electron**             | Migrate Electron applications             | [Electron Migration Guide](https://github.com/BrightDevelopers/BrightDev/blob/main/migration-guides/electron)         |
| **Flutter/Dart**         | Convert Flutter web apps to BrightSign    | [Flutter/Dart Migration Guide](https://github.com/BrightDevelopers/BrightDev/blob/main/migration-guides/flutter-dart) |
| **Tizen (Samsung)**      | Port Samsung Smart Signage Platform apps  | 🚧 Coming Soon                                                                                                        |

## AI-Assisted Development

The MCP server is a powerful tool that accelerates development, but it doesn't generate perfect code every time. You should:

- **Debug and iterate** on the generated code
- **Test thoroughly** on actual BrightSign hardware
- **Read the documentation** at [docs.brightsign.biz](https://docs.brightsign.biz) to understand BrightSign-specific APIs
- **Refine your prompts** based on the output - be specific about error messages and desired behavior

### Template Prompt for Building BrightSign Applications

Use this template with the BrightDeveloper MCP server to generate BrightSign applications:

:::BlockQuote
I want to create a BrightSign application with the following features:
\- \[Feature 1: e.g., Display rotating images from a remote API]
\- \[Feature 2: e.g., Show device information (model, serial number, firmware version)]
\- \[Feature 3: e.g., Play video content on a schedule]
\- \[Feature 4: e.g., Send analytics to a remote server]

Preferences:
\- Platform: \[BrightScript / HTML+JavaScript / Node.js v18/14]
\- Display Resolution: \[1920x1080 / 3840x2160 / other]
\- Network Requirements: \[WiFi / Ethernet / Both]
\- Storage: \[Local file system / Cloud-based]

Additional Requirements:
\- Include local development setup instructions
\- Add debugging and trace logging configuration
\- Provide instructions for deploying to BrightSign player
\- \[Any other specific requirements]
:::

**Common issues and how to address them:**

- API mismatches: Check [docs.brightsign.biz/developers/player-apis-brightscript-and-javascript](https://docs.brightsign.biz/developers/player-apis-brightscript-and-javascript) for correct syntax
- Module not found errors: Verify you're using BrightSign-supported Node.js modules
- Display issues: Ensure your HTML/CSS accounts for the player's resolution and GPU capabilities

For detailed development environment setup, debugging tools, and logging configuration, see [DEVELOPMENT.md](https://github.com/BrightDevelopers/BrightDev/blob/main/DEVELOPMENT.md).

## FAQ

### Should I use BrightScript or JavaScript?

- Use **BrightScript** for: Simple media playback, GPIO control, legacy compatibility
- Use **HTML/JavaScript/Node.js** for: Complex UIs, web content, API integrations, modern web frameworks

See [Player APIs: BrightScript and JavaScript](https://docs.brightsign.biz/developers/player-apis-brightscript-and-javascript) for details.

### How do I find my player's IP address?

1. **No storage boot** - Boot the player without any storage device; it displays its IP on screen
2. **DHCP server** - Check your router's DHCP client list
3. **Local DWS** - If enabled, browse to brightsign-\<SERIAL\_NUMBER>.local
4. **Serial/SSH** - Run ifconfigcommand
5. **BSN.cloud** - View in BrightSign Author or the BSN.Cloud web interface

See [Find a Player's IP Address](https://docs.brightsign.biz/how-tos/find-a-players-ip-address) for details.

### How do I enable the Local Diagnostic Web Server (DWS)?

1. **Via BrightAuthor\:Connected** - Enable in your BSN.Cloud setup
2. **Via BrightScript/JavaScript** - Enable programmatically in your application
3.

:::BlockQuote
registry write networking http\_server 80
registry flush
reboot
:::

**Via Serial Shell**:

See [DWS: Local Access](https://docs.brightsign.biz/advanced/dws-local-access) for details.

### How do I factory reset my player?

1. **SVC + RST Buttons** - Press & hold both buttons together during boot until the red power light rapidly flashes, release buttons and allow player to boot
2. **Via Local DWS** - Control → "Factory Reset"
3. **Via Serial Shell** - factoryreset confirm

**Warning:** This erases all content, settings, and user data.

See [Factory Reset a Player](https://docs.brightsign.biz/how-tos/factory-reset-a-player) for details.

### My player is stuck in a reboot loop. How do I recover?

1. **Replace SD card** - Insert a new SD card with recovery content (or no content)
2. **Serial shell recovery** - Connect via serial, press SVC key after "Starting BrightSign application..." message to access the shell

See [Stop a Continuously Rebooting Player](https://docs.brightsign.biz/how-tos/stop-a-continuously-rebooting-player) for details.

## Community & Support

- [BrightSign Documentation](https://docs.brightsign.biz) — Official BrightSign API and platform documentation
- [Contributing ](https://github.com/BrightDevelopers/BrightDev/blob/main/CONTRIBUTING.md)— Found a bug? Have an example?
- [BrightSign Support Community](https://support.brightsign.biz/hc/en-us/community/topics) — Hardware, BSN.Cloud, and developer support

[title] roAppendFile
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This object can be used to create a new file or append information to the end of an existing file.

Object Creation: Creating an *roAppendFile* object opens an existing file or creates a new file. The current position is set to the end of the file, and all writes are made to the end of the file.

```text
CreateObject("roAppendFile", filename As String)
```

## ifStreamSend

### SetSendEol(eol\_sequence As String) As Void

Sets the EOL sequence when writing to the stream. The default value is CR+LF. If you need to set this value to a non-printing character, use the `chr()` [global function](docId\:nSjXffR7OlFgDWgjFEbMe).

### SendByte(byte As Integer) As Void

Writes the specified byte to the stream.

### SendLine(string As String) As Void

Writes the specified characters to the stream followed by the current EOL sequence.

### SendBlock(a As Dynamic) As Void

Writes the specified characters to the stream. This method can support either a string or an *roByteArray*. If the block is a string, any null bytes will terminate the block.

### Flush() As Void

Writes the stream to the file, blocking execution until all data is written out. 

### AsyncFlush() As Void

Writes the stream to the file within a few seconds. The system will not block execution while writing to the file.

:::hint{type="info"}
The system performs an asynchronous flush automatically when the object instance is destroyed (for instance, when the the variable containing it is reassigned). The stream is first written to the kernel, which then writes it to the file system when resources are available.
:::

## ifStreamPosition

### CurrentPosition() As Integer

Returns the current position within the file.

[title] roNodeJsEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

If an *roMessagePort* is attached to an *roNodeJs*, it will receive *roNodeJsEvent* objects when something happens to the parent *roNodeJs* instance.

## ifUserData

`SetUserData(user_data As Object)`
Sets the user data that will be returned when events are raised.

`GetUserData() As Object`
Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifNodeJsEvent

`GetData() As roAssociativeArray`
Returns the event data as an associative array with the following key/value pairs:

- `reason` <font color="#6B21A8">string</font>: The cause of the event, which can be one of the following:
  - `process_exit`: The nodeJs instance has exited.
  - `message`: The nodeJs instance has sent a message\*.\*
- `exit_code` <font color="#6B21A8">number</font>:  This field is only present if the value of the `reason` field value is `process_exit`. It will return the exit code from the Node.js® process, as described at [https://nodejs.org/api/process.html#process\_exit\_codes](https://nodejs.org/api/process.html#process_exit_codes). The `exit_code` field is only defined from OS 8.2 onwards. Note that the Node.js script could also use these codes for its own purposes. 
- `message` <font color="#6B21A8">string</font>: If the `reason` field value is `message`, this field returns the contents of the message.

## Example

The following event loop waits for a nodeJs event and reports the events:

```text
while true
    ev = wait(0, gaa.mp)
    print "=== BS: Received event ";type(ev)
    if type(ev) = "roNodeJsEvent" then
        eventData = ev.GetData()
        if type(eventData) = "roAssociativeArray" and type(eventData.reason) = "roString" then
            if eventData.reason = "process_exit" then
                print "=== BS: Node.js instance exited with code " ; eventData.exit_code
            else if eventData.reason = "message" then
                print "=== BS: Received message "; eventData.message
                ' To use this: msgPort.PostBSMessage({text: "my message"});
            else
                print "======= UNHANDLED NODEJS EVENT ========="
                print eventData.reason
            endif
        else
            print "=== BS: Unknown eventData: "; type(eventData)
        endif
    endif
endwhile
```


[title] roAudioEventMx
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

The *roAudioPlayerMx* object can generate *roAudioEventMx* messages with the following values:

- 8 EVENT\_MEDIAENDED
- 14 EVENT\_OVERLAY\_MEDIAENDED
- 16 EVENT\_MEDIAERROR
- 17 EVENT\_OVERLAY\_MEDIAERROR

"Media ended" events are sent when a track finishes and there are no more queued tracks for the player, while "Media error" events are sent when a queued file is not found (e.g. when it does not exist). 

## ifInt

### GetInt() As Integer

Returns the event ID 

### SetInt(value As Integer) As Void

Sets the value of the event

## ifAudioUserData

### SetUserData(user\_data As String)

Sets the user data.

### GetUserData() As String

Returns the user data that has previously been set via `SetUserData()` (either on the source or event object). It will return Invalid if no data has been set.

## ifSourceIdentity

### GetSourceIdentity() As Integer

### SetSourceIdentity() As Integer

:::hint{type="info"}
The *ifSourceIdentity* interface has been deprecated. We recommend using the *ifAudioUserData* interface instead.
:::


[title] roVirtualMemory
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

The *roVirtualMemory* object allows you to create a virtual memory repository for the Chromium HTML engine. This allows Chromium to automatically swap unused elements out of physical memory.

This object is only available on players that support SSD / mSATA drives.

Object Creation: This object is instantiated without parameters.

```text
CreateObject("roVirtualMemory")
```

## ifVirtualMemory

### AddSwapFile(parameters As roAssociativeArray) As Boolean

Adds a virtual memory repository to local storage. This method accepts an associative array with the following parameters:

- `filename` <font color="#6B21A8">string</font>: The URI of the swap file to be created. It is possible to specify a file location other than the SSD/mSATA drive, but it is not recommended.
- `megabytes` <font color="#6B21A8">int</font>: The size of the swap file to be created.

If the specified file does not already exist, it will be created. If it already exists, the size will be modified. Either way, this operation can take some time, but it should only need to be called once.

### RemoveSwapFile(filename As String) As Boolean

Removes a swap file with the specified filename.

## ifFailureReason

### GetFailureReason() As String

Returns additional useful information when a method on the *ifVirtualMemory* interface returns `False`.

[title] roVideoMode
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object allows you to configure resolution and other video output settings. The same video resolution is applied to all video outputs on a BrightSign player. Video or images that are subsequently decoded and displayed will be scaled (using the hardware scalar) to this output resolution if necessary. The JavaScript equivalent is [videomodeconfiguration](docId\:uupZxkYFlBSOLyh8oLcES) (see the "roVideoMode" section of the [BrightScript-JavaScript Migration Guide](docId:2KEwWxLmpYcwu8tffuf2Z) for the equivalent methods).

Object Creation: The *roVideoMode&#xA0;*&#x6F;bject is created with no parameters.

:::BlockQuote
CreateObject("roVideoMode")
:::

The *roVideoMode&#x20;*&#x6F;bject generates *roHdmiInputChanged&#x20;*&#x61;nd *roHdmiOutputChanged&#x20;*&#x65;vent objects whenever the hotplug status of the HDMI® input or output changes. The system will generate an *roHdmiEdidChanged&#x20;*&#x65;vent when an HDMI cable is hotplugged and the EDID information changes.

# ifVideoMode

### GetScreenModes()

Returns a roArray which contains a roAssociativeArray describing each available output on your player hardware and how those outputs are configured. This method has been implemented as of BOS 9.0.15.

When calling `GetScreenModes()`, confirm that the HDMI array positions are valid so you don't accidentally use an undefined array. For example, if you call `GetScreenModes()` on a four-output player that only has one connected display, you won't get a valid return on the other outputs.

The members are:&#x20;

- `name`: On the XC platform, the possible values are HDMI-1, HDMI-2, HDMI-3, or HDMI-4.  The number of array items depend on the number of outputs:
  - The XC2055 has two outputs, HDMI-1 and HDMI-2
  - The XC4055 has four outputs, HDMI-1, HDMI-2, HDMI-3, and HDMI-4
  - The name tells the system which output is associated with the rest of the settings in that entry within the roAssociativeArray (the order of the HDMI outputs is not important).
- `video_mode`: The videomode can be either:
  - A known BrightSign format videomode (for example, *1920x1080x60p)*
  - A full modeline as described in [Apply a Custom Resolution](docId:58VplQM4sGH_VgqVs4Frs)&#x20;
  - *auto&#x20;*&#x77;hich differs slightly from previous platforms. *auto* isn’t recommended when using multiple outputs because the canvas positions are fixed and so if a screen uses an unexpected resolution then it won’t be positioned correctly in the canvas.
- `display_x` and `display_y`: The position of the screen within the overall canvas. The origin (0,0) is the top left corner, and each screen can be positioned relative to it. This allows gaps to be left on the canvas between screens for bezel compensation.
- `transform`: One of normal, 90, 180 or 270 rotation. Each screen can be rotated independently. When a screen is rotated, it rotates all of the content including video. If a single screen is set to *1920x1080x60p* and 90 then the screen is running in portrait mode and all of the firmware will run as if the screen is set to *1080x1920x60p* with video and graphics all rotated.
- `enabled`: Whether the screen is enabled for output. To turn an output to off, set `enabled = false`. No other fields need to be set.

If you do not want to change the existing screen settings, do not enter a value for those settings.

### SetScreenModes (ScreenConfigList configs)

Takes the same format as argument that `GetScreenModes()` returns. By default a single screen is enabled. The player uses full resolution graphics if any of the videomodes configured using `SetScreenModes` use the `:fullres` modifier. BrightSign Author always sets `:fullres` on all of the videomodes for the XC5. See [roVideoMode](docId\:QQ734nQz0hCwNI0uNSdMP) to understand how the x/y display coordinates works with output resolution.

:::hint{type="info"}
Calling `SetScreenModes()` to change the screen HDMI configuration will cause the player to reboot when it makes that change.
:::

This method has been implemented as of BOS 9.0 and later.

To configure two screens, enter:

:::BlockQuote
vm = CreateObject("roVideoMode")
sm = vm.GetScreenModes()

sm\[0].video\_mode="1920x1080x60p"
sm\[0].transform = "normal"
sm\[0].display\_x=0
sm\[0].display\_y=0
sm\[0].enabled = true

sm\[1].video\_mode="1920x1080x60p"
sm\[1].transform = "normal"
sm\[1].display\_x=0
sm\[1].display\_y=1080
sm\[1].enabled = true

vm.SetScreenModes(sm)
:::

To configure a 1x2 video wall with bezel compensation, enter:

:::BlockQuote
vm = CreateObject("roVideoMode")
sm = vm.GetScreenModes()

sm\[0].video\_mode="1920x1080x60p"
sm\[0].transform = "normal"
sm\[0].display\_x=0
sm\[0].display\_y=0
sm\[0].enabled=true

sm\[1].video\_mode="1920x1080x60p"
sm\[1].transform = "normal"
sm\[1].display\_x=0
sm\[1].display\_y=1100    ' Bezel compensation of 20 pixels
sm\[1].enabled=true

sm\[2].enabled=false
sm\[3].enabled=false

vm.SetScreenModes(sm)
:::

In this case the resulting canvas will be 1920x2180, and full screen video and graphics will display across all outputs.

:::hint{type="info"}
To calculate the size of a screen bezel in pixels from millimeters, you must multiply the screen width/height in pixels by the bezel size in millimeters, then divide by the screen width/height in millimeters. You can add this bezel area to the wall width and height to get the total bezel-adjusted resolution.
:::

### GetPerformanceMetrics

This method returns the last, peak, and average measured GPU values.

### SetMode(mode As String) As Boolean

Sets the video output mode. See [this page](docId\:QpML112mBhEK7LBDGUxnv) for a list of supported video modes. This method also accepts ["auto"](docId\:QQ734nQz0hCwNI0uNSdMP) as a mode parameter, or "custom" which will use the mode configured using SetCustomModeline.&#x20;

T<font color="#0C121D">he boolean value </font><font color="#0C121D">can return </font>`true` or `false`<font color="#0C121D">, or not return control to the BrightScript caller at all</font>.  When a real mode change is required (for example: 640x480x60p -> 1920x1080x60p) an application restart will occur on Series 5 or 6 players, and a full reboot will happen on Series 3 or 4 players.  Refresh rate changes (for example, 1920x1080x30p -> 1920x1080x60p) causes an application restart on Series 5 and 6 players , but not on Series 3 and 4 players, where no application restart or player reboot occurs if the mode change is limited to only changing the refresh rate.&#x20;

- SetMode returns `false` and control is returned to the BrightScript caller to take any required action in the following scenarios:
  - An invalid/unsupported mode string is passed (for example a malformed mode name)
  - A mode that is not supported on the current player/output constraints is requested
  - A mode option that requires unavailable configuration (for example, `custom` without valid custom timing configured) is used
- SetMode returns `true` if no action is taken because the mode is already set to the requested mode. If the script sets the mode to the same string returned by `GetMode()`,  the call will return to the script and print the result. The code block below is an example which will cause the application to restart:

:::CodeblockTabs{indent="1"}
```none
Sub Main()
	videoMode = CreateObject("roVideoMode")
	currentMode = videoMode.GetMode()
	print "current mode: "; currentMode
	print "setting mode to current mode: "; currentMode
	result = videoMode.SetMode(currentMode)
	print "SetMode returned: "; result
End Sub
```
:::

- If the mode is a genuine mode change, the BrightSign application will stop, the video mode will change, and the application will restart. Control will not reach the line `print "SetMode returned: "; result`. &#x20;

The following optional parameters can be appended to the string:

- `<resolution>:<color_space>:<depth>bit`: Sets the [video profile](docId\:iqN3Si7i3oTm20ccgRPoX) for HDMI output. BrightSign supports the following color space modifiers:
  - 420 (4:2:0 YUV)
  - 422 (4:2:2 YUV, only for 12-bit and only for 4K modes)
  - 444 (4:4:4 YUV)
  - rgb (RGB, always implicitly 4:4:4)
  - For example, to output 4Kp60 at the 420 (4:2:0 YUV) color space with 10 bits of depth, you would pass the following string: `"3840x2160x60p:420:10bit"`
- `<resolution>:preferred`: Enables the preferred video mode setting. This instructs the player to only use the video mode if the display EDID indicates that it is supported. Otherwise, the output will default to "auto" mode. If no EDID is detected at bootup, the player will output the preferred video mode. If an HDMI hotplug event occurs afterward, then the player will perform the preferred video-mode check again. The `:preferred` flag currently ignores video profile settings (i.e. color space and bit depth).
- `<resolution>:fullres`: Enables full-resolution graphics. This instructs the player to match the graphics plane to the video mode; otherwise, video modes larger than 1920x1200 upscale the graphics plane to match the video output. See [Full-Resolution Graphics](docId\:TJNw230KCx6i9tNihfCvD) for more details and a list of supported modes/models. If the `fullres` mode is used with graphics-intensive HTML applications, we recommend enabling the `gfxmemlarge` setting as well.
- `<resolution>:gfxmemlarge`: Enables the large graphics memory configuration for XTx44 and XTx43 models (at the expense of general-purpose memory). This setting requires a reboot to take effect.
- `<resolution>:gfxmemdefault`: Resets the graphics memory configuration to default. This setting requires a reboot to take effect.
- `<resolution>:dbv`: Enables Dolby Vision on video output (XTx44 only). Only one video decoder is available when Dolby Vision is enabled.
- `<resolution>:rgb:<range>`: Sets the color space to RGB. The optional `<range>` parameter can be one of the following values:
  - `auto`: The default setting. Over HDMI, the player will output RGB Full for VESA modes and RGB Limited for TV modes. Over DVI, the player will output RGB Full for all modes.
  - `fullrange`: The RGB Full (0-255) setting
  - `limitedrange`: The RGB Limited (16-235) setting/

:::hint{type="info"}
BrightSign hardware has a video anti-aliasing low-pass filter that is set automatically.
:::

### SetCustomModeline(roString modeline) As roBool

Sets the custom videomode with the supplied modeline (see [Apply a Custom Resolution](docId:58VplQM4sGH_VgqVs4Frs)). The custom videomode can then be selected using SetMode.

### GetModeForNextBoot() As String

Returns the target video mode of the player the next time it reboots. The return value is specified with the `SetModeForNextBoot()` method.

### SetModeForNextBoot(mode as String)

Sets the target video mode of the player, which will take effect when the player next reboots.&#x20;

### GetBestMode(connector As String) As String

Returns the highest [video mode](docId\:QpML112mBhEK7LBDGUxnv) for this player that can be supported by the display via EDID. The video connector can be specified as `"hdmi"` or `"vga"` (these values are case sensitive). If the display does not return a resolution value over EDID (or if no display is connected), this method returns a blank string.

### GetMode() As String

Returns the current video mode of the player, which is specified using the `SetMode()` method.

### GetFailureReason() As String

Returns additional information when a member function returns `false`.

### GetAvailableModes() As Array 

Returns all video modes supported by the player as an array of of entries. Each entry is an associative array with the following values:

:::hint{type="info"}
In 4K modes, the graphics plane may be smaller than the video plane and output. In these cases, the graphics plane to match the video plane/output.
:::

- `videomode` <font color="#704ae0">string</font>: A description of the video mode (a full list of modes can be found on [this page](docId\:QpML112mBhEK7LBDGUxnv))
- `width` <font color="#704ae0">int</font>: The width of the video output
- `height` <font color="#704ae0">int</font>: The height of the video output
- `graphicsPlaneWidth` <font color="#704ae0">int</font>: The width of the graphics plane 
- `graphicsPlaneHeight` <font color="#704ae0">int</font>: The height of the graphics plane
- `framerate` <font color="#704ae0">int</font>: The frame rate of the video output
- `interlaced` <font color="#704ae0">boolean</font>: A flag indicating whether the video output is interlaced (`true`) or progressive (`false`)
- `overscan` <font color="#704ae0">boolean</font>: A flag indicating whether the video output is using an overscan setting or not
- `colorspace` <font color="#704ae0">string</font>: The color space of the video signal ("rgb", "yuv420", or "yuv422")
- `colordepth` <font color="#704ae0">string</font>: The color depth of the video signal ("8bit", "10bit", or "12bit")
- `dropframe` <font color="#704ae0">boolean</font>: A flag indicating whether the video timecode utilizes drop frames 
- `preferred` <font color="#704ae0">boolean</font>: A flag indicating whether the video mode is the preferred mode, which is configured using the `SetMode()` method

### GetActiveMode() As AssociativeArray

Returns information about the current video mode as an associative array:

- `videomode` <font color="#704ae0">string</font>: The current video mode (e.g. "3840x2160x60p")
- `colordepth` <font color="#704ae0">string</font>: The current color depth ("8bit", "10bit", or "12bit")
- `colorspace` <font color="#704ae0">string</font>: The current color space ("rgb", "yuv420", or "yuv422")
- `preferred` <font color="#704ae0">string</font>: A "true" or "false" string indicating whether the current video mode is the preferred mode, which is set using the SetMode() method.

### GetConfiguredMode() As AssociativeArray

Returns information about the video mode configured using the `SetMode()` method. This method returns an *roAssociativeArray*; see the [GetAvailableModes()](docId\:QQ734nQz0hCwNI0uNSdMP) entry for more details about returned values. If the video mode is set to `"auto"`, this method will return Invalid.

### GetFPS() As Integer

Returns the current framerate of the video output.

### SetDecoderMode(decoder As String, timeslice\_mode As String, z\_order As Integer, friendly\_name As String, enable\_mosaic\_deinterlacer As Boolean) As Boolean 

Configures a video decoder for either standard mode or Mosaic mode. In standard mode, a single decoder is used to play a single video; in Mosaic mode, the decoder can be used to decode multiple videos from different local or remote sources. See the [Selecting Decoders](docId\:QQ734nQz0hCwNI0uNSdMP) section below for more information on assigning video players to decoders in HTML or BrightScript.

:::hint{type="info"}
Series 5 players don’t need Mosaic mode to decode multiple videos if the videos have a low pixel count and do not contain more total pixels than the Series 5 video pipeline can process.
:::

- `decoder`: The video decoder to be used (decoder availability differs by model).
  - "4K": The primary 4K decoder (XTx44 models only)
  - "4K2": The secondary 4K decoder (XTx44 models only)
  - "4K": The sole 4K decoder (HDx24, XTx43, 4Kx42, XDx34, XDx33 and HDx24 models only)
  - "HD1": The primary HD decoder
  - "HD2": The secondary HD decoder
- `timeslice_mode`: The maximum resolution that the decoder will accept (at framerates up to 60p). If this resolution is the same as the decoder's maximum resolution limit, the decoder will use standard mode, not Mosaic mode.
  - "4K": 3840x2160
  - "HD": 1920x1080
  - "SD": 720x576
  - "CIF": 352x288
  - "QCIF": 176x144

:::hint{type="danger"}
Upscaling videos in Mosaic mode currently causes severe performance degradation.
:::

- `z_order`: The z-order of the video window (in standard mode) or group of video windows (in Mosaic mode). A positive integer positions the video window(s) in front of the graphics plane, while a negative integer positions the video(s) behind the graphics plane. If there are two video decoders in use, the video window(s) of the decoder with the higher `z_order` value will be positioned in front. The graphics plane z-order can be modified with the roVideoMode.SetGraphicsZOrder() method, and the video decoder z-order can be modified with the roVideoPlayer.ToFront()/ToBack() methods.
- `friendly_name`: A human-readable name for referencing the decoder in HTML and scripts
- `enable_mosaic_deinterlacer`: A Boolean value indicating whether Mosaic-mode videos can be interlaced or not. Enabling the deinterlacer will allow playback of interlaced videos in Mosaic mode, but will reduce the number of Mosaic-mode videos that can be decoded simultaneously as well.

### GetDecoderModes() As roArray

Returns an array of associative arrays, each one corresponding to a single decoder. Each associative array contains the following entries:

- `decoder_name` <font color="#704ae0">string</font>: The system name of the decoder
- `friendly_name` <font color="#704ae0">string</font>: The name of the decoder as specified when calling `SetDecoderMode()`
- `max_decode_size` <font color="#704ae0">string</font>: The maximum resolution of the decoder, as set by system software. This value can be either "4K" or "HD"
- `configured_decode_size` <font color="#704ae0">string</font>: The maximum resolution of the decoder that is specified when calling `SetDecoderMode()`
- `mode` <font color="#704ae0">string</font>: The current mode of the decoder, which can be either "Regular" or "Mosaic"
- `usage_count` <font color="#704ae0">int</font>: The number of videos currently being decoded by the decoder
- `max_usage` <font color="#704ae0">int</font>: The maximum number of videos that can be decoded simultaneously by the decoder. The optimum `max_usage` limits are described below; the limit may be lower depending on a number of factors, including interlacing and frame rate.
  - 4K decoder:
    - 1 4K video
    - 2 HD videos
    - 4 SD videos
    - 8 CIF videos
    - 10 QCIF videos
  - HD decoder:
    - 0 4K videos
    - 1 HD video
    - 3 SD videos
    - 4 CIF videos
    - 5 QCIF videos
- `mosaic_mode_interlace` <font color="#704ae0">string</font>: The current deinterlacing mode of the decoder, which can be either "Enabled" or "Disabled". This value is specified when calling `SetDecoderMode()`.

### Set3dMode(mode As Integer) As Boolean

Sets the 3D video output mode, which is specified by passing one the following parameters:

- 0: Standard mono video (default)
- 1: Side-by-side stereo video
- 2: Top-and-bottom stereo video

### Screenshot(parameters As roAssociativeArray) As Boolean

Captures a screenshot of the video and graphics layer as a *.jpeg&#x20;*&#x6F;r *.bmp&#x20;*&#x66;ile. The screenshot is configured by passing an associative array of parameters to the method:

- `filename` <font color="#704ae0">string</font>: The name and path of the image file that will be saved (e.g. "SD:/myscreenshots/screen.jpg"). If the specified directory does not exist, the screenshot will fail.
- `width` <font color="#704ae0">int</font>: The width of the image file.
- `height` <font color="#704ae0">int</font>: The height of the image file.

:::hint{type="info"}
The default dimensions of the image file is 640x480.
:::

- `filetype` <font color="#704ae0">string</font>: A string determining whether the image is a "JPEG" or "BMP" file type. Note that the file extension (".jpg" or ".bmp") is not appended to the filename by default and, if needed, should be included in the `filename` string.
- `quality` <font color="#704ae0">int</font>: The image-quality value (between 0 and 100) of the screenshot. This parameter is set to 50 by default.
- `async` <font color="#704ae0">int</font>: A flag that determines whether the screenshot should be taken synchronously or asynchronously. If set to 0, the function returns `true` after the image file has successfully finished writing. If set to 1, the function will return `true` prior to saving the file, then return an *roScreenShotComplete&#x20;*&#x65;vent once the file has finished writing.
- `rotation` <font color="#704ae0">int</font>: The rotation of the screenshot image (in degrees). The default value is 0. Accepted values are 0, 90, 180, and 270.

### GetResX() As Integer

Returns the current width of the graphics plane.

### GetResY() As Integer

Returns the current height of the graphics plane.

### GetVideoResX() As Integer

Returns the current width of the video plane.

### GetVideoResY() As Integer

Returns the current height of the video plane.

### GetOutputResX() As Integer

Returns the width of the display for the current video mode.

### GetOutputResY() As Integer

Returns the height of the display for the current video mode.

:::hint{type="info"}
The coordinate system for content placement on screen is based on the graphics plane. In most cases, the values returned by `GetResX()/GetResY()`, `GetVideoResX()/GetVideoResY()`, and `GetOutputResX()/GetOutputResY()` will be identical.

&#x20;The "GetRes" and "GetVideoRes" values will sometimes differ when using 4K modes if the graphics plane (i.e. "GetRes") remains at 1920x1080, while the video plane (i.e. "VideoRes") expands (e.g. to 3840x2160). The "OutputRes" value will differ from the other two values when the video output is upscaled: For example, when upscaling from HD to 4K, the "GetRes" and "GetVideoRes" values will remain at 1920x1080, while the "OutputRes" values will indicate 3840x2160. To know where you are drawing on this relative scale, query the player for the size of the graph since it is not always the same size as the output resolution.
:::

### GetSafeX() As Integer

Returns the horizontal coordinate for the upper-left corner of the "safe area". For modes that are generally displayed with no overscan, this will be zero.

### GetSafeY() As Integer

Returns the vertical coordinate for the upper-left corner of the "safe area". For modes that are generally displayed with no overscan, this will be zero.

### GetSafeWidth() As Integer

Returns the width of the "safe area." For modes that are generally displayed with no overscan, this will return the same as *GetResX*.

### GetSafeHeight() As Integer

Returns the height of the "safe area." For modes that are generally displayed with no overscan, this will return the same as *GetResY*.

:::hint{type="info"}
More information about safe areas can be found here:

- [Safe area](http://en.wikipedia.org/wiki/Safe_area)&#x20;
- [Overscan](http://en.wikipedia.org/wiki/Overscan_amounts)&#x20;
:::

### SetGraphicsZOrder(order As String) As Boolean 

Specifies the order of the graphics plane (which includes all graphical elements) in relation to the video plane(s). This method accepts three parameters:

- `"front"`: Places the graphics plane in front of the video plane(s).
- `"middle"`: Places the graphics plane between two video planes. This option is only applicable for models that have two video decoders (e.g. XTx44, XDx34).
- `"back"`: Places the graphics plane behind the video plane(s).

If the player is rendering two videos, the `front` and `back` options will always place the graphics plane in front of or behind both video planes. To determine the z-order of video planes in relation to one another, use the `ToFront()` and `ToBack()` methods provided by the *roVideoPlayer*  object. The following table shows all possible video and graphics z-order arraignments that can be specified using the `SetGraphicsZOrder()` method and calling the `ToFront()`  and `ToBack()` methods on a "Video1" *roVideoPlayer* instance.

| **SetGraphicsZOrder()** | **front** | **front** | **middle** | **middle** | **back**  | **back** |
| ----------------------- | --------- | --------- | ---------- | ---------- | --------- | -------- |
| ToFront()/ToBack()      | ToFront() | ToBack()  | ToFront()  | ToBack()   | ToFront() | ToBack() |
| Z-Order                 | Graphics  | Graphics  | Video1     | Video2     | Video1    | Video2   |
|                         | Video1    | Video2    | Graphics   | Graphics   | Video2    | Video1   |
|                         | Video2    | Video1    | Video2     | Video1     | Graphics  | Graphics |

### PauseGraphics(timeout\_in\_ms As Integer) As Boolean

Suspends graphics compositor updates for the specified number of milliseconds (or until the ResumeGraphics() method is called), up to a maximum interval of 10 seconds. While the graphics compositor is paused, no visual elements will be updated (except for [HWZ video](docId\:e6uJleH69Q0JmMv8kyTrp), [scrolling tickers](docId\:GQeNKTmmFazEjdlZHttIZ), and off-screen Chromium textures). Use this method to combine `Show()`, `Hide()`, `Raise()`, `Lower()`, and `SetRectangle()` operations into a single v-sync update.

### ResumeGraphics() As Boolean

Resumes the graphics compositor if it has been paused with the `PauseGraphics()` method.

### SetImageSizeThreshold(parameters As roAssociativeArray) As Boolean 

Changes the maximum allowed size for images. Images sizes are measured in bytes using the following formula: `image_width * image_height * 4`.

The default image size limit is 35389440 bytes (equivelant to 3840x2160x32bpp) for XTx44, XTx43, XDx34, XDx33, and 4Kx42 models and 2621440 bytes (equivelant to 2048x1280x32bpp) for other models. Displaying images larger than the default value may deplete the graphics memory and cause a crash, so we recommend testing a script that uses this method thoroughly before deploying it in a production environment. This method accepts an associative array with the following parameters:

- `width` <font color="#704ae0">int</font>: The image width value
- `height` <font color="#704ae0">int</font>: The  image height value
- `ignore` <font color="#704ae0">int</font>: A flag specifying whether the image size limit is enabled (0) or disabled (1)

:::hint{type="success"}
You can also increase the default maximum width/height by reducing the bpp value (e.g. using a 3840x1280x16bpp on non-4K-capable players is allowed); however, this method is not applicable to HTML pages because Chromium always decodes images to RGBA 8888.
:::

### AdjustGraphicsColor(parameters As roAssociativeArray) As Boolean

Adjusts the video and graphics output of the player using the following parameters, which can be passed to the method as an associative array: "brightness", "hue", "contrast", "saturation". Each parameter has a default value of 0 and can accept a range of values between -1000 and 1000.

### ConfigureHdmiInput(parameters As roAssociativeArray) As Boolean

Configures EDID reporting for the HDMI input. By default, the input EDID includes video modes from the display attached to the HDMI output, some video modes supported by the player, and support for PCM audio up to 48kHz; it does not report proprietary media codecs that can be decoded by the device connected to the HDMI output, so you can use this method to announce such support if available at the endpoint. Using this method to change the default configuration will trigger a reboot on the player.

:::hint{type="info"}
The boolean return value from this method does not follow the usual conventions for BrightScript methods. Instead, a return value of `false` means that *either* the supplied parameters were invalid and the method call has failed *or* that the parameters were accepted but no change was made to the HDMI configuration. Conceptually this method would return `true` to indicate that the HDMI configuration has changed but in practice the player always reboots in this situation so the script will never see a return value of true. The caller can determine whether the operation did in fact succeed by inspecting the result of `GetLastFailureReason()`.
:::

The passed associative array can contain the following parameters:

- `MaxHdcpVersion` <font color="#704ae0">int</font>: The maximum supported version of HDCP advertised by the HDMI input. The default value is 2, which indicates support for HDCP 2.2. It can also be set to 1, which limits advertised support to HDCP 1.4. Series 4 and 5 BrightSign players support HDCP version 1.4.
- `MaxSampleRate` <font color="#704ae0">int</font>: The maximum supported PCM audio sampling rate in Hz (e.g. the default sampling rate is 48000)
- `MaxChannelCount` <font color="#704ae0">int</font>: The number of PCM channels that are advertised over EDID. The default value is 2, which allows for stereo mixdown. Increasing this value to 6 allows the source to send multichannel PCM. If AC-3 or E-AC-3 is enabled on the player, multichannel audio is supported regardless of the MaxChannelCount setting. 
- `EnableAC3` <font color="#704ae0">int</font>: A flag specifying whether AC-3 is not supported (0) or supported (1)
- `EnableEAC3` <font color="#704ae0">int</font>: A flag specifying whether E-AC-3 is not supported (0) or supported (1)
- `EnableTrueHDMlp` <font color="#704ae0">int</font>: A flag specifying whether TrueHD MLP is not supported (0) or supported (1)
- `EnableDTS` <font color="#704ae0">int</font>: A flag specifying whether DTS is not supported (0) or supported (1)
- `EnableDTSHD` <font color="#704ae0">int</font>: A flag specifying whether DTS-HD is not supported (0) or supported (1)
- `LockAudioToVideoClock` <font color="#704ae0">int</font>: A flag specifying whether the audio sample rate clock is locked to the audio clock (0) or video clock (1) of the incoming HDMI signal.
- `EdidFilename` <font color="#704ae0">string</font>: Allows a valid EDID filename to be passed to the HDMI input (if the filename is not valid, it will be rejected and an error will appear in the log). In the example below, the HDMI input will be configured with the EDID from edid.bin on bootup:

:::BlockQuote
vm=CreateObject("roVideoMode")
vm.ConfigureHdmiInput(\{EdidFilename:"sd:/edid.bin"})
:::

### SetHdmiMetadata(parameters As roAssociativeArray) As roAssociativeArray

Configures strings to be sent in the HDMI metadata. This method accepts an associative array with the following parameters:

- `spd_vendor` <font color="#704ae0">string</font>: The vendor string
- `spd_description` <font color="#704ae0">string</font>: The description string

This method returns an associative array, which can contain a single parameter:

- `restart_required` <font color="#704ae0">boolean</font>: A flag indicating whether the player must be rebooted for the metadata changes to take effect

### GetHdmiOutputStatus() As roAssociativeArray

Returns an associative array of Boolean and integer values if an HDMI output is currently connected to a display device. This method will return Invalid if the HDMI output is currently not connected to a display device. The associative array contains the following parameters:

- `output_present` <font color="#704ae0">boolean</font>: A flag indicating wheter the HDMI output is connected to a display device
- `output_powered` <font color="#704ae0">boolean</font>: A flag indicating whether the display device is on (i.e. RX powered)
- `EOTF` <font color="#704ae0">string</font>: A string indicating the current electro-optical transfer function (EOTF) used by the display. The following are possible values:
  - `"HDR (GAMMA)"`
  - `"SDR (GAMMA)"`
  - `"SMPTE 2084 (PQ)"`
  - `"HLG"`
  - `"unspecified"`
- `audio_bits_per_sample` <font color="#704ae0">int</font>: The number of bits per audio sample
- `audio_format` <font color="#704ae0">string</font>: The format of the audio output. A "PCM" value indicates that the player is sending decoded output.
- `audio_channel_count` <font color="#704ae0">int</font>: The number of audio channels in the output
- `audio_sample_rate` <font color="#704ae0">int</font>: The audio sample rate (in hertz)

:::hint{type="info"}
If an HDR video is playing, the following values will be retrieved from the video file: "max\_cll", "max\_fall", "red\_primary\_x", "red\_primary\_y", "green\_primary\_x", "green\_primary\_y", "blue\_primary\_x", "blue\_primary\_y", "white\_point\_x", "white\_point\_y", "min\_mastering\_luminance", "max\_mastering\_luminance".
:::

### GetHdmiInputStatus() As roAssociativeArray

Returns an associative array of Boolean and integer values if an HDMI input is currently connected to the device. This method will return Invalid if there is currently no HDMI input source. The associative array contains the following parameters:

- `device_present` <font color="#704ae0">boolean</font>: A flag indicating whether an HDMI input source is present
- `width` <font color="#704ae0">int</font>: The width of the source video
- `height` <font color="#704ae0">int</font>: The height of the source video
- `interlaced` <font color="#704ae0">boolean</font>: A flag indicating whether the video source is interlaced
- `frame_rate` <font color="#704ae0">float</font>: The framerate of the source video
- `pixelClock` <font color="#704ae0">float</font>: The pixel-clock rate of the source video (in MHz)
- `colorspace` <font color="#704ae0">string</font>: The color space of the source video
- `audio_type` <font color="#704ae0">string</font>: The audio encoding of the source video
- `audio_sampling_rate` <font color="#704ae0">int</font>: The audio sampling rate of the source video (in Hz)

### GetCompositorCrc() As Integer

Returns the CRC of the Y and Cb signals as a single integer.

### GetTxHdcpStatus() As roAssociativeArray

Returns an associative array indicating the current HDCP status of the HDMI output. The associative array currently contains a single key labeled state, which can have the following values:

- `"not-required"`: HDCP is not required by the player. HDCP is required by the player if the video has been decoded locally and needs protection or if the script has called the `forceHdcpOn()` method. Note that, even if the "not-required" value is returned, HDCP might still be active in passthrough mode if an upstream HDMI source (i.e. a device connected to the HDMI input port on the player) has requested it.
- `"authenticated"`: HDCP has been enabled and successfully negotiated.
- `"authentication-in-progress"`: HDCP has been enabled, but authentication has not been completed.
- `"authentication-failed"`: HDCP has been requested but could not be negotiated.

### ForceHdcpOn(force As Boolean) As Boolean

Forces HDCP authentication on the HDMI output if passed `True`. Passing `False` to this method will prevent forced authentication attempts with subsequent hotplug events. This method will return `False` if the player does not support HDCP or if `ForceHdcpOn()` has already been called with the same value.

### DisableHdcpRepeater(disable As Boolean) As Boolean

Prevents HDCP authentication from taking place on the HDMI input if passed `True`. The HDMI source will treat the player like any other non-HDCP authenticated HDMI sink. This method returns `False` if the HDCP state could not be changed, indicating that there's no HDMI input on the player or that HDCP has already been disabled.

### SetBackgroundColor(color As Integer) As Boolean

Specifies the background color using an `#rrggbb` hex value (8 bits for each color). Hex codes like #ffffff will cause an autorun error, so you should use the decimal of hex code (for example, the decimal of #ffffff is 16777215). You can get this value from a hex to decimal converter website: [Hexadecimal / Decimal Colors](https://www.mathsisfun.com/hexadecimal-decimal-colors.html).

### SetPowerSaveMode(video\_connector As String, power\_save\_mode As Boolean) As Boolean

The power\_save\_mode paramater disables HDMI output, the syncs for VGA output, and the DAC output for component video. The absence of a signal will cause some monitors to go into standby mode.&#x20;

The optional video\_connector parameter supports specifying different HDMI outputs and should only be used with multi-output players.

### IsAttached(connector As String) As Boolean

Returns `True` if the specified video connector is attached to an output device (i.e. the display EDID can be read successfully). This method can be passed the following parameters (note that they are case sensitive):

- `"hdmi"`
- `"vga"`

### HdmiAudioDisable(disable As Boolean) As Boolean

Disables audio output if True. This method is set to False by default.

### SetMultiscreenBezel(x\_pct As Integer, y\_pct As Integer) As Boolean

Adjusts the size of the bezel used in calculations for multiscreen displays, allowing for users to compensate for the width of their screen bezels. The calculations for the percentages are as follows:

`x_percentage = (width_of_bezel_between_active_screens / width_of_active_screen) * 100`

`y_percentage = (height_of_bezel_between_active_screens / height_of_active_screen) * 100`

The bezel measurement is therefore the total of the top and bottom bezels in the y case, or the left and right bezels in the x case. When this value is set correctly, images spread across multiple screens take account of the bezel widths, leading to better alignment of images.

### SaveEdids(filename As String) As Boolean

Saves the EDID information of the display(s) connected via HDMI and/or VGA. The EDID fields are saved sequentially as raw binaries into the specified file. The EDID sets are two 2kb each, resulting in a maximum file size of 4kb. This method returns True upon success and False upon failure.

### GetEdidIdentity(video\_connector As Object) As roAssociativeArray

Returns an associative array with EDID information from a compatible monitor/television. `video_connector` can be a string or a boolean:&#x20;

- Pass `True` to specify EDID over HDMI
- Pass a string to specify the HDMI port from which to get the EDID information
- Pass `False` to specify EDID over VGA

These are the possible parameters returned in the associative array:

- `serial_number_string`
- `year_of_manufacture`
- `monitor_name`
- `manufacturer`
- `text_string`
- `serial_number`
- `product`
- `week_of_manufacture`
- unstable

The system will generate an *roHdmiEdidChanged&#x20;*&#x65;vent when an HDMI cable is hotplugged and the EDID information changes. Calling `GetEdidIdentity(true)` at this point retrieves the new EDID information.

**Usage Example**

Specify the HDMI port you want to get the EDID from. For example:&#x20;

:::BlockQuote
GetEdidIdentity(“HDMI-2”)
:::

### SetMpcdi(parameters As roAssociativeArray) As Boolean

Enables MPCDI using the passed parameters. See [this page](docId\:W9QxxBdGzv8_kjUzeUHDU) for more information about configuring MPCDI on BrightSign players.

### SetSyncDomain(domain As String) As Boolean

Enables Genlock synchronization on the specified *roSyncManager&#xA0;*&#x64;omain. To disable Genlock on the domain, pass an empty string to this method. To reconfigure an active Genlock synchronization, call `SetSyncDomain()` again using the domain name of the new or edited *roSyncManager&#x20;*&#x69;nstance.

# ifMessagePort

### SetPort(port As Object) As Void

Posts events to the attached message port

# ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

# "Auto" Video Mode

If the video mode is set to "auto," BrightSign players will use the algorithm below to determine the best video mode to use based on connected hardware, unless they are XD5 or HD5 players. “Auto” on those players will set to the best general resolution that can cope with any type and combination of content of for these platforms, not the highest resolution. For example, the “auto” setting on an XD5 or HD5 will be set to HD, not 4K.&#x20;

1. Try HDMI: If HDMI is attached, use the highest-resolution mode (as reported by the monitor) that the player supports.
2. Default to 640x480x60p.
3. If an HDMI hotplug event occurs at any point, recheck the monitor EDID to determine if the highest-resolution mode has changed. If it has changed, reboot the player and use the new video mode.

# Selecting Decoders for Playback

The system software selects which video decoder to use based on the resolution probed from the video file. In standard mode, it will attempt to select the decoder that has the closest maximum supported resolution (i.e. 1920x1080 for the HD decoder and 3840x2160 for the 4K decoder), without exceeding that maximum resolution. If a decoder has been configured for Mosaic mode, it will match the video resolution against the specified `timeslice_mode` instead. If both decoders support the same maximum resolution, you can select a decoder by matching the z-order of the *roVideoPlayer&#x20;*&#x69;nstance (set using the `ToFront()` and `ToBack()` methods) with the z-order of the decoder (set using the *roVideoMode.SetDecoderMode()&#x20;*&#x6D;ethod).

:::hint{type="info"}
Series 5 players don’t need Mosaic mode to decode multiple videos if the videos have a low pixel count and do not contain a more total pixels than the Series 5 video pipeline can process.
:::

You can also select the decoder manually. First, configure the decoder(s) using the *roVideoMode.SetDecoderMode()&#x20;*&#x6D;ethod. Then, use the `friendly_name` specified when calling the method to designate a decoder to use for video playback.

To select a decoder in BrightScript, pass an associative array to the *roVideoPlayer.PlayFile()&#x20;*&#x6D;ethod containing the `decoder:[friendly_name]` parameter:

:::BlockQuote
PlayFile(\{filename:"text\_1.mov", decoder:"main-video"})
:::

To select a decoder for HTML video, include the `decoder:[friendly_name]` property with the `hwz` attribute:

:::BlockQuote
\<video hwz="decoder\:main-video;"> \</video>
\<video hwz="decoder\:sd-video;"> \</video>
:::

The `max_usage`of a decoder determines how many video players can be assigned to the decoder using the system software algorithm described above—video players beyond the `max_usage` limit may be assigned to another decoder or not displayed at all. On the other hand, if you manually assign video players using the `friendly_name` of the decoder, you can assign more video players to the decoder than the `max_usage` limit, but this may cause unpredictable video-display behavior.

[title] roTextField
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

A text field represents an area of the screen that can contain arbitrary text. This feature is intended for presenting diagnostic and usage information. Use the *roTextWidget* object to generate text for user interfaces and signage.

Object Creation: The object is created with several parameters:

```text
CreateObject("roTextField", xpos As Integer, ypos As Integer, width_in_chars As Integer, height_in_chars As Integer, metadata As Object)
```

- `xpos`: The horizontal coordinate for the top left of the text field.
- `ypos`: The vertical coordinate for the top left of the text field. The top of the screen is equivalent to zero.
- `width_in_chars`: The width of the text field in character cells.
- `height_in_chars`: The height of the text field in character cells.
- `metadata`: An optional *roAssociativeArray* containing extra parameters for the text field. You can pass zero if you do not require this.

The metadata associative array supports the following extra parameters:

- "CharWidth": The width of each character cell in pixels.
- "CharLength": The height of each character cell in pixels.
- "BackgroundColor": The background color of the text field as an integer specifying eight bits (for each) for red, green and blue in the form \&Hrrggbb.
- "TextColor": The color of the text as an integer specifying eight bits (for each) for red, green and blue in the form \&Hrrggbb.
- "Size": An alternative to "CharWidth" and "CharLength" for specifying either normal size text (0) or double-sized text (1).

:::hint{type="info"}
In TV modes, a border around the screen may not be displayed due to overscanning. You may want to use the *roVideoMode* object functions `GetSafeX()` and `GetSafeY()` to ensure that the coordinates you use will be visible.
:::

## ifTextField

### Cls() As Void

Clears the text field.

### GetWidth() As Integer

Returns the width of the text field

### GetHeight() As Integer

Returns the height of the text field.

### SetCursorPos(x As Integer, y As Integer) As Void

Moves the cursor to the specified position. Subsequent output will appear at this position.

### GetValue() As Integer

Returns the value of the character currently under the cursor

### Raise() As Void

Sends the widget to the top of the z-order on the graphics plane (i.e. in front of all other surfaces that implement the *ifWidget* interface). By default, new widgets are placed at the top of the graphics z-order.

:::hint{type="info"}
Some surfaces are always drawn at the top of the graphics z-order, including the mouse cursor, closed captions, and [scrolling tickers](docId\:GQeNKTmmFazEjdlZHttIZ).
:::

:::hint{type="success"}
You can use the `PauseGraphics()`/ `ResumeGraphics()` methods on the [roVideoMode](docId\:QQ734nQz0hCwNI0uNSdMP) object to ensure multiple changes to the graphics z-order occur simultaneously.
:::

### Lower() As Void

Sends the widget to the bottom of the z-order on the graphics plane (i.e. behind all other surfaces that implement the *ifWidget* interface). By default, new widgets are placed at the top of the graphics z-order.

## ifStreamSend

### SendByte(byte As Integer) As Void

Writes the character indicated by the specified number at the current cursor position within the text field. It then advances the cursor.

### SendLine(string As String) As Void

Writes the characters specified at the current cursor position followed by the end-of-line sequence.

### SendBlock(string As Dynamic) As Void

Writes the characters specified at the current cursor position and advances the cursor to one position beyond the last character. This method can support either a string or an [roByteArray](docId:9XVZITNMurdLAayfgIacu). If the block is a string, any null bytes will terminate the block.

### SetSendEol(string As String) As Void

Sets the sequence sent at the end of a SendLine() value. You should leave this at the default ASCII value of 13 (Carriage Return) for normal use. If you need to change this value to another non-printing character, use the `chr` [global function](docId\:nSjXffR7OlFgDWgjFEbMe).

:::hint{type="info"}
The ifStreamSend interface is also described in the section documenting the various file objects. The interface is described again here in a manner more specific to the roTextField object.
:::

## Printing a Text Field 

As with any object that implements the *ifStreamSend* interface, a text field can be written to using the PRINT #textfield syntax. See the example below for more details.

It is also possible to write to a text field using the syntax PRINT #textfield, @pos, where *pos* is the character position in the *textfield*. For example, if your *textfield* object has 8 columns and 3 rows, writing to position 17 writes to row 3, column 2 (positions 0-7 are in row 1; positions 8-15 are in row 2; and positions 16-23 are in the last row).

When output reaches the bottom of the text field, it will automatically scroll.

### Example

```text
meta = CreateObject("roAssociativeArray")
meta.AddReplace("CharWidth", 20)
meta.AddReplace("CharLength", 32)
meta.AddReplace("BackgroundColor", &H101010) ' Dark grey
meta.AddReplace("TextColor", &Hffff00) ' Yellow
vm = CreateObject("roVideoMode")
tf = CreateObject("roTextField", vm.GetSafeX(), vm.GetSafeY(), 20, 20, meta)
print #tf, "Hello World"
tf.SetCursorPos(4, 10)
print #tf, "World Hello"
```


[title] roVideoEvent, roAudioEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

Video and audio events are declared as separate classes. Events can have one of the following values, which are retrieved using the `GetInt()` method:

|    |                         |                                                                                                                                                                                                                                                                                                                                    |
| -- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 3  | `Playing`               | The current media item has started playing.                                                                                                                                                                                                                                                                                        |
| 8  | `MediaEnded`            | The media item has completed playback.                                                                                                                                                                                                                                                                                             |
| 12 | `TimeHit`               | A particular timecode has been reached. See the entry on [Timecode Events](docId\:zTUZ0LdazCmL2kQmdBKCn) for more details.                                                                                                                                                                                                         |
| 13 | `Overlay_Playing`       | An *roAudioPlayerMx* instance has begun playback of an audio file.                                                                                                                                                                                                                                                                 |
| 14 | `Overlay_MediaEnded`    | An *roAudioPlayerMx* instance has completed playback of an audio file.                                                                                                                                                                                                                                                             |
| 15 | `Overlay_TimeHit`       | The EventTimeStamp of an *roAudioPlayerMx* instance has been been reached.                                                                                                                                                                                                                                                         |
| 16 | `MediaError`            | A media error has been detected. As opposed to code 30, this event usually indicates transient errors (e.g. low buffer levels).                                                                                                                                                                                                    |
| 17 | `Overlay_MediaError`    | A media error has been detected during *roAudioPlayerMx* playback.                                                                                                                                                                                                                                                                 |
| 18 | `FadingOut`             | The current media item has completed fading out. See the *roVideoPlayer.SetFade()* entry for more details.                                                                                                                                                                                                                         |
| 19 | `DecoderEOS`            |                                                                                                                                                                                                                                                                                                                                    |
| 20 | `Overlay_FadingOut`     | The FadeOutLocation of an *roAudioPlayerMx* instance has been reached.                                                                                                                                                                                                                                                             |
| 21 | `Overlay_DecoderEOS`    |                                                                                                                                                                                                                                                                                                                                    |
| 26 | `Underflow`             | The stream seems to be underflowing. This event usually indicates that the streaming latency is set too low. It will be generated every few seconds as long as underflow is detected.                                                                                                                                              |
| 28 | `ResourceShortage`      | You are trying to play more video simultaneously than is allowed. If you are playing a single video by creating new video tags, reuse the existing video tag when possible to avoid race conditions when a video tag might hold onto a hardware video resource or take too long to disassociate a video player from the video tag. |
| 30 | `MediaError_NotStarted` | A fatal error has been encountered while attempting to start playback (e.g. the video format is not supported).                                                                                                                                                                                                                    |

:::hint{type="info"}
The [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM) log may return more specific information about media error states.
:::

## ifInt

### GetInt() As Integer

Returns the event ID as an integer value. 

### SetInt(value As Integer) As Void

Sets the integer value. 

## ifUserData

### SetUserData(user\_data As Object) As Void

Sets the user data.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` (on either the event or source object). It will return Invalid if no data has been set.

## ifSourceIdentity

### GetSourceIdentity() As Integer

### SetSourceIdentity() As Integer 

:::hint{type="info"}
The *ifSourceIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::

## ifData    

### GetData() As Integer

### SetData(a As Integer) 

## Example

```text
vp_msg_loop:
    msg=Wait(tiut, p)    
    if type(msg)="roVideoEvent" then
        if debug then print "Video Event";msg.GetInt()
        if msg.GetInt() = 8 then
            if debug then print "VideoFinished"
            retcode=5
            return
        endif
    else if type(msg)="roGpioButton" then
        if debug then print "Button Press";msg
        if escm and msg=BM then retcode=1:return
        if esc1 and msg=B1 then retcode=2:return
        if esc2 and msg=B2 then retcode=3:return
        if esc3 and msg=B3 then retcode=4:return
    else if type(msg)="rotINT32" then
        if debug then print "TimeOut"
        retcode=6
        return
    endif

    goto vp_msg_loop
```


[title] Variables, Literals, and Types
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

## Identifiers

Identifiers are names of variables, functions, and labels. They also apply to BrightScript object methods (i.e. functions) and interfaces (which appear after a "." Dot Operator). Identifiers have the following rules:

- Must start with an alphabetic character (a-z).
- May consist of alphabetic characters, numbers, or the underscore symbol ("\_").
- Are not case sensitive.
- May be of any length.
- May not be a [reserved word](docId\:o4a6EWOpAfyohiS1SHtFr).
- (**variables only**) May end with an optional type declaration ("$" for a string, "%" for an integer, "!" for a float, "#" for a double).

**Examples**

```text
a
boy5
super_man$
42%
```

## Types

BrightScript supports both dynamic typing and declared types. This means that every value has a type determined at runtime, but variables can also be instructed to always contain a value of a specified type. If a value is assigned to a variable that has a specified type, the type of the value will be converted to the variable type if possible. If conversion is impossible, a runtime error will occur.

A variable that does not end in a type declaration may change its type dynamically. For example, the statement `a=4` will create an integer, while a following statement specifying that `a="hello"` will change the type of the variable a to a string.

BrightScript supports the following types:

- **Boolean**: True or False
- **Integer**: A 32-bit signed integer number
- **Float**: The smallest floating point number format supported by either the hardware or software
- **Double**: The largest floating point number format supported by either the hardware or software. Although Double is an intrinsically understood type, it is implemented internally with the *roIntrinsicDouble* object.
- **String**: A sequence of ASCII (not UTF-8) characters. BrightScript uses two intrinsic string states:
  - **Constant strings**: A statement such as `s="astring"` will create an intrinsic constant string.
  - **roString instances**: Once a string is used in an expression, it becomes an *roString* instance. For example, the statement `s = s + "bstring"` will cause the intrinsic string `s` to convert to an *roString* instance. If this is followed by the statement `s2 = s`, the `s2` value will be a reference to `s`, not a copy of it. The behavior of reference counting strings is new to BrightScript version 3.0.
- **Object**: A reference to a BrightScript object (i.e. a native component). Note that the `type()` function will not return "Object" but the type of object instead (e.g. *roList*, *roVideoPlayer*). Also note that there is no separate type for intrinsic BrightScript Objects. All intrinsic BrightScript Objects are built on the *roAssociativeArray* object type.
- **Interface**: An interface in a BrightScript Object. If a  "." Dot Operator is used on an interface type, the member must be static (since there is no object context).
- **Invalid**: A type that can have only one value: `Invalid`. This type is returned in various instances when no other type is valid (for example, when indexing an array that has never been sent). It can also be assigned to a variable with the statement `var = invalid`.

The following are examples of different types. The `?` statement is a shortcut for `print`, while the `type()` function returns a string that identifies the type of the passed expression.

```text
BrightScript> ?type(1)                      
Integer
        
BrightScript> ?type(1.0)                        
Float
       
BrightScript> ?type("hello")                            
String
        
BrightScript> ?type(CreateObject("roList"))                   
roList  
    
BrightScript> ?type(1%)
Integer

BrightScript> b!=1
BrightScript> ?type(b!)
Float

BrightScript> c$="hello"
BrightScript> ?type(c$)
String

BrightScript> d="hello again"
BrightScript> ?type(d)
String

BrightScript> d=1
BrightScript> ?type(d)
Integer

BrightScript> d=1.0
BrightScript> ?type(d)
Float
 
BrightScript>e=invalid
BrightSCript>?type(e)
Invalid
```

## Type Declaration Characters

A type declaration may be used at the end of a variable or literal to fix its type. Variables with the same identifier but separate types are separate variables: For example, defining a$ and a% would create two independent variables.

| **Character** | **Type**                  | **Examples** |
| ------------- | ------------------------- | ------------ |
| $             | String                    | A$, ZZ$      |
| %             | Integer                   | A1%, SUM%    |
| !             | Single-Precision (Float)  | B!, N1!      |
| #             | Double-Precision (Double) | A#, 1/3#, 2# |

## Literals (Constants)

The following are valid literal types:

- Type Boolean: Either `True` or `False`
- Type Invalid: `Invalid` only
- Type String: A string in quotes (e.g. `"This is a string"`)
- Type Integer: An integer in hex (e.g. `HFF`) or decimal (e.g. `255`) format
- Type Float: A number with a decimal (e.g. `2.01`), in scientific notation (e.g. `1.23456E+30`), or with a Float type designator (e.g. `2!`)
- Type Double: A number in scientific notation containing a double-precision exponent symbol (e.g. `1.23456789D-12`) or with a Double type declaration (e.g. `2.3#`)
- Type Function: Similar to variable formatting (e.g. `MyFunction`)
- Type Integer: LINE\_NUM – The current source line number

## Array Literals

The `[]` Array Operator can be used to declare an array. It can contain literals (constants) or expressions.

```text
x = 5
Myarray = []
Myarray = [ 1, 2, 3]
Myarray = [ x+5, true, 1<>2, ["a","b"]]
```

## Associative Array Literals

The \{ } Associative Array Operator can be used to define an associative array. It can contain literals (constants) or expressions.

```text
aa = { }
aa = {key1:"value", key2: 55, key3: 5+3 }
```

Arrays and associative arrays can also be defined with the following format: 

```text
aa = {
   Myfunc1: aFunction
   Myval1 : "the value"
}
```

## Invalid Object Return

Many methods (i.e. functions) that return objects can also return Invalid (for example, in cases where there is no object to return). In these cases, the variable accepting the result must be dynamically typed since it may be assigned either type.

The following code will return a type mismatch: a$ is a string that has a string type declaration, and thus it cannot contain Invalid.

```text
l = []
a$ = l.pop()
```

## Numbers

### Dynamic Typing

The following rules determine how integers, doubles, and floats are dynamically typed:

1. If a constant contains 10 or more digits, or if `D` is used in the exponent, the number is Double. Adding a `#` type declaration also forces a constant to be a Double.
2. If the number is not double precision and it contains a decimal point, the number is a Float. Expressing a number in scientific notation using the `E` exponent also forces a constant to be a Float.
3. If neither of the above conditions is true for a constant, the number is an Integer.

### Type Conversion

When operations are performed on one or two numbers, the result must be typed as an Integer, Float, or Double. When an addition (+), subtraction (-), or multiplication (\*) operation is performed, the result will have the same degree of precision as the most precise operand: For example, multiplying an Integer by a Double will return a number that is a Double.

Only when both operands are Integers will the result be an Integer number. If the result of two Integer operands is outside the 32-bit range, the operation and return will be carried out with Doubles.

Division (/) operates using the same rules as above, except that it can never be carried out at the Integer level: When both operators are Integers, the operation and return will be carried out with Floats.

Comparison operations (e.g. \<, >, =) will convert the numbers to the same type before they are compared. The less precise type will always be converted to the more precise type.

### Type Conversion and Accuracy

When a Float or Double number is converted to the Integer type, it is *rounded down*: The largest integer that is not greater than the number is used. This also happens when the INT function is called on a number.

When a Double number is converted to the Float type, it is *4/5 rounded*: The least significant digit is rounded up if the fractional part is >=5 (otherwise, it is left unchanged).

When a Float number is converted to the Double type, only the seven most significant digits will be accurate.

[title] XML Support
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

BrightScript provides XML support with two BrightScript objects and a set of dedicated language features:

- **roXMLElement**: This object provides support for parsing, generating, and containing XML.
- **roXMLList**: This object is used to contain a list of *roXMLElement* instances.

## Dot Operator

The "." [Dot Operator](docId\:Pl6ydtPGCTYDCA5q2bw45) has the following features when used with XML objects:

- When used with an *roXMLElement* instance, the "." Dot Operator returns an *roXMLList* instance of the child tags that match the dot operand. If no tags match the operand, an empty list is returned.
- When applied to an *roXMLList* instance, the "." Dot Operator aggregates the results of performing the above operation on each *roXMLElement* in the list.
- When applied to XML, which is technically case sensitive, the "." Dot Operator is still case insensitive. If you wish to perform a case-sensitive XML operation, use the member functions of the *roXMLElement*/*roXMLList* objects.

## Attribute Operator

The “@” Attribute Operator can be used with an *roXMLElement* instance to return a named attribute. Though XML is case sensitive, the Attribute Operator is always case insensitive. If the Attribute Operator is used with an *roXMLList* instance, it will only return a value if that list contains exactly one element.

## Examples

```text
<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
    <photos page="1" pages="5" perpage="100" total="500">
        <photo id="3131875696" owner="21963906@N06" secret="f248c84625" server="3125"
        farm="4" title="VNY 16R" ispublic="1" isfriend="0" isfamily="0" />
        <photo id="3131137552" owner="8979045@N07" secret="b22cfde7c4" server="3078"
        farm="4" title="hoot" ispublic="1" isfriend="0" isfamily="0" />
        <photo id="3131040291" owner="27651538@N06" secret="ae25ff3942" server="3286"
        farm="4" title="172 • 365 :: Someone once told me..." ispublic="1" isfriend="0"
        />
    </photos>
</rsp>
```

Given the XML in the above *example.xml* file, then the following code will return an *roXMLList* instance with three entries:

```text
rsp=CreateObject("roXMLElement")
rsp.Parse(ReadAsciiFile("example.xml"))
 
? rsp.photos.photo
```

The following will return an *roXMLElement* reference to the first photo (id="**3131875696**"):

```text
? rsp.photos.photo[0]
```

The following will return an *roXMLList* reference containing the \<photos> tag:

```text
? rsp.photos
```

The following will return the string “100”:

```text
rsp.photos@perpage
```

You can use the *roXMLElement.GetText()* method to return an element’s text: For example, if the variable `<booklist>` contains the element `<book lang=eng>The Dawn of Man</book>`, then the following code will print the string “The Dawn of Man”.

```text
Print booklist.book.gettext()
```

Alternatively, using the Attribute Operator will print the string “eng”.

```text
print booklist.book@lang
```

### Flikr code clip

```text
REM
REM Interestingness
REM pass an (optional) page of value 1 - 5 to get 100 photos
REM starting at 0/100/200/300/400
REM
REM returns a list of "Interestingness" photos with 100 entries
REM


Function GetInterestingnessPhotoList(http as Object, page=1 As Integer) As Object


	print "page=";page


    http.SetUrl("http://api.flickr.com/services/rest/?method=flickr.interestingness.getList&api_key=YOURKEYGOESHERE&page="+mid(stri(page),2))


    xml=http.GetToString()


    rsp=CreateObject("roXMLElement")
    if not rsp.Parse(xml) then stop

       return helperPhotoListFromXML(http, rsp.photos.photo) 'rsp.GetBody().Peek().GetBody())

      
End Function


Function helperPhotoListFromXML(http As Object, xmllist As Object, owner=invalid As dynamic) As Object


    photolist=CreateObject("roList")
    for each photo in xmllist
       photolist.Push(newPhotoFromXML(http, photo, owner))
    end for
    return photolist


End Function


REM
REM newPhotoFromXML
REM
REM    Takes an roXMLElement Object that is an <photo> ... </photo>
REM    Returns an brs object of type Photo
REM       photo.GetTitle()
REM       photo.GetID()
REM       photo.GetURL()
REM       photo.GetOwner()
REM


Function newPhotoFromXML(http As Object, xml As Object, owner As dynamic) As Object
    photo = CreateObject("roAssociativeArray")
    photo.http=http
    photo.xml=xml
    photo.owner=owner
    photo.GetTitle=function():return m.xml@title:end function
    photo.GetID=function():return m.xml@id:end function
    photo.GetOwner=pGetOwner
    photo.GetURL=pGetURL
    return photo
End Function


Function pGetOwner() As String
	if m.owner<>invalid return m.owner
	return m.xml@owner
End Function


Function pGetURL() As String
	a=m.xml.GetAttributes()
	url="http://farm"+a.farm+".static.flickr.com/"+a.server+"/"+a.id+"_"+a.secret+".jpg"
	return url
End Function
```


[title] roList
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

This object functions as a general-purpose, doubly linked list. It can be used as a container for arbitrary-length lists of BrightSign objects. The array operator \[ ] can be used to access any element in an ordered list. 

## ifList

### Count() As Integer

Returns the number of elements in the list.

### ResetIndex() As Boolean

Resets the current index or position in the list to the head element.

### AddTail(obj As Object) As Void

Adds a typed value to the tail of the list.

### AddHead(obj As Object) As Void

Adds a typed value to the head of the list.

### RemoveIndex() As Object

Removes an entry from the list at the current index or position and increments the index or position in the list. It returns `Invalid` when the end of the list is reached.

### GetIndex() As Object

Retrieves an entry from the list at the current index or position and increments the index or position in the list. It returns `Invalid` when the end of the list is reached.

### RemoveTail() As Object

Removes the entry at the tail of the list.

### RemoveHead() As Object

Removes the entry at the head of the list.

### GetTail() As Object

Retrieves the entry at the tail of the list and keeps the entry in the list.

### GetHead() As Object

Retrieves the entry at the head of the list and keeps the entry in the list.

### Clear()

Removes all elements from the list.

## ifEnum

### Reset()

Resets the position to the first element of enumeration.

### Next() As Dynamic

Returns a typed value at the current position and increment position.

### IsNext() As Boolean

Returns `True` if there is a next element.

### IsEmpty() As Boolean

Returns `True` if there is not an exact statement.

## ifArray

### Peek() As Dynamic

Returns the last (highest index) list entry without removing it.

### Pop() As Dynamic

Returns the last (highest index) entry and removes it from the list.

### Push(entry As Dynamic)

Adds a new highest-index entry to the end of the list.

### Shift() As Dynamic

Removes index zero from the list and shifts all other entries down by one unit.

### Unshift(entry As Dynamic)

Adds a new index zero to the list and shifts all other entries up by one unit.

### Delete(index As Integer) As Boolean

Deletes the indicated list entry and shifts all above entries down by one unit.

### Count() As Integer

Returns the length of the list (i.e. the index of the highest entry in the list plus one).

### Clear()

Deletes every entry in the list.

### Append(list As roList)

Appends one *roList* to another. If the passed *roList* contains entries that were never set to a value, they are not appended.

:::hint{type="info"}
The two appended objects must be of the same type.
:::

## ifArrayGet 

### GetEntry(a As Integer) As Dynamic

Returns a list entry of a given index. Entries start at zero. If an entry that has not been set is fetched, Invalid is returned.

## ifArraySet

### SetEntry(a As Integer, b As Dynamic)

Sets an entry of a given index to the passed type value.

## Example

```text
list = CreateObject("roList")
list.AddTail("a")
list.AddTail("b")
list.AddTail("c")
list.AddTail("d") 
list.ResetIndex()
x= list.GetIndex()
while x <> invalid
print x
x = list.GetIndex()
end while 
print list[2]
```


[title] roAssetFetcherEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Content Management Objects/

This event is generated by an *roAssetFetcher* instance when a file transfer succeeds or fails or when population of the asset pool as a whole succeeds or fails.

## ifAssetFetcherEvent

### GetEvent() As Integer

Returns an integer indicating the result of an *roAssetFetcher* download attempt:

-  1: POOL\_EVENT\_FILE\_DOWNLOADED
- -1: POOL\_EVENT\_FILE\_FAILED
-  2: POOL\_EVENT\_ALL\_DOWNLOADED
- -2: POOL\_EVENT\_ALL\_FAILED

### GetName() As String

Returns the filename associated with the event (if any).

### GetFailureReason() As String

Returns additional failure information associated with the event (if any).

### GetFileIndex() As Integer

Retrieves the zero-based index from the sync spec of the file associated with the event. 

### GetResponseCode() As Integer

Returns the protocol response code associated with an event. The following codes indicate success:

- 200: Successful HTTP transfer
- 226: Successful FTP transfer
- 0: Successful local file transfer

For unexpected errors, the return value is negative. There are many possible negative errors from the CURL library, but it is often best to look at the text version by calling `GetFailureReason()`.

Here are some potential errors. Not all of them can be generated by a BrightSign player: 

| **Status** | **Name**                          | **Description**                                                                                                                                                                                          |
| ---------- | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| -1         | CURLE\_UNSUPPORTED\_PROTOCOL      |                                                                                                                                                                                                          |
| -2         | CURLE\_FAILED\_INIT               |                                                                                                                                                                                                          |
| -3         | CURLE\_URL\_MALFORMAT             |                                                                                                                                                                                                          |
| -5         | CURLE\_COULDNT\_RESOLVE\_PROXY    |                                                                                                                                                                                                          |
| -6         | CURLE\_COULDNT\_RESOLVE\_HOST     |                                                                                                                                                                                                          |
| -7         | CURLE\_COULDNT\_CONNECT           |                                                                                                                                                                                                          |
| -8         | CURLE\_FTP\_WEIRD\_SERVER\_REPLY  |                                                                                                                                                                                                          |
| -9         | CURLE\_REMOTE\_ACCESS\_DENIED     | A service was denied by the server due to lack of access. When login fails, this is not returned.                                                                                                        |
| -11        | CURLE\_FTP\_WEIRD\_PASS\_REPLY    |                                                                                                                                                                                                          |
| -13        | CURLE\_FTP\_WEIRD\_PASV\_REPLY    |                                                                                                                                                                                                          |
| -14        | CURLE\_FTP\_WEIRD\_227\_FORMAT    |                                                                                                                                                                                                          |
| -15        | CURLE\_FTP\_CANT\_GET\_HOST       |                                                                                                                                                                                                          |
| -17        | CURLE\_FTP\_COULDNT\_SET\_TYPE    |                                                                                                                                                                                                          |
| -18        | CURLE\_PARTIAL\_FILE              |                                                                                                                                                                                                          |
| -19        | CURLE\_FTP\_COULDNT\_RETR\_FILE   |                                                                                                                                                                                                          |
| -21        | CURLE\_QUOTE\_ERROR               | Failed quote command                                                                                                                                                                                     |
| -22        | CURLE\_HTTP\_RETURNED\_ERROR      |                                                                                                                                                                                                          |
| -23        | CURLE\_WRITE\_ERROR               |                                                                                                                                                                                                          |
| -25        | CURLE\_UPLOAD\_FAILED             | Failed upload command.                                                                                                                                                                                   |
| -26        | CURLE\_READ\_ERROR                | Could not open/read from file.                                                                                                                                                                           |
| -27        | CURLE\_OUT\_OF\_MEMORY            |                                                                                                                                                                                                          |
| -28        | CURLE\_OPERATION\_TIMEDOUT        | The timeout time was reached.                                                                                                                                                                            |
| -30        | CURLE\_FTP\_PORT\_FAILED          | FTP PORT operation failed.                                                                                                                                                                               |
| -31        | CURLE\_FTP\_COULDNT\_USE\_REST    | REST command failed.                                                                                                                                                                                     |
| -33        | CURLE\_RANGE\_ERROR               | RANGE command did not work.                                                                                                                                                                              |
| -34        | CURLE\_HTTP\_POST\_ERROR          |                                                                                                                                                                                                          |
| -35        | CURLE\_SSL\_CONNECT\_ERROR        | Wrong when connecting with SSL.                                                                                                                                                                          |
| -36        | CURLE\_BAD\_DOWNLOAD\_RESUME      | Could not resume download.                                                                                                                                                                               |
| -37        | CURLE\_FILE\_COULDNT\_READ\_FILE  |                                                                                                                                                                                                          |
| -38        | CURLE\_LDAP\_CANNOT\_BIND         |                                                                                                                                                                                                          |
| -39        | CURLE\_LDAP\_SEARCH\_FAILED       |                                                                                                                                                                                                          |
| -41        | CURLE\_FUNCTION\_NOT\_FOUND       |                                                                                                                                                                                                          |
| -42        | CURLE\_ABORTED\_BY\_CALLBACK      |                                                                                                                                                                                                          |
| -43        | CURLE\_BAD\_FUNCTION\_ARGUMENT    |                                                                                                                                                                                                          |
| -45        | CURLE\_INTERFACE\_FAILED          | CURLOPT\_INTERFACE failed.                                                                                                                                                                               |
| -47        | CURLE\_TOO\_MANY\_REDIRECTS       | Catch endless re-direct loops.                                                                                                                                                                           |
| -48        | CURLE\_UNKNOWN\_TELNET\_OPTION    | User specified an unknown option.                                                                                                                                                                        |
| -49        | CURLE\_TELNET\_OPTION\_SYNTAX     | Malformed telnet option.                                                                                                                                                                                 |
| -51        | CURLE\_PEER\_FAILED\_VERIFICATION | Peer's certificate or fingerprint wasn't verified correctly.                                                                                                                                             |
| -52        | CURLE\_GOT\_NOTHING               | When this is a specific error.                                                                                                                                                                           |
| -53        | CURLE\_SSL\_ENGINE\_NOTFOUND      | SSL crypto engine not found.                                                                                                                                                                             |
| -54        | CURLE\_SSL\_ENGINE\_SETFAILED     | Cannot set SSL crypto engine as default.                                                                                                                                                                 |
| -55        | CURLE\_SEND\_ERROR,               | Failed sending network data.                                                                                                                                                                             |
| -56        | CURLE\_RECV\_ERROR                | Failure in receiving network data.                                                                                                                                                                       |
| -58        | CURLE\_SSL\_CERTPROBLEM           | Problem with the local certificate.                                                                                                                                                                      |
| -59        | CURLE\_SSL\_CIPHER                | Could not use specified cipher.                                                                                                                                                                          |
| -60        | CURLE\_SSL\_CACERT                | Problem with the CA cert (path?)                                                                                                                                                                         |
| -61        | CURLE\_BAD\_CONTENT\_ENCODING     | Unrecognized transfer encoding.                                                                                                                                                                          |
| -62        | CURLE\_LDAP\_INVALID\_URL         | Invalid LDAP URL.                                                                                                                                                                                        |
| -63        | CURLE\_FILESIZE\_EXCEEDED,        | Maximum file size exceeded.                                                                                                                                                                              |
| -64        | CURLE\_USE\_SSL\_FAILED,          | Requested FTP SSL level failed.                                                                                                                                                                          |
| -65        | CURLE\_SEND\_FAIL\_REWIND,        | Sending the data requires a rewind that failed.                                                                                                                                                          |
| -66        | CURLE\_SSL\_ENGINE\_INITFAILED    | Failed to initialize ENGINE.                                                                                                                                                                             |
| -67        | CURLE\_LOGIN\_DENIED              | User, password, or similar field was not accepted and login failed .                                                                                                                                     |
| -68        | CURLE\_TFTP\_NOTFOUND             | File not found on server.                                                                                                                                                                                |
| -69        | CURLE\_TFTP\_PERM                 | Permission problem on server.                                                                                                                                                                            |
| -70        | CURLE\_REMOTE\_DISK\_FULL         | Out of disk space on server.                                                                                                                                                                             |
| -71        | CURLE\_TFTP\_ILLEGAL              | Illegal TFTP operation.                                                                                                                                                                                  |
| -72        | CURLE\_TFTP\_UNKNOWNID            | Unknown transfer ID.                                                                                                                                                                                     |
| -73        | CURLE\_REMOTE\_FILE\_EXISTS       | File already exists.                                                                                                                                                                                     |
| -74        | CURLE\_TFTP\_NOSUCHUSER           | No such user.                                                                                                                                                                                            |
| -75        | CURLE\_CONV\_FAILED               | Conversion failed.                                                                                                                                                                                       |
| -76        | CURLE\_CONV\_REQD                 | Caller must register conversion callbacks using the following URL\_easy\_setopt options: CURLOPT\_CONV\_FROM\_NETWORK\_FUNCTION CURLOPT\_CONV\_TO\_NETWORK\_FUNCTION CURLOPT\_CONV\_FROM\_UTF8\_FUNCTION |
| -77        | CURLE\_SSL\_CACERT\_BADFILE       | Could not load CACERT file, missing or wrong format.                                                                                                                                                     |
| -78        | CURLE\_REMOTE\_FILE\_NOT\_FOUND   | Remote file not found.                                                                                                                                                                                   |
| -79        | CURLE\_SSH                        | Error from the SSH layer (this is somewhat generic, so the error message will be important when this occurs).                                                                                            |
| -80        | CURLE\_SSL\_SHUTDOWN\_FAILED      | Failed to shut down the SSL connection.                                                                                                                                                                  |

The following error codes are generated by the system software and are outside the range of CURL events

| **Status** | **Name**                      | **Description**                                                                   |
| ---------- | ----------------------------- | --------------------------------------------------------------------------------- |
| -1002      | ENOENT                        | The specified file does not exist or cannot be created.                           |
| -10001     | Cancelled                     | The operation has been cancelled.                                                 |
| -10002     | Exception                     | The operation caused a local exception. Call GetFailureReason() for more details. |
| -10003     | ERROR\_EXCEPTION              | An unexpected exception occurred.                                                 |
| -10004     | ERROR\_DISK\_ERROR            | A disk error occurred (usually as a result of the disk being full).               |
| -10005     | ERROR\_POOL\_UNSATISFIED      | The expected files are not present in the pool.                                   |
| -10006     | ERROR\_DOWNLOADING\_ELSEWHERE | The file is being downloaded by another *roAssetFetcher* instance.                |
| -10007     | ERROR\_HASH\_MISMATCH         | A downloaded file did not match its checksum or file size.                        |

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

[title] roAssetRealizer
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Content Management Objects/

This object contains functions for realizing files (i.e. extracting files from an asset pool and placing them into the standard file directory). Realizing a complete asset pool is not recommended because the process can be slow. Instead, the script should retrieve pool file locations using the *roAssetPoolFiles* object and use them to refer to files directly. The *roAssetRealizer* object is still useful for realizing files that must be in the root directory to work (e.g. autorun and firmware update files). The JavaScript equivalent is [assetrealizer](docId\:xnl0us14GWG7EUIz2XSDm).

Object Creation: The *roAssetRealizer* object requires two parameters upon creation: an *roAssetPool* object and a destination directory.

```text
CreateObject("roAssetRealizer", pool As roAssetPool, destination_directory As String)
```

### Example

```text
pool = CreateObject("roAssetPool", "pool")
realizer = CreateObject ("roAssetRealizer", pool, "/")
```

## IfUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

## ifAssetRealizer

### GetFailureReason() As String

Yields additional useful information if a function return indicates an error.

### EstimateRealizedSizeInMegabytes(spec As Object) As Integer

Returns the estimated amount of space that would be taken up by the specified sync spec.

### Realize(spec As roSyncSpec/roAssetCollection) As roAssetRealizerEvent

Places the files into the destination directory specified in the passed *roSyncSpec* or *roAssetCollection*. If the pool does not contain the full set of required files, then this method will immediately fail before any files are changed (this method attempts to do as much work as possible before destructively modifying the file system). This method automatically checks the length of the file and any hashes that match the specification. If there is a mismatch, then the affected file is deleted and realization fails. This method indicates success or failure by returning an *roAssetRealizerEvent* object.

:::hint{type="info"}
The pool and the destination must be in the same file system.
:::

### ValidateFiles(spec As Object, options As Object) As roAssociativeArray

Checks the hash of every file in the spec against the corresponding file in the destination path and returns an associative array containing each mismatched file name mapped to the reason. The options parameter is an *roAssociativeArray*, which can currently support a single option:

- "DeleteCorrupt": Automatically deletes any files that do not match the expected hash. By default, these files are not deleted.


[title] Content Management Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/

This section describes objects that enable downloading, storage, and retrieval of content from a remote CMS.

- [roAssetCollection](docId\:RvZrJyf0TAVkNLG8G5LHW)
- [roAssetFetcher](docId:1aQOGvXANa1wfJWf8tHmd)
- [roAssetFetcherEvent](docId\:MTa3K5RAQthAwk4u3Ue3h)
- [roAssetFetcherProgressEvent](docId:12_avNhhh5uVj2YEvYES2)
- [roAssetPool](docId\:dz9ZC0Ke6JLQnIbuNuq0n)
- [roAssetPoolFiles](docId\:CK1-zBEqIUwFQyWr4fRzs)
- [roAssetRealizer](docId\:yoV_QcUTleNArbM-FZMfv)
- [roAssetRealizerEvent](docId\:I9xynYU27ccntHOBfhpHU)
- [roSyncSpec](docId\:aNIMDW9JJGZbCa4_kgxGv)


[title] roCanvasWidget
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object composites background color, text, and images into a single rectangle, allowing you to layer images on a z-axis.

Object Creation: Like other widgets, *roCanvasWidget* is created with an *roRectangle* to set its size and position on the screen.

```text
CreateObject ("roCanvasWidget", r As roRectangle) As Object
```

## ifCanvasWidget

### Hide() As Boolean

Hides the widget.

### Show() As Boolean

Shows the widget.

### Raise() As Void

Sends the widget to the top of the z-order on the graphics plane (i.e. in front of all other surfaces that implement the *ifWidget* interface). By default, new widgets are placed at the top of the graphics z-order.

:::hint{type="info"}
Some surfaces are always drawn at the top of the graphics z-order, including the mouse cursor, closed captions, and [scrolling tickers](docId\:GQeNKTmmFazEjdlZHttIZ).
:::

:::hint{type="success"}
**Tip**
You can use the `PauseGraphics()`/ `ResumeGraphics()` methods on the [roVideoMode](docId\:QQ734nQz0hCwNI0uNSdMP) object to ensure multiple changes to the graphics z-order occur simultaneously.
:::

### Lower() As Void

Sends the widget to the bottom of the z-order on the graphics plane (i.e. behind all other surfaces that implement the *ifWidget* interface). By default, new widgets are placed at the top of the graphics z-order.

### SetRectangle(r As roRectangle) As Boolean

Changes the size and positioning of the widget rectangle using the passed *roRectangle* object.

### SetLayer(content As Object, z-level As Integer) As Boolean

Sets the contents of a layer within the widget. The lowest z-level is drawn first, and the highest z-level is drawn last. The object content is described below.

### ClearLayer(z-level As Integer) As Boolean

Clears the specified layer.

### Clear() As Boolean

Clears all of the layers

### EnableAutoRedraw(enable As Boolean) As Boolean

Enables or disables the automatic redrawing of the widget.

- When this function is enabled, each call to SetLayer, ClearLayer, or Clear results in a redraw. If you need to change multiple layers, then you should disable auto redraw while calling the SetLayer function.
- SetLayer enables or disables redrawing of the widget when layer content is changed. When auto-redraw is enabled, each call to SetLayer, ClearLayer, or Clear results in a redraw. To batch multiple updates together, you should first suspend drawing using EnableAutoRedraw(false), then make the changes to the content, and finally re-enable drawing using EnableAutoRedraw(true). The redraw happens in a separate thread, so EnableAutoRedraw returns almost immediately.

## Object Content

The content specified in each layer can consist of one or more objects. Each object is defined by an roAssociativeArray. If there is more than one object, then each is placed into an roArray prior to passing to the `SetLayer()` method. Currently, there are four object types. 

### Background color

- `color`: The #\[aa]rrggbb hex value of the background color
- `targetRect`: A target rectangle, which is another *roAssociativeArray* consisting of x, y, w, and h values. These values are relative to the top left corner of the widget.

### Text

- `text`: A string of text to display
- `targetRect`: The rectangle in which the text is displayed
- `textAttrs`: An *roAssociativeArray* containing attributes to be applied to the text. The attributes can be any of the following:
  - `font`: A string indicating whether the text should be displayed as "small"/"medium"/"large"/"huge"
  - `fontSize`: A point size that is used directly when creating the font. If the value is set to 0, then the font automatically resizes to fit the targetRect.
  - `fontfile`: The filename for a non-system font to use
  - `hAlign`: A string indicating the "left"/"center"/"right" alignment of the text on a line
  - `vAlign`: A string indicating the "top"/"center"/"bottom" alignment of the text perpendicular to the line
  - `rotation`: A string indicating the "0"/'90"/"180"/"270" degree rotation of the text
  - `color`: The #\[aa]rrggbb hex value of the text

### Image

- `filename`: The filename of the image
- `encryptionalgorithm`: The file-encryption algorithm. Currently the options are "AesCtr" and "AesCtrHmac".
- `encryptionkey`: The key to decrypt the image file. This is a byte array consisting of 128 bits of key, followed by 128 bits of IV.

:::hint{type="info"}
See [Image Decryption](docId:0UMXqYvruY7DRNLuUZAFp) for details on displaying encrypted images.
:::

- `targetRect`: The rectangle in which the image is displayed. The image will be automatically resized to fit into the target area.
- `sourceRect`: The source rectangle to clip from a source image
- `compositionMode`: Enter either source or source\_over. The latter alpha blends with underlying objects. The former replaces the underlying values completely.
- `imgAttrs`: An *roAssociativeArray* containing attributes to be applied to the image:
  - `rotation`: A string indicating the "0"/'90"/"180"/"270" degree rotation of the image

### QR Codes

QR (quick response) codes appear as squares of black dots on a white background. They are used to encode URLs, email addresses, etc, and they can be scanned using readily available software for smart phones. Although the codes usually appear as black on white, you can, in theory, use any two contrasting colors.

- `targetRect`: The rectangle in which the QR code is displayed. Regardless of the aspect ratio of this rectangle, the QR code itself will always be squared with the background color that fills the gaps.
- `QrCode` (simple form): Contains the string to encode into the QR code.
- `QrCode` (complex form): Contains an array of parameters for the QR code. The parameters can be any of the following:
  - `color`: The foreground color in the QR code (the default is black)
  - `backgroundColor`: The background color in the QR code (the default is white)
  - `rotation`: A string indicating the "0"/'90"/"180"/"270" degree rotation of the code. The code will scan regardless of rotation.
  - `qrText`: Contains the text to encode into the QR code.

## Example

This code contains most of the *roCanvasWidget* features outlined above:

```text
rect=CreateObject("roRectangle", 0, 0, 1920, 1080)
cw=CreateObject("roCanvasWidget", rect)

aa=CreateObject("roAssociativeArray")
aa["text"] = "Primal Scream"
aa["targetRect"] = { x: 280, y: 180, w: 500, h: 30 }
aa["textAttrs"] = { Color:"#AAAAAA", font:"Medium", HAlign:"Left", VAlign:"Top"}

aa1=CreateObject("roAssociativeArray")
aa1["text"] = "Movin' on up, followed by something else, followed by something else, followed by something else, followed by something else"
aa1["targetRect"] = { x: 282, y: 215, w: 80, h: 500 }
aa1["textAttrs"] = { Color:"#ffffff", font:"Large", fontfile:"usb1:/GiddyupStd.otf", HAlign:"Left", VAlign:"Top", rotation:"90"}

array=CreateObject("roArray", 10, false)
array.Push({ color: "5c5d5f" })
array.Push({ filename: "transparent-balls.png" })
array.Push(aa)

aa2=CreateObject("roAssociativeArray")
aa2["filename"] = "transparent-balls.png"
aa2["CompositionMode"] = "source_over"
aa2["targetRect"] = { x: 400, y: 200, w: 200, h: 200 }

aa3=CreateObject("roAssociativeArray")
aa3["QrCode"] = "www.brightsign.biz"
aa3["targetRect"] = { x: 100,  y: 100,  w: 400, h: 400  }

aa4=CreateObject("roAssociativeArray")
aa4["QrCode"] = { qrText:"www.brightsign.biz", rotation:"90" }
aa4["targetRect"] = { x: 1200,  y: 100,  w: 400, h: 600  }

aa5=CreateObject("roAssociativeArray")
aa5["QrCode"] = { color:"#964969", backgroundColor:"#FFFF77", qrText:"www.brightsign.biz", rotation:"180" }
aa5["targetRect"] = { x: 100,  y: 600,  w: 400, h: 400  }

cw.Show()
cw.EnableAutoRedraw(0)
cw.SetLayer(array, 0)
cw.SetLayer(aa1, 1)
cw.SetLayer(aa1, 2)
cw.SetLayer(aa3, 3)
cw.SetLayer(aa4, 4)
cw.SetLayer(aa5, 5)
cw.EnableAutoRedraw(1)

cw.ClearLayer(0) 
```

##


[title] roCharDisplay
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

The *roCharDisplay* object lets you write to a character display as well as set and get its properties.

Object Creation:

```text
CreateObject("roCharDisplay")
```

## if CharDisplay

### Show(row As Integer, col As Integer, txt As String) As Void

Displays text at the prescribed position. This has the following parameters:

- `row` <font color="#6B21A8">int</font>: The row in which to put the text
- `col` <font color="#6B21A8">int</font>: The column in which to put the text
- `txt` <font color="#6B21A8">string</font>: The text as a string

### Clear() as void

Clears the display

### SetPosition (row As Integer, col As Integer) As Void

Positions the cursor. This has the following parameters:

- `row` <font color="#6B21A8">int</font>: The row in which to put the cursor
- `col` <font color="#6B21A8">int</font>: The column in which to put the cursor

### SetCursor(cursor As Integer) As Void

Sets the cursor style. This has the following parameter:

- `cursor` <font color="#6B21A8">int</font>: The preferred cursor style; 0 is off; 1 is blink; 2 is underline; 3 is both

### SetContrast(contrast As Integer) As Void

Set the display contrast. This has the following parameter:

- `contrast` <font color="#6B21A8">int</font>: A value from 0 to 100

### GetContrast() As Integer

Gets the display contrast

### SetBrightness(brightness) As Integer

Set the display brightness. This has the following parameter:

- `brightness` <font color="#6B21A8">int</font>: A value from 0 to 100

### GetBrightness() As Integer

Gets the display brightness

### GetColumns() As Integer

Returns the number of columns. This is useful for writing code that loops over the available rows and columns. 

### GetRows() As Integer

Returns the number of rows. This is useful for writing code that loops over the available rows and columns.

[title] roDiskMonitor
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This object provides access to low-level information about disk errors. It provides an event-based interface that delivers *roDiskErrorEvent* objects via *roMessageport*. Error messages are held for five seconds before delivery to minimize the chance of spurious error reports. Errors are not reported if the disk is removed during this five second interval because disk-removal detection takes several seconds. This allows for long-term monitoring of occasional media errors.

Object Creation: The *roDiskMonitor* object is created with no parameters.

```text
CreateObject("roDiskMonitor")
```

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roDiskErrorEvent* to the attached message port. 

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

### Example

```text
diskmon=CreateObject("roDiskMonitor")
 
msgp=CreateObject("roMessagePort")
diskmon.Setport(msgp)
```


[title] Threading Model
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

BrightScript runs in a single thread. In general, BrightScript object calls are synchronous if they return quickly, and asynchronous if they take a substantial amount of time to complete. For example, methods belonging to the *roArray* object are all synchronous, while the `Play()` method that is part of the *roVideoPlayer* object will return immediately (it is asynchronous). As a video plays, the *roVideoPlayer* object will post messages to the message port, indicating such events as “media playback finished” or “frame x reached”.             &#x20;

The object implementer decides whether a BrightScript object should launch a background thread to perform a synchronous operation. Sometimes, an object will feature synchronous and asynchronous versions of the same method.

This threading model ensures that the script writer does not have to deal with mutexes and other synchronization objects. The script is always single threaded, and the message port is polled or waited on to receive events into the thread. On the other hand, those implementing BrightScript objects have to consider threading issues: For example, the *roList* and *roMessagePort* objects are thread-safe internally, allowing them to be used by multiple threads.

[title] roSyncSpec
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Content Management Objects/

This object represents a parsed sync spec. It allows you to retrieve various parts of the specification with methods.

## ifSyncSpec

### GetFailureReason() As String

Returns information if an *roSyncSpec* method indicates failure.

### ReadFromFile(filename As String) As Boolean

Populates the sync spec by reading the specified file. This method returns `True` upon success and `False` upon failure.

### ReadFromString(spec As String) As Boolean

Populates the sync spec by reading the passed string. This method returns `True` upon success and `False` upon failure.

### WriteToFile(filename As String) As Boolean

Writes out the current sync spec to the specified file as XML. Because the XML is regenerated, it is possible this file may not be textually identical to the specification that was read. This method returns `True` upon success and `False` upon failure.

### WriteToFile(filename As String, options As roAssociativeArray) As Boolean

Writes out the current sync spec to the specified file as XML or JSON. The `options` associative array can currently contain the `format` parameter, which can have a value of "xml" or "json". Because the XML/JSON is regenerated, it is possible this file may not be textually identical to the specification that was read. This method returns `True` upon success and `False` upon failure.

### WriteToString() As String

Writes out the current sync spec to a string and returns it as XML. This method returns an empty string if the write operation fails.

### WriteToString(options As roAssociativeArray) As String

Writes out the current sync spec to a string and returns it as XML or JSON. The `options` associative array can currently contain the `format` parameter, which can have a value of "xml" or "json". This method returns an empty string if the write operation fails.

### GetMetadata(section As String) As roAssociativeArray

Returns an *roAssociativeArray* object containing the information stored in the specified metadata section of the sync spec (typically "client" or "server"). This method returns 0 if the read operation fails.

If the sync spec is formatted as XML, then all returned values will be strings. If the spec spec is formatted as JSON, the JavaScript types will be converted as follows:

| **JavaScript type** | **BrightScript type** |
| ------------------- | --------------------- |
| Array               | roArray               |
| Object              | roAssociativeArray    |
| String              | String                |
| Boolean             | Boolean               |
| Number              | Double                |
| Null                | Invalid               |

### LookupMetadata(section As String, field As String) As String

Provides a shortcut for looking up specified metadata items in the specified section without needing to create a temporary *roAssociativeArray* object. This method returns an empty string if the read operation fails.

### GetFileList(section As String) As roList

Returns an *roList* object containing *roAssociativeArray* objects for each file in the specified section of the sync spec. This method returns `Invalid` if the read operation fails.

### GetFile(section As String, index As Integer) As roAssociativeArray

Returns an *roAssociativeArray* object for the file in the specified section and at the specified index. This method returns `Invalid` if the read operation fails.

### GetName() As String

Returns the name supplied for the sync spec in the \<sync> XML element.

### EqualTo(other As roSyncSpec) As Boolean

Compares the contents of the *roSyncSpec* object with another *roSyncSpec* object. This method compares the parsed contents of each sync spec rather than the XML files themselves.

### VerifySignature(signature as String, obfuscated\_passphrase as String) As Boolean

De-obfuscates the passphrase and uses it to verify the signature of the sync spec. This method returns `True` upon success and `False` upon failure.

### FilterFiles(section As String, criteria As roAssociativeArray) As roSyncSpec

Returns a new *roSyncSpec* object that is a copy of the existing object, except that the specified section is filtered using the specified criteria. The criteria are matched against the file metadata. Multiple criteria can be specified in the passed associative array, and all criteria must be met for a file to be returned with the new *roSyncSpec*.

The following call will yield an *roSyncSpec* object with a "download" section that has been filtered so that only files of the group "scripts" will remain.

```text
filtered_spec = spec.FilterFiles("download", { group: "scripts" })
```

### FilesEqualTo(spec As roSyncSpec) As Boolean

Compares the contents of the sync spec to another sync spec and returns `true` if they're identical. This method compares the parsed contents of the sync specs, rather than the XML/JSON itself.

### GetAssets(section As String) As Object

Retrieves a list of assets from the sync spec in a form that's compatible with *roAssetPool* and its associated objects.

[title] roAudioOutput
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object allows individual control of audio outputs on the player. The JavaScript equivalent is [audiooutput](docId\:lXzJ2B4sOLXTNXKXXkOb5).

Object Creation: The *roAudioOutput* object requires a single output parameter upon creation.

```text
CreateObject("roAudioOutput", output As String)
```

The `output` parameter can take the following strings:

- `“none”`
- `"hdmi”` or `"hdmi-1"`, `"hdmi-2"`, `"hdmi-3"`, or `"hdmi-4`" for Series 5 players with multiple outputs
- `“usb”`
- `“spdif”`
- `"analog"` 
- `“analog:N”` (N specifies the port enumeration, which is useful for models with multiple analog-audio ports; you can also use `"analog:1"` to specify the analog output on a model with a single analog-audio port)
- `"earc"` (AU335 only)
- Support for multiple USB outputs using the USB port naming terminology.&#x20;
  - `"usb:fid"` where `fid` is the device’s Friendly ID as documented here:  [roDeviceInfo-getusbtopology](docId\:uTKDmpos1ulxaoYLx1nS6)

:::ExpandableHeading{indent="1"}
**Getting the Friendly ID**

The `"usb:fid"` form requires knowing the fid of the USB audio device. The fid is derived from the physical port the device is connected to and can be discovered at runtime using`roDeviceInfo.GetUSBTopology()`. For a player with two ports, a device connected directly to a port will have a `fid` such as `A:0` or `B:0`. If a device is connected via a hub, it may have a fid such as `B/2.0`. The following example prints all USB audio device fids:

```none
di = CreateObject("roDeviceInfo")
topo = di.GetUSBTopology({xml: true})
print topo

' Example output for a device on port B:
'   <device>
'     <raw>4-1:1.0</raw>
'     <fid>B.0</fid>
'     <category>AUDIO</category>
'     ...
'   </device>
```
:::

You can create any number of *roAudioOutput* objects. There can be multiple instances of this object that represent the same audio output, but in these cases one object will override another.

To wire the `roAudioOutput` object to the player, see this `SetPcmAudioOutputs` usage example:&#x20;

:::ExpandableHeading{indent="1"}
**Getting a USB Audio Output**

To create a USB audio output, the fid string to pass to `CreateObject` is `"usb:" + fid`, e.g. `"usb:B.0"` for a device connected directly to port B, or `"usb:B/2.0"` for a device on a hub attached to port B. The `"usb:"` prefix is matched case-insensitively; the fid portion must match exactly the value returned by `GetUSBTopology()`. The USB audio topology must be established **before the player boots**. Connecting or disconnecting USB audio devices after boot is not supported and will not update the available audio routes. If a USB audio device is not present at boot time, `CreateObject("roAudioOutput", "usb:fid")` will return `Invalid` for that fid.

The following script shows how to route audio to a USB device, given that the `fid` of the device is known.

```none
' Create an audio output for the USB device on port B
usbOut = CreateObject("roAudioOutput", "usb:B.0")

' Create a player and direct its PCM output to the USB device
player = CreateObject("roAudioPlayer")
player.SetPcmAudioOutputs([usbOut])

' Multiple USB devices (e.g. port A and port B) can be passed together
usbOutA = CreateObject("roAudioOutput", "usb:A.0")
usbOutB = CreateObject("roAudioOutput", "usb:B.0")
player.SetPcmAudioOutputs([usbOutA, usbOutB])
player.PlayFile("sd:/my.mp3")
```
:::

## ifAudioOutput

### SetVolume(a As Integer) As Boolean

Sets the volume of the specified output as a percentage represented by an integer between 0 and 100.

### SetVolume(parameters As roAssociativeArray) As Boolean

Sets the volume of the specified output using the parameters passed:

- db: The required volume in decibels. Allowed values are up to 0.0, which represents full volume.

### SetTone(treble As Integer, bass As Integer) As Boolean

Sets the treble and bass of the specified output. The treble and bass integers can range from -1000 to 1000, with 0 indicating no modification to the audio signal. Each increment represents a change of 0.01db.

### SetMute(a As Boolean) As Boolean

Mutes the specified output if `True`. This method is set to `False` by default.

### GetOutput() As String

Returns the string with which the *roAudioOutput* object was created.

### SetAudioDelay(delay\_in\_milliseconds As Integer) As Boolean

Delays the audio for a specific audio output by lagging decoded samples before they reach that output. Delays are limited to 150ms or less. Currently, the system software only supports positive delays; therefore, if you need to set the audio ahead of the video, you will need to use *roVideoPlayer.SetVideoDelay()* instead.

### GetPlugState( ) As Boolean

This function returns `true` if the corresponding output has a plug in it, `false` if it does not, or `Invalid` if the plug state cannot be determined on the current hardware or OS version. This is supported only on MD435, MD455, EV445, EV455, XD236, XD1036, HD226 and HD1026 players in BOS 9.0.163 onwards.

The `SetVolume()` and `SetMute()` methods work in conjunction with the volume and mute functionality offered by *roAudioPlayer*. The *roAudioPlayer* volume settings affect the audio decoder volume. The audio stream is then sent to the assigned outputs, which have an additional level of volume control enabled by *roAudioOutput*.

The *roAudioOutput* object affects the absolute volume (as well as mute settings) for an audio output. If two players are streaming to the same output, both will be affected by any settings implemented through *roAudioOutput*.

:::hint{type="info"}
To control which audio outputs connect to audio player outputs generated by *roAudioOutput*, use the SetPcmAudioOutputs() and   SetCompressedAudioOutputs() methods, which can be used for *roVideoPlayer* and  *roAudioPlayer*. See the *roAudioPlayer* entry for further explanation of these methods.
:::


[title] roBrightPackage
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

An *roBrightPackage* object represents a *.zip* file, which can include arbitrary content or be installed on a storage device to provide content and script updates (for example, to distribute updates via USB thumb drives). The JavaScript equivalent is the Node.js Zlib API.

Object Creation: The *roBrightPackage* object is created with a filename parameter that specifies the name of the *.zip* file.

```text
CreateObject("roBrightPackage", filename As String)
```

**Limitations**

The *roBrightPackage* object supports *.zip* files that are smaller than 4GB only.

**Supported Technologies**

- deflate32 (with default options)
- PPMd (with default options)
- WinZip (with "No compression", "Maximum", and "SuperFast" options; other options, including "Enhanced Deflate", are not supported)
- AES encryption

**Unsupported Technologies**

- bzip2
- LZMA
- Deflate64
- zip64 (i.e. the compression software built in to Windows Explorer)

## ifBrightPackage

:::hint{type="info"}
*ifBrightPackage* is a legacy interface. We recommend you use *roAssetPool* instead to achieve better functionality.
:::

### Unpack(path As String) As Void

Extracts the *.zip* file to the specified destination path. Any preexisting files in the target directory will be deleted as part of this operation. Providing a destination path of "SD:/" will wipe all preexisting files from the card and extract the *.zip* contents to the root folder.

### SetPassword(password As String) As Void

Provides the password specified when the *.zip* file was created. This method supports AES 128 and 256 bit encryption, as generated by WinZip. The method returns `false` if the  operation fails.

### GetFailureReason() As String

### UnpackFile(a As String, b As String) As Boolean

This method takes two parameters, `filename` and `path`. The `filename` is the name of the file to unpack and `path` is the location to which the file will be unpacked. The method returns `false` if the unpack operation fails.

**Example**

```text
package = CreateObject("roBrightPackage", "myfile.zip")
setPassOk = package.SetPassword("test")
if not setPassOk then
    print "Failed to set password: "; package.GetFailureReason()
    stop
end if

unpackedDir$ = "SD:/unpacked"
DeleteDirectory(unpackedDir$)

dirOk = CreateDirectory(unpackedDir$)
if not dirOk then
    print "Failed to create directory: "; unpackedDir$
    stop
end if

' Unpack a specific file from the root of myfile.zip
ok = package.UnpackFile("index.html", unpackedDir$)
if not ok then
    print "Failed to unpack file: "; package.GetFailureReason()
    stop
end if

print "File unpacked successfully."
```

## Using roBrightPackage for Content Updates

BrightSign players check storage devices for autorun scripts in the following order:

1. External USB devices 1 through 9
2. SD
3. µSD

In addition to looking for *autorun.brs* scripts, BrightSign players look for *autorun.zip* files that contain the script name *autozip.brs*. If an *autorun.zip* file with an *autozip.brs* file is found, and *autozip.brs* can be decrypted, then the player will execute the *autozip.brs* file.

:::hint{type="danger"}
The *autozip.brs* file cannot reference any external files, as it is the only file to be automatically uncompressed by a BrightSign player prior to execution.
:::

The *autozip.brs* script should unpack the contents of the *autorun.zip* file to an installed storage device and reboot to complete the update:

**Example**

```text
package = CreateObject("roBrightPackage", "SD:/autorun.zip")
package.Unpack("SD:/")
MoveFile("SD:/autorun.zip", "SD:/autorun.zip_invalid")
RebootSystem()
```

### Unpacking Encrypted Archives

If the *autorun.zip* file is encrypted, then the player uses the password stored in the [registry](docId\:YTpSfntswYFMXx8PCqJLf), in the section "security" under the name "autozipkey," to decrypt the file.

**Extended** **Example**

```text
' Content update application


r=CreateObject("roRectangle", 20, 668, 1240, 80)
t=CreateObject("roTextWidget",r,1,2,1)
r=CreateObject("roRectangle", 20, 20, 1200, 40)
t.SetSafeTextRegion(r)
t.SetForegroundColor(&hff303030)
t.SetBackgroundColor(&hffffffff)
t.PushString("Updating content from USB drive, please wait...")


package = CreateObject("roBrightPackage", "autorun.zip")
package.SetPassword("test")
package.Unpack("SD:/")
package = 0


t.Clear()
t.PushString("Update complete - remove USB drive to restart.")


while true
       sleep(1000)


       usb_key = CreateObject("roReadFile", "USB1:/autorun.zip")
       if type(usb_key) <> "roReadFile" then
             a=RebootSystem()
       endif
       usb_key = 0
end while
```


[title] roTextWidget
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This object is used to display text on the screen.

Note that "Scrolling ticker" mode is limited to 10 tickers at a time. You can have 100 roTextWidgets, so long as they are in some other mode (for example, "Static text")*.*

Object Creation: This object is created using one of two variants.

**Option 1**

```text
CreateObject("roTextWidget", r As roRectangle, line_count As Integer, text_mode As Integer, pause_time As Integer)
```

- `r` : An *roRectangle* instance that contains the text
- `line_count`: The number of lines of text to show within the rectangle
- `text_mode`: The animation characteristics of the text:
  - 0: An animated view similar to teletype
  - 1: Static text
  - 2: Simple text with no queue of strings
  - 3: Scrolling ticker (strings are separated with a diamond by default; the separator can be modified using the `SetSeparator()` method). Note that this option is not available for LSx22, HDx20, or HDx10 models. 
- `pause_time`: The length of time each string is displayed before displaying the next string. This does not apply to text mode 2 or 3 because the strings on screen are updated immediately.

**Option 2**

```text
CreateObject("roTextWidget", r As roRectangle, line_count As Integer, text_mode As Integer, parameters As roAssociativeArray)
```

- `r`: An *roRectangle* instance that contains the text
- `line_count`: The number of lines of text to show within the rectangle
- `text_mode`: The animation characteristics of the text:
  - 0: An animated view similar to teletype
  - 1: Static text
  - 2: Simple text with no queue of strings
  - 3: Scrolling ticker (strings are separated with a diamond by default; the separator can be modified using the `SetSeparator()` method). Note that this option is not available for LSx22, HDx20, or HDx10 models.
- `parameters`: An associative array that can include the following values:
  - `LineCount`: The number of lines of text to show within the rectangle.
  - `TextMode`: The animation characteristics of the text:
    - 0: An animated view similar to teletype
    - 1: Static text
    - 2: Simple text with no queue of strings
    - 3: Scrolling ticker (strings are separated with a diamond by default; the separator can be modified using the `SetSeparator()` method). Note that this option is not available for LSx22, HDx20, or HDx10 models.
- `PauseTime`: The length of time each string is displayed before displaying the next string. This does not apply to text mode 2 or 3 because the strings on screen are updated immediately.
- `Rotation`: The rotation of the text within the widget (note that the coordinates and dimensions of the rectangle itself are not rotated):
  - 0: 0 degrees
  - 1: 90 degrees. This value can also be represented in degrees (90) or radians (.5Π).
  - 2: 180 degrees. This value can also be represented in degrees (180) or radians (Π).
  - 3: 270 degrees. This value can also be represented in degrees (270) or radians (1.5Π).
- `Alignment`: The alignment of the text:
  - 0: Left
  - 1: Center
  - 2: Right

:::hint{type="success"}
Modes 0, 1, and 3 are useful for displaying RSS feeds and ticker-type text. However, for dynamic data where immediate screen updates are required, mode 2 may be more appropriate. Mode 2 allows text to be drawn immediately to the screen.
:::

:::hint{type="info"}
Text-mode 3 (scrolling ticker) supports both right-to-left and left-to-right (e.g. Arabic, Hebrew) scrolling modes, depending on the language of the first string or file added to the widget. To change the scrolling direction, you will first need to remove all strings from the ticker.
:::

## ifTextWidget

### SetGlobalParameter(param As String, value as Integer) As Void

Configures parameters related to scrolling tickers (i.e. text mode 3). The following are accepted parameters: 

- `startat`: The starting position of scrolling text, which can be any number between 0 (the left side of the screen) and the total width of the widget. To start at the right side of the screen (i.e. offscreen), specify a value of -1 or the total width of the widget. 
- `autopop`: The autopop setting for the widget. If this value is set to 1, strings are automatically removed (popped from the stack) once they have scrolled offscreen. If this value is set to 0 (the default behavior), strings are not automatically removed. 
- `autoaddseparator`: The separator setting for the widget. Setting this value to 0 disables string separators (useful for displaying emojis with the `PushSurface()` method), while setting this value to 1 enables string separators (the default behavior). 
- `gap`: The gap (in pixels) between the string and the string separator (at both the beginning and end of strings). The default value is 0. This parameter may not be reliable if the ticker contains strings in its memory. 

:::hint{type="info"}
Global parameters can be altered after `Show()` is called, but in some cases (e.g. the `startat` parameter) their results are undefined. The parameters `autopop` and `autoaddseparator` are intended to be used once `Show()` has been called.
:::

### GetGlobalParameter(param as String) As Integer

Returns the value of a parameter set using the `SetGlobalParameter()` method. This method also returns a value for the read-only "`last_string_id`" parameter, which is a unique identifier for the string most recently added to the list-list value that is identical to the integer returned by the `PushString()` and `PushSurface()` methods. 

### PushString(str As String) As Boolean

Adds the string to the list of elements to display in modes 0, 1, and 3. Strings are displayed in order, and when the end is reached, the object loops, returning to the beginning of the list. In mode 2, the string is displayed immediately. This method returns a unique identifier, which can be used with *roTextWidgetEvent* messages to determine when the string has moved offscreen. A failure to add an element to the list returns "0". 

:::hint{type="info"}
Adding too many strings without popping them from the stack will cause PushString() to return False (the exact number depends on the font size for each string). The maximum recommended number of stored strings is 64.
:::

### PushSurface(image as roImageBuffer) As Integer

Adds a bitmap image to the list of elements to display in modes 0, 1, and 3. Images are scaled to match the height of the ticker. This method returns a unique identifier. which can be used with *roTextWidgetEvent* messages to determine when the image/surface has moved offscreen. A failure to add an element to the list returns "0". 

:::hint{type="info"}
There are currently no restrictions on formatting, but it is recommended to use the same color format as the main screen.
:::

### PopStrings(number\_of\_string\_to\_pop As Integer) As Boolean

Pops elements off the front of the list (using "last in, first out" ordering) in modes 0, 1, and 3. This occurs the next time the widget wraps so that elements can be added to and removed from the widget seamlessly. In mode 2, the element is cleared from the widget immediately.

### GetStringCount() As Integer

Returns the number of elements that will exist once any pending pops have taken place.

### Clear() As Boolean

Clears the list of elements, leaving the widget blank and able to accept more `PushString()` calls.

### SetStringSource(file\_path As String) As Boolean

Displays the text file at the specified path as a single, continuous string. This method is only applicable to text mode 3 (scrolling ticker). When the end of the file is reached, the text widget loops to the beginning, using a diamond symbol as the separator.

### SetAnimationSpeed(speed As Integer) As Boolean

Sets the speed at which animated text displays. This method is applicable to text modes 0 and 3 only:

- Mode 0: The default speed value is 10000. Setting an integer above this value decreases the speed of the teletype-style ticker: For example, specifying a value of 20000 will decrease the default speed at which text displays by half, while a value of 5000 will double the default speed.
- Mode 3: The default speed value is 10000. Because the speed of a scrolling ticker is measured in pixels per second (PPS), the speed must be a multiple of the current framerate, or else it will be rounded down to the nearest multiple (for example, a framerate of 60p will honor PPS values of 60, 120, 180, etc.). The software determines the speed of the scrolling ticker by performing the following calculation on the passed `speed` parameter:
  `PPS = (speed * 60) / 10000`

### SetSeparator(separator As String) As Boolean

Changes the separator between strings. The default diamond separator will be replaced by the contents of the passed string. This method applies to Text Mode 3 (smooth scrolling ticker) only. The following strings indicate special symbols: "\:diamond:", "\:circle:", "".

### SetSyncManager(domain As String) As Boolean

Specifies a [roSyncManager](docId\:Wwc22ZsPhu1e689xe7en6) domain to use when executing the `SetMultiscreen()` call. When this method is called, it creates an internal domain that is based on the existing *roSyncManager* domain and uses the same network parameters. We recommend using this method instead of passing a multicast IP address and port to the `SetMultiscreen()` method itself.

### SetMultiscreen(offset As Integer, size As Integer, ip\_address As String, port As Integer) As Boolean

Displays a smooth scrolling ticker across multiple screens. To specify network synchronization parameters, you can either call the `SetSyncManager()` method first or pass the optional `ip_address` and `port` values to the `SetMultiscreen()` method (calling `SetSyncManager()` is preferred). If you use `SetSyncManager()`, do not specify the `ip_address`/`port`; doing so may lead to unexpected behavior.

The master screen is designated as the instance with the rightmost offset of all the players in the multiscreen array; all `PushString()` and `Show()` calls (as well as any other changes) must be made on the master instance. Follower instances of the text widget will remain blank until the leader starts. This method requires the following parameters:

- `offset`: The offset (in pixels) of the display in the multiscreen array. For example, using an offset of 1920 in a two-screen array of 1920x1080 screens would specify this player as the right-hand (master) display.
- `size`: The total width (in pixels) of the multiscreen array. For example, defining a size of 3840 would specify a two-screen array of 1920x1080 screens.
- `ip_address`: A string specifying the multicast IP address for the [roSyncManager](docId\:Wwc22ZsPhu1e689xe7en6)  network traffic (e.g. "239.192.0.0")
- `port`: A string specifying the multicast port for the PTP synchronization process (e.g. 1234).

:::hint{type="info"}
Players can support more than one multiscreen ticker at a time.
:::

## ifWidget

### Show() As Boolean

Displays the widget. After creation, the widget is hidden until Show() is called.

### Hide() As Boolean

Hides the widget.

### Raise() As Void

Sends the widget to the top of the z-order on the graphics plane (i.e. in front of all other surfaces that implement the *ifWidget* interface). By default, new widgets are placed at the top of the graphics z-order.

:::hint{type="info"}
Some surfaces are always drawn at the top of the graphics z-order, including the mouse cursor, closed captions, and scrolling tickers.
:::

:::hint{type="success"}
**Tip**
You can use the `PauseGraphics()`/ `ResumeGraphics()` methods on the [roVideoMode](docId\:QQ734nQz0hCwNI0uNSdMP) object to ensure multiple changes to the graphics z-order occur simultaneously.
:::

### Lower() As Void

Sends the widget to the bottom of the z-order on the graphics plane (i.e. behind all other surfaces that implement the *ifWidget* interface). By default, new widgets are placed at the top of the graphics z-order.

### SetForegroundColor(color As Integer) As Boolean

Sets the foreground color in ARGB format. The top 8 bits are "alpha" parameters. Zero is equivalent to fully transparent and 255 to fully non-transparent.

:::hint{type="info"}
Foreground alpha values are currently unsupported with ticker mode 3 (scrolling ticker) and will be ignored by this method. This behavior may change in future firmware versions.
:::

Hex color values should be converted to integers before being passed to this method (e.g. the value `&hFFFFFFFF` should be passed as 4294967295). You can use the `HexToInteger()` method (available in the [core library extension](docId\:lEOO6do_aRr2igzXcRipI)) to convert a hex string to an integer.

### SetBackgroundColor(color As Integer) As Boolean

Sets the background color in ARGB format. The top 8 bits are "alpha" parameters. Zero is equivalent to fully transparent and 255 to fully non-transparent. This feature allows for effects similar to subtitles. For example, you can create a semi-transparent black box containing text over video.

Hex color values should be converted to integers before being passed to this method (e.g. the value `&hFFFFFFFF` should be passed as 4294967295). You can use the `HexToInteger()` method (available in the [core library extension](docId\:lEOO6do_aRr2igzXcRipI)) to convert a hex string to an integer.

### SetFont(font\_filename As String) As Boolean

Specifies a custom font for the widget using a TrueType font file from local storage (e.g. "SD:/ComicSans.ttf").

### SetBackgroundBitmap(bitmap\_filename As String, stretch As Boolean) As Boolean

Sets the background bitmap image. If stretch is True, then the image is stretched to the size of the widget.

### SetBackgroundBitmap(parameters As roAssociativeArray, stretch As Boolean) As Boolean

Sets the background bitmap image. If *stretch* is True, then the image is stretched to the size of the widget. The associative array can contain the following parameters:

- `Filename`: The name of the image file
- `EncryptionAlgorithm`: The file-encryption algorithm. Currently the options are "AesCtr" and "AesCtrHmac".
- `EncryptionKey`: The key to decrypt the image file. This is a byte array consisting of 128 bits of key, followed by 128 bits of IV.

:::hint{type="info"}
See the [Image Decryption](docId:0UMXqYvruY7DRNLuUZAFp) section in the *roImagePlayer* entry for details on displaying encrypted images.
:::

### SetSafeTextRegion(region As roRectangle) As Boolean

Specifies the rectangle within the widget where the text can be drawn safely.

### SetRectangle(r As roRectangle) As Boolean

Changes the size and positioning of the widget rectangle using the passed *roRectangle* object.

### GetFailureReason() As String

Yields additional useful information if a function return indicates an error.

[title] Object Reference
[path] Player APIs (BrightScript & JavaScript)/BrightScript/

BrightSign players use a standardized library of BrightScript objects to expose functionality for software development. To publish a new API for interacting with BrightSign hardware, we create a new BrightScript object. 

The pages in this section provide definitions for objects that can be used in BrightScript. A brief description, a list of interfaces, and the member functions of the interfaces are provided for each object class. While most BrightScript objects have self-contained pages, some objects are grouped on the same page if they are closely related or depend on one another for functionality.

Here is a sample of objects that are used frequently when creating applications in BrightScript:

|                                                        |                                                                                                                                                                                                                                        |
| ------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [roVideoMode](docId\:QQ734nQz0hCwNI0uNSdMP)            | Configures video output and interacts with displays using CEC/EDID.                                                                                                                                                                    |
| [roRectangle](docId:3E73tPEmL1-OEbs2GoAUQ)             | Used to define zones/widgets on the screen. This object is passed to many other objects to define their screen area, including *roVideoPlayer*, *roImagePlayer, roImageWidget*, *roHtmlWidget*, *roClockWidget*, and *roCanvasWidget.* |
| [roVideoPlayer](docId\:zTUZ0LdazCmL2kQmdBKCn)          | Plays video files, streams, and HDMI® input.                                                                                                                                                                                           |
| [roImagePlayer](docId:0UMXqYvruY7DRNLuUZAFp)           | Displays images.                                                                                                                                                                                                                       |
| [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK)           | Displays local or remote HTML content using the Chromium rendering engine.                                                                                                                                                             |
| [roNetworkConfiguration](docId\:U6ZceYQddlz9xdAKtTmJs) | Used to configure Ethernet, WiFi, and local network parameters.                                                                                                                                                                        |
| [roDeviceInfo](docId\:uTKDmpos1ulxaoYLx1nS6)           | Used to retrieve a wide array of system information, including model type, device serial number, and firmware version.                                                                                                                 |

## Interfaces and Methods

Every BrightScript object consists of one or more "interfaces." An interface consists of one or more "methods." For example, the *roVideoPlayer* object has several interfaces, including *ifMessagePort*. The interface *ifMessagePort* has one method: `SetPort()`. 

The abstract interface *ifMessagePort* is exposed and implemented by both the *roControlPort* and the *roVideoPlayer* objects. Once the SetPort() method is called, these objects will send their events to the supplied message port. This is discussed more in the Event Loops section below.

### Example

```text
p = CreateObject("roMessagePort")
video = CreateObject("roVideoPlayer") 
gpio = CreateObject("roControlPort", "BrightSign")
gpio.SetPort(p)
video.SetPort(p)  
```

The above syntax makes use of a shortcut provided by the language: The interface name is optional, unless it is needed to resolve name conflicts. For example, the following two lines of code carry out the exact same function:

```text
gpio.SetPort(p)
gpio.ifMessagePort.SetPort(p)
```

BrightScript Objects consist *only* of interfaces, and interfaces define *only* methods. There is no concept of a "property" or variable at the object or interface level. These must be implemented as "set" or "get" methods in an interface.

## Classes

A *class name* is used to create a BrightScript object. For example, the class name for a video playback instance is *roVideoPlayer*, so, to initialize a video playback instance, you would use code similar to the following:

### Example

```text
video = CreateObject("roVideoPlayer")
```

Note that "video" can be any name that follows the syntax outlined in the next section.

## Object and Class Name Syntax

Class names have the following characteristics:

- Must start with an alphabetic character (a – z).
- May consist of alphabetic characters, numbers, or the "\_" (i.e. underscore) symbol.
- Are not case sensitive.
- May be of any reasonable length.

## Zones

With the BrightSign Zones feature, you can divide the screen into rectangles and play different content in each rectangle.

Depending on the BrightSign model, zones can contain video, images, HTML content, audio, a clock, or text. 4Kx42, XDx32, and XDx30 models can display two video zones on screen, while the HDx22, HDx20, and LSx22 models can only display one. There can be multiple zones of other types on the screen. A text zone can contain simple text strings or can be configured to display an RSS feed in a ticker-type display. 

As of firmware 6.0.x, zone support is enabled by default. When zones are enabled, the image layer is on top of the video layer by default. The default behavior can be modified using the*roVideoMode.SetGraphicsZOrder()* method. 

Zone support can be disabled by calling `EnableZoneSupport(false)`. When zones are not enabled, the image layer is hidden whenever video is played, and the video layer is hidden whenever images are played.

## Event Loops 

When writing anything more than a very simple script, an "event loop" will need to be created. Event loops typically have the following structure:

1. Wait for an event.
2. Process the event.
3. Return to step 1.

An event can be any number occurrences: a button has been pressed; a timer has been triggered; a UDP message has been received; a video has finished playing back; etc. By convention, event scripting for BrightScript objects follows this work flow:

1. An object of the type *roMessagePort* is created by the script.
2. Objects that can send events (i.e. those that support the *ifMessagePort/ifSetMessagePort* interface) are instructed to send their events to this message port using the `SetPort()` method. You can set up multiple message ports and have each event go to its own message port, but it is usually simpler to create one message port and have all the events sent to this one port.
3. The script waits for an event using the built-in `Wait()` statement (or the *ifMessagePort.WaitMessage()* method).
4. If multiple object instances are assigned to the same message port, the script determines from which instance the event originated, then processes it. The script then jumps back to the `Wait()` statement.

### Example

```text
'Listens for UDP messages on two different ports and displays the image file requested in the UDP message body.
mp = CreateObject("roMessagePort")

udp1 = CreateObject("roDatagramReceiver", 3000)
udp1.SetPort(mp)
udp1.SetUserData("port 3000")
 
udp2 = CreateObject("roDatagramReceiver", 5000)
udp2.SetPort(mp)
udp2.SetUserData("port 5000")
 
r = CreateObject("rorectangle",0, 0, 1920, 1080)
img = CreateObject("roImagePlayer")
img.SetRectangle(r)

loop:
event = Wait(0, mp)
if type(event) = "roDatagramEvent"
	print "Image play command received on " + event.GetUserData() + "."
	img = DisplayFile("SD:/" + event.GetString())
	endif
endif
goto loop
```


[title] roPassKey
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

This object provides a means for generating keys (hashes) from a password and salt. The JavaScript equivalent is the Node.js Crypto API.

Object Creation: The object is passed an associative array that specifies the generation methods and cipher.

```text
CreateObject("roPassKey", parameters As roAssociativeArray)
```

The associative array should contain the following parameters:

- `method`: The key derivation method. Currently, only "pbkdf2" can be specified.
- `keyfn`: The pseudorandom function (PRF). Currently, only "hmac-sha256" can be specified.
- `keylen`: The key length
- `iterations`: The number of iterations

## ifPassKey

### GenerateKey(password As Object, salt As Object) As roByteArray

Generates a key using the supplied password and salt. The parameters may be passed as either strings or *roByteArray* instances. The generated *roByteArray* instance may contain all possible byte values, including NUL.

### GenerateSalt(length As Integer) As roByteArray

Generates a salt of the specified length. This salt can be used when calling the `GenerateKey()` method. The generated *roByteArray* instance may contain all possible byte values, including NUL.

### Example

```text
' Create input test data
salt = CreateObject("roByteArray")
pass = CreateObject("roByteArray")
pass.FromAsciiString("password")
salt.FromAsciiString("salt")
' Create the key generator
pk = CreateObject("roPassKey",  { method: "pbkdf2", keyfn: "hmac-sha256", keylen: 32, iterations: 4096 } )
' key with be a roByteArray
key = pk.GenerateKey(pass, salt)
```


[title] roTouchEvent, roTouchCalibrationEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

The *roTouchEvent* object is generated by the *roTouchScreen* object whenever a touch or mouse event is detected within a defined region. The JavaScript equivalent is `TouchEvent()`.

## ifInt

### GetInt() As Integer

Retrieves the region ID of the event.

### SetInt(a As Integer)

Sets the region ID of the event.

## ifPoint

The *ifPoint* interface is not available on the *roTouchCalibrationEvent* object.

### GetX() As Integer

Retrieves the x coordinate of the mouse/touch event.

### GetY() As Integer

Retrieves the y coordinate of the mouse/touch event.

### SetX(a As Integer)

Sets the x coordinate of the event.

### SetY(a As Integer)

Sets the y coordinate of the event.

## ifEvent

The *ifEvent* interface is not available on the *roTouchCalibrationEvent* object.

### GetEvent() As Integer

### SetEvent(a As Integer)


[title] roStreamQueueEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This event object is generated by an *roStreamQueue* object when the end of the queue is reached.

## ifUserData

### SetUserData(user\_data As Object) As Void

Sets the user data.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` (on either the event or source object). It will return Invalid if no data has been set.

## ifStreamQueueEvent

### GetData() As Object

Returns an roAssociativeArray with two entries, `action` and `file`:

- `action`  contains one of:
  - `START:` indicates that playback of a queued file has been started
  - `SKIP:` indicates that a file in the queue has been skipped
  - `END:` indicates that a file has finished playing
- `file` contains the name of the file whose state is returned in `action`.


[title] BrightScript Versions
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

| **Version Matrix, January 9, 2009**                                                                 | HD20000 1.3 Branch | HD2000<br /> 2.0 Branch | Compact Main Line |
| --------------------------------------------------------------------------------------------------- | ------------------ | ----------------------- | ----------------- |
| SnapShot Date                                                                                       | 1/7/2008           | 7/16/2008               | 1/9/2009          |
| Defxxx, on, gosub, clear, random, data, read, restore, err, errl, let, clear, line numbers          | **X**              | **X**                   |                   |
| Intrinsic Arrays                                                                                    | **X**              | **X**                   |                   |
| Compiler                                                                                            |                    | **X**                   | **X**             |
| AA & dot Op & m reference                                                                           |                    | **X**                   | **X**             |
| Sub/Functions                                                                                       |                    | **X**                   | **X**             |
| ifEnum & For Each                                                                                   |                    | **X**                   | **X**             |
| For/Next Does Not Always Execute At Least Once                                                      |                    | **X**                   | **X**             |
| Exit For                                                                                            |                    | **X**                   | **X**             |
| Invalid Type.  Errors that used to be Int Zero are now Invalid. Added roInvalid; Invalid Autoboxing |                    |                         | **X**             |
| Array's use roArray; Added ifArray                                                                  |                    |                         | **X**             |
| Uninit Var Usage No Longer Allowed                                                                  |                    |                         | **X**             |
| Sub can have "As" (like Function)                                                                   |                    |                         | **X**             |
| roXML Element & XML Ops dot and @                                                                   |                    |                         | **X**             |
| Type() Change: Now matches declaration names (eg. Integer not roINT32)                              |                    |                         | **X**             |
| Added roBoolean                                                                                     |                    |                         | **X**             |
| Added dynamic Type; Type now optional on Sub/Functions                                              |                    |                         | **X**             |
| And/Or Don't Eval un-needed Terms                                                                   |                    |                         | **X**             |
| Sub/Fun Default Parameter Values (e.g. `Sub (x=5 As Integer)`)                                      |                    |                         | **X**             |
| AA declaration  Op \{ }                                                                             |                    |                         | **X**             |
| Array Declaration Op \[ ]                                                                           |                    |                         | **X**             |
| Change Array Op from ( ) to \[]                                                                     |                    |                         | **X**             |
| Anonymous Functions                                                                                 |                    |                         | **X**             |
| Added Circ. Ref. Garbage Collector                                                                  |                    |                         | **X**             |
| Add Eval(), Run(), and Box()                                                                        |                    |                         | **X**             |


[title] Events
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

Events in BrightScript center around an event loop and the *roMessagePort* object. Most BrightScript objects can post to a message port in the form of an event object: For example, the *roTimer* object posts events of the type *roTimerEvent* when configured intervals are reached.

The following script sets the destination message port using the `SetPort()` method, waits for an event in the form of an *roGpioButton* object, and then processes the event.

```text
print "BrightSign Button-LED Test Running"
p =   CreateObject("roMessagePort")
gpio =  CreateObject("roGpioControlPort") 
gpio.SetPort(p)
 
while true
   msg=wait(0, p)
   if type(msg)="roGpioButton" then
       butn = msg.GetInt()
       if butn <=5 then
           gpio.SetOutputState(butn+17,1)
           print "Button Pressed: ";butn
           sleep(500)
           gpio.SetOutputState(butn+17,0)
        end if
    end if
 
   REM ignore buttons pressed while flashing led above
   while p.GetMessage()<>invalid
         end while
end while
```

Note that lines 6-7 can be replaced using the following (and substituting `end while` with `end for`):

```text
For each msg in p
```


[title] Language Reference
[path] Player APIs (BrightScript & JavaScript)/BrightScript/

These are some general characteristics of BrightScript, as compared to other common scripting languages:

- BrightScript is not case sensitive.
- Statement syntax is similar to Python, Basic, Ruby, and Lua (and dissimilar to C).
- Like JavaScript and Lua, objects and named data-entry structures are associative arrays.
- BrightScript supports dynamic typing (like JavaScript) and declared types (like C and Java).
- Similar to .Net and Java, BrightScript uses "interfaces" and "components" (i.e. objects).

BrightScript code is compiled into bytecode that is run by an interpreter. The compilation step occurs every time a script is loaded and run. Similar to JavaScript, there is no separate compilation step that results in a saved binary file.

BrightScript and its component architecture are entirely written in C for speed, efficiency, and portability. Since many embedded processors do not have floating-point units, BrightScript makes extensive use of the "integer" type. Unlike some languages (including JavaScript), BrightScript only uses floating point numbers when necessary.

[title] roRegistry
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

The registry is an area of memory where a small number of persistent settings can be stored. Access to the registry is available through the *roRegistry* object. The JavaScript equivalent is [registry](docId\:tXWoOMbD2-u12dfegX7gA) (see [BrightScript-JavaScript Migration Guide](docId:2KEwWxLmpYcwu8tffuf2Z) for the method equivalents).

This object is created with no parameters:

```text
CreateObject("roRegistry")
```

## ifRegistry

### GetSectionList() As roList

Returns a list with one entry for each registry section.

### Delete(section As String) As Boolean

Deletes the specified section and returns an indication of success.

### Flush() As Boolean

Flushes the registry out to persistent storage.

[title] BrightScript Encryption
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

BrightScript supports encrypted modules. In order to use encrypted BrightScript, make sure that the players are running OS 8.1.54 or newer.

To encrypt your BrightScript modules, first contact BrightSign and request an encryption key. BrightSign will generate a new unique key pair and provide `customer-pub.pem` and `customer.hdr`. Once those two items are in your possession, encrypt your BrightScript files using the following process:

```text
$ encrypt-brightscript --customer-public-key=customer-pub.pem --encrypted-key-data=customer.hdr myscript.brs
```

This will generate `myscript.ebrs` which is the encrypted version of the script.

:::hint{type="info"}
Any .brs file can be encrypted, including those loaded with LIBRARY. Additionally, if any encrypted file is loaded, the BrightScript debugger is disabled for security reasons.
:::


[title] roBoolean
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/BrightScript Core Objects/

This is the object equivalent of the Boolean intrinsic type. It is useful in the following situations:

- **When an object is needed instead of an intrinsic value**: For example, if a Boolean is added to *roList*, it will be automatically wrapped in an *roBoolean* object by the language interpreter. When a function that expects a BrightScript component as a parameter is passed a Boolean, BrightScript automatically creates the equivalent BrightScript component.
- **When an object exposes the** ***ifBoolean*** **interface**: That object can then be used in any expression that expects an intrinsic value.

## ifBoolean 

### GetBoolean() As Boolean

### SetBoolean(a As Boolean

###

[title] BrightScript Known Issues
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

## Subroutine declaration incorrectly allows return type to be defined

A subroutine is defined as a function shortcut which returns type void, by either explicitly calling, “return“ or not including a return. The BrightScript subroutine **incorrectly** allows a subroutine to declare a return type allowing the subroutine to compile. A subroutine can “return” or not include a return, but if a subroutine should return a variable, we recommend declaring a function with a return type.

See [ProgramStatements-Function()AsType/EndFunction](docId\:xjNCz5P2xsv5j9GEofi13) for more information about subroutines and functions. It correctly mentions that a subroutine only returns a void type (“The `Sub` statement can be used instead of `Function` as a shortcut for creating a function with return type `Void`").

[title] File Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/

This section describes objects for creating, deleting, and manipulating files. The JavaScript equivalent is the `fs` (file) API.

Manipulating the file system does not require you to create an object. You can find documentation on creating and deleting directories and files, along with other file system manipulation functions, on [this page](docId\:nSjXffR7OlFgDWgjFEbMe).

- [roAppendFile](docId\:FqRCKnbC3HSMgY2lJbdTG)
- [roCreateFile](docId\:CXCLdkjSnyDZW4I-ve-aC)
- [roReadFile](docId\:Bi0cbCihV5Pq7wuTGF5UQ)
- [roReadWriteFile](docId\:mW4BLK4dG-zj5P_8JGlIi)


[title] roTextWidgetEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

This event object is generated when a string or surface leaves the screen area of an *roTextWidget* instance.

## ifWidgetEvent

### GetStringId() As Integer

Returns the ID of the string or surface that has disappeared from the screen.

## ifUserData

### SetUserData(user\_data As Object) As Void

Sets the user data.

### GetUserData() As Objecta

Returns the user data that has previously been set via `SetUserData()` (on either the event or source object). It will return Invalid if no data has been set.

[title] roStorageAttached, roStorageDetached
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Untitled/

These event objects are generated by the *roStorageHotplug* object whenever a storage device becomes attached or detached from the player. The JavaScript equivalent is Node.js `fs.watch()`.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via SetUserData(). It will return Invalid if no data has been set.

## ifString

### GetString() As String

### SetString(a As String)

[title] Scope
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

BrightScript uses the following scoping rules:

- Global variables are not supported; however, there is a single hard-coded global variable (“global”) that is an interface to the [global BrightScript object](docId\:nSjXffR7OlFgDWgjFEbMe), which contains all global library functions.
- Functions declared with the `Function` statement are global in scope; however, if the function is anonymous, it will still be local in scope.
- Local variables exist within the function scope. If a function calls another function, that new function has its own scope.
- Labels exist within the function scope.
- Block statements such as `For / End For` and `While / End While` do not create a separate scope.


[title] roHdmiInputChanged, roHdmiOutputChanged
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Presentation and Widget Objects/

The *roVideoMode* object generates an *roHdmiInputChanged* or *roHdmiOutputChanged* event object whenever the hotplug status of the HDMI® input or output changes. The JavaScript equivalent is *videoinput.VideoInputConfiguration.hdmiinputchanged* or *videooutput.VideoOutputConfiguration.hotplugevent.*

At least one *roHdmiOutputChanged* event object will always be generated for a hotplug event, even for very quick disconnect/connect hotplug events. In most cases, a disconnect/connect hotplug event will generate two event objects.

## ifInt

### GetInt() As Integer

Returns the event ID. 

### SetInt(value As Integer) As Void

Sets the value of the event. 

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.




[title] Core Library Extension
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Untitled/

There are a number of built-in functions that are not part of the BrightScript Core Library. You can use the [LIBRARY](docId\:xjNCz5P2xsv5j9GEofi13) statement to include this subset of functions:

```text
LIBRARY "v30/bslCore.brs"
```

### bslBrightScriptErrorCodes() As roAssociativeArray

Returns an associative array of name/value pairs corresponding to BrightScript error codes and their descriptions.

### bslGeneralConstraints() As roAssociativeArray

Returns an associative array of name/value pairs corresponding to system constants.

### bslUniversalControlEventCodes() As roAssociativeArray

Returns an associative array of name/value pairs corresponding to the remote key code constraints.

### AsciiToHex(ascii As String) As String

Returns a hex-formatted version of the passed ASCII string.

### HexToAscii(hex As String) As String

Returns an ASCII-formatted version of the passed hex string.

### HexToInteger(hex As String) As Integer

Returns the integer value of the passed hex string.

[title] roDeviceInfo
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/System Objects/

This object provides information about the device hardware, firmware, and features. The JavaScript equivalent is [deviceinfo](docId\:xCvijzYTq6jq780KLOGLu) .

## ifDeviceInfo

### GetModel() As String

Returns the model name for the BrightSign device running the script as a string (for example, "HD1020" or "XD230").

### GetVersion() As String

Returns the version number of BrightSign firmware running on the device (for example, "4.0.13").

### GetVersionNumber() As Integer

This method has been deprecated. Use `GetVersion()` to read the version numbers as a string and `FirmwareIsAtLeast()` when comparing version numbers.&#x20;

### FirmwareIsAtLeast(version As String) As Boolean

Returns True if the BrightSign firmware version on the device is greater than or equal to the version number represented by the passed string (e.g. "4.0.13").

### GetBootVersion() As String

Returns the version number of the BrightSign boot firmware as a string (for example, "1.0.4").

### GetBootVersionNumber() As Integer

This method has been deprecated. Use `GetBootVersion()` to read the version numbers as a string and `BootFirmwareIsAtLeast()` when comparing version numbers.&#x20;

### BootFirmwareIsAtLeast(version As String) As Boolean

Returns True if the BrightSign boot firmware version on the device is greater than or equal to the version number represented by the passed string (e.g. "4.4.22").

### GetTemperature() As roAssociativeArray

Returns an associative array containing a dynamic string location key and the temperature as a floating point value.

### GetDeviceUptime() As Integer

Returns the number of seconds that the device has been running since the last power cycle or reboot.

### GetDeviceLifetime() As Integer

### GetBoardName() As String

Returns the internal code name for the BrightSign player board. This is rarely useful and the exact response may change.

### GetLoadStatistics(parameters As roAssociativeArray) As String

Provides current performance information related to the Linux kernel. This method accepts an associative array with a single key/value pair formatted as `item:<parameter>`; it will then return a string containing information associated with that parameter. The following are recognized parameters:

- "loadavg": Provides information about system performance. The first three columns measure CPU and I/O utilization over the past 1, 5, and 10 minutes, respectively. The fourth column displays the number of currently running processes and the total number of processes. The last column displays the ID of the most recently used process.
- "meminfo": Displays physical and swap memory usage.
- "slabinfo": Provides information about memory usage at the slab level.
- "stat": Provides overall statistics about the system (e.g. the number of page faults since the system booted).
- "vmstat": Displays detailed virtual memory statistics from the kernel.
- "zoneinfo": Provides overall statistics about the system, broken down by system Node.
- "interrupts": Displays which interrupts are in use and how many of each type there have been.
- "version": Provides the kernel version.

Example:

```text
stat = CreateObject("roDeviceInfo")
print stat.GetLoadStatistics({item:"interrupts"})
```

### GetUSBTopology(return As roAssociativeArray) As Dynamic 

Returns the USB topology of the player, including the port enumeration, PID, and VID of each USB device. Use this method to determine whether certain USB devices are connected to certain ports. The passed associative array determines the return value:

- `{}`: Returns the USB topology as a string list.
- `{format: "xml"}`:  If `true`, returns the USB topology as an XML-formatted string.
- `{format: "array"}`:  Returns an array of associative arrays. Each associative array contains information about a single USB port.
- `rebuild`:  If `true`, ensures that the returned information is up to date with the current hardware status.

Updates information and returns it in XML format:

```text
di = CreateObject("roDeviceInfo")
tp = di.GetUSBTopology({format: "xml", rebuild:true})
```

String list:

```text
BrightScript Debugger> di = CreateObject("roDeviceInfo")
BrightScript Debugger> topo = di.GetUSBTopology({})
BrightScript Debugger> print topo
{
 "containers": [
  {
   "category": "HUB",
   "fid": "",
   "pid": 1552,
   "raw": "1-1",
   "type": "",
   "vid": 1507
  }
 ],
 "devices": [
  {
   "category": "HID",
   "fid": "B.0",
   "ident": "usb/hiddev0",
   "pid": 60931,
   "raw": "1-1.2:1.0",
   "type": "BP900",
   "vid": 2127
  }
...
```

XML string:

```text
BrightScript Debugger> di = CreateObject("roDeviceInfo")
BrightScript Debugger> topo = di.GetUSBTopology({xml: true})
BrightScript Debugger> print topo
<topology>
	<device>
  		<raw>8-1:1.0</raw>
  		<fid>C.0</fid>
  		<category>HID</category>
  		<vid>084f</vid>
  		<pid>ee03</pid>
		<ident>usb/hiddev0</ident>
  		<type>BP900</type>
	</device>
	<devices raw="2-1.4" category="HUB" vid="05e3" pid="0610" >
   		<device>
    		<raw>2-1.4.1:1.0</raw>
    		<fid>A/4.0</fid>
    		<category>AUDIO</category>
    		<vid>05a7</vid>
    		<pid>40fa</pid>
   		</device>
   		<device>
    		<raw>2-1.4.1:1.2</raw>
    		<fid>A/4.2</fid>
    		<category>HID</category>
    		<vid>05a7</vid>
    		<pid>40fa</pid>
  		</device>
...
```

Array:

```text
BrightScript Debugger> di = CreateObject("roDeviceInfo")
BrightScript Debugger> topo = di.GetUSBTopology({array: true})
BrightScript Debugger> print topo[0]
vid:  05a7
pid:  40fa
fid: A.0
category: AUDIO
raw: 2-1.4.1:1.0
ident: usb/hiddev0
```

Ports that have USB devices connected to them will include a `fid` (Friendly ID) value (only array and XML-string returns include this value). Use the `fid` to determine which physical port on the player the USB device is connected to. The following table matches `fid` values to the ports on different model lines:

**Series 5 Friendly ID (FID)**

| **Model Family**            | **Friendly ID (fid)** | **Location** | **Type** | **Speed** |
| --------------------------- | --------------------- | ------------ | -------- | --------- |
| XD235/XD1035                | A                     | Back         | Type-C   |           |
|                             | B                     | Back         | Type-A   |           |
| LS425/LS445                 | A                     | Front        | Type-C   |           |
| SP2/CV-HD3                  | A                     | Back         | Type-A   |           |
| HD225/HD1025                | A                     | Back         | Type-A   | FS/HS     |
| XT245/XT1145/XT2145/CV-UHD3 | A                     | Back         | Type-C   | FS/HS     |
|                             | B                     | Back         | Type-A   |           |
| XC2055/XC4055               | A                     | Front        | Type-C   |           |
|                             | B                     | Back         | Type-A   |           |

**Series 3/4 Friendly ID (FID)**

| **Model Family** | **Friendly ID (fid)** | **Location**        |
| ---------------- | --------------------- | ------------------- |
| LS424/LS423      | A                     | Front (USB-C)       |
| HDx24/HDx23      | A                     | Front (USB-A)       |
| HS123            | A                     | N/A (M.2 connector) |
| HO523            | A                     | Upper Front (USB-A) |
|                  | B                     | Lower Front (USB-A) |
|                  | C                     | Back (JAE TX-25)    |
| XDx33/XDx34      | A                     | Front (USB-C)       |
|                  | B                     | Back (USB-A)        |
| XTx43/XTx44      | A                     | Front (USB-C)       |
|                  | B                     | Back (USB-A)        |

A `fid` value of `<port>.<int>` (e.g. "B.0") indicates that the USB device is directly connected to the player, while a value of `<port>/<int>.<int>` (e.g. "A/4.2") indicates a device connected through a USB hub. The last integer specifies the endpoint: For example, if a USB device presents as both an HID and audio device, they will be listed as separate devices with different endpoint numbers. Also note that there can be more than one layer of port numbers if multiple USB hubs are connected together (e.g. "A/4.0.0").

### GetDeviceUniqueId() As String

Returns an identifier that, if not an empty string, is unique to the unit running the script.

### GetFamily() As String

Returns a single string that indicates the family to which the device belongs. A device family is a set of models that are all capable of running the same firmware.

### HasFeature(feature As String) As Boolean

Returns `True` if the player feature, which is passed as a case-insensitive string parameter, is present on the current device and firmware. The possible features that can be queried from the script are listed below:

:::hint{type="danger"}
 If you pass a parameter other than one of those listed below, it may return `False` even if the feature is available on the hardware and firmware.
:::

- `"5v serial"`: A 5V serial port
- `"audio1"`: The first audio output
- `"audio2"`: A second audio output
- `"audio3"`: A third audio output
- `"brightscript1"`: BrightScript Version 1
- `"brightscript2"`: BrightScript Version 2
- `"component video"`: A component video output
- `"ethernet"`: An Ethernet interface
- `"FindMemberFunction"`: The global function of that name is available for use. See the [Global Functions](docId\:nSjXffR7OlFgDWgjFEbMe) page for details.
- `"gpio connector"`: A DA15 or Phoenix-style GPIO port 
- `"hdmi"`: An HDMI® output
- `"hdmi input"`: An HDMI input
- `"hevc_decode"`: An H.265 video decoder
- `"media_decryption"`: The ability to decrypt AES-encrypted media, including video, image, and audio files.
- `"nand storage"`: NAND storage for the boot loader and firmware
- `"networking"`: Any form of networking capability. A False return may indicate that no network is currently available.
- `"reset button"`: A reset button
- `"registry"`: On-board persistent storage
- `"rtc"`: A real-time clock (RTC)
- `"sd"`: SD- or SDHC-compatible storage
- `"sdhc"`: SDHC-compatible storage only
- `"serial port 0"`: The first serial port
- `"serial port 1"`: A second serial port
- `"serial port 2"`: A third serial port
- `"svc button"`: A service ("SVC") button. Passing the legacy term `"gpio12 button"` will yield the same result.
- `"usb"`: One or more USB interfaces
- `"vga"`: A VGA output
- `"video_encoder"`: A video encoder/transcoder

**Example**

```text
di = CreateObject("roDeviceInfo")
print di.GetModel()
print di.GetVersion()
print di.GetBootVersion()
print di.GetDeviceUptime()
```

On a particular system, this will generate the following:

```text
XD1035
9.0.189
9.0.155
 51
```


[title] roSystemLog
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/System Objects/

This object enables recording of the system log on a BrightSign player. Note that BrightScript `print` values are not written to the system log; use the *ifStreamSend* methods to write to the log instead.

Object Creation: This object is created with no parameters:

```text
CreateObject("roSystemLog")
```

## ifSystemLog

### ReadLog() As roArray

Returns an array of strings. The strings correspond to lines in the system log, spanning from bootup to the most recent entry.

### ReadNextLine() As String

Reads the next line of the recorded system log.

## ifStreamSend

### SetSendEol(eol\_sequence As String) As Void

Sets the EOL sequence when writing to the stream. The default value is CR+LF. If you need to set this value to a non-printing character, use the `chr()` [global function](docId\:nSjXffR7OlFgDWgjFEbMe).

### SendByte(byte As Integer) As Void

Writes the specified byte to the stream.

### SendLine(string As String) As Void

Writes the specified characters to the stream followed by the current EOL sequence.

### SendBlock(a As Dynamic) As Void

Writes the specified characters to the stream. This method can support either a string or an *roByteArray*. If the block is a string, any null bytes will terminate the block.

### Flush() As Void

Writes the stream to the file, blocking execution until all data is written out.

## Writing to a Remote Syslog Server

BrightSign players can write to a remote syslog server using the standard syslog protocol (RFC 3164). To configure remote logging, write the "syslog" entry to the "networking" section of the [player registry](docId\:FfM73tjd_BThW4-P-0JVG):

### Example

```text
registry = CreateObject("roRegistrySection", "networking")
registry.Write("syslog", "my-syslog-server")
registry.Flush()
```

You can specify the syslog using either its IP address or hostname.

[title] roPowerManager
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

The *roPowerManager* object is used to report the battery state of the device.

Object Creation: The *roPowerManager* object is created as follows:

```text
CreateObject("roPowerManager")
```

## ifPowerManager

### GetPowerSource() As String

Returns either "Battery", "AC", or "Ethernet", depending on the power source.

### GetBatteryStatus() As Object

Returns the following values:

- `state` <font color="#6B21A8">string</font>: Returns the device battery status as either "charging", "discharging", "charge-complete", or "charge-fault"
- `soc_percent` <font color="#6B21A8">int</font>: The level of charge of the battery as a percentage.
- `hardware_version` <font color="#6B21A8">string</font>: The hardware version number

### PowerOff()

Indicates that the charger should cut the power

### SetPowerSwitchMode(as A String)

Takes either "hard" or "soft"

### GetPowerSwitchMode() As String

Returns whether it is set to "hard" or "soft"

## ifMessagePort

### SetPort(as A Object)

Which message port should be used to get messages from the power manager.

[title] roBtClientManager
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object represents a BLE GATT service, where the player acts as a peripheral and another device (phone, tablet, etc.) acts as the client/central. Unlike [roBtManager](docId\:AkMxi8IWh0ER_tQdIQ3Yg), which allows for unidirectional, non-connectable communication (i.e. beaconing), the *roBtClientManager* object is used to facilitate two-way, connectable communication. It provides an event to an attached message port when a new client connects. It also manages the client state, provides client update events, and times out the client after a period of inactivity. The JavaScript equivalent is [BSBtManager](docId\:Cf7q7xSA9dRtCq3bTXV-A).

The BLE clients themselves are represented by the [roBtClient](docId\:fDPNJsZ_TkIciApE63OL9) object. 

## ifBtClientManager

### Start(params As roAssociativeArray) As Boolean

Starts BLE communication. This method accepts the following parameters:

- `client_timeout`: The amount of time (in seconds) that a client can be inactive before being disconnected
- `service_uuid`: A UUID that identifies the service
- `clientid_uuid`: The client-identifier attribute. Once a client device connects to the player, it should write its unique client identifier value to this attribute.
- `user_variable_uuid`: The user variables attribute. This attribute is intended to be writable by both the player and the client, providing the primary means for exchanging state data. User variables can be written as a JSON string.
- `command_uuid`: The command attribute. When a client device writes to this attribute, an event containing the command string is generated by the associated *roBtClient*  instance.
- `device_info_uuid`: The attribute for device information. This attribute is read-only for clients.
- `device_data_uuid`: The attribute for device data. This attribute can be used to communicate available commands to clients. It is read-only for clients.

:::hint{type="info"}
There is a limit 512 bytes on each attribute.
:::

### Stop() As Boolean

Stops BLE communication.

### SetDeviceInfo(a As Object) As Boolean

### SetDeviceData(a As Object) As Boolean

## ifMessagePort

### SetPort(a As Object)

Posts messages of type [roBtClientManagerEvent](docId:0ya2SsCmiDFpWj_6W_XVI) to the attached message port.

## ifIdentity

### GetIdentity() As Integer

Returns a unique number that can be used to identify [roBtClientManagerEvent](docId:0ya2SsCmiDFpWj_6W_XVI) objects that originate from this object.

:::hint{type="info"}
The *ifIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifFailureReason

### GetFailureReason() As String

Returns additional useful information when a method on the *ifBtClientManager* interface returns `False`.

[title] roRtspStream
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This is a simple media-streaming object that is passed to the *roVideoPlayer.PlayFile()&#x20;*&#x6D;ethod. Use this object to play UDP, RTP, HLS, and HTTP streams. See the [Video Streaming](docId\:o9GIleB8eiEJpZhqRe7Q5) and [Stream Content via IP Camera](docId:0er0hhTcryaPJTXszy_55) FAQs for more details. The JavaScript equivalent is to use \<video> elements.

Object Creation: To play a stream, instantiate an *roRtspStream* object with a URL as its argument. Then pass it to the PlayFile() method as shown in the following example:

```none
v = createobject("rovideoplayer")
r = createobject("rortspstream", "http://172.30.1.37/alldigital/1080p/playlist.m3u8")
v.playfile({rtsp:r}) 
```

:::hint{type="info"}
The key in the passed associative array will always be "rtsp", no matter which streaming protocol is used.
:::

## ifRtspStream

**GetUrl() As String**

Retrieves the currently configured URL.

**AddHeader(header As String, text As String)**

Adds the specified header and header text to the streaming request. The ":" after the header and the "\r\n" after the header text are supplied automatically by the method. Headers only take effect when a stream is played; you cannot add more headers when a stream is playing (though these headers will be applied if the stream is played again).

**ClearHeaders()**

Removes headers that have been added using the `AddHeader()` method.

## ifMessagePort

**SetPort(port As roMessagePort)**

Posts event messages to the attached message port. The event messages are of the type roRtspStreamEvent and will implement the ifInt interface.

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

[title] roMediaServer
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

The *roMediaServer* object waits for client requests, deals with negotiation, and ultimately generates an *roMediaStreamer* pipeline to fulfill the request. For more information, see the [BrightSign Media Server](docId\:B6e8mGH--2yp06LLh1aha) section. The JavaScript equivalent is node-media-server.

This object currently supports RTSP and HTTP requests. Requests from the client must take the following form:

```text
protocol://IP_address:port/media_streamer_pipeline
```

- `protocol`: Either rtsp or http
- `IP_address:port`: The IP address of the BrightSign player and the port number on which the media server is running.
- `media_streamer_pipeline`: A media streamer pipeline, but without the final destination component (as the destination is implicit in the request from the client).

Object Creation: The *roMediaServer* object is created with no parameters

```text
CreateObject("roMediaServer")
```

## ifMediaServer

### GetFailureReason() As String

Returns useful information if the `Start()`, `Stop()`, or `Terminate()` methods return `False`.

### Start(a As String) As Boolean

Begins a media server instance. This method can be passed a string that specifies the streaming protocol and the port number of the server:

```text
s = CreateObject("roMediaServer")
s.Start("http:port=8080")
```

A number of optional parameters can be added after the port parameter using an "&" (ampersand):

- `trace`: Displays a trace of messages in the negotiation with the client. This parameter is useful particularly for debugging RTSP sessions. For example: `"rtsp:port=554&trace"`
- `maxbitrate`: Sets the maximum instantaneous bitrate (in Kbps) of the RTP transfer initiated by RTSP. This parameter has no effect for HTTP. The parameter value 80000 (i.e. 80Mbps) has been found to work well. The default behavior (also achieved by passing a zero value) is to not limit the bitrate at all. For example: `"rtsp:port=554&trace&maxbitrate=80000"`
- `threads`: Sets the maximum number of threads the server is prepared to have running. Each thread handles a single client request. The default value is "5". For example: `"http:port=8080&threads=10"`

### Stop() As Boolean

Stops the media server. This method signals all threads to stop, but does not wait for this to happen before destroying the server instance.

### Terminate() As Boolean

Stops the media server. This method waits for all threads to stop before destroying the server instance.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages to the attached message port.

## ifIdentity

### GetIdentity() As Integer

:::hint{type="info"}
The *ifIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::


[title] roNetworkHotplug
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object can be used to generate events when a [network interface](docId\:U6ZceYQddlz9xdAKtTmJs) becomes available or unavailable. It will post events of type [roNetworkAttached](docId\:wrxOOghI0XfxsynqOktNf) and [roNetworkDetached](docId\:b2OC8VrdNORy84OaiNKmr) to the associated message port. The JavaScript equivalent is [networkhotplug](docId\:NEizLJQNwCice75OcWKoL).

To determine which network was attached or detached, the script needs to call `GetInt()` or `GetString()` on the *roNetworkAttached*/*roNetworkDetached* event object. These methods provide an index of the network interface that was attached or detached.

:::hint{type="info"}
Reconfiguring a network interface using *roNetworkConfiguration* may cause it to detach and attach again. A DHCP address renewal may cause an *roNetworkAttached* event, even if the IP address hasn't changed.
:::

## ifMessagePort

### SetPort(a As Object)

Posts messages of type *roNetworkAttached*/*roNetworkDetached* to the attached message port.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

[title] roIRDownEvent, roIRRepeatEvent, roIRUpEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

An IR event object is generated when an IR button input (button press, button repeat, button release) is received by the *roIRReceiver* object. Use these objects to retrieve the message body of the IR input. 

:::hint{type="info"}
The *roIRUpEvent* object is generated with the Iguanaworks IR transceiver only.
:::

## ifInt

### GetCode() As Integer

Returns the IR code received by the *roIRReceiver* instance.

### SetCode(a As Integer)

Overrides the IR code received by the *roIRReceiver* instance, replacing it with the specified binary code. 

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned by `GetUserData()`.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set. 

## ifReceivedEvent

### GetEncoding() As String

Returns the encodings setting of the *roIRReceiver* instance. This setting can be one of the following strings:

- "NEC"
- "RC5" (supported on the Iguanaworks IR transceiver only)


[title] roTimeSpan
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Date and Time Objects/

This object provides an interface to a simple timer for tracking the duration of activities. It is useful for tracking how long an action has taken or whether a specified time has elapsed from a starting event. The JavaScript equivalent is "Date".

## ifTimeSpan

### Mark()

Sets the "Mark" point to the current time. The Mark point is also automatically set to the current time when an roTimespan object is created.

### TotalMilliseconds() As Integer

Returns the total number of milliseconds from the "Mark" point to the current time.

### TotalSeconds() As Integer

Returns the total number of seconds from the "Mark" point to the current time.&#x20;

Example

:::BlockQuote
x = timespan.TotalSeconds()
:::

is equivalent to

:::BlockQuote
x = Int(timespan.TotalMilliseconds() / 1000)
:::

### GetSecondsToISO8601Date(a As String) As Integer

Parses the ISO8601 date (for example, 2008-11-29T14:54:02.171) and returns the number of seconds from now (not the "Mark" point) until the specified date/time.

The date provided and the current time calculations are all done assuming UTC. The "Z" timezone part of the ISO8601 string is ignored.

**Parameters**

- `date` <font color="#704ae0">String</font>: The ISO8601date to be parsed.





[title] roIRTransmitter
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object supports sending arbitrary remote control Infrared remote control codes using the NEC, RC5, or PHC (Pronto Hex Controls) protocols. The JavaScript equivalent is [BSIRTransmitter](docId\:OG4yl3PeFza5nKGKbgBLv).

Object Creation: The *roIRTransmitter&#x20;*&#x69;s created with an associate array.

```none
CreateObject("roIRTransmitter", config as roAssociativeArray)
```

The associative array can contain the following parameter:

- `destination`: A string value indicating the connector that will be used to output the signal.
  - "IR-out": The 3.5mm IR output connector (available on XDx30 models) or 3.5mm IR input/output connector (available on 4Kx42 and XDx32 models)
  - "Iguana": The [Iguanaworks](http://iguanaworks.net/) IR transceiver

:::hint{type="info"}
System software will not prevent you from generating both an roIRTransmitter instance set to "IR-out" and an roIRReceiver instance set to "IR-in" (i.e. configuring the 3.5mm IR connector for input and output at the same time). However, input/output performance will not be reliable.
:::

## ifMessagePort

**SetPort(message\_port\_object As Object) As Void**

Posts event messages to the attached message port.

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifIRTransmitter

**GetFailureReason() As String**

**Send(protocol As String, code As Dynamic) As Boolean**

Sends the specified code using the output destination set during object creation. The system currently supports two IR transmission protocols: "NEC" and "PHC" ([Pronto Hex Code](docId\:S84MPE1R1QJ7aeHgOaJhH)). This method returns True if the code was successfully transmitted, but there is no way to determine from BrightScript if the controlled device actually received it.

**AsyncSend(protocol As String, code As Dynamic) As Boolean**

Sends the specified code and generates an *roIRTransmitCompleteEvent* object upon completion. The system currently supports two IR transmission protocols: "NEC" and "PHC" ([Pronto Hex Code](docId\:S84MPE1R1QJ7aeHgOaJhH)). This method is only supported using the IR-out destination.


[title] roSyncManagerEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

These events are generated on follower units in response to *roSyncManager.Synchronize()&#x20;*&#x63;alls from the leader unit. The *roSyncManager* on each follower unit will handle message duplicates, so the script will receive the sync message only once during normal operations.

If the follower unit is already booted up, then the event will arrive from the first network event generated by *roSyncManager.Synchronze()*. On the other hand, if the follower unit is booted up while the leader is in the middle of playing a video file or displaying an image file, then one of the message resends (generated at one second intervals by the leader unit) will trigger the event. The script passes on the data from the event to the `PlayFile()` command of the video player or the `DisplayFile()` command of the image player, which will then determine how far forward in the file it needs to seek.

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()` . It will return `Invalid` if no data has been set.

## ifSyncManagerEvent

**GetDomain() As String**

Returns the domain of the sync group, which is specified during creation of the roSyncManager object on the master unit.

**GetId() As String**

Returns the identifier of the event.

**GetIsoTimestamp() As String**

Returns the timestamp of the event in ISO format.

[title] roSyncManager
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object provides synchronization capabilities for video walls and other deployments that require closely calibrated interaction among players. roSyncManager handles network traffic for leader/follower synchronization. When using sync manager across multiple BrightSign players, PTP must be enabled on the players via their registries which is a separate operation (see the example and corresponding text below). PTP effectively shares a common clock amongst all of the players. If only synchronizing on a single BrightSign player, then PTP isn’t required, as the local BrightSign player clock is common to the objects participating in the synchronization. Multiple synchronization groups are allowed on the same local network and even within the same video wall.

The roSyncManager object currently supports video, image, and scrolling ticker synchronization. The roVideoPlayer and roImagePlayer objects rely on values generated by the ifSyncManager and roSyncManagerEvent methods to synchronize playback, while the roTextWidget object simply requires the domain name of the roSyncManager instance.

As of firmware version 7.0, roSyncManager also supports Genlock synchronization (frame-accurate VSync) over Ethernet. To enable Genlock on an roSyncManager domain, pass the domain name to the roVideoMode.SetSyncDomain() method. Otherwise, the process for synchronizing video, image, and ticker playback is the same.

:::hint{type="info"}
The roSyncManager object supports synchronization over Ethernet networks only.
:::

Before using roSyncManager across multiple BrightSign players you will need to set all of the BrightSign players within the group to the same PTP domain value. To do this, use the roRegistrySection.Write() method to set the `ptp_domain` key of the “networking” section to a value between 0 and 127. In general, changes to the registry only take effect after a reboot, so the PTP synchronization service will start on each player after it is rebooted. Any player with the same value of `ptp_domain` will end up with the same PTP master clock.

**Example**

```none
regSec = CreateObject("roRegistrySection", "networking")
regSec.Write("ptp_domain", "0")
regSec.Flush()
 
RebootSystem()
```

The JavaScript equivalent is [BSSyncManager](docId\:DQNX2ot2TDKXYNmRGLNCP) .

Object Creation: The *roSyncManager&#x20;*&#x6F;bject is created with an associative array representing a set of parameters.

```none
CreateObject("roSyncManager", parameters as roAssociativeArray)
```

The associative array can have the following parameters:

- `Domain` <font color="#6554c0">string</font>: An identifier that is used to distinguish among differen&#x74;*&#x20;roSyncManager&#x20;*&#x69;nstances within the same synchronization group (i.e. PTP domain). The default string is "BrightSign". This parameter allows multiple *roSyncManager&#x20;*&#x69;nstances to operate at the same time.
- `MulticastAddress` <font color="#6554c0">string</font>: The multicast address to which synchronization messages are communicated. The default address is "224.0.126.10".
- `MulticastPort `<font color="#6554c0">string</font>: The multicast port to which synchronization messages are communicated. The default port is "1539". 

## ifMessagePort

**SetPort(port As roMessagePort)**

Posts messages of type *roSyncManagerEvent* to the attached message port. Use these messages to synchronize *roVideoPlayer* and *roImagePlayer* playback.

## ifSyncManager

**SetAsLeader(leader\_mode As Boolean) As Boolean&#xA0;**

Specifies whether the unit is running the leader instance of roSyncManager.

**Synchronize(identifier As String, ms\_delay As Integer) As Object**

Broadcasts a time-stamped message to other players. This method is used on the leader unit only. The message will be rebroadcasted every second to allow follower units that are powered on late to catch up. The network message contains the sync ID, as well as the domain and a timestamp. The timestamp is created at the point when this method is called; however, it can be offset by passing a non-zero ms\_delay value, allowing synchronization points to be set slightly in the future and giving the client enough time to switch video files and perform other actions. The identifier parameter allows the script on the leader unit to pass a filename, or some other useful marker, to the follower units as part of the synchronization message. This method returns the message that is sent out so that the leader can access the timestamp. 

The synchronization message is sent over all available networks (including WiFi), but follower units will use only the first message received. The PTP messages, which are used by the firmware during synchronization, are sent over Ethernet only.

:::hint{type="info"}
Because synchronization can involve follower units seeking to catch up with the playback of a leader unit, we recommend using the more efficient MOV/MP4 container format when synchronizing video files. Transport Stream files (MPEG-TS) are also supported, but they must begin with a presentation timestamp (PTS) of 0. Program Stream files (MPEG-PS) are not supported.
:::

Currently, there are two objects that can accept synchronization parameters: The roVideoPlayer.PlayFile() call accepts the parameters provided by SyncManagerEvent messages, while the roImagePlayer.DisplayFile() and roImagePlayer.PreloadFile() calls accept `SyncIsoTimestamp` in an associative array. To synchronize image playback, an roImagePlayer object will simply delay the transition thread prior to running the transition. If there is a separate call for` DisplayFile()`, then the transition will be cancelled and the image will be displayed immediately (as with non-synchronized `DisplayFile()` calls).

**SetEncryptionEnable(enable As Boolean, key As Dynamic) As Boolean**

Enables or disables encryption of *roSyncManager&#xA0;*&#x6D;essages over the network. This method returns `true` on success and `false` on failure.

The`  key  `may be specified as a string or *roByteArray&#xA0;*&#x6F;bject. Alternatively, a `key` value may not be supplied, in which case a pseudo-randomly generated key is used. Setting `enable` to `false` and supplying a `key` at the same time will cause this method to fail. 

Encryption is available (and enabled by default) in OS8 and later. Note the following behavior in mixed-version environments:

- Follower units that have encryption enabled can ingest unencrypted synchronization messages from a leader unit. Once a follower unit receives encrypted packets, it will no longer accept unencrypted packets from a leader unit, unless encryption is explicitly disabled using this method.
- Follower units that have encryption disabled (or do not support encryption) cannot ingest encrypted messages from a leader unit. Therefore, if a synchronization group includes mixed versions of OS, the leader unit should always have an older version of OS than the follower units.

**SetEncryptionEnableWithObfuscatedKey(obfuscated\_key As String) As Boolean**

Enables encryption of *roSyncManager&#xA0;*&#x6D;essages using an obfuscated key. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.

**GetCurrentConfig() As roAssociativeArray**

Returns the current configuration parameters for the *roSyncManager&#xA0;*&#x69;nstance:

- `leader` <font color="#6B21A8">int:</font> A flag indicating whether the unit is in leader mode (1) or not (0)
- `ip` <font color="#6B21A8">string: </font> The multicast address to which synchronization messages are communicated
- `port` <font color="#6B21A8">int: </font>The multicast port to which synchronization messages are communicated
- `domain` <font color="#6B21A8">int</font>: The domain identifier used to distinguish among differen&#x74;*&#xA0;roSyncManager&#xA0;*&#x69;nstances

## Example

The following script synchronizes video playback on the leader and follower units:

```javascript
' Create a sync manager with default address and port.
aa1=CreateObject("roAssociativeArray")
aa1.Domain = "BS1"
s=CreateObject("roSyncManager", aa1)
p=CreateObject("roMessagePort")
s.SetPort(p)

' Create a video player - we're going to play a seamlessly looped file
v=CreateObject("roVideoPlayer")
v.SetLoopMode(True)

' THIS SECTION IS ONLY DONE BY THE LEADER
' We're the leader unit - send out a synchronize event saying that we're starting.
' playback 1000ms from now
s.SetLeaderMode(True)
msg = s.Synchronize("Blah1", 1000)

' THIS SECTION IS ONLY DONE BY THE FOLLOWER
' We're a follower unit, and we're sitting waiting for a sync message.
msg=Wait(4000, p)

' EVERYONE DOES THE REST
aa=CreateObject("roAssociativeArray")
aa.Filename = "Text_1.mov"
aa.SyncDomain = msg.GetDomain()
aa.SyncId = msg.GetId()
aa.SyncIsoTimestamp = msg.GetIsoTimestamp()

v.PlayFile(aa)
```


[title] roUPnPController
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object establishes and maintains a UPnP Control Point. It must exist for the entirety of UPnP discovery operations. Refer to the [UPnP Device Architecture](http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.0.pdf) document for more information about UPnP discovery protocols. 

Object Creation: The *roUPnPController* object is created without any parameters.

```none
CreateObject("roUPnPController")
```

## ifUPnPController

**SetDebug(debug As Boolean) As Void**

Enables detailed debugging in the UPnP engine.

**Search(searchTarget As String, mx As Integer) As Boolean**

Issues a Search request for a UPnP device. The parameters correspond to the ST (Search Target) and MX (Maximum wait time) header values that are sent with a UPnP M-SEARCH command. Responses to the Search request will generate messages in the form of roUPnPSearchEvent objects.

:::hint{type="info"}
The most common value for the searchTarget parameter is "upnp\:rootdevice". This allows you to search all root devices, identify which devices you wish to interact with, and then get the roUPnPDevice and UPnPService instances for these embedded devices and services.
:::

**RemoveDevice(udn As String) As Boolean**

Forces removal of the specified device from the Control Point device list. The passed string must include "`uuid:"` prepended to the UDN value.

## ifMessagePort

Specifies the port that will receive events generated by the *roUPnPController&#x20;*&#x69;nstance.

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## UPnP Controller Operation

The *roUPnPController&#x20;*&#x6F;bject maintains a list of all currently detected UPnP devices accessible via the local network. To maintain this list, the *roUPnPController* object follows these generally accepted control-point practices:

- If an `ssdp:alive` multicast notification is received from a device that is not part of the list, it is queried for its device information and added to the list. However, the `ssdp:alive` message is not intended as the primary means for device discovery; rather, this behavior is intended to keep the list up-to-date and remove devices that disappear without an `ssdp:byebye` notification.
- If an `ssdp:byebye` multicast notification is received form a device that is part of the list, it will be removed from the list.
- The UPnP Controller allows a client to issue a Search request for UPnP devices. All devices on the network are expected to respond directly to the requesting device. If a response is received from a device that is not part of the list, it is queried for its device information and added to the list.
- UPnP devices report a "time-to-live" for notifications. For UPnP NOTIFY and search-response messages, this is contained in the "Cache-Control: max-age" header. Typically, this "time-to-live" is 20 or 30 minutes, though some devices have much shorter time values. Every device is configured to expire after its "time-to-live" is reached, at which point it is removed from the device list. The counter is reset (i.e. the device is renewed) after each receipt of an `ssdp:alive` message.

BrightScript does not allow direct access to its internal DeviceList. Rather, it raises events in the form of *roUPnPSearchEvent&#x20;*&#x6F;bjects when devices are added or removed from the list. These objects can, in turn, be used to retrieve *roUPnPDevice&#x20;*&#x6F;bjects containing all device information.

The controller also raises events whenever it receives a NOTIFY multicast message or a response to an M-SEARCH message (i.e. a response to a controller search request). These events return associative arrays containing headers from the NOTIFY multicast message or from the HTTP response to the M-SEARCH message.

The associative arrays may also contain additional non-header items. For an SSDP multicast message notification (type 0), the associative array will contain an "ssdpType" key, the value of which designates whether it is a NOTIFY or M-SEARCH message. In most cases, it is best to ignore M-SEARCH messages, unless you are implementing a UPnP device (the UPnP controller object does allow this).

During an M-SEARCH request, a "new device" notification (type 2) will only be sent when a device is added to the controller's internal list. Once a device is part of the device list, subsequent M-SEARCH requests will only return type 1 (search response) values for that device. This type 1 response returns an associative array with message headers, but not an roUPnPDevice object (which is used to contain a complete set of device information).

:::hint{type="info"}
See the roUPnPSearchEvent page for more information about the messages sent by the UPnP Controller.
:::


[title] roKeyboard
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object is used to wait for events from a USB keyboard. It can also be used to configure the localization of the keyboard. The JavaScript equivalent is [keyboard](docId\:mNJv4RN7rm_2FSlSjTqgc).

Object Creation: The *roKeyboard* object is created with no parameters.

```text
CreateObject("roKeyboard")
```

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roKeyboardPress* to the attached message port.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifKeyboardConfig

### IsPresent() As Boolean

Returns `True` if a USB keyboard is connected to the player. This method counts a connected device as a keyboard if it reports having the following keys: "A", "Z", "0", "9", ".", and Enter.

### SetNumLock(on\_off As Boolean) As Boolean

Sets the numlock state for the attached USB keyboard if passed true. Resets the state if passed false.

### SetLayout(layout As String) As Boolean

Specifies the localized layout for the attached USB keyboard. This setting takes effect immediately and persists in the registry after a reboot. The following table lists valid keymap parameters (players are set to "us" by default): 

|    |                        |    |                |    |                    |    |                   |
| -- | ---------------------- | -- | -------------- | -- | ------------------ | -- | ----------------- |
| af | Afghanistan            | es | Spain          | kh | Cambodia           | pk | Pakistan          |
| al | Albania                | et | Ethiopia       | kr | Korea, Republic of | pl | Poland            |
| am | Armenia                | fi | Finland        | kz | Kazakhstan         | pt | Portugal          |
| at | Austria                | fo | Faroe Islands  | la | Laos               | ro | Romania           |
| az | Azerbaijan             | fr | France\*       | lk | Sri Lanka          | rs | Serbia            |
| ba | Bosnia and Herzegovina | gb | United Kingdom | lt | Lithuania          | ru | Russia            |
| bd | Bangladesh             | ge | Georgia        | lv | Latvia             | se | Sweden            |
| be | Belgium                | gh | Ghana          | ma | Morocco            | si | Slovenia          |
| bg | Bulgaria               | gn | Guinea         | md | Moldova            | sk | Slovakia          |
| br | Brazil                 | gr | Greece         | me | Montenegro         | sn | Senegal           |
| bt | Bhutan                 | hr | Croatia        | mk | Macedonia          | sy | Syria             |
| bw | Botswana               | hu | Hungary        | ml | Mali               | th | Thailand          |
| by | Belarus                | ie | Ireland        | mm | Myanmar            | tj | Tajikistan        |
| ca | Canada                 | il | Israel         | mn | Mongolia           | tm | Turkmenistan      |
| cd | Congo (DRC)            | in | India          | mt | Macao              | tr | Turkey            |
| ch | Switzerland            | iq | Iraq           | mv | Maldives           | tw | Taiwan            |
| cm | Cameroon               | ir | Iran           | ng | Nigeria            | tz | Tanzania          |
| cn | China                  | is | Iceland        | nl | Netherlands        | ua | Ukraine           |
| cz | Czech Republic         | it | Italy          | no | Norway             | us | United States\*\* |
| de | Germany                | jp | Japan          | np | Nepal              | uz | Uzbekistan        |
| dk | Denmark                | ke | Kenya          | pc | Pitcairn           | vn | Vietnam           |
| ee | Estonia                | kg | Kyrgyzstan     | ph | Philippines        | za | South Africa      |

\*Equivalent to the AZERTY keyboard layout

\*\*The default setting

[title] roUPnPDevice
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object is returned by the roUPnPSearchEvent.GetObject() method under certain conditions.

## ifUPnPDevice

**GetUUID() As String**

**GetHeaders() As roAssociativeArray**

Returns an associative array of headers (including vendor-specific extensions) associated with the advertisement or search.

**GetDeviceInfo() As roAssociativeArray**

Returns an associative array of device metadata from the device XML (applicable to root items only).

**GetEmbeddedDevices() As roAssociativeArray**

Returns an associative array of embedded roUPnPDevice object instances, keyed by device type.

**GetEmbeddedDevice(deviceType As String) As roUPnPDevice**

Returns an *roUPnPDevice&#x20;*&#x69;nstance, using the specified deviceType as a unique identifier. The `deviceType` parameter must use one of the following formats:

- `urn:schemas-upnp:device:deviceType:v`: Search for any device of this type. The deviceType and version (v) are defined by the UPnP Forum working committee.
- `urn:domain-name:device:deviceType:v:` Search for any device of this type. The domain-name,` deviceType`, and version (v) are defined by the UPnP vender. Period characters in the domain name must be replaced with hyphens in accordance with RFC2141.

**GetServices() As roAssociativeArray**

Returns an associative array of embedded roPnPService object instances, keyed by type.

**GetService(serviceType As String) As roUPnPService**

Returns an roUPnPService instance of the specified type.



[title] roControlPort
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object provides support for the BP200/BP900 USB button boards, GPIO ports, and side buttons on the BrightSign player. Button presses are returned as *roControlUp* and *roControlDown* events. The object is used to configure output levels on the I/O connector and monitor inputs. Typically, LEDs and buttons are attached to the GPIO connector on the BrightSign player or the BrightSign Expansion Module.

The JavaScript equivalent is [controlport](docId\:N8yoCsdAGOgqCP1OyuoLw).

Object Creation: The *roControlPort* object is created with a single parameter that specifies the port being used.

```text
CreateObject("roControlPort", port As String)
```

The port parameter can be one of the following:

- `BrightSign`: Specifies the onboard GPIO connector (including the SVC (GPIO12) button).
- `Expander-GPIO`: Specifies the DB-25 connector on the BrightSign Expansion Module. If no BrightSign Expansion module is attached, then object creation will fail and Invalid will be returned.
- `Expander-<n>-GPIO`: Specifies a [USB-to-GPIO device](https://www.brightsign.biz/digital-signage-products/accessories/USB-C-Cables) connected to the player. Multiple USB-to-GPIO devices can be controlled using separate *roControlPort*  instances: The first device corresponds to `"Expander-0-GPIO"`, the second to `"Expander-1-GPIO"`, etc.
- `Expander-DIP`: Specifies the eight DIP switches on the BrightSign Expansion Module. If no BrightSign Expansion module is attached, then object creation will fail and `Invalid` will be returned.

:::hint{type="info"}
Hot-plugging the BrightSign Expansion Module is not supported.
:::

- `Touchboard-<n>-GPIO`: Retrieves events from the specified BP200/BP900 button board. Events are handled in the same manner as events from the BrightSign port.
- `Touchboard-<n>-LED-SETUP`: Sets various LED output options for the specified BP200/BP900 button board.
- `Touchboard-<n>-LED`: Sets the bits for each button on the specified BP200/BP900 button board. The bits indicate whether the associated LED should be on or off.

:::hint{type="info"}
Since multiple BP200/BP900 button boards can be connected to a player simultaneously, the \<n> value specifies the port enumeration of each board. This value corresponds to the `<raw>` or `<fid>` value returned by the [roDeviceInfo.GetUSBTopology()](docId\:uTKDmpos1ulxaoYLx1nS6) method. An unspecified enumeration value is synonymous with a button board with an enumeration value of 0 (e.g. Touchboard-GPIO and Touchboard-0-GPIO are identical).
:::

##  ifControlPort

:::hint{type="info"}
The "button" numbers described below are not the same as GPIO "pin" numbers: Some pins act as power supply or ground, so they are not included in the button numbering scheme. See the [hardware manual](docId\:UYYJYeJ6qoJy1HKSbRlPu) associated with your player model to view a mapping of buttons to pins.
:::

### GetVersion() As String

Returns the version number of the firmware (either the main BrightSign firmware or the BrightSign Expansion Module firmware) responsible for the control port.

### EnableOutput(button As Integer) As Boolean

Marks the specified button as an output. If an invalid button number is passed, `false` will be returned. If successful, the function returns `true`. The output will be driven high or low depending on the current output state of the pin.

### EnableInput(button As Integer) As Boolean

Marks the specified button as an input. If an invalid button number is passed, `false` will be returned. If successful, the function returns `true`. The button will be tri-stated and can be driven high or low externally.

### EnableAlternateFunction(button As Integer, pin\_function As String) As Boolean

Enables an alternate function on a GPIO button. This method applies to the onboard GPIO connector and is currently supported on the XTx44, XTx43, XDx34, XDx33, HDx24, HDx23, and HO523 models.

The first argument specifies the GPIO button number (between 0 and 7). The second argument specifies the alternate function setting; the following table outlines the possible alternate setting for each pin:

| **GPIO Pin** | **Button Number** | **Alternate Function**            |
| ------------ | ----------------- | --------------------------------- |
| 3            | 0                 | `"serial1"` (Rx)                  |
| 4            | 1                 | `"irin1"`                         |
| 5            | 2                 | `"irout"` (HDx23, HO523 only)     |
| 6            | 3                 | N/A                               |
| 9            | 4                 | `"serial0"` (Rx - console port)\* |
| 10           | 5                 | `"serial0"` (Tx)\*                |
| 11           | 6                 | `"serial1"` (Tx)                  |
| 12           | 7                 | N/A                               |

\*Models that do not have a 3.5mm serial port (e.g. HD223, XD233) do not support serial port 0.

:::hint{type="info"}
To revert a GPIO button to its primary function, specify the `pin_function` as "gpio".
:::

### GetWholeState() As Integer

Returns the state of all the inputs attached to the control port as bits in an integer. Individual buttons can be checked using binary operations, although it is normally easier to call `IsInputActive()` instead.

### IsInputActive(button As Integer) As Boolean

Returns the state of the specified input. If the button is not configured as an input, then the result is undefined.

### SetWholeState(state As Integer) As Boolean 

Specifies the desired state of all outputs attached to the control port as bits in an integer. The individual buttons can be set using binary operations, although it is normally easier to call  `SetOutputState()` instead.

### Example

```text
port = CreateObject("roControlPort", "BrightSign")
gpio1 = 2 '2^1
gpio3 = 8 '2^3
gpio5 = 32 '2^5
gpio7 = 128 '2^7
port.SetWholeState(gpio1 + gpio2 + gpio5 + gpio7) 'turns on ports 1, 3, 5, and 7
```

### SetOutputState(button As Integer, level As Boolean) As Boolean

Configures the output of the specified pin, which can be either "off" (0) or "on" (1). If the button is not configured as an output, the resulting level is undefined. This method can also be used to configure LED output behavior on BP200/B900 button boards; see the [BP200/BP900 Setup](docId:8ExDHgmoHqig7J-UvfCe1) section below for more details.

### SetOutputValue(offset As Integer, bit-mask As Integer) As Boolean

Configures a button on a BP200/BP900 button board. This method can only be used when the *roControlPort* object is instantiated with the `Touchboard-<n>-LED-SETUP` or `Touchboard-<n>-LED` parameter. See the [BP200/BP900 Setup](docId:8ExDHgmoHqig7J-UvfCe1) section below for more details.

### SetOutputValues(values As roAssociativeArray) As Boolean

Configures buttons on a BP200/BP900 button board. This method can only be used when the *roControlPort* object is instantiated with the `Touchboard-<n>-LED-SETUP` or `Touchboard-<n>-LED` parameter. See the [BP200/BP900 Setup](docId:8ExDHgmoHqig7J-UvfCe1) section below for more details.

### GetProperties() As roAssociativeArray

Returns an associative array of values related to the attached BP200/BP900 button board, including hardware, header, and revision. This method can only be used with an *roControlPort* instantiated with the `Touchboard-<n>-GPIO` parameter.

### SetPulseParams(parameters As roAssociativeArray) As Boolean

Specifies a period of time, as well as the time slices within that period, for pulsing GPIO LEDs. These properties are applied to all GPIO outputs. This method is passed an associative array with the following parameters:

- `milliseconds`: An integer specifying the time period (in ms) for pulsing
- `slices`: An integer specifying the number of divisions within the milliseconds time period: For example, a 500ms time period with slices:2 is divided into two 250ms slices.

### SetPulse(button As Integer, bit-field As Integer) As Boolean

Sets the off/on bit field for a particular GPIO. Use the `slices` parameter of the `SetPulseParams()` method to determine the number of bits in the bit field. For example, specifying `milliseconds:500, slices:2`, and a bit field of `10` will cause the button to turn on every other 250 millisecond period.

### RemovePulse(button As Integer) As Boolean

Removes the specified GPIO from the set affected by the pulse.

## ifMessagePort

### SetPort(port As Object)

Posts messages of type [roControlUp and roControlDown and roControlDown](docId:_58TKuomyoD8uRhrP3uqY)  to the attached message port.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifIdentity

### GetIdentity() As Integer

Returns an identity value that can be used to associate *roControlUp*  and *roControlDown*  events with this control port.

:::hint{type="info"}
The *ifIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::

### Examples

This example script applies timed pulses to a set of GPIOs:

```text
' set up button 2 and 3 to flash at 2Hz (i.e. on & off twice in a second) in an alternating ' fashion.

gpioPort = CreateObject("roControlPort", "BrightSign")

gpioPort.EnableOutput(2)
gpioPort.SetOutputState(2, true)

gpioPort.EnableOutput(3)
gpioPort.SetOutputState(3, true)

' set up pulse to have two time slices of 250ms each.
gpioPort.SetPulseParams({ milliseconds: 500, slices: 2 })

' button 2 will have slice 1 on and slice 2 off.
gpioPort.SetPulse(2, &h01)

' button 3 will have the reverse of button 2.
gpioPort.SetPulse(3, &h02)

' wait for a bit.
sleep(10000)

' stop pulsing on button 2.
gpioPort.RemovePulse(2)
```

This example script enables various alternate functions on the GPIO:

```text
c = CreateObject("roControlPort", "BrightSign")
 
'Enable serial port 1 on the GPIO.
 
c.EnableAlternateFunction(0, "serial1")
c.EnableAlternateFunction(6, "serial1")

s1 = CreateObject("roSerialPort", 1, 115200)
s1.SendLine("This is serial port 1")

mp = CreateObject("roMessagePort")
s1.SetLineEventPort(mp)
? wait(10000, mp)

'Switch serial port 0 from the 3.5mm serial port to the GPIO.
'[Note: it is advised use telnet/ssh or a script when testing this]

c.EnableAlternateFunction(4, "serial0")
c.EnableAlternateFunction(5, "serial0")

s = CreateObject("roSerialPort", 0, 115200)
s.SendLine("Hello on the console?")

mp = CreateObject("roMessagePort")
s.SetLineEventPort(mp)
? wait(10000, mp)

'Restore normal operation on serial port 0.

c.EnableAlternateFunction(4, "gpio")
c.EnableAlternateFunction(5, "gpio")

'Enable IR input on the GPIO.

c = CreateObject("roControlPort", "brightsign")
? c.EnableAlternateFunction(1, "irin1")

nexus_encodings = [ "NEC", "NEC32" ]
ir_gpio = CreateObject("roIRReceiver", { source: "GPIO", encodings: nexus_encodings })

mp = CreateObject("roMessagePort")
ir_gpio.SetPort(mp)

m = wait(10000, mp)

'Enable IR output on the GPIO (HDx23, HO523 only--the XT/XD models have a dedicated 3.5mm IR socket)

c.EnableAlternateFunction(2, "irout")

ir = CreateObject("roIRTransmitter", { destination: "GPIO"} )
ir.Send("NEC32", &H12345)
```

## BP200/BP900 Setup 

To send a configuration to the BP200/BP900 button board, instantiate *roControlPort* with the `Touchboard-<n>-LED-SETUP` parameter and call the `SetOutputValue()` method. This method accepts two integers: the first integer specifies one of three command types (offsets); the second integer is a bit field consisting of 32 bits.

- Offset 0: Configures the button board using a bit field that is split into four bytes of eight bits each. Each byte is a separate part of the configuration. In the script, these bytes need to be listed from right to left in hex value (i.e. Byte 1 + Byte 2 + Byte 3 + Byte 4).
  - Byte 1: Specifies the configuration type for the button board. Currently, the only configuration type is for LED output, which is specified with the value \&hA0.
  - Byte 2: The button number(s) that will be configured. Buttons are numbered beginning from 1. The value is set to 0 (\&h00) if this command is not required.
  - Byte 3: The LED bit-field configuration. This value specifies how many on/off bits should be used (up to 32 bits) when `SetOutputValue()` is called on a `Touchboard-<n>-LED` instance (see the BP200/BP900 LED Output section below for details). Set the value to 0 (\&h00) if this command is not required (the bit field will be set to eight bits by default).
  - Byte 4: This value is currently always set to 0 (\&h00).
- Offset 1: Disables buttons on the button board according to values in the bit field. Each button is disabled individually by setting bits 0-10: For example, passing the hex value \&h00000008 will disable button 4 only.
- Offset 2: Disables LEDs on the button board according to values in the bit field. Each LED is disabled individually by setting bits 0-10: For example, passing the hex value \&h00000080 will disable the LED on button 8 only.

:::hint{type="info"}
Disabling a button LED will not automatically disable the button itself (and vice-versa). To disable both the button and the LED, make separate SetOutputValue() calls for Offset 1 and Offset 2.
:::

## BP200/BP900 LED Output

To control the behavior of individual button LEDs, instantiate *roControlPort* with the `Touchboard-<n>-LED` parameter, then pass per-LED bit fields to the `SetOutputValue()`  method. This method accepts two integers: the first integer specifies the button number (0-11), while the second integer uses a bit field to specify the on/off behavior of the button LED. The size of the bit field (up to 32 bits) is determined with the Offset 0 – Byte 3 value described in the section above.

Each bit specifies the on/off behavior of a single cycle, and the BP200/BP900 button boards run at approximately 11Hz. For example, if you want an LED to cycle on every other second, you would set the Offset 0 – Byte 3 value to \&h16 (22 bits) and the bit field itself to \&h3FF800 (0000000000011111111111).

This example script sets a BP900 to “twinkle” by turning off each button LED at a different point in the cycle:

```text
led=CreateObject("roControlPort", "TouchBoard-0-LED")
led_setup=CreateObject("roControlPort", "TouchBoard-0-LED-SETUP")
led_setup.SetOutputValue(0, &h000B00A0)
led.SetOutputValue(0, &h07fe)
led.SetOutputValue(1, &h07fd)
led.SetOutputValue(2, &h07fb)
led.SetOutputValue(3, &h07f7)
led.SetOutputValue(4, &h07ef)
led.SetOutputValue(5, &h07df)
led.SetOutputValue(6, &h07bf)
led.SetOutputValue(7, &h077f)
led.SetOutputValue(8, &h06ff)
led.SetOutputValue(9, &h05ff)
led.SetOutputValue(10, &h03ff)
```

:::hint{type="info"}
See [controlport](docId\:N8yoCsdAGOgqCP1OyuoLw) for the equivalent example (setting a BP900 to twinkle) in JavaScript.
:::


[title] roKeyStore
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object allows you to register client certificates with the player. These certificates can be used by *roHtmlWidget* and *roUrlTransfer* objects when communicating with servers and *roVideoPlayer* objects when accessing streams. All object instances share the same certificate database. The JavaScript equivalent is [keystore](docId:6Alp0AIXrZlHV4cBkebvz).

While CA packages (added using the `AddCAPackage()` method) are persistent, individual certificates added using the `AddCACertificate()` and `AddClientCertificate()` methods must be applied on each boot.

## ifKeyStore

### GetFailureReason() As String

Returns additional useful information if an *ifKeyStore* method returns False.

### AddCACertificate(certificate\_file As String) As Boolean

Registers the specified CA certificate with the certificate database. Client certificates can be either self-signed or signed using a 3rd-party certificate issuer (Versign, DigiCert, etc.). 

### AddCAPackage(filename As String) As Boolean

Adds the specified CA package file to the certificate database. The package name resides in the file and does not need to be the same as the filename.

You will need to work with BrightSign to create a CA package to add to BrightSign players; see the [Generating a CA Package](docId\:GhSZNW9eS8TEMURQXq-DU) section below for more details.

:::hint{type="info"}
Attempting to modify a CA package file that has been added to the database will invalidate it. If a package is invalidated, it will need to be removed from the database (using the `RemoveCAPackage()` method) and added again.
:::

### RemoveCAPackage(package\_name As String) As Boolean

Removes the specified CA package from the certificate database. Use the `GetCAPackagesInstalled()` method to retrieve a list of package names in the database.

### GetCAPackagesInstalled() As roArray

Returns a list of names of CA packages contained in the certificate database.

### AddClientCertificate(parameters As roAssociativeArray) As Boolean

Registers a .p12 client certificate with the certificate database. This method accepts an associative array with the following parameters:

- `certificate_file`: The file name and path of the .p12 client certificate
- `passphrase`: A passphrase for the .p12 client certificate
- `obfuscated_passphrase`: An obfuscated passphrase for the .p12 client certificate

:::hint{type="danger"}
Provide the passphrase using either the "passphrase" or "obfuscated\_passphrase" parameter (not both). We recommend using the "obfuscated\_passphrase" in production environments, while the "passphrase" should be used for testing purposes only. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.
:::

BrightSign players use the "nickname" of a .p12 client certificate to match it with a website. The "nickname" consists of the `host:port` of the web address you wish to match: For example, to use a client certificate for [https://brightsign.biz](https://brightsign.biz) , you would specify a "nickname" of `"brightsign.biz:443"`.

The following example uses an openssl terminal to generate a .p12 client certificate to use with [https://brightsign.biz](https://brightsign.biz) .

```text
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12 -name "brightsign.biz:443"
```

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages to the attached message port.

## Generating a CA Package 

Contact [support@brightsign.biz](mailto\:support@brightsign.biz) for help generating a CA package. You will need to provide a PEM file to BrightSign containing one or more root CAs that you would like the player to trust.

BrightSign will hash the CA file using SHA-256 and package it with an X.509 certificate containing the hash. The package will be signed by a CA that is trusted by the BrightSignOS for CA packaging only.

BrightSign packages the X.509 certificate with two strings:

- "friendly name": Specifies the package name, which will be returned by the `GetCAPackagesInstalled()` method (and can be different from the filename of the CA package). You should specify the friendly name when you provide the CA file.
- "action": Currently, the only supported action is "add", which adds the contents of the CA package to the default BrightSign CAs.

BrightSign will send you the CA package as a *.bsca* file, which can then be added to BrightSign players using the `AddCAPackage()` method. You can also inspect the package contents to determine if they are correct. 

## Example

```text
k=createobject("rokeystore")
k.addcacertificate("ssd:/apache.crt")
aa = CreateObject("roAssociativeArray")
aa.AddReplace("certificate_file", "ssd:/client.p12")
aa.AddReplace("passphrase", "1q2w3e4r")
k.addclientcertificate(aa)


if k.AddCaPackage("ssd:/example.bsca") then print "CA Package added"
pkglist = k.GetCAPackagesInstalled()
print pkglist
if k.RemoveCAPackage("Example") then print "Removed CA Package" 
```


[title] roPowerEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

The *roPowerEvent* object triggers if you switch between plugged in AC and PoE.

Object Creation: The *roPowerEvent* object is created as follows:

```text
CreateObject("roPowerEvent", a As String, b As String) As Object
```

## IfPowerEvent

`GetData() As Object`

Returns current state and requested state when it has switched from the current state to the requested state.

[title] roBtCentralManager
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object allows you to check if Bluetooth is fitted; set, monitor, or retrieve the current Bluetooth Low Energy (BLE) advertisements; and scan for Bluetooth devices.

### Scan(parameters As roAssociativeArray) As Boolean&#x20;

When set to `true`, scanning includes BLE advertisements.&#x20;

Parameters can include `advertising_reports`.

## ifBtAdvertisingReportEvent

### GetAdapter() As String

Returns the adapter that the advertising device belongs to

### GetDevice() As String

Returns the identifier for remote advertising device

### GetRssi() As Integer

Returns the signal strength indicator for advertisement

### GetData() As roByteArray

Returns advertisement data

### GetAdvertisement() As roAssociativeArray

Available as of BOS 9.0.198 and 9.1.21, this returns an associative array containing all of the above. The field names are:

- `adapter_path` <font color="#704ae0">string</font>: The object path of the adapter the device belongs to
- `device_address` <font color="#704ae0">string</font>: The Bluetooth device address of the remote device
- `rssi` <font color="#704ae0">int</font>: The Received Signal Strength Indicator of the remote device (inquiry or advertising)
- `data` <font color="#704ae0">roByteArray</font>: An roByteArray of manufacturing data

### Reset() As Boolean

This reset method will attempt to recover the Bluetooth stack if it becomes unresponsive

## ifBtDeviceFoundEvent

### GetDevice() as roAssociativeArray

Available as of BOS 9.0.198 and 9.1.21, this returns an associative array containing the following:

- `adapter_path` <font color="#704ae0">string</font>: The object path of the adapter the device belongs to
- `address` <font color="#704ae0">string</font>: The Bluetooth device address of the remote device
- `name` <font color="#704ae0">string</font>: The Bluetooth remote name.&#x20;
- `alias` <font color="#704ae0">string</font>: The name alias for the remote device.&#x20;
- `rssi` <font color="#704ae0">int</font>: The Received Signal Strength Indicator of the remote device (inquiry or advertising)
- `tx_power` <font color="#704ae0">int</font>: The advertised transmitted power level (inquiry or advertising)
- `uuids` <font color="#704ae0">roArray</font>: An roArray of UUID strings that represent the available remote services
- `advertising_flags` <font color="#704ae0">roArray</font>: An roArray of advertisement flags
- `manufacturer_data` <font color="#704ae0">roArray</font>: An roArray of roAssociativeArray where each element has:
  - `id` <font color="#704ae0">int</font>: The id of the manufacturer
  - `data` <font color="#704ae0">roByteArray</font>: An roByteArray of mfg data
- `service_data` <font color="#704ae0">roAssociativeArray</font>: An roAssociativeArray with the following pairs:
  - `uuid` <font color="#704ae0">string</font>: UUID strings that represent the available remote services
  - `service data` <font color="#704ae0">roByteArray</font>: An array of service advertisement data

## ifBtDeviceLostEvent

### GetDevice() as roAssociativeArray

Available as of BOS 9.0.198 and 9.1.21, this returns an associative array containing the following:

- `adapter_path` <font color="#704ae0">string</font>: The object path of the adapter the device belongs to.
- `address` <font color="#704ae0">string</font>: The Bluetooth device address of the remote device

## Example

```none
mp = CreateObject("roMessagePort")
btc = CreateObject("roBtCentralManager")
btc.SetPort(mp)
btc.Scan({advertising_reports: true})
```


[title] roPtp
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object can be used to retrieve information about the network PTP state of the player. The JavaScript equivalent is [hostconfiguration](docId\:P1DkloQhLM9wxsSwmPeeK).

Object Creation: This object is created with no additional parameters.

```text
ptp = CreateObject("roPtp")
```

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of the type *roPtpEvent* to the attached message port.

## ifPtp

### GetPtpStatus() As roAssociativeArray

Returns an associative array containing information about the network PTP state of the player:

- `state`: A string indicating the current PTP state of the player. Values can be "MASTER", "SLAVE", or "UNCALIBRATED".
- `timestamp`: A value indicating when the PTP state was last changed. This value is measured in seconds since the player booted. This value can be compared against the total uptime of the player, which is retrieved by calling `UpTime(0)`.


[title] roUsbPowerControl
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

The roUsbPowerControl object is used to control the power of the USB port for specific supported platforms. The supported platforms are XT1144, XD1034, AU325, and AU335. This object is available on BrightSign OS 8.2.20 and above.

## ifUsbPowerControl

**PowerCyclePort(friendly\_name As String) As Boolean**

Allows you to power cycle the VBus on a device that may be stuck on a specific port. This method returns `True` on success, or `False` on failure.

- `friendly_name` <font color="#6554c0">string</font>: The friendly name of the specific USB port. Refer to the table below to map friendly names to supported platforms. For example, call `usb.powerCyclePort("USB:A")` to turn the USB power on port 1 of AU325 off and on again.

| **Platform**   | **USB**          | **Friendly Name**                                          |
| -------------- | ---------------- | ---------------------------------------------------------- |
| AU325          | 1, 2, 3, 4, 5, 6 | "USB\:A", "USB\:B", "USB\:C", "USB\:D", "USB\:E", "USB\:F" |
| AU335          | Type-C           | "USB\:A"                                                   |
| XD1034, XT1144 | Type-C, Type-A   | "USB\:A", "USB\:B"                                         |

**PowerCycleAllPorts() As Boolean**

Call `usb.PowerCycleAllPorts()` to turn the power off and on for all USB ports and power cycle all plugged in devices. This method returns `True` on success, or `False` on failure.

**PortPowerOn(friendly\_name As String) As Boolean**

Allows you to power on the specified port. This method returns `True` on success, or `False` on failure.

- `friendly_name` <font color="#6554c0">string</font>:  The friendly name of the specific USB port. Please refer to the table above to map friendly names on supported platforms.

**PortPowerOff(friendly\_name As String) As Boolean**

Allows you to power off the specified port. This method returns `True` on success, or `False` on failure.

- `friendly_name` <font color="#6554c0">string</font>: The friendly name of the specific USB port.  Please refer to the table above to map friendly names on supported platforms.

## Example

This example power cycles USB\:A and USB\:B ports with a one second wait:

```none
usb = CreateObject("roUsbPowerControl")
? usb.PortPowerOff("USB:A")
? usb.PortPowerOff("USB:B")
sleep(1000)
? usb.PortPowerOn("USB:A")
? usb.PortPowerOn("USB:B")
```


[title] roIRRemote
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object supports receiving and transmitting arbitrary Infrared remote control codes using the NEC protocol. You can also use this object to send PHC (Pronto Hex Code) commands. The best way to determine the required send values is to capture the codes received by *roIRRemote* when the remote buttons of the device are pressed and then send the same codes. 

:::hint{type="danger"}
The *roIRRemote* object cannot be used to receive input over the 3.5mm IR port on the 4Kx42 and XDx32 series—use the *roIRReceiver* object instead.
:::

NEC codes are expressed in 24 bits:

- Bits 0-7: Button code
- Bits 8-23: Manufacturer code

:::hint{type="info"}
If the manufacturer code is zero, then the code is considered to be intended for the Roku SoundBridge remote control.
:::

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roIRRemotePress* to the attached message port.

## ifIRRemote

### Send(protocol as String, code as Dynamic) As Boolean

Sends the specified code using the IR blaster. The system currently supports two IR transmission protocols: "NEC" and "PHC" (Pronto Hex Code). This method returns `True` if the code was successfully transmitted, but there is no way to determine from BrightScript if the controlled device actually received it.

## Pronto Hex Format 

Raw captures of Pronto Hex commands will likely not work with the inbuilt IR blaster, though they should work with [Iguanaworks](http://iguanaworks.net/) IR transceivers. This is a result of the trailing *off* periods, which are too long to be ecoded properly. Changing the *off* periods to all zeros ("0000") will fix this issue.

The following example sends an "ON" command to a Panasonic television using a single string of Pronto Hex Code. You can also provide Pronto Hex Code as an *roArray* of hex values, which results in less work for the script engine.

```text
ir = CreateObject("roIRRemote")  

pronto_hex_Panasonic_on_str = " 0000 0071 0000 0032 0080 003F 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0010 0030 0010 0030 0010 0030 0010 0030 0010 0030 0010 0010 0010 0010 0010 0010 0010 0030 0010 0030 0010 0030 0010 0030 0010 0030 0010 0010 0010 0030 0010 0000"

ir.Send("PHC", pronto_hex_lg_on_str)
```


[title] roDeviceCustomization
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/System Objects/

This object provides miscellaneous device configuration and customization methods.  

## ifFailureReason

### GetFailureReason() As String

Returns helpful information if one of the *ifDeviceCustomization* methods fail.

## ifDeviceCustomization

### WriteSplashScreen(filename As String) As Boolean

Removes the default splash screen (or a previously set splash screen) and replaces it with the specified image file. The image file must use a [supported image format](docId\:gZcaQrOoR8-ZaRNrEPKN1). This method returns `True` on success and `False` on failure.

### EnumerateExtensions() As Array

Returns an array of the extensions that are installed on a player. You will receive extension information about each listed extension, and this information will include the extension name, size, id and version if defined.

### FactoryReset(confirm As String) As Boolean

Applies a factory reset to the player. This method must be passed the string "confirm" to work; otherwise, it will return `False` and do nothing. If successful, this method will reboot without a return value. The following steps will be carried out during a factory reset:

1. All files are wiped from the `BOOT:` drive (including custom splash screens and autorun scripts).
2. All values are wiped from the registry.
3. The RTC is reset (if the player has an RTC).
4. The `FLASH:` drive is wiped.

### ConfigureAsUsbGadget(roBool gadget)

This method allows the USB OTG (On The Go) port on the AU335 to be dynamically configured to *host* or *gadget* mode. In the *host* role, the USB port follows standard behavior (it allows USB devices to be plugged into it). In the *gadget* role, the player can behave as a USB device (for example, roUsbFilesystem). This method will return false on platforms other than the AU335. 

This script switches to *gadget* role and presents *sd:/test.img* as a filesystem to a connected USB host:

```text
dc=CreateObject("roDeviceCustomization")
dc.ConfigureAsUsbGadget(1)

fs = CreateObject("roUsbFilesystem")
fs.Enable({filename: "SD:test.img"})
```

If `ConfigureAsUsbGadget(1)` isn't called on an AU335, then the USB will only run in *host* mode, regardless of what is connected. 

Note that on all BrightSign players other than AU335, the USB port doesn't need any configuration to work in USB OTG mode. The USB stack switches automatically between *host* and *gadget* depending on what is connected to the port. 

### EncryptStorage(device As String, params As roAssociativeArray) As Boolean

Encrypts the contents of a storage device using an encryption key stored in the private section of the player registry. This prevents other devices from reading the names or contents of files on the storage device (though file metadata will still be readable). The storage device can still be mounted on other devices, which can list, delete, and copy files (even though they cannot read them).

Use the `device` parameter to specify which storage drive to encrypt (see [here](docId\:BczooenmOIfNRbeny6ZKI) for a list of valid drive names). Encryption parameters are passed as an associative array, which can contain the following:

- `method As String`:(Required) The encryption method, which can be one of the following:
  - `"none"`: Encryption is disabled and any encryption keys for the storage device are deleted from the registry. 
  - `"passphrase"`: The storage device is encrypted using an un-obfuscated passphrase.
  - `"obfuscated_passphrase"`: The storage device is encrypted using an obfuscated passphrase. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player. 
  - `"brightsign_key"`: The storage device is encrypted using an encryption key that is common to all BrightSign players, but is not shared with outside parties. 
  - `"generate_key"`: The storage device is encrypted using an encryption key that is generated on-demand using a secure random generator. The private registry of the player contains the only copy of the key; if the value in the registry is erased or becomes corrupted, there will be no way to recover data from that storage device.
    - Note that the private registry does not distinguish between different physical volumes of the same drive. For example, if you encrypt two SD cards, the key for the first SD card will be overwritten when the second SD card is encrypted; in the case of a randomly generated key, the data from the first SD card will be irretrievable.
  - `passphrase As String`: The passphrase for encrypting the storage device. This parameter must be included if the method is specified as `"passphrase"` or `"obfuscated_passphrase"`. 
  - `format As Boolean`: Setting this parameter to `true` will cause the specified storage device to be reformatted–all existing files will be deleted (but are not guaranteed to be securely erased) before the device is encrypted; however, if the device cannot be reformatted, the operation will fail. If this parameter is set to `false`, the storage device will be mounted as if it has been previously encrypted using the supplied key.
    - If the storage device hasn't been previously encrypted, it will be encrypted while leaving any preexisting files unencrypted. If the storage device has been encrypted using a different key, the operation will fail.
    - If the `format` parameter is not specified, the storage device will be mounted as if it has been previously encrypted using the supplied key. If the storage device hasn't been previously encrypted, the operation will fail.


[title] roTimer
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Date and Time Objects/

This object allows the script to trigger events at a specific date/time or during specified intervals. Events are triggered by delivering *roTimerEvent* objects to the specified message port. The JavaScript equivalent is .setTimeout()/.setInterval().

## ifTimer

### SetTime(hour As Integer, minute As Integer, second As Integer, millisecond As Integer) As Void

Sets the time for the event to trigger. In general, if a value is -1, then it is a wildcard and will cause the event to trigger every time the rest of the specification matches. If there are no wildcards, then the timer will trigger only once when the specified time occurs.

:::hint{type="info"}
Periodic timers that fire every second are not supported. The seconds and milliseconds parameters must be zero if there are any wildcards elsewhere.
:::

### SetTime(a As Integer, b As Integer, c As Integer)

### SetDate(year As Integer, month As Integer, day As Integer) As Void

Sets the date for the event to trigger. In general, if a value is -1, then it is a wildcard and will cause the event to trigger every time the rest of the specification matches. If there are no wildcards, then the timer will trigger only once when the specified date/time occurs.

### SetDayOfWeek(day\_of\_week As Integer) As Void

Sets the day of week for the event to trigger. In general, if a value is -1, then it is a wildcard and will cause the event to trigger every time the rest of the specification matches. If there are no wildcards, then the timer will trigger only once when the specified date/time occurs.

:::hint{type="info"}
It is possible, using a combination of SetDate() and SetDayOfWeek() calls, to specify invalid combinations that will never occur. If specifications include any wildcard, then the second and millisecond specifications must be zero; events will be raised at most once per minute near the whole minute.
:::

### SetDateTime(date\_time As roDateTime) As Void

Sets the time when you wish the event to trigger from an *roDateTime* object. It is not possible to set wildcards using this method.

### Start() As Boolean

Starts the timer based on the current values specified using the above functions.

### Stop() As Void

Stops the timer.

### SetElapsed(seconds As Integer, milliseconds As Integer)

Configures a timer to trigger once the specified time period has elapsed. Unlike the absolute timer methods above, changes to the system clock will not affect the period of the SetElapsed() timer.

## ifMessagePort

### SetPort(port As roMessagePort) As Void

Posts messages of type *roTimerEvent* to the attached message port.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifIdentity

### GetIdentity() As Integer

Returns a unique number that can be used to identify when events originate from this object.

:::hint{type="info"}
The *ifIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::

## Examples

This script uses the `SetElapsed()` method to create a timer that triggers every 30 seconds:

```text
Sub Main()
    mp = CreateObject("roMessagePort")
    timer = CreateObject("roTimer")
    timer.SetPort(mp)

    timer.SetElapsed(30, 0)

    print "Start at "; Uptime(0)
    timer.Start()

    while true
       ev = mp.WaitMessage(0)
       if type(ev) = "roTimerEvent" then
           print "Timer event received at "; Uptime(0)
           timer.Start()
       else
           print "Another event arrived: "; type(ev)
       end if
    end while
End Sub
```

This script creates a timer that triggers every minute using wildcards in the timer spec:

```text
st=CreateObject("roSystemTime")
timer=CreateObject("roTimer")
mp=CreateObject("roMessagePort")
timer.SetPort(mp)

timer.SetDate(-1, -1, -1)
timer.SetTime(-1, -1, 0, 0)
timer.Start()

while true
       ev = Wait(0, mp)
       if (type(ev) = "roTimerEvent") then
             print "timer event received"
       else
             print "unexpected event received"
       endif
endwhile
```

This script creates a timer that triggers once at a specific date/time.

```text
timer=CreateObject("roTimer")
mp=CreateObject("roMessagePort")
timer.SetPort(mp)

timer.SetDate(2008, 11, 1)
timer.SetTime(0, 0, 0, 0)

timer.Start()

while true
       ev = Wait(0, mp)
       if (type(ev) = "roTimerEvent") then
             print "timer event received"
       else
             print "unexpected event received"
       endif
endwhile
```


[title] roBtClient
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

Each instance of this object represents a single BLE client. This object is not instantiated by the script; instead, when a BLE client connects to the player, the [roBtClientManager](docId\:j-50zRJY-jTWE5E5SWoO-)  object sends an event to its attached message port and creates a *roBtClient* instance. The JavaScript equivalent is [BSBtManager](docId\:Cf7q7xSA9dRtCq3bTXV-A).

The primary purpose of the *roBtClient* object is to transfer data between the player and the client via user variables (i.e. characteristics). When a client updates user-variables or sends a command, an  [roBtClientEvent](docId\:dR0EfVD1O9JQa1mfa33AW) is sent to the attached message port. The state can be retrieved using either the *roBtClient.GetUserVars()* method or the *roBtClientEvent.GetParam()* method: Updates from the *roBtClientEvent* object are queued until the script processes them, while the *roBtClient* object returns the most current state.

## ifBtClient

### GetClientId() As String

Retrieves the UUID of the client associated with the object instance.

### SetUserVars(data As String) As Boolean

Specifies new data for the client to retrieve.

### GetUserVars() As String

Retrieves the latest data from the *roBtClient* state.

### Disconnect() As Boolean

Forces the player to disconnect from the client.

## ifMessagePort

### SetPort(a As Object)

Posts messages of type *roBtClientEvent* to the attached message port. An event is raised whenever the end of the queue is reached.

## ifUserData

### SetUserData(a As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifIdentity

### GetIdentity() As Integer

Returns a unique number that can be used to identify *roBtClientEvent* objects that originate from this object.

:::hint{type="info"}
The *ifIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::

## ifFailureReason

### GetFailureReason() As String

Returns additional useful information if a method on the *ifBtClient* interface returns False.

[title] roIRRemotePress
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

Messages of the type *roIRRemotePress* are generated upon key presses from a Roku Soundbridge remote.

## ifInt

### GetInt() As Integer

Returns the event ID. 

### SetInt(value As Integer) As Void

Sets the value of the event. 

For the Roku SoundBridge remote control, the Integer returned can have one of the following values:

| **Integer** | **Command** | **Integer** | **Command** |
| ----------- | ----------- | ----------- | ----------- |
| 0           | West        | 8           | Search      |
| 1           | East        | 9           | Play        |
| 2           | North       | 10          | Next        |
| 3           | South       | 11          | Previous    |
| 4           | Select      | 12          | Pause       |
| 5           | Exit        | 13          | Add         |
| 6           | Power       | 14          | Shuffle     |
| 7           | Menu        | 15          | Repeat      |
| 8           | Search      | 16          | Volume up   |
| 9           | Play        | 17          | Volume down |
| 10          | Next        | 18          | Brightness  |


[title] roKeyboardPress
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This is an event object resulting from the user pressing a key on a USB keyboard. The returned integer value is equivalent to the ASCII code of the key that was pressed.

## ifInt

### GetInt() As Integer

Returns the ASCII value of the key press. 

### SetInt(a As Integer)

Sets the value returned by the `GetInt()` method.

The returned *roInt32* can have one of the following values:

| **Letter Keys** | ****     | **# Keys** | **Func. Keys** | **Misc Keys**        | **Special Keys** | **** |    |    |
| --------------- | -------- | ---------- | -------------- | -------------------- | ---------------- | ---- | -- | -- |
| A - 97          | R  - 114 | 0 - 48     | F1 - 32826     | Del  - 127           | "-"              | 45   | :  | 58 |
| B  - 98         | S  - 115 | 1 - 49     | F2 - 32827     | Backspace - 8        | "="              | 61   | "  | 34 |
| C  - 99         | T  - 116 | 2 - 50     | F3 - 32828     | Tab - 9              | \\               | 92   | \< | 60 |
| D  - 100        | U  - 117 | 3 - 51     | F4 - 32829     | Enter - 13           | \`               | 96   | >  | 62 |
| E  - 101        | V  - 118 | 4 - 52     | F5 - 32830     | Print Scrn - 32838   | \[               | 91   | ?  | 63 |
| F  - 102        | W  - 119 | 5 - 53     | F6 - 32831     | Scrl Lock - 32839    | ]                | 93   | !  | 33 |
| G  - 103        | X  - 120 | 6 - 54     | F7 - 32832     | Pause/Brk - 32840    | ;                | 59   | @  | 64 |
| H  - 104        | Y  - 121 | 7 - 55     | F8 - 32833     | INS - 32841          | " ' "            | 39   | #  | 35 |
| I  - 105        | Z  - 122 | 8 - 56     | F9 - 32834     | Home - 32842         | ,                | 44   | $  | 36 |
| J  - 106        |          | 9 - 57     | F11 - 32836    | Page Up - 32843      | .                | 46   | %  | 37 |
| K  - 107        |          |            | F12 - 32837    | Page Down - 32846    | /                | 47   | ^  | 94 |
| L  - 108        |          |            |                | End - 32845          | \_               | 95   | &  | 38 |
| M  - 109        |          |            |                | Caps - 32811         | "+"              | 43   | \* | 42 |
| N  - 110        |          |            |                | Left Arrow - 32848   | \|               | 124  | (  | 40 |
| O  - 111        |          |            |                | Right Arrow  - 32847 | \~               | 126  | )  | 41 |
| P  - 112        |          |            |                | Up Arrow - 32850     | \{               | 123  |    |    |
| Q  - 113        |          |            |                | Down Arrow - 32849   | }                | 125  |    |    |


[title] roNetworkAdvertisement
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object is used to advertise services running on a BrightSign player to other devices on the network. The current implementation supports advertising via mDNS (which is part of [zeroconf](http://en.wikipedia.org/wiki/Zero_configuration_networking) via [Bonjour](http://www.apple.com/support/bonjour/)™).

:::hint{type="success"}
To discover a player advertising on the local network, use the [roNetworkDiscovery](docId\:faxPdpIeevhSmUJn7d-eS) object.
:::

Object creation: The *roNetworkAdvertisement* object is created with an associative array of network parameters and arbitrary text information.

```text
CreateObject("roNetworkAdvertisement", advertisement As roAssociativeArray) As Object
```

The *roAssociativeArray* can contain the following keys:

- `name`: The service name. This should be a readable string such as "Remote BrightSign Widget Service."
- `type`: The service type. This should be a service from the definitive list, formatted in the following manner: "\_service.\_protocol" (for example, "\_http.\_tcp").
- `port`: The port number on which the service runs.
- `_<name>`: An arbitrary text key. The value can be used to provide additional, optional data to clients (serial number, IP address, etc.). The key must be preceded by an underscore to avoid name conflicts within the associative array; the underscore will be removed before the record is registered with mDNS.

Once the object is created, advertising starts immediately and continues until the object is destroyed (i.e. when it becomes unreferenced).

There are no interfaces on the *roNetworkAdvertisement* object.

### Example

```text
mp = CreateObject("roMessagePort")
di = CreateObject("roDeviceInfo")
props = { name: "My Hoopy Service", type: "_http._tcp", port: 8080, _serial: di.GetDeviceUniqueId() }
advert = CreateObject("roNetworkAdvertisement", props)

wait(600000, mp)
advert = invalid ' Stop advertising
```


[title] roTCPServer
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

The JavaScript equivalent is net.socket.

## ifTCPServerInstance

**GetFailureReason() As String**

Yields additional useful information if an *roTCPServer* method fails.

**SetPort(port As Object)**

Sets the message port that will receive events from an roTCPServer instance.

**BindToPort(port As Dynamic) As Boolean**

Prepares to accept incoming TCP connections on the specified port. Passing an integer to this method will specify a standard port number. This method can also accept an associative array to provide more control over the binding. The associative array must contain the `port` but can also contain the `interface` name. This method returns `True` upon success and `False` upon failure.

- `port` <font color="#704ae0">integer</font>: The local port number to bind to.
- `interface` <font color="#704ae0">integer</font><font color="#0C121D"> or </font><font color="#704ae0">string</font>: Either the name of a network interface as a string (such as "eth0" or "wlan0") or the integer associated with the network interface index:
  - -1: Any (this is the default value)
  - 0: Ethernet
  - 1: WiFi
  - 2: Modem
  - 32767: Loopback (i.e. TCP connections can only be established by internal sources)

## ifUserData

**SetUserData(a As Object)&#xA0;**

Supplies an object that will be provided by every event called by an roTCPServer instance.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.


[title] roMediaStreamer
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

The current implementation of this object allows a player to stream *.ts* files over UDP and RTP. For more information, see the [BrightSign Media Server](docId\:B6e8mGH--2yp06LLh1aha) section.

Object Creation: The *roMediaStreamer* object is created with no parameters.

```text
CreateObject("roMediaStreamer") 
```

## ifMediaStreamer

### GetFailureReason() As String

### SetPipeline(pipeline As String) As Boolean

Specifies a streaming pipeline. The source (a file URI) and destination (an IP address) of the stream are specified in the passed stream. This method replaces the SetSource() and SetDestination() methods from firmware version 4.7. To stream media as before, use the filesimple source designation and the udpsimple/rtpsimple destination designations:

### Example

```text
m = CreateObject("roMediaStreamer")
m.SetPipeline("filesimple:///data/clip.ts, udpsimple://239.192.0.0:1234/")
m.Start()
```

### Initialize() As Boolean

Progresses the pipeline into the INITIALIZED state. This allocates some resources for the pipeline, but does not begin a stream.

### Connect() As Boolean

Progresses the pipeline into the CONNECTED state. This allows the script to create a memory stream without starting it.

### Start() As Boolean

Begins streaming.

### Stop() As Boolean

Stops the pipeline stream. Some internal pipeline stages may continue running.

### Disconnect() As Boolean

Regresses the steam back to the CONNECTED state.

### Reset() As Boolean

Resets the pipeline stream. All internal pipeline stages are terminated.

### Inject(a As Integer) As Boolean 

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roMediaStreamerEvent* to the attached message port.

## Source Specifications

The string passed to the *roMediaStreamer.SetPepline()* method can have unique parameters that determine the source type and playback behavior.

- **Looping**: By default, a stream from a media file will not loop when it ends. You can specify a looping parameter at the end of the source string as follows: """filesimple:///data/example.mp4?loop". It is also possible to loop the stream using end-of-stream messages from *roMediaStreamerEvent*. However, the slightly longer restart gap that results from using BrightScript may cause problems with the streaming client. This is especially true if you attempt to set a new media file source upon looping the function.

###


[title] roStreamByteEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

## ifInt

**GetInt() As Integer**

Returns the event ID. 

**SetInt(value As Integer) As Void**

Sets the value of the event. 



## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

 


[title] roDateTime
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Date and Time Objects/

This object is used to represent an instant in time. At the time of its creation, a new object represents zero seconds. The JavaScript equivalent is "Date".

## ifDateTime

### GetDayOfWeek() As Integer

### GetDay() As Integer

### GetMonth() As Integer

### GetYear() As Integer

### GetHour() As Integer

### GetMinute() As Integer

### GetSecond() As Integer

### GetMillisecond() As Integer

### SetDay(day As Integer) As Void

### SetMonth(month As Integer) As Void

### SetYear(year As Integer) As Void

### SetHour(hour As Integer) As Void

### SetMinute(minute As Integer) As Void

### SetSecond(second As Integer) As Void

### SetMillisecond(millisecond As Integer) As Void

### AddSeconds(seconds As Integer) As Void

### SubtractSeconds(seconds As Integer) As Void

### AddMilliseconds(milliseconds As Integer) As Void

### SubtractMilliseconds(milliseconds As Integer) As Void

### Normalize() As Boolean

Checks that all the fields supplied are correct. This function fails if the values are out of bounds.

### ToIsoString() As String

Returns the current *roDateTime* value as an ISO-8601 basic formatted string. Hyphens for date and colons for time are omitted, and a comma is used to separate seconds from milliseconds: For example, the ISO-8601 standard "2014-05-29T12:30:00.100" would be formatted as "20140529T123000,100".

This method returns an empty string if the year is less than 1970 or greater than 2100. Since a new, un-configured *roDateTime* object lies outside the acceptable range, it will also return an empty string.

### FromIsoString(date-time As String) As Boolean

Sets the value of the *roDateTime* object using an ISO-8601 basic formatted string. Hyphens for date and colons for time are omitted, and either a period or comma can be used to separate seconds from milliseconds: The ISO-8601 standard "2014-05-29T12:30:00.100" could, for example, be formatted as either "20140529T123000,100" or "20140529T123000.100". This method will return `false` (indicating that it has not affected changes to the *roDateTime* object) if the string is formatted incorrectly or if the date passed is outside the range of January 1, 1970 and December 31, 2100.

### ToSecondsSinceEpoch() As Integer

Returns the number of seconds that have elapsed since midnight on January 1, 1970, as represented by the *roDateTime* instance (not the system time).

### FromSecondsSinceEpoch(seconds As Integer) As Boolean

Populates the *roDateTime* instance with the specified number of seconds since midnight on January 1, 1970.

### GetString() As String

## ifString

### GetString() As String

Returns the current date using a sortable date format: "YYYY/MM/DD hh\:mm\:ss.sss".

[title] roBtClientEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This event object is generated by an *roBtClient* object when a BLE client updates the *roBtClient* state or sends a command.

## ifBtClientEvent

### GetEvent() As String

Returns the event name, which can currently be `"client-update"` or `"client-command"`

### GetParam() As String

Returns the event data as a string

## ifUserData

### SetUserData(user\_data As Object) As Void

Sets the user data

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` (on either the event or source object). It will return `Invalid` if no data has been set.

[title] roSequenceMatchEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object is generated whenever *roSequenceMatcher* matches a specified byte sequence pattern. 

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned by `GetUserData()`.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

[title] roSerialPort
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object controls the serial port on the player, allowing you to transmit and receive serial data. The JavaScript equivalent is [BSSerialPort](docId\:ZMQun8ZM06AoSriD6EsfB).

:::hint{type="info"}
If the *serial\_with\_telnet* registry key is set to 1, serial communication via roSerialPort in scripts will be highly unreliable. See [this page](docId:8LUJ1vpF-ftLCBISBqBvZ) for more information about *serial\_with\_telnet*.
:::

Object Creation: The *roSerialPort* object is created with two parameters.

```text
CreateObject("roSerialPort", port As Dynamic, baud_rate As Integer)
```

- `port As Integer`: The port enumeration of the serial device:
  - Most standard serial devices (including the USB-serial port on the [LS424](docId\:pfX3ZfrOOwIm0gPElVl68)) enumerate on port 0, though port 1 may be available on the GPIO connector on some models if enabled. See [roControlPort](docId:8ExDHgmoHqig7J-UvfCe1).
  - If more than one USB serial device is attached then the first one will be port 2, the second will be port 3, etc.
  - To communicate with the serial port of an OPS display (i.e. with the HO523), use port 1.
  - To communicate with a USB-serial device (such as a GPS receiver), use port 2.
- `port As String`: If multiple USB-serial devices are connected to the player, the device can be specified with a friendly name (`"USB:<friendly_name>"`). This value corresponds to the `<fid>` value returned by the [roDeviceInfo.GetUSBTopology](docId\:uTKDmpos1ulxaoYLx1nS6) method. The BrightSign shell `usblist` command can be used to discover friendly names. Note that RAW names are not guaranteed to stay the same between products or OS versions, so they are not recommended.
- `baud_rate As Integer`: The baud rate for serial communication. The serial port supports the following baud rates: 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400.

### Example

```text
serial1 = CreateObject("roSerialPort", 0, 115200)
serial2 = CreateObject("roSerialPort", "USB:A/1", 57600) 
```

The *roSerialPort* object sends the following event types:

- *roStreamLineEvent*: The line event is generated whenever the end of line string set using *SetEol* is found and contains a string for the whole line. This object implements the *ifString* and *ifUserData* interfaces.
- *roStreamByteEvent*: The byte event is generated on every byte received. This object implements the *ifInt* and *ifUserData* interfaces.

## ifStreamSend

### SetSendEol(eol\_sequence As String) As Void

Sets the EOL sequence when writing to the stream. The default value is CR (ASCII value 13). If you need to set this value to a non-printing character, use the `chr()` [global function](docId\:nSjXffR7OlFgDWgjFEbMe).

### SendByte(byte As Integer) As Void

Writes the specified byte to the stream.

### SendLine(string As String) As Void

Writes the specified characters to the stream followed by the current EOL sequence.

### SendBlock(a As Dynamic) As Void

Writes the specified characters to the stream. This method can support either a string or an *roByteArray*. If the block is a string, any null bytes will terminate the block.

### Flush()

## ifStreamReceive

### SetLineEventPort(port As Object) As Void

Sets the message port that *roStreamLineEvent* events will be posted to.

### SetByteEventPort(port As Object) As Void

Sets the message port that *roStreamByteEvent* events will be posted to.

### SetByteArrayEventPort(port As Object) As Void

This method works like *SetByteEventPort* but causes *roStreamByteArrayEvent* messages to be posted to the message port when data is received. For some object types (for example, *roTCPStream*), this can be much more efficient since data no longer needs to be delivered to BrightScript a byte at a time, but since serial ports are comparatively slow it's possible that each event will still contain only a single character. 

### SetReceiveEol(eol\_sequence As String)

Sets the sequence that will signify the end of line and cause a *roStreamLineEvent* to be delivered to the message port set by *SetLineEventPort*. If you need to set this value to a non-printing character, use the `chr()` [global function](docId\:nSjXffR7OlFgDWgjFEbMe) or an *roByteArray*. If the sequence contains NUL bytes it must be passed as an *roByteArray* since strings may not contain NUL bytes.

To use a NUL byte as a line terminator:

```text
eol = CreateObject("roByteArray")
eol.Push(0)
mp = CreateObject("roMessagePort")
client = CreateObject("roSerialPort", 0, 115200)
client.SetReceiveEol(eol)
client.SetLineEventPort(mp)
```

### SetMatcher(matcher As Object) As Boolean

Instructs the stream to use the specified matcher. This method returns `True` if successful. Pass `Invalid` to this method to stop using the specified matcher.

## ifSerialControl

### SetBaudRate(baud\_rate As Integer) As Boolean

Sets the baud rate of the device. The supported baud rates are as follows: 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400.

### SetMode(mode As String) As Boolean

Sets the serial mode in "8N1" syntax. The first character is the number of data bits. It can be either 5, 6, 7, or 8. The second number is the parity. It can be "N"one, "O"dd, or "E"ven. The third is the number of stop bits. It can be 1 or 2.

### SetEcho(enable As Boolean) As Boolean

Enables or disables serial echo. It returns `True` on success and `False` on failure.

### SetEol(a As String)

### SetFlowControl(enable As Boolean) As Boolean

Enables or disable RTS/CTS handshaking over the serial port. This feature is currently only available on 4Kx42, XDx32, and HDx22 models.

### SetInverted(inverted As Boolean) As Boolean

Inverts the TX/RX signal levels on the serial port. This allows the player to communicate with devices that use -12V to 12V signaling. Inversion is supported on the DE-9 (more commonly referred to as DB-9) and USB ports only. Passing True to the method enables inversion, whereas passing False disables it.

### SendBreak(duration\_in\_ms As Integer) as Boolean

Sends a serial break or sets the serial break condition. This method returns `True` upon success and `False` upon failure.

- `duration_in_ms = -1`: Sends a continuous break.
- `duration_in_ms = 0`: Clears the break state.
- `duration_in_ms >= 100`: Sets the break condition for the specified period of milliseconds (note that this integer is only accurate to the tenth of a second).

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## Example

This example script waits for a serial event and echoes the input received on the serial port to the shell:

```text
serial = CreateObject("roSerialPort", 0, 9600)
p = CreateObject("roMessagePort")
serial.SetLineEventPort(p)

serial_only:
msg = Wait(0,p) ' Wait forever for a message.
if(type(msg) <> "roStreamLineEvent") goto serial_only 'Accept serial messages only.
serial.SendLine(msg) ' Echo the message back to serial.
```


[title] roNetworkDiscovery
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object allows for zeroconf discovery of devices on the local network (including other BrightSign players) using mDNS. Other BrightSign players must be running an instance of [roNetworkAdvertisement](docId\:yQWTvcJm15Y4G2jNw5d5y) to be discovered using the *roNetworkDiscovery* object. 

Object Creation: The *roNetworkDiscovery* object is created with no parameters.

```text
CreateObject("roNetworkDiscovery") 
```

## ifNetworkDiscovery

### Search(parameters As roAssociativeArray) As Boolean

Searches for BrightSign players on the local network. A player will only respond to the search if it is currently running an instance of *roNetworkAdvertisement*. Search results will be posted to the attached message port. Search parameters are passed to this method as an associative array containing the following values:

- `type`: The service type. If this entry is omitted, the search will default to "\_http.\_tcp".
- `protocol`: The IP protocol. Acceptable values are "IPv4" and "IPv6". You can also omit this entry if you wish to search for players using either protocol. 

## ifMessagePort

### SetPort(port As roMessagePort)

Posts events to the attached message port. See the Event Types section below for more details.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## Event Types

The *roNetworkDiscovery* object can post three event object types to the attached message port:

- *roNetworkDiscoveryResolvedEvent*: Raised when a host is fully resolved.
- *roNetworkDiscoveryCompletedEvent*: Raised when the search is complete.
- *roNetworkDiscoveryGeneralEvent*: Raised for events other than the above two. This event rarely occurs.

All three event objects offer the `SetUserData()`, `GetUserData()`, and `GetData()` methods. Use `GetData()` to retrieve an associative array of results. For the *roNetworkDiscoveryResolvedEvent* object, calling `GetData()` will return the following entries:

- `protocol`: The network protocol family that was used for discovery, either "IPv4" or "IPv6".  Note that this is not necessarily the address family for the returned address; it is possible for IPv6 addresses to be advertised over an IPv4 transport, or vice versa.
- `host_name`: The hostname of the player
- `name`: The service name
- `txt`: An associative array containing arbitrary text entries specified during instantiation of the *roNetworkAdvertisement* instance.
- `domain`: The domain of the player
- `type`: The service type
- `address`: The IPv4 or IPv6 address

The following script searches for a player running an *roNetworkAdvertisement* instance and prints the results of the discovery.

```text
rn = CreateObject("roNetworkDiscovery")
mp = CreateObject("roMessagePort")
rn.SetPort(mp)
params = {}
rn.Search(params)
 
complete = false
while not complete
    ev = mp.WaitMessage(10000)
    if ev = invalid then
        stop
    end if

    if type(ev) = "roNetworkDiscoveryCompletedEvent" then
        print "roNetworkDiscoveryCompletedEvent"
    end if

    if type(ev) = "roNetworkDiscoveryGeneralEvent" then
        print "roNetworkDiscoveryGeneralEvent"
    end if

    if type(ev) = "roNetworkDiscoveryResolvedEvent" then
        complete = true
        data = ev.GetData()
        print "DATA:"; data
        print "DONE"
        textdata = data[ "txt" ]
        if textdata <> invalid then
            print "TEXT: "; textdata
        endif
    end if

end while
```


[title] roNetworkConfiguration
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object provides various methods for configuring the network interfaces on a BrightSign player. The JavaScript equivalent is [networkconfiguration](docId:6MS7rdjWWhP21clMeDRwv) (see [BrightScript-JavaScript Migration Guide](docId:2KEwWxLmpYcwu8tffuf2Z) for the method equivalents).

Object Creation: The *roNetworkConfiguration* object is created with a single parameter.

```text
CreateObject("roNetworkConfiguration", network_interface as Dynamic)
```

The `network_interface` parameter can be any of the following: 

- `0` or `"eth0"`: The Ethernet port on the BrightSign player
- `"eth1"`: The “control” Ethernet port on players that have one. Note that the port is not enabled by default and must be explicitly enabled (which can be done from the BrightSign shell prompt, JavaScript or BrightScript).
- `1` or `"wlan0"`: The internal WiFi
- `2` or `"ppp0"`: A connected modem
- `"usb0"`, `"usb1"`, etc: USB ethernet interfaces

If the `network_interface` is specified as an integer, the interface must currently exist on the player; otherwise, the object-creation function will return `Invalid`. Conversely, specifying the `network_interface` as a string allows you to create a *roNetworkConfiguration* instance for an interface that is not currently present on the player.

The network interface can be configured as a VLAN using the following string format: `"[parent_interface].[vlan_id]"` (e.g `"eth0.42"`). Once the VLAN interface(s) are configured, they must be enabled on the parent network interface (e.g. "eth0") using the `SetVlanIds()` method. VLAN interfaces use DHCP by default. They are supported on Series 4 (XTx44, XDx34, HDx24, LS424) and Series 3 (XTx43, XDx33, HDx23, LS423, HO523) players only. Also see [Default Routing Metrics](docId:0jDtAGrV4AlBWLYFJNj45).

**Example:**

```text
 n6 = CreateObject("roNetworkConfiguration", "eth0.6")
```

Some of the settings below are specific to the network interface, while others are used by the BrightSign host for all network interfaces.

## ifNetworkConfiguration <font color="#0C121D">(Network Interface Settings)</font>

<font color="#0C121D">These settings apply to the interface passed to </font>`CreateObject()`.

### Apply() As Boolean

Applies the requested changes to the network interface. This method returns `false` if the changes could not be applied to the network interface, though changes made using "Set" and "Reset" methods will be preserved through future reboots even if `Apply()` fails. Configuration may take several seconds to complete.

:::hint{type="info"}
"Set" and "Reset" methods do not take effect until `Apply()` is called.
:::

### SetClientIdentifier(a As String) As Boolean

Sets the DHCP client identifier. 

### GetClientIdentifier() As String

Returns the DHCP client identifier.

### SetInboundShaperRate(rate As Integer) As Boolean

Sets the bandwidth limit for inbound traffic in bits per second, and affects all traffic on the network interface. For the default bandwidth limit, pass -1 to the method; for no bandwidth limit, pass 0 (though these two settings are functionally the same). You will need to call `Apply()` for this setting to take effect, and changing this setting at any time will cause the network interface to be taken down and reinitialized.

### SetMTU(mtu As Integer) As Boolean

Sets the maximum transmission unit (MTU) for the network interface in bytes. Currently, the MTU setting is not returned when the `GetCurrentConfig()` method is called.

### SetRoutingMetric(a As Integer) As Boolean 

Configures the metric for the default gateway on the current network interface. Routes with lower metrics are preferred over routes with higher metrics. This function returns `true` upon success.

### SetDHCP() As Boolean (interface)

Enables DHCP and disables all other settings. This function returns `true` if successful.

### SetEnabledProtocols(protocols as roArray) As Boolean

Enables or disables IPv4/IPv6 support on a network interface. By default, both protocol versions are supported, and the local-network configuration determines which version the interface uses. This method allows you to restrict support to one IP version.

The array passed to this method can have the following string values: "IPv4" or "IPv6". If the array contains both values, both protocols are supported; if it contains neither, the network interface will come up but not provide connectivity.

This method returns `true` on success and `false` on failure; use the `GetFailureReason()` method to return more information in case of failure.

**Example**

```text
 ' Disable IPv6 and leave IPv4 enabled
 n1=CreateObject("roNetworkConfiguration", 1)
 print n1.SetEnabledProtocols(["IPv4"])
 print n1.Apply()
```

### GetEnabledProtocols() As roArray

Returns enabled IP versions on the interface. The array can contain the "IPv4" and "IPv6" string values.

### SetIP4Address(ip As String) As Boolean (interface)

### SetIP4Netmask(netmask As String) As Boolean (interface)

### SetIP4Broadcast(broadcast As String) As Boolean (interface)

### SetIP4Gateway(gateway As String) As Boolean (interface)

Sets the IPv4 interface configuration. All values must be specified explicitly. Unlike the `ifconfig` shell command, there is no automatic inference. The parameter is a string dotted decimal quad (i.e. "192.168.1.2" or similar). It returns `true` upon success.

**Example**

```text
nc = CreateObject("roNetworkConfiguration",0) 
nc.SetIP4Address("192.168.1.42")
nc.SetIP4Netmask("255.255.255.0")
nc.SetIP4Broadcast("192.168.1.255")
nc.SetIP4Gateway("192.168.1.1")
```

### SetVlanIds(vlan\_ids As roArray) As Boolean

Enables the specified VLAN IDs (and only those IDs) on the network interface (the VLAN interfaces must be configured first). This method accepts an array of integers. 

The physical interface (`eth0` in the example) is disabled by default when VLANs are enabled. To use both the physical interface (that is, without VLAN tags) and VLANs, users should specify a VLAN ID of zero in the array when calling `SetVlanIds`.

**Example**

```text
' Configure the VLANs first. Use defaults for VLAN6.
n6=CreateObject("roNetworkConfiguration", "eth0.6")
print n6.ResetInterfaceSettings()
print n6.Apply()

' Use defaults for VLAN11.
n11=CreateObject("roNetworkConfiguration", "eth0.11")
print n11.ResetInterfaceSettings()
print n11.Apply()

' Use static IP for VLAN15.
n15=CreateObject("roNetworkConfiguration", "eth0.15")
print n15.SetIP4Address("192.168.15.100")
print n15.SetIP4Netmask("255.255.255.0")
print n15.Apply()

' Now enable VLANs 6, 11 and 15 on eth0.
n0=CreateObject("roNetworkConfiguration", "eth0")
print n0.SetVlanIds([6, 11, 15])
print n0.Apply()
```

:::hint{type="info"}
VLAN configuration is persistent, even when VLAN is not enabled. If you use the `SetVlanIds()` method to remove and then add VLAN IDs, they will return with the previous configuration by default. You can use the `ResetInterfaceSettings()` method to remove any previous configuration.
:::

### SetWiFiESSID(essid as String) As Boolean

Configures the WiFi ESSID of the wireless network that the player will connect to. This method returns `true` on success.

### GetWiFiESSID() As String

Retrieves the configured WiFi ESSID, even if the player is not currently connected to that wireless network. Use the `GetCurrentConfig().wifi_essid` value to retrieve the ESSID of the wireless network that the player is currently connected to.

### SetWiFiPassphrase(passphrase as String) As Boolean

Configures the passphrase or key for the wireless network. This method accepts a plain-text passphrase. It returns `true` if the passphrase is successfully set.

### SetWiFiPassphraseAndObfuscate(a As String) As String

Configures the passphrase or key for the wireless network. This method accepts a plain-text passphrase and returns the obfuscated result. If the passphrase is not set, an empty string is returned instead.

### SetObfuscatedWiFiPassphrase(password As String) As Boolean

Configures the passphrase or key for the wireless network. This method accepts a passphrase that has been obfuscated using a shared secret. It returns `true` if the password is successfully set.

:::hint{type="info"}
Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.
:::

### SetWiFiFrequencies(frequencies As String) As Boolean

Sets valid WiFi frequencies to specified range. Supports 2GHz, 5GHz, or list of frequencies written in MHz("2412 2417"). It returns `true` if the frequency is successfully set.

### SetWiFiAccessPointMode(enable as Boolean) As Boolean

Enables or disables WiFi access-point mode: Passing `true` to this method instructs the player to act as a wireless access point, which uses the ESSID and passphrase set with the `SetWiFiESSID()` and `SetWiFiPassphrase()` (or `SetObfuscatedWiFiPassphrase()`) methods. If a passphrase has been set, the wireless access point will use WPA2 authentication–otherwise, it will use no authentication. This method returns `true` on success and `false` on failure; use the `GetFailureReason()` method to return more information in case of failure.

WiFi access-point mode should be used for configuration only. It offers a minimal DHCP server, but does not provide DNS servers or routing to the Ethernet. We recommend assigning a static IP address to the wireless interface, though this is not enforced by the firmware.

### SetWiFiAccessPointHidden(BOOL hidden)

If hidden is true, the SSID is hidden, if false then it is visible. The default is non-hidden, which was the previous behavior.

:::hint{type="info"}
WiFi access-point mode is not available on Series 2 (4Kx42, XDx32, HDx22) or earlier models.
:::

### SetWiFiAccessPointFrequencyMHz(frequency As Integer) As Boolean

Sets the [frequency](https://en.wikipedia.org/wiki/List_of_WLAN_channels) of the wireless access point (in MHz). This method returns `true` on success and `false` on failure; use the `GetFailureReason()` method to return more information in case of failure.

:::hint{type="info"}
The following `SetWifi*` methods are used to configure WPA Enterprise with EAP-TLS.
:::

### SetWiFiIdentity(identity As String) As Boolean

Sets the RADIUS identity. In EAP-TLS mode, the identity will be taken from the client certificate if this method is not called ("subjectAltName" will be used if present; otherwise, the "commonName" is used). In EAP-PEAP/MSCHAP mode, this method must be called to set the identity.

### SetWiFiEapTlsOptions(options As String) As Boolean

Sets EAP-specific options. Currently, this method can be used to enable or disable MD5 support ("md5=enable" or "md5=disable") and to set an anonymous identity for EAP-PEAP/MSCHAP configurations ("anonymous\_identity=anon\@brightsign.biz"). Multiple parameters can be set with a space-separated list. To clear previous settings, pass an empty string to this method.

### SetWiFiCACertificates(certificates As Dynamic) As Boolean

Sets the CA certificate file for EAP-TLS (certificates can also be sent from an EAP peer). The certificate data can be specified as an *roByteArray* of Base64 data (for *.cer*, *.pfx*, or *.p12* file formats) or an *roString* (for the *.pem* file format ). The supported binary formats are ASN.1 DER (for seperate certificates and keys) and PKCS#12 (for a single file that may contain both certificates and keys). The supported text format is PEM. 

### SetWiFiClientCertificate(certificate As Dynamic) As Boolean

Sets the client certificate for EAP-TLS. The certificate data can be specified as an *roByteArray* of Base64 data or an *roString*.

### SetWiFiPrivateKey(key As Dynamic) As Boolean

Sets the private key for authentication. The certificate data can be specified as an *roByteArray* of Base64 data or an *roString.* If the private key is password protected, use the `SetWiFiPassphrase()` method to set the password.

:::hint{type="info"}
If the client certificate and associated private key are in the same PKCS#12 file, the file contents should be specified using the `SetWiFiPrivateKey()` method and the `SetWiFiClientCertificate()` value should be left empty.
:::

### SetWiFiSecurityMode(mode As String) As Boolean

Sets the WiFi encryption method. By default, both WPA (TKIP) and WPA2 (CCMP) encryption are permitted. This method accepts a space-separated, case-insensitive list that can include either "tkip" or "ccmp" values. Passing an empty string sets the default mode. If both CCMP and TKIP are allowed, CCMP always has priority.

### ConfigureDHCPServer(config As roAssociativeArray) As Boolean

Configures a DHCP server on the Ethernet port or wireless access point. This method accepts an associative array with the following parameters:

- `ip4_start` <font color="#6B21A8">string</font> <font color="#14B8A6">required</font>: The beginning of the range of offered IP addresses
- `ip4_end` <font color="#6B21A8">string</font> <font color="#14B8A6">required</font>: The end of the range of offered IP addresses
- `name_servers` <font color="#6B21A8">roArray</font>: An array of strings containing the IPv4 addresses of name servers (IPv6 addresses are not currently supported)
- `domain` <font color="#6B21A8">string</font>: The domain suffix to be used by clients
- `ip4_gateway` <font color="#6B21A8">string</font>: The IPv4 address of the gateway to be used by clients

To disable the DHCP server, pass an empty associative array (`{}`) to this method. This method returns `true` on success and `false` on failure; use the `GetFailureReason()` method to return information in case of failure.

:::hint{type="success"}
DHCP lease information can be viewed by accessing either of the following IP addresses using a web browser on the local network: `http://<brightsign-ip>/dhcp-server.html` or `http://<brightsign-ip>/dhcp-server.txt`
:::

### SetDomain(domain As String) As Boolean (host)

Sets the device domain name. This will be appended to names to fully qualify them, though it is not necessary to call this. This method returns `true` on success.

**Example**

```text
nc.SetDomain("brightsign.biz")
```

### SetDNSServers(servers As roArray) As Boolean (host)

Sets the list of DNS servers if there were no DNS servers when the object was created. This method accepts an array of strings, each containing the dotted-quad IP address of a DNS server, and it returns `true` on success. There is currently a maximum of three servers; the method will return `false` if you attempt to add more than three servers.

:::hint{type="success"}
To clear the list of DNS servers, call `SetDNSServers([])`.
:::

### AddDNSServer(server As String) As Boolean (host)

Adds another DNS server to the list if there were no DNS servers when the object was created. This method accepts the dotted-quad IP address of a DNS server as a string, and it returns `true` on success. There is currently a maximum of three servers; the method will return `false` if you attempt to add more than three servers. 

### EnableLEDs(enable As Boolean) As Boolean

Enables or disables the Ethernet activity LED (i.e. flashing during link and activity behavior). The Ethernet LED is enabled by default. Changes to this setting do not persist across reboots. This method returns `true` upon success and `false` upon failure. Note that this method is not available on HDx10, HDx20, and LSx22 models.

### ResetInterfaceSettings() As Boolean

Clears all interface-specific settings (e.g. IP address, default gateway). This method is ideal for resetting an interface to a known, empty state before configuring specific settings.

### GetFailureReason() As String

Returns additional information when a member function returns `false`.

### TestInterface() As Object

Performs various tests on the network interface to determine whether it appears to be working correctly. It reports the results via an associative array containing the following members:

| **Value** | **Type**             | **Description**                                                                                        |
| --------- | -------------------- | ------------------------------------------------------------------------------------------------------ |
| ok        | Boolean              | This value is `true` if the tests find no problems, or `false` if at least one problem was identified. |
| diagnosis | String               | A single-line diagnosis of the first problem identified in the network interface.                      |
| log       | *roArray* of strings | A complete log of all the tests performed and their results.                                           |

### SetDialupInitString(cmds As String) As Boolean

Specify the initialisation string, if any, required to configure the installed cellular modem for data operation. Typically this would be of the form `AT+CGDCONT=1,"IP","myapn"` where `myapn` is the APN string specified by the network operator.  Consult your modem vendor and network operator for further guidance.

### SetDialupNumber(number As String) As Boolean

Specify the telephone number that must be “dialled” to establish a data connection over the cellular interface, typically `*99#`. Consult your modem vendor for further guidance.

### SetDialupUser(user As String) As Boolean

### SetDialupPassword(password As String) As Boolean

Specify the PAP/CHAP credentials, if any, required to establish a cellular data connection.  In most cases these are not needed. Consult your network operator for guidance.

## <font color="#0C121D">ifNetworkConfiguration (Host Settings)</font>

<font color="#0C121D">These settings are applied globally no matter which interface was passed to </font>`CreateObject()`.

### SetupDWS(settings As roAssociativeArray) As Boolean

Configures the Diagnostic Web Server (DWS). This method returns `true` if a restart is required for the changes to take effect. It will return `false` if a restart is not required or if the method failed–the `GetFailureReason()` method returns a non-empty string in event of failure.

<font color="#303030">The Local DWS (LDWS) is disabled by default in BOS 9.0.218 on the 9.0 branch, and in BOS 9.1.75 on the 9.1 branch. </font><font color="#303030">To enable the LDWS, see . On previous BOS versions, the LDWS is enabled by default</font> on port 80, with the player serial number as password. Settings for the LD<font color="#303030">WS are specified in an associative array. These properties are written to the registry and persist after reboot:</font>

- `port`: The port number of the LDWS, located at the IP address of the player. Setting this value to 0 will disable the LDWS, while setting it to "default" will make the LDWS accessible on the default port (80). 
- `password`: An obfuscated password for the LDWS. This method uses digest access authentication. Specifying this parameter without setting a `port` number will make the LDWS accessible on the default port.
- `open`: An unobfuscated password for the LDWS. This method uses digest access authentication. The default port is 80.  Specifying this parameter without setting a `port` number will make the LDWS accessible on the default port. Specifying this parameter in the associative array with an empty string is equivalent to enabling the LDWS without password protection.
- `basic`: A flag indicating whether basic authentication should be used or not. Setting this parameter to `true` allows the password set with the `open` parameter to be validated using basic authentication, rather than digest access authentication. This option allows for backwards compatibility with older platforms; most, if not all, modern browsers require basic authentication to be disabled in order to communicate with the LDWS.

The user name is "admin" for all authentication configurations.

### GetRecoveryUrl() As String

Returns the current recovery URL, which is stored in the "ru" entry of the "networking" [registry section](docId\:FfM73tjd_BThW4-P-0JVG). If the recovery URL is set via DHCP Option 43, it will take precedence over the "ru" registry entry.

### FlushDNSCache()

Flushes the player's DNS cache. This method is available in BrightSign OS 8.3.32 and later releases. Note that certain objects (such as roUrlTransfer) may continue to use the old results for a short period of time after the OS 8.3.32 release.

To use this method:

```text
nc = CreateObject("roNetworkConfiguration", 0)
if not nc.FlushDNSCache() then
  print "Flush DNS cache failed: "; nc.GetFailureReason()
end if
```

### ResetHostSettings() As Boolean

Clears all host settings (i.e. settings that don't take the interface number into account and that don't affect the specified network interface; e.g. the time server). 

### SetLoginPassword(password As String) As Boolean

Specifies a login password for the SSH connection (if SSH has been enabled in the registry). This method accepts a plain-text password.

:::hint{type="info"}
When a recent SSH client attempts to connect to the SSHD on a BrightSign player, the connection must specify the host key algorithms to try, otherwise the player will not find a compatible algorithm.
“ssh -o HostKeyAlgorithms=ssh-rsa,ssh-dss  brightsign\@172.22.200.74” offers a list of possible host keys.
:::

### SetObfuscatedLoginPassword(password As String) As Boolean

Specifies a login password for the SSH connection (if SSH has been enabled in the registry). This method accepts a password that has been obfuscated using a shared secret.

:::hint{type="info"}
Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.
:::

### SetForwardingPolicy(parameters As roAssociativeArray) As Boolean

Configures the host-wide forwarding policy (this method applies to all network interfaces, no matter which *roNetworkConfiguration* instance it is called on). The return value is `true` on success or `false` on failure. This method accepts an associative array with the following parameters: 

- `forwarding_enabled` <font color="#6B21A8">boolean</font>: (Required) A flag that enables or disables IP forwarding. `Forwarding_enabled` must be specified as either `true` or `false`. If `forwarding_enabled` is `false`, no IP forwarding takes place. This is the default and matches previous behavior.  
- `nat_enabled` <font color="#6B21A8">boolean</font>: (Required) A flag that enables or disables address translation with IP forwarding. If `forwarding_enabled` is `true`, `nat_enabled` must be specified as `true` or `false`. 
  - If `forwarding_enabled` is `true` and `nat_enabled` is `false`, IP datagrams are forwarded between all interfaces and no address translation is done. 
  - If `forwarding_enabled` is `true` and `nat_enabled` is `true`, IP datagrams are forwarded between all interfaces but SNAT is applied to any datagrams which are sent out of an "upstream" interface. For this purpose, an "upstream" interface is any one on which a default route is set. Note that there can be more than one such interface. Datagrams which are destined for an interface that has no default route are forwarded without NAT. 
- Note that the forwarding policy is a host-wide setting and it makes no difference which interface was selected when the *roNetworkConfiguration* object was created. 

### SetTimeServer(time\_server As String) As Boolean (host)

Sets the default time server, which is "time.brightsignnetwork.com". You can disable the use of NTP by calling `SetTimeServer("")`. You can use URL syntax to specify that the player use an HTTP or HTTPS server to synchronize the clock. The following are valid time server addresses:

- http\://time.brightsignnetwork.com/
- https\://time.brightsignnetwork.com/
- ntp\://time.brightsignnetwork.com/
- time.brightsignnetwork.com

:::hint{type="info"}
The last two addresses are equivalent.
:::

### GetTimeServer() As String

Retrieves the (host) time server currently in use.

### SetTimeServerIntervalSeconds(interval\_in\_seconds As Integer) As Boolean

Specifies how often the player should communicate with the time server and adjust its clock. The default interval is 12 hours; passing a value of 0 specifies the default interval. The minimum interval allowed is 120 seconds.

### GetTimeServerIntervalSeconds() As Integer

Returns the current interval for time-server renewal (in seconds).

### SetHostName(name as String) As Boolean (host)

Sets the device host name. If no host name has been explicitly set, then a host name is automatically generated based on the device serial number. Passing an empty string to this method resets the device host name to its automatically generated value.

### GetHostName() As String (host)

Retrieves the host name currently in use.

### SetProxy(proxy as String) As Boolean (host)

Sets the name or address of the proxy server used for HTTP, HTTPS, and FTP requests. The proxy string should be formatted as "http\://user\:password\@hostname\:port". The hostname can contain up to four "\*" characters; each "\*" character can be used to replace one octet from the current IP address. For example, if the IP address is currently 192.168.1.2, and the proxy is set to "proxy-\*-\*", then the player will attempt to use a proxy named "proxy-192.168".

The following characters must be percent-encoded for the user name and password:

|     |     |
| --- | --- |
| SPC | %20 |
| "   | %22 |
| #   | %23 |
| %   | %25 |
| /   | %2F |
| \<  | %3C |
| >   | %3E |
| ?   | %3F |
| @   | %40 |
| \[  | %5B |
| \\  | %5C |
| ]   | %5D |
| ^   | %5E |
| \`  | %60 |
| \{  | %7B |
| \|  | %7C |
| }   | %7D |

### GetProxy() As String (host)

Returns the name or address of the proxy server.

### SetProxyBypass(hostnames As Array) As Boolean

Exempts the specified hosts from the proxy setting. The passed array should consist of one or more hostnames. The player will attempt to reach the specified hosts directly rather than using the proxy that has been specified with the `SetProxy()` method. For example, the hostname "http\://example.com " would exempt "http\://example.com ", "http\://example.com:80 ", and "http\://www\.example.com " from the proxy setting.

### GetProxyBypass() As roArray

Returns an array of hostnames that have been exempted from the proxy setting using the `SetProxyBypass()` method.

### TestInternetConnectivity() As Object

Performs various tests on the Internet connection (via any available network interface, not necessarily the one specified when the *roNetworkConfiguration* object was created) to determine whether it appears to be working correctly. It reports the results via an associative array containing the following members:

| **Value** | **Type**             | **Description**                                                                                        |
| --------- | -------------------- | ------------------------------------------------------------------------------------------------------ |
| ok        | Boolean              | This value is `true` if the tests find no problems, or `false` if at least one problem was identified. |
| diagnosis | String               | A single line diagnosis of the first problem identified with the Internet connection.                  |
| log       | *roArray* of strings | A complete log of all the tests performed and their results.                                           |

### <font color="#0C121D">GetSshAuthorizedKeys() as Object </font>

<font color="#0C121D">Available as of BOS 10.0.11, this r</font><font color="#0C121D">eturns a roArray of strings with one authorized public key line string.</font> <font color="#0C121D">See</font> [Public Key Format](docId:-GP4o6Du0GIAJTyC8_hl2).

### <font color="#0C121D">SetSshAuthorizedKeys(keys as Object) as Boolean </font>

<font color="#0C121D">Available as of BOS 10.0.11, this </font><font color="#0C121D">a</font><font color="#0C121D">ccepts an an enumerable container (usually a roArray) of strings containing the complete set of authorized public keys to trust. Returns `true` if successful or `false` on failure. If `false` is returned then calling `GetFailureReason()` will provide more information. The new set of public keys will take effect immediately once `Apply()` is called. </font><font color="#0C121D">See</font> [Public Key Format](docId:-GP4o6Du0GIAJTyC8_hl2).

### ResetSshHostKeys() as Boolean

Erases all the SSH server host keys. If the method returns `True` then a reboot is required for the server to start using the new keys. If the method returns `False` then call `GetFailureReason()`. If that returns an empty string then the call was successful and no reboot is required for the new keys to take effect. If `GetFailureReason()` returns a non-empty string then the call failed.

## <font color="#0C121D">ifNetworkConfiguration</font> <font color="#0C121D">(Network Interface &amp; Host Settings)</font>

### GetCurrentConfig() As Object

Retrieves the entire current configuration as an associative array containing the following members:

| **Value**         | **Type**             | **Host/Interface** | **Description**                                                                                                                                                                                        |
| ----------------- | -------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| metric            | Integer              | Interface          | Returns the current routing metric for the interface. See the `SetRoutingMetric()` entry for more details.                                                                                             |
| dhcp              | Boolean              | Interface          | Returns `true` if the system is currently configured to use DHCP. Returns `false` otherwise.                                                                                                           |
| hostname          | String               | Host               | The currently configured host name                                                                                                                                                                     |
| mdns\_hostname    | String               | Host               | The Zeroconf host name currently in use. This may be longer than the host name if there is a collision on the current network.                                                                         |
| ethernet\_mac     | String               | Interface          | The Ethernet MAC address                                                                                                                                                                               |
| ip4\_address      | String               | Interface          | The current IPv4 address. If none is currently set, the string will be empty.                                                                                                                          |
| ip4\_netmask      | String               | Interface          | The current IPv4 network mask. If none is currently set, the string will be empty.                                                                                                                     |
| ip4\_broadcast    | String               | Interface          | The current IPv4 broadcast address. If none is currently set, the string will be empty.                                                                                                                |
| ip4\_gateway      | String               | Interface          | The current IPv4 gateway address. If none is currently set, the string will be empty.                                                                                                                  |
| domain            | String               | Host               | A whitespace-separated list of domains that will be appended to unqualified names when resolving them                                                                                                  |
| domains           | *roArray* of Strings | Host               | The domains that will be appended to uniqualified names when resolving name                                                                                                                            |
| dns\_servers      | *roArray* of Strings | Host               | The currently active DNS servers                                                                                                                                                                       |
| time\_server      | String               | Host               | The current time server                                                                                                                                                                                |
| configured\_proxy | String               | Host               | The currently configured proxy. This may contain magic characters as explained under `SetProxy()` above.                                                                                               |
| current\_proxy    | String               | Host               | The currently active proxy. Any magic characters will have been replaced as explained under `SetProxy()` above.                                                                                        |
| shape\_inbound    | Integer              | Interface          | The current bandwidth shaping for inbound traffic determined by the `SetInboundShaperRate()` method.                                                                                                   |
| type              | String               | Interface          | Either "wired" or "wifi"                                                                                                                                                                               |
| link              | Boolean              | Interface          | Indicates whether the network interface is currently connected.                                                                                                                                        |
| wifi\_essid       | String               | Interface          | The name of the current Wi-Fi network (if any)                                                                                                                                                         |
| wifi\_signal      | Integer              | Interface          | An indication of the received signal strength. The absolute value of this field is usually not meaningful, but it can be compared with the reported value on other networks or in different locations. |

### GetNeighborInformation() As roAssociativeArray

Retrieves location information from the network infrastructure using the LLDP-MED protocol. The information is returned as an associative array of strings corresponding to civic-address types, which are defined as follows according to the LLDP-MED specification: 

| **CAtype** | **Label** | **Description**                                             |
| ---------- | --------- | ----------------------------------------------------------- |
| 1          | A1        | national subdivisions (state, region, province, prefecture) |
| 2          | A2        | county, parish, gun(JP), district(IN)                       |
| 3          | A3        | city, township, shi(JP)                                     |
| 4          | A4        | city division, borough, city district, ward, chou(JP)       |
| 5          | A5        | neighborhood, block                                         |
| 6          | A6        | street                                                      |

| **CAtype** | **NENA** | **PIDF** | **Description**                      | **Examples**        |
| ---------- | -------- | -------- | ------------------------------------ | ------------------- |
| 0          |          |          | language                             | i-default \[3]      |
| 16         | PRD      | PRD      | leading street direction             | N                   |
| 17         | POD      | POD      | trailing street suffix               | SW                  |
| 18         | STS      | STS      | street suffix                        | Ave, Platz          |
| 19         | HNO      | HNO      | house number                         | 123                 |
| 20         | HNS      | HNS      | house number suffix                  | A, 1/2              |
| 21         | LMK      | LMK      | landmark or vanity address           | Columbia University |
| 22         | LOC      | LOC      | additional location information      | South Wing          |
| 23         | NAM      | NAM      | name (residence and office occupant) | Joe's Barbershop    |
| 24         | ZIP      | PC       | postal/ZIP code                      | 10027-1234          |
| 25         |          |          | building (structure)                 | Low Library         |
| 26         |          |          | unit (apartment, suite)              | Apt 42              |
| 27         |          | FLR      | floor                                | 4                   |
| 28         |          |          | room number                          | 450F                |
| 29         |          |          | placetype                            | office              |
| 30         | PCN      |          | postal community name                | Leonia              |
| 31         |          |          | post office box (P.O Box)            | 12345               |
| 32         |          |          | additional code                      | 13203000003         |
| 128        |          |          | script                               | Latn                |
| 255        |          |          | reserved                             |                     |



## ifWiFiConfiguration

### ScanWiFi() As roArray

Scans for available wireless networks. The results are reported as an *roArray* containing one or more associative arrays with the following members:

| **Value** | **Type** | **Description**                                                                                                                                                                            |
| --------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| essid     | String   | Network name                                                                                                                                                                               |
| bssid     | String   | Access point BSSID                                                                                                                                                                         |
| signal    | Integer  | Received signal strength indication. The absolute value of this field is not usually relevant, but it can be compared with the reported value on other networks or in different locations. |

:::hint{type="info"}
ScanWiFi may fail if a previous scan has not completed, or a background scan is in progress. This potential failure should be handled in the script, and the script should retry ScanWifi if it does fail.
:::

### ReassociateWiFi(enable As Boolean) As Boolean

This method takes no parameters and attempts to disconnect from and reconnect to the currently-configured WiFi network. This should not normally be necessary, but could be useful when diagnosing network problems. Returns `true` on success or `false` on failure. When `false` is returned calling `GetFailureReason()` may provide more information as to why.

This method is present in BOS 8.4.20 and above, BOS 8.5.26 and above, and in all BOS 9.0 versions.

Note that this function may return before the network has been reconnected. Use `roNetworkHotplug` to determine when reconnection is complete.

## Network Authentication

BrightSign players support most commonly used wireless encryption formats: WEP (64 & 128), WPA (TKIP), and WPA2 (AES).

WPA Enterprise is supported using EAP-TLS (with DER, PEM, or PKCS#12 certificates) and PEAPv0/MSCHAPv2 (with a username and passphrase). Wired authentication via 802.1x is also supported. The configuration instructions below apply to both WiFi and wired authentication via 802.1x; the only difference is the wired/wireless parameter (0/1) passed during *roNetworkConfiguration* initialization.

### EAP-TLS

EAP-TLS authentication requires a client certificate and private key. There are two ways to accomplish this:

- Packaging the client certificate and private key in a single file in PKCS#12 format (using PEM or DER encoding), usually with a *.p12* file extension. To do this, set the PKCS#12 file using the `SetWiFiPrivateKey()` method and pass a blank string to the `SetWiFiClientCertificate()` method.
- Packaging the client certificate as a X.509 certificate (using PEM or DER encoding) and optionally securing the key with a passphrase (instead of the usual WiFi passphrase). To do this, set the client certificate using the `SetWiFiClientCertificate()` method and the key using the `SetWiFiPrivateKey()` method. If the key is protected with a passphrase, you should then call `SetWiFiPassphrase()`.

Certificate keys may contain binary data if not PEM formatted. In this case, they must be provided as an *roByteArray* object. Text formats may be passed using a string or *roByteArray*.

**Example: Setting EAP-TLS with a .p12 file**

```text
nc = CreateObject("roNetworkConfiguration",1)
 
p12 = CreateObject("roByteArray")
p12.ReadFile("client.p12")

nc.SetWiFiClientCertificate("")
nc.SetWiFiPrivateKey(p12)
nc.SetWiFiPassphrase("passwordgoeshere") 
```

During authentication, the Radius server is passed an identity. By default, the identity will be taken from the client certificate. If the certificate has a "subjectAltName", it will be used; otherwise, the "CommonName" is used. If neither of these are correct, the identity may be overridden. This default behavior can be overridden by calling `SetWiFiIdentity()`, or it can be specified by passing a blank string to `SetWiFiIdentity()`.

### PEAP/MSCHAP

This mode requires an identity (username) and passphrase, rather than a client certificate. There may also be a second, "outer", identity–see the Special Cases section below for configuration details.

```text
nc = CreateObject("roNetworkConfiguration",1)
nc.SetWiFiIdentity("user@brightsign-example.com")
nc.SetWifiPassphrase("passwordgoeshere")
```

### Common Variants

### Additional Certificates

Additional CA certificates are often required when using a private or internal CA for authentication. Also, some CA hierarchies require intermediate certificates, which are sometimes supplied via EAP. If the server does not supply them, they may be added to the CA file using the `SetWiFiCACertififcates()` method. This method supports PEM certificates.

:::hint{type="info"}
If a CA is not supplied, no peer verification will be done and an unvalidated authentication/connection will occur.
:::

```text
nc = CreateObject("roNetworkConfiguration",1)
ca = CreateObject("roByteArray")
ca.ReadFile("ca.pem")
nc.SetWiFiCACertificates(ca)
```

### Obfuscated WiFi Passphrase

If an obfuscated WiFi passphrase is required, you can substitute the `SetObfuscatedWiFiPassphrase()` method for the `SetWiFiPassphrase()` method. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.

### TKIP/CCMP Encryption

By default, both WPA (TKIP) and WPA2 (CCMP) encryption is permitted. You can alter this behavior using the `SetSecurityMode()` method, which accepts a space-separated, case-insensitive list of allowed modes ("ccmp" and "tkip"). If both CCMP and TKIP are allowed, CCMP always has priority.

```text
nc = CreateObject("roNetworkConfiguration",1)
nc.SetWiFiSecurityMode("") 'Sets the default mode
nc.SetWiFiSecurityMode("ccmp tkip") 'Explicitly allows both modes (same as the default mode)
nc.SetWiFiSecurityMode("ccmp") 'Requires the use of CCMP
```

### Special Cases

### MD5 Support

MD5 support is enabled by default for backwards-compatibility reasons. This behavior can be modified by passing the "md5=enable" or "md5=disable" string to the `SetWiFiEapTlsOptions()` method.

```text
nc = CreateObject("roNetworkConfiguration",1)
nc.SetWiFiEapTlsOptions("md5=disable")
```

### Anonymous Identity

Some EAP-PEAP/MSCHAP configurations require an anonymous identity. By default, the BrightSign player uses the same inner and outer identity. An anonymous identity can be configured with the `SetWiFiEaptTlsOptions()` method:

```text
nc = CreateObject("roNetworkConfiguration",1)
nc.SetWiFiEapTlsOptions("anonymous_identity=anon@brightsign.biz")
```

:::hint{type="success"}
If neither MD5 or identity options are being used, the setting should be cleard by passing a blank string to the `SetWiFiEaptTlsOptions()` method.
:::

### Validity Dates

Validity dates are required for both EAP-TLS and PEAP/MSCHAP. The current time is required to check the certificate. If the player clock has not been set, it will typically set its time using the network, but this requires EAP authentication first. To avoid this problem, there are two special exceptions:

- EAP-TLS: When the clock is not set, the time is set to ten seconds after the client certificate becomes valid, which is usually sufficient to authenticate (though this may not be sufficient for servers with newer certificates than the client). 
- PEAP/MSCHAP: There is no client certificate, and the server certificate time is not checked when the date is not set.

The clock can also be set via the [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM), which prevents either of the above exceptions from being used. Typically, the clock is also set from the network once it is available, so these exceptions are only used on first boot or when the clock battery has been completely emptied.

## Examples

The following script disables WPA Enterprise configuration (which is otherwise persistent):

```text
nc = CreateObject("roNetworkConfiguration", 1)
nc.SetWiFiSecurityMode("")
nc.SetWiFiESSID("")
nc.SetWiFiIdentity("")
nc.SetWiFiCaCertificates("")
nc.SetWiFiClientCertificate("")
nc.SetWiFiPrivateKey("")
nc.SetWiFiPassphrase("")
nc.SetWiFiEapTlsOptions("")
ok = nc.Apply()
```

The following script configures the WiFi for EAP-TLS using a PKCS#12 (*.p12*) file, without additional CA certificates:

```text
essid = "brightwifi"
pkcs12file = "client.p12"
pkcspass = "passwordgoeshere"

nc = CreateObject("roNetworkConfiguration", 1)
nc.SetWiFiESSID(essid)

p12 = CreateObject("roByteArray")
ok = p12.ReadFile(pkcs12file)

if ok then
    nc.SetWiFiClientCertificate("")
    nc.SetWiFiPrivateKey(p12)
    nc.SetWiFiPassphrase(pkcspass)

    nc.SetWiFiCaCertificates("")
    nc.SetWiFiSecurityMode("")
    nc.SetWiFiIdentity("")
    nc.SetWiFiEapTlsOptions("")

    ok = nc.Apply()
end if
```

The following script configures the WiFi for EAP-TLS with additional certificates:

```text
essid = "brightwifi"
cafile = "cacert.pem"
pkcs12file = "client.p12"
pkcspass = "passwordgoeshere"

nc = CreateObject("roNetworkConfiguration", 1)
nc.SetWiFiESSID(essid)

p12 = CreateObject("roByteArray")
ok = p12.ReadFile(pkcs12file)

ca = CreateObject("roByteArray")
ok = ca.ReadFile(cafile) and ok

if ok then
    nc.SetWiFiClientCertificate("")
    nc.SetWiFiPrivateKey(p12)
    nc.SetWiFiPassphrase(pkcspass)

    nc.SetWiFiCaCertificates("")
    nc.SetWiFiSecurityMode("")
    nc.SetWiFiIdentity("")
    nc.SetWiFiEapTlsOptions("")

    ok = nc.Apply()
end if
```

The following script configures the WiFi for PEAP/MSCHAP with additional CA files:

```text
essid = "brightwifi"
cafile = "ca.pem"
user = "someuser@brightsign.biz"
pass = "whatever"
ca = CreateObject("roByteArray")
ok = ca.ReadFile(cafile)

if ok then
    nc = CreateObject("roNetworkConfiguration", 1)
    nc.SetWiFiESSID(essid)
    nc.SetWiFiIdentity(user)
    nc.SetWiFiPassphrase(pass)
    nc.SetWiFiCaCertificates(ca)
    nc.SetWiFiClientCertificate("")
    nc.SetWiFiPrivateKey("")
    'Use this if an anonymous outer identity is required
    'nc.SetWiFiEapTlsOptions("anonymous_identity=anon@brightsign.biz")
    nc.SetWiFiEapTlsOptions("")

    ok = nc.Apply()
    if not ok then
        fail = "Unable to set configuration: " + nc.GetFailureReason()
    end if
else
    fail = "Unable to read file " + cafile
end if

' if not ok, do something with the failure message
```

The following script performs various VLAN configurations on the Ethernet interface:

```text
' Configure the VLANs first. Use defaults for VLAN6
n6=CreateObject("roNetworkConfiguration", "eth0.6")
print n6.ResetInterfaceSettings()
print n6.Apply()

' Use defaults for VLAN11
n11=CreateObject("roNetworkConfiguration", "eth0.11")
print n11.ResetInterfaceSettings()
print n11.Apply()

' Use static IP for VLAN15
n15=CreateObject("roNetworkConfiguration", "eth0.15")
print n15.SetIP4Address("192.168.15.100")
print n15.SetIP4Netmask("255.255.255.0")
print n15.Apply()

' Now enable VLANs 6, 11 and 15 on eth0.
n0=CreateObject("roNetworkConfiguration", "eth0")
print n0.SetVlanIds([6, 11, 15])
print n0.Apply()
```


[title] roPcap
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

`roPcap` is used to analyze PCAP files for UDP traffic flows, prepare them for
replay (optionally filtering and rewriting headers), replay them onto a network
interface with drift-free pacing, and extract raw UDP payload streams from PCAP
captures. It is available as of BOS 9.1.143.

If a message port is set via `SetPort()`, the object posts `roPcapEvent` messages
for replay lifecycle events (started, stopped, looped, underrun, dropped).

Only one `roPcap` instance may exist at a time. `CreateObject("roPcap")` returns
`Invalid` if another instance is already alive.

:::hint{type="warning"}
If using *tmp\:/* you need to be mindful of how big the PCAP is. If its large, it won’t fit into a RAM-based *tmp\:/* and you should use local storage instead (for example, *sd:/*)
:::

***

## ifPcap

### Analyze(filename As String) As Object

Scans all packets in `filename` and returns a `roArray` of `roAssociativeArray`,
one entry per UDP flow found. Flows are sorted by packet count in descending
order. Returns an empty array if the file cannot be opened or contains no UDP
flows.

Each entry in the returned array contains the following keys:

| **Key**        | **Type** | **Description**                   |
| -------------- | -------- | --------------------------------- |
| `src_ip`       | String   | Source IPv4 address               |
| `src_port`     | Integer  | Source UDP port                   |
| `dst_ip`       | String   | Destination IPv4 address          |
| `dst_port`     | Integer  | Destination UDP port              |
| `packet_count` | Integer  | Number of UDP packets in the flow |

***

### Prepare(params As roAssociativeArray) As Integer

Filters packets from the input PCAP and writes a replay-ready output PCAP,
optionally rewriting destination IP and UDP port headers. The source MAC address
and source IP address in every output packet are always rewritten to the values
of the specified network interface.

If `RewriteOutputDestAddress` is a multicast address, the destination MAC is
derived using the RFC 1112 formula. If it is a unicast address, the destination
MAC is resolved via the kernel ARP cache; the destination must already be
reachable (e.g. via a prior ping) before calling `Prepare()`.

Returns a `PcapEngineError` integer code; `0` on success. See [Error Codes](./#error-codes).

**Required parameters:**

| **Key**      | **Type** | **Description**                                                              |
| ------------ | -------- | ---------------------------------------------------------------------------- |
| `InputFile`  | String   | Path to the source PCAP file                                                 |
| `OutputFile` | String   | Path to write the prepared PCAP (must differ from `InputFile`)               |
| `Interface`  | String   | Network interface name used to resolve the source MAC and IP (e.g. `"eth0"`) |

**Optional filter parameters:**

| **Key**                    | **Type** | **Description**                                             |
| -------------------------- | -------- | ----------------------------------------------------------- |
| `FilterInputSourceAddress` | String   | Keep only packets with this IPv4 source address             |
| `FilterInputSourcePort`    | Integer  | Keep only UDP packets from this source port (1024–65535)    |
| `FilterInputDestAddress`   | String   | Keep only packets with this IPv4 destination address        |
| `FilterInputDestPort`      | Integer  | Keep only UDP packets to this destination port (1024–65535) |
| `AutoFlowSelect`           | Boolean  | See note below                                              |

**Optional rewrite parameters:**

| **Key**                    | **Type** | **Description**                                           |
| -------------------------- | -------- | --------------------------------------------------------- |
| `RewriteOutputDestAddress` | String   | Rewrite the destination IP address (unicast or multicast) |
| `RewriteOutputDestPort`    | Integer  | Rewrite the UDP destination port (1024–65535)             |

**AutoFlowSelect default behavior:**
When no `FilterInput*` keys are supplied, `AutoFlowSelect` defaults to `true`:
the flow with the highest packet count is selected automatically. When any
`FilterInput*` key is present, `AutoFlowSelect` defaults to `false`: if the
filter criteria match more than one flow, `Prepare()` returns
`PCAP_ERR_AMBIGUOUS_FLOW (-7)` instead of picking one. An explicit
`AutoFlowSelect` key always overrides the default.

***

### ExtractStream(params As roAssociativeArray) As Integer

Concatenates the raw UDP payload bytes of every matching packet in `InputFile`
and writes them to `OutputFile`. No prior `Prepare()` call is required. This is
useful for recovering the original byte stream from a UDP capture — for example,
extracting an MPEG-TS file from a TS-over-UDP recording.

The filter criteria must resolve to exactly one UDP flow. Use `AutoFlowSelect`
to select the highest-count flow automatically when the filter is broad.

Returns a `PcapEngineError` integer code; `0` on success. See [Error Codes](./#error-codes).
May return `PCAP_ERR_READ_FAILED (-8)` if the input file is corrupt or truncated.

**Required parameters:**

| **Key**      | **Type** | **Description**                                          |
| ------------ | -------- | -------------------------------------------------------- |
| `InputFile`  | String   | Path to the source PCAP file                             |
| `OutputFile` | String   | Path to write the extracted stream; created or truncated |

**Optional filter parameters:**

Same as `Prepare()`: `FilterInputSourceAddress`, `FilterInputSourcePort`,
`FilterInputDestAddress`, `FilterInputDestPort`, `AutoFlowSelect` (same default
logic as `Prepare()`).

***

### Start(params As roAssociativeArray) As Boolean

Starts replaying the prepared PCAP file on the specified network interface.
Packets are paced at their original inter-packet intervals using
absolute monotonic timestamps so timing overshoot on one packet cannot accumulate
into drift over subsequent packets.

Blocks until the sender thread has started or failed to start. Posts a
`roPcapEvent` with type `1` (Started) to the message port on success.

Returns `True` on success; `False` if the sender thread could not be started.

**Required parameters:**

| **Key**     | **Type** | **Description**                                   |
| ----------- | -------- | ------------------------------------------------- |
| `Filename`  | String   | Path to the prepared PCAP file to replay          |
| `Interface` | String   | Network interface name to send on (e.g. `"eth0"`) |

**Optional parameters:**

| **Key**             | **Type** | **Description**                                                                                                                                                                                                                                                                                                           |
| ------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `LoopCount`         | Integer  | Number of times to loop through the file; `0` (default) loops forever                                                                                                                                                                                                                                                     |
| `PreloadIntoMemory` | Boolean  | If `True`, loads the entire file into RAM before replay begins (capped at 50% of total system RAM). Use this when deterministic per-packet timing is required and the file fits comfortably in memory. Default is streaming mode, which reads from disk with a 20 MiB readahead buffer and is suitable for any file size. |

***

### Stop() As Void

Returns `True` while the sender thread is executing the replay loop. Returns
`False` once the loop count is exhausted, `Stop()` is called, or a fatal error
occurs after `Start()` returned `True`.

***

### GetStats() As roAssociativeArray

Returns a snapshot of replay statistics. Safe to call at any time, including
while replay is running.

| **Key**               | **Type** | **Description**                                                                                  |
| --------------------- | -------- | ------------------------------------------------------------------------------------------------ |
| `packets_sent`        | Integer  | Frames successfully transmitted since the last `Start()`                                         |
| `packets_dropped`     | Integer  | Frames dropped due to no buffer space / busy, since the last `Start()`                           |
| `loops_completed`     | Integer  | Full loop passes that have finished cleanly                                                      |
| `underruns`           | Integer  | Times the streaming readahead buffer was empty; always `0` when `PreloadIntoMemory` is `True`    |
| `elapsed_ms`          | Integer  | Wall-clock milliseconds since the last `Start()` or `ResetStats()` call; `0` when stopped        |
| `timing_sample_count` | Integer  | Number of packets contributing to the timing fields below                                        |
| `timing_mean_us`      | Integer  | Mean timing error in microseconds; positive means the packet went out late, negative means early |
| `timing_min_us`       | Integer  | Minimum (most-early) timing error in microseconds                                                |
| `timing_max_us`       | Integer  | Maximum (most-late) timing error in microseconds                                                 |
| `timing_stddev_us`    | Integer  | Sample standard deviation of timing error in microseconds                                        |

Timing fields are `0` until at least one packet has been sent.

***

### ResetStats() As Void

Resets all replay statistics to zero. Safe to call while replay is running.
Counters updated by the replay thread after the call reflect only activity since
the reset.

***

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type `roPcapEvent` to the attached message port.

***

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data previously set via `SetUserData()`. Returns `Invalid` if
no data has been set.

***

## roPcapEvent

`roPcapEvent` is posted to the message port set on `roPcap` whenever a replay
lifecycle event occurs.

### ifPcapEvent

### GetInt() As Integer

Returns the event type code:

| **Value** | **Name** | **Description**                                                                             |
| --------- | -------- | ------------------------------------------------------------------------------------------- |
| 1         | Started  | Replay thread started and is sending packets                                                |
| 2         | Stopped  | Replay thread stopped (loop count exhausted, `Stop()` called, or fatal error)               |
| 3         | Looped   | One full pass completed; `GetData()` returns the 1-indexed loop number                      |
| 4         | Underrun | Streaming readahead buffer was empty; replay timing may have been affected                  |
| 5         | Dropped  | A packet was dropped; `GetData()` returns the cumulative drop count at the time of the drop |

### GetData() As Integer

Returns event-specific data. See the table above. Returns `0` for events where
no additional data applies.

***

## Error Codes

`Prepare()` and `ExtractStream()` return one of the following integer codes:

| **Value** | **Name**                       | **Description**                                                                                                                                                                          |
| --------- | ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 0         | PCAP\_OK                       | Success                                                                                                                                                                                  |
| -1        | PCAP\_ERR\_FILE\_NOT\_FOUND    | `InputFile` does not exist or cannot be opened                                                                                                                                           |
| -2        | PCAP\_ERR\_INVALID\_FLOW\_PORT | A port value is outside the valid range \[1024, 65535]                                                                                                                                   |
| -3        | PCAP\_ERR\_WRITE\_FAILED       | `OutputFile` could not be written                                                                                                                                                        |
| -4        | PCAP\_ERR\_INVALID\_INTERFACE  | The interface name is invalid or not found on the system                                                                                                                                 |
| -5        | PCAP\_ERR\_INVALID\_PARAM      | An invalid parameter was supplied: bad IP address format, `InputFile` and `OutputFile` are the same path, or a unicast `RewriteOutputDestAddress` could not be resolved to a MAC via ARP |
| -6        | PCAP\_ERR\_NO\_MATCHING\_FLOW  | The filter criteria matched no flows; supply a less restrictive filter or verify the input file contains the expected traffic                                                            |
| -7        | PCAP\_ERR\_AMBIGUOUS\_FLOW     | The filter criteria matched more than one distinct flow; tighten the filter to select exactly one, or set `AutoFlowSelect: True` to pick the highest-count flow automatically            |
| -8        | PCAP\_ERR\_READ\_FAILED        | `ExtractStream()` only: the input file is corrupt or truncated                                                                                                                           |

***

## Examples

### Analyze a PCAP File

Print all UDP flows found in a capture file:

```brightscript
pcap = CreateObject("roPcap")
flows = pcap.Analyze("SD:/capture.pcap")

for each flow in flows
    print flow.src_ip + ":" + flow.src_port.ToStr() + " -> " + _
          flow.dst_ip + ":" + flow.dst_port.ToStr() + _
          "  packets=" + flow.packet_count.ToStr()
end for
```

***

### Prepare and Replay with Event Handling

Select a flow, rewrite it to a local multicast group, and replay it three times
while monitoring events:

```brightscript
pcap = CreateObject("roPcap")
port = CreateObject("roMessagePort")
pcap.SetPort(port)

' Step 1 — inspect the capture to find the flow
flows = pcap.Analyze("SD:/source.pcap")
if flows.Count() = 0
    print "No UDP flows found"
    stop
end if

' Step 2 — prepare: filter to the largest flow, rewrite destination
params = CreateObject("roAssociativeArray")
params.InputFile  = "SD:/source.pcap"
params.OutputFile = "tmp:/prepared.pcap"
params.Interface  = "eth0"
' AutoFlowSelect defaults to true when no FilterInput* keys are given,
' so the highest-count flow is selected automatically.
params.RewriteOutputDestAddress = "239.1.2.3"
params.RewriteOutputDestPort    = 1234

result = pcap.Prepare(params)
if result <> 0
    print "Prepare failed: " + result.ToStr()
    stop
end if

' Step 3 — replay three times
startParams = CreateObject("roAssociativeArray")
startParams.Filename  = "tmp:/prepared.pcap"
startParams.Interface = "eth0"
startParams.LoopCount = 3

if not pcap.Start(startParams)
    print "Start failed"
    stop
end if

' Step 4 — event loop
while True
    msg = Wait(0, port)
    if type(msg) = "roPcapEvent"
        select case msg.GetInt()
            case 3 ' Looped
                print "Completed loop " + msg.GetData().ToStr()
            case 5 ' Dropped
                print "Drop count: " + msg.GetData().ToStr()
            case 2 ' Stopped
                print "Replay finished"
                exit while
        end select
    end if
end while

stats = pcap.GetStats()
print "Sent=" + stats.packets_sent.ToStr() + _
      " Dropped=" + stats.packets_dropped.ToStr() + _
      " Underruns=" + stats.underruns.ToStr()
```

***

### Extract a Raw Stream from a PCAP

Recover an MPEG-TS file from a TS-over-UDP capture. No `Prepare()` or network
interface is needed:

```brightscript
pcap = CreateObject("roPcap")

params = CreateObject("roAssociativeArray")
params.InputFile  = "SD:/recording.pcap"
params.OutputFile = "SD:/extracted.ts"
' AutoFlowSelect defaults to true when no FilterInput* keys are given.
' Set explicit filter keys to target a specific flow in a multi-flow capture.
params.FilterInputDestAddress = "239.10.20.30"
params.FilterInputDestPort    = 1234
' AutoFlowSelect defaults to false because FilterInput* keys are present;
' set it explicitly to true to auto-pick if the filter still matches multiple flows.
params.AutoFlowSelect = True

result = pcap.ExtractStream(params)
if result = 0
    print "Stream extracted successfully"
else
    print "ExtractStream failed: " + result.ToStr()
end if
```


[title] roResourceManager
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/System Objects/

The *roResourceManager* object is used to manage strings in multiple languages.

Object creation: The *roResourceManager* object is created with a single filename parameter that specifies the name of the file that contains all of the localized resource strings required by the user. This file must be in UTF-8 format.

```text
CreateObject("roResourceManager", filename As String)
```

## ifResourceManager

### SetLanguage(language\_identifier As String) As Boolean

Instructs the *roResourceManager* object to use the specified language. `False` is returned if there are no resources associated with the specified language.

### GetResource(resource\_identifier As String) As String

Returns the resource string in the current language for a given resource identifier.

### GetFailureReason() As String

Yields additional useful information if a function return indicates an error.

### GetLanguage() As String

## Usage

At present, *roResourceManager* is primarily used for localizing the *roClockWidget*. The resource file passed in during creation has the following format for each string entry:

```text
[RESOURCE_IDENTIFIER_NAME_GOES_HERE]
eng "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec"
ger "Jan|Feb|Mär|Apr|Mai|Jun|Jul|Aug|Sep|Okt|Nov|Dez"
spa "Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic"
fre "Jan|Fév|Mar|Avr|Mai|Jun|Jul|Aou|Sep|Oct|Nov|Déc"
ita "Gen|Feb|Mar|Apr|Mag|Giu|Lug|Ago|Set|Ott|Nov|Dic"
dut "Jan|Feb|Mar|Apr|Mei|Jun|Jul|Aug|Sep|Okt|Nov|Dec"
swe "Jan|Feb|Mar|Apr|Maj|Jun|Jul|Aug|Sep|Okt|Nov|Dec"
```

The name in square brackets is the resource identifier. Each line after it is a language identifier followed by the resource string. Multiple *roResourceManager* objects can be created. A default "resources.txt" file, which contains a range of internationalization values for the clock widget, is available on [this page](docId:1c7On8L3Z2bgg2tg-tgYR).

[title] roUrlEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This event is generated by the roUrlTransfer object.

## ifInt

**GetInt() As Integer**

Returns the type of event. The following event types are currently defined:

- `1`: transfer complete
- `2`: transfer started

## ifString

**GetString() As String**

Returns the string associated with the event. For transfer-complete `AsyncGetToString()`, `AsyncPostFromString()`, and `AsyncPostFromFile()` requests, this will be the actual response body from the server, truncated to 65,536 characters.

## ifUserData

**SetUserData(user\_data As Object) As Void**

Sets the user data.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()` (on either the event or source object). It will return Invalid if no data has been set.

## ifSourceIdentity

**GetSourceIdentity() As Integer**

Returns a unique number that can be matched with the value returned by roUrlTransfer.GetIdentity() to determine where this event originated.

:::hint{type="info"}
The ifSourceIdentity interface has been deprecated. We recommend using the ifUserData interface instead.
:::

## ifUrlEvent

**GetResponseCode() As Integer**

Returns the protocol response code associated with an event. The following codes indicate success:

- 200: Successful HTTP transfer
- 226: Successful FTP transfer
- 0: Successful local file transfer

For unexpected errors, the return value is negative. There are many possible negative errors from the CURL library, but it is often best to look at the text version by calling `GetFailureReason()`.

Here are some potential errors. Not all of them can be generated by a BrightSign player:

| **Status** | **Name**                          | **Description**                                                                                                                                                                                          |
| ---------- | --------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| -1         | CURLE\_UNSUPPORTED\_PROTOCOL      | <br /><br />                                                                                                                                                                                             |
| -2         | CURLE\_FAILED\_INIT               | <br /><br />                                                                                                                                                                                             |
| -3         | CURLE\_URL\_MALFORMAT             | <br /><br />                                                                                                                                                                                             |
| -5         | CURLE\_COULDNT\_RESOLVE\_PROXY    | <br /><br />                                                                                                                                                                                             |
| -6         | CURLE\_COULDNT\_RESOLVE\_HOST     | <br /><br />                                                                                                                                                                                             |
| -7         | CURLE\_COULDNT\_CONNECT           | <br /><br />                                                                                                                                                                                             |
| -8         | CURLE\_FTP\_WEIRD\_SERVER\_REPLY  | <br /><br />                                                                                                                                                                                             |
| -9         | CURLE\_REMOTE\_ACCESS\_DENIED     | A service was denied by the server due to lack of access. When login fails, this is not returned.                                                                                                        |
| -11        | CURLE\_FTP\_WEIRD\_PASS\_REPLY    | <br /><br />                                                                                                                                                                                             |
| -13        | CURLE\_FTP\_WEIRD\_PASV\_REPLY    | <br /><br />                                                                                                                                                                                             |
| -14        | CURLE\_FTP\_WEIRD\_227\_FORMAT    | <br /><br />                                                                                                                                                                                             |
| -15        | CURLE\_FTP\_CANT\_GET\_HOST       | <br /><br />                                                                                                                                                                                             |
| -17        | CURLE\_FTP\_COULDNT\_SET\_TYPE    | <br /><br />                                                                                                                                                                                             |
| -18        | CURLE\_PARTIAL\_FILE              | <br /><br />                                                                                                                                                                                             |
| -19        | CURLE\_FTP\_COULDNT\_RETR\_FILE   | <br /><br />                                                                                                                                                                                             |
| -21        | CURLE\_QUOTE\_ERROR               | Failed quote command                                                                                                                                                                                     |
| -22        | CURLE\_HTTP\_RETURNED\_ERROR      | <br /><br />                                                                                                                                                                                             |
| -23        | CURLE\_WRITE\_ERROR               | <br /><br />                                                                                                                                                                                             |
| -25        | CURLE\_UPLOAD\_FAILED             | Failed upload command.                                                                                                                                                                                   |
| -26        | CURLE\_READ\_ERROR                | Could not open/read from file.                                                                                                                                                                           |
| -27        | CURLE\_OUT\_OF\_MEMORY            | <br /><br />                                                                                                                                                                                             |
| -28        | CURLE\_OPERATION\_TIMEDOUT        | The timeout time was reached.                                                                                                                                                                            |
| -30        | CURLE\_FTP\_PORT\_FAILED          | FTP PORT operation failed.                                                                                                                                                                               |
| -31        | CURLE\_FTP\_COULDNT\_USE\_REST    | REST command failed.                                                                                                                                                                                     |
| -33        | CURLE\_RANGE\_ERROR               | RANGE command did not work.                                                                                                                                                                              |
| -34        | CURLE\_HTTP\_POST\_ERROR          | <br /><br />                                                                                                                                                                                             |
| -35        | CURLE\_SSL\_CONNECT\_ERROR        | Wrong when connecting with SSL.                                                                                                                                                                          |
| -36        | CURLE\_BAD\_DOWNLOAD\_RESUME      | Could not resume download.                                                                                                                                                                               |
| -37        | CURLE\_FILE\_COULDNT\_READ\_FILE  | <br /><br />                                                                                                                                                                                             |
| -38        | CURLE\_LDAP\_CANNOT\_BIND         | <br /><br />                                                                                                                                                                                             |
| -39        | CURLE\_LDAP\_SEARCH\_FAILED       | <br /><br />                                                                                                                                                                                             |
| -41        | CURLE\_FUNCTION\_NOT\_FOUND       | <br /><br />                                                                                                                                                                                             |
| -42        | CURLE\_ABORTED\_BY\_CALLBACK      | <br /><br />                                                                                                                                                                                             |
| -43        | CURLE\_BAD\_FUNCTION\_ARGUMENT    | <br /><br />                                                                                                                                                                                             |
| -45        | CURLE\_INTERFACE\_FAILED          | CURLOPT\_INTERFACE failed.                                                                                                                                                                               |
| -47        | CURLE\_TOO\_MANY\_REDIRECTS       | Catch endless re-direct loops.                                                                                                                                                                           |
| -48        | CURLE\_UNKNOWN\_TELNET\_OPTION    | User specified an unknown option.                                                                                                                                                                        |
| -49        | CURLE\_TELNET\_OPTION\_SYNTAX     | Malformed telnet option.                                                                                                                                                                                 |
| -51        | CURLE\_PEER\_FAILED\_VERIFICATION | Peer's certificate or fingerprint wasn't verified correctly.                                                                                                                                             |
| -52        | CURLE\_GOT\_NOTHING               | When this is a specific error.                                                                                                                                                                           |
| -53        | CURLE\_SSL\_ENGINE\_NOTFOUND      | SSL crypto engine not found.                                                                                                                                                                             |
| -54        | CURLE\_SSL\_ENGINE\_SETFAILED     | Cannot set SSL crypto engine as default.                                                                                                                                                                 |
| -55        | CURLE\_SEND\_ERROR,               | Failed sending network data.                                                                                                                                                                             |
| -56        | CURLE\_RECV\_ERROR                | Failure in receiving network data.                                                                                                                                                                       |
| -58        | CURLE\_SSL\_CERTPROBLEM           | Problem with the local certificate.                                                                                                                                                                      |
| -59        | CURLE\_SSL\_CIPHER                | Could not use specified cipher.                                                                                                                                                                          |
| -60        | CURLE\_SSL\_CACERT                | Problem with the CA cert (path?)                                                                                                                                                                         |
| -61        | CURLE\_BAD\_CONTENT\_ENCODING     | Unrecognized transfer encoding.                                                                                                                                                                          |
| -62        | CURLE\_LDAP\_INVALID\_URL         | Invalid LDAP URL.                                                                                                                                                                                        |
| -63        | CURLE\_FILESIZE\_EXCEEDED,        | Maximum file size exceeded.                                                                                                                                                                              |
| -64        | CURLE\_USE\_SSL\_FAILED,          | Requested FTP SSL level failed.                                                                                                                                                                          |
| -65        | CURLE\_SEND\_FAIL\_REWIND,        | Sending the data requires a rewind that failed.                                                                                                                                                          |
| -66        | CURLE\_SSL\_ENGINE\_INITFAILED    | Failed to initialize ENGINE.                                                                                                                                                                             |
| -67        | CURLE\_LOGIN\_DENIED              | User, password, or similar field was not accepted and login failed .                                                                                                                                     |
| -68        | CURLE\_TFTP\_NOTFOUND             | File not found on server.                                                                                                                                                                                |
| -69        | CURLE\_TFTP\_PERM                 | Permission problem on server.                                                                                                                                                                            |
| -70        | CURLE\_REMOTE\_DISK\_FULL         | Out of disk space on server.                                                                                                                                                                             |
| -71        | CURLE\_TFTP\_ILLEGAL              | Illegal TFTP operation.                                                                                                                                                                                  |
| -72        | CURLE\_TFTP\_UNKNOWNID            | Unknown transfer ID.                                                                                                                                                                                     |
| -73        | CURLE\_REMOTE\_FILE\_EXISTS       | File already exists.                                                                                                                                                                                     |
| -74        | CURLE\_TFTP\_NOSUCHUSER           | No such user.                                                                                                                                                                                            |
| -75        | CURLE\_CONV\_FAILED               | Conversion failed.                                                                                                                                                                                       |
| -76        | CURLE\_CONV\_REQD                 | Caller must register conversion callbacks using the following URL\_easy\_setopt options: CURLOPT\_CONV\_FROM\_NETWORK\_FUNCTION CURLOPT\_CONV\_TO\_NETWORK\_FUNCTION CURLOPT\_CONV\_FROM\_UTF8\_FUNCTION |
| -77        | CURLE\_SSL\_CACERT\_BADFILE       | Could not load CACERT file, missing or wrong format.                                                                                                                                                     |
| -78        | CURLE\_REMOTE\_FILE\_NOT\_FOUND   | Remote file not found.                                                                                                                                                                                   |
| -79        | CURLE\_SSH                        | Error from the SSH layer (this is somewhat generic, so the error message will be important when this occurs).                                                                                            |
| -80        | CURLE\_SSL\_SHUTDOWN\_FAILED      | Failed to shut down the SSL connection.                                                                                                                                                                  |

The following error codes are generated by the system software, and are outside the range of CURL events:

| **Status** | **Name**         | **Description**                                                                                         |
| ---------- | ---------------- | ------------------------------------------------------------------------------------------------------- |
| -10001     | ERROR\_CANCELLED | The transfer request has been cancelled because the *roUrlTransfer&#x20;*&#x69;nstance is out of scope. |
| -10002     | ERROR\_EXCEPTION | The callback threw an exception.                                                                        |

**GetObject() As Object**

Returns the object associated with the event. Currently, this method can only return an object created in response to an roUrlTransfer.AsyncGetToObject request.

**GetFailureReason() As String**

Returns a description of the failure that occurred.

**GetSourceIdentity() As Integer**

Returns a unique number that can be matched with the value returned by roUrlTransfer.GetIdentity() to determine where the event came from.

**GetResponseHeaders() As roAssociativeArray**

Returns an associative array containing all the headers returned by the server for appropriate protocols (such as HTTP).

**GetHash() As String**

The hash (digest) of the response body, as specified by the `response_pipe{hash:}` parameter of the roUrlTransfer.AsyncMethod() method.

**GetPrefix() As String**

A number of bytes from the start of the response body. The amount of bytes is specified with the `response_pipe{prefix_capture:}` parameter of the roUrlTransfer.AsyncMethod() method.

[title] roSnmpAgent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

When this object is created, it starts an SNMP process that handles some standard SNMP MIBs such as system uptime. Prior to starting th&#x65;*&#xA0;*&#x53;NMP agent, you can register other OIDs for handling. You can set and retrieve these by both an SNMP client and the script.

OID values are retrieved by an SNMP client without script interaction. Setting OID values will generate an *roSnmpEvent&#x20;*&#x6F;bject stating that they have been changed. The script event handler can then retrieve new values and take appropriate action.

Setting an OID value from an SNMP client doesn't block the client waiting on any script action; there is a short, but indeterminate, time delay for scripts to act on a value change. This isn't a problem generally because of the way SNMP MIBs are designed. If you want to provide constantly updating OID values, you can update them using either a timer or state changes.

The JavaScript equivalent is net-snmp.

The *roSnmpAgent&#xA0;*&#x6F;bject is created with an optional *roAssociativeArray:*

:::hint{type="info"}
agent = CreateObject("roSnmpAgent")
:::

As of BrightSignOS 8.3.20, the default parameters below can be provided on object construction. Note that when both ro\_community and rw\_community are set, they must be unique values. Otherwise, simply provide rw\_community:

- `ro_community` <font color="#6554c0">string</font> <font color="#00b8d9">optional</font>: Sets the read community string.
- `rw_community` <font color="#6554c0">string</font> <font color="#00b8d9">optional</font>: Sets the write community string.

## ifSnmpAgent

**AddOidHandler(oid\_string As String, writable\_flag As Boolean, initial\_value As Object) As Boolean**

Adds an OID handler with the following parameters to the SNMP agent:

- `oid_string`: The OID string (e.g. "1.3.6.1.4.1.26095.1.1.1.4.4.0"). All OID strings should be numerical.
- `writable_flag`: A Boolean value indicating whether the value can be changed by an SNMP client.
- `initial_value`: The initial value, which can be either an *roString&#xA0;*&#x6F;r *roInt*. The OID will reflect the type chosen here.


**GetOidValue(oid\_string As String) As Object**

Returns the current value (as either roString or roInt) for a given OID.

**SetOidValue(oid\_string As String, new\_value As Object) As Boolean**

Changes the current value for a given OID. The passed value can be either an roString or roInt.

**Start() As Boolean**

Starts the SNMP agent. Call this method once all OID handlers have been registered.

**Example**

```none
agent = CreateObject("roSnmpAgent")
agent.AddOidHandler("1.3.6.1.4.1.26095.1.1.1.4.4.0", false, "ValueOfOid")
agent.AddOidHandler("1.3.6.1.4.1.26095.1.1.1.4.5.0", true, 10)
agent.Start() 
```

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via SetUserData(). It will return Invalid if no data has been set.

## ifMessagePort

**SetPort(port As roMessagePort)**

Posts messages of type *roSnmpEvent&#xA0;*&#x74;o the attached message port.


[title] roControlUp, roControlDown
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

These objects are posted by an [roControlPort](docId:8ExDHgmoHqig7J-UvfCe1) instance to the configured message port when inputs change state. An *roControlDown* event is posted when the input level goes from high to low. An *roControlUp* event is posted when the input level goes from low to high.

## ifInt

### GetInt() As Integer

Retrieves the pin number associated with the event.

### SetInt(value As Integer) As Void

Sets the value of the event.

## ifUserData

### SetUserData(user\_data As Object) As Void

Sets the user data.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` (on either the event or source object). It will return `Invalid` if no data has been set.

## ifSourceIdentity

### GetSourceIdentity() As Integer

Retrieves the identity value that can be used to associate events with the source *roControlPort* instance.

:::hint{type="info"}
The *ifSourceIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::


[title] roNetworkTimeEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Date and Time Objects/

This event object is generated by the *roSystemTime* object.  

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned by `GetUserData()`.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifNetworkTimeEvent

### WasSuccessful() As Boolean

Returns `True` if the last attempt to set the clock via the network (i.e. NTP or HTTP) was successful.

### GetFailureReason() As String

Returns a description of the error if the last attempt to set the clock via the network failed.

[title] roTCPStream
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

The JavaScript equivalent is net.socket.

## ifStreamReceive

**SetLineEventPort(messagePort As Object)**

Sets the message port that roStreamLineEvent events will be posted to.

**SetByteEventPort(messagePort As Object)**

Sets the message port that roStreamByteEvent events will be posted to.

**SetByteArrayEventPort(messagePort As Object)**

This method works like SetByteEventPort but causes roStreamByteArrayEvent messages to be posted to the message port when data is received. For some object types (for example, roTCPStream), this can be much more efficient since data no longer needs to be delivered to BrightScript a byte at a time.

**SetReceiveEol(messagePort As String or roByteArray)**

Sets the sequence that will signify the end of line and cause a *roStreamLineEvent* to be delivered to the message port set by *SetLineEventPort*. If you need to set this value to a non-printing character, use the chr() [global function](docId\:nSjXffR7OlFgDWgjFEbMe) or an *roByteArray*. If the sequence contains NUL bytes it must be passed as an *roByteArray* since strings may not contain NUL bytes.

To use a NUL byte as a line terminator:

```none
eol = CreateObject("roByteArray")
eol.Push(0)
mp = CreateObject("roMessagePort")
client = CreateObject("roTCPStream")
client.SetReceiveEol(eol)
client.SetLineEventPort(mp)
```

**SetMatcher(matcher As Object) As Boolean**

Instructs the stream to use the specified matcher. This object returns `True` if successful. Pass `Invalid` to this method to stop using the specified matcher.

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via SetUserData(). It will return `Invalid` if no data has been set.

## ifStreamSend

**SetSendEol(eol\_sequence As String) As Void**

Sets the EOL sequence when writing to the stream. The default value is CR (ASCII value 13). If you need to set this value to a non-printing character, use the `chr()` global function.

**SendByte(byte As Integer) As Void**

Writes the specified byte to the stream.

**SendLine(string As String) As Void**

Writes the specified characters to the stream followed by the current EOL sequence.

**SendBlock(a As Dynamic) As Void**

Writes the specified characters to the stream. This method can support either a string or an roByteArray. If the block is a string, any null bytes will terminate the block.

**Flush()**

## ifTCPStream

**GetFailureReason() As String**

Yields additional useful information if an roTCPStream method fails.

**ConnectTo(a As String, b As Integer) As Boolean**

Connects the stream to the specified host (designated using a dotted quad) and port. The function returns `True` upon success.

**Accept(a As Object) As Boolean**

Accepts an incoming connection event. The function returns True upon success.

**AsyncConnectTo(a As String, b As Integer) As Boolean**

Attempts to connect the stream to the specified host (designated using a dotted quad) and port. The function returns `False` if this action is immediately impossible (for example, when the specified host is not in the correct format). Otherwise, the function returns `True` upon success. The connect proceeds in the background, and an [roStreamConnectResultEvent](docId\:bTY_UwyK5Ty8xKbOahBEc) is posted when the connect attempt succeeds or fails, to the message port set by either `SetLineEventPort()` or  `SetByteEventPort()`.


[title] roIRReceiver
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object supports receiving arbitrary Infrared remote control codes using the NEC and RC5 protocols. The JavaScript equivalent is [BSIRReceiver](docId\:W5oQmfTxhlg8lwisWtg7r).

Object Creation: The *roIRReceiver* object is created with an associative array.

```text
CreateObject("roIRReceiver", config As roAssociativeArray)
```

The associative array can contain the following parameters:

- `source`: A string value indicating the source of the input.
  - "IR-in": The 3.5mm IR input/output connector&#x20;
  - "Type-C": Cable input over USB for LS players
  - "GPIO": Pin 1 of the GPIO connector
  - "Iguana": The [Iguanaworks](http://iguanaworks.net/) IR transceiver. This source can support both NEC and RC5 encodings simultaneously.
  - “tvcontroller” : This virtual IR driver is only available on BrightSign built-in products. It reads the IR messages from UART and drives the roIRReceiver object like other IR receivers. See the Examples section.
- `encodings`: An array indicating the required encodings.
  - "NEC"
  - "RC5" (supported on the Iguanaworks IR transceiver only)

NEC codes are expressed in 24 bits:

- Bits 0-7: Button code
- Bits 8-23: Manufacturer code

:::hint{type="info"}
If the manufacturer code is zero, then the code is considered to be intended for the Roku SoundBridge remote control.
:::

The *roIRReceiver* object can generate the following events:

- *roIRDownEvent*: Generates when a button is pressed.
- *roIRRepeatEvent*: Generates when a button repeats.
- *roIRUpEvent* (Iguanaworks IR transceiver only): Generates when a button is released

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifMessagePort

### SetPort(port As roMessagePort)

Specifies the port that will receive events generated by the *roIRReceiver* instance.

## Examples

### Connecting a USB-C port to an IR receiver

:::hint{type="info"}
Series 4 and 5 LS players (LS424, LS425, and LS445) are the only models that support IR input on the Type C connector. A special cable is also required: either an adapter (3.5mm plug to 3.5mm socket crossover), or custom all-in-one cable (LiteOn PN 306300009327).
:::

```text
'2-3-23 - V1.12 Test IR input, output to system log
 
Sub Main()
scriptlog = CreateObject("roSystemLog")   'display messages in system log
msgPort = CreateObject("roMessagePort")
gpioPort = CreateObject("roGpioControlPort")
gpioPort.SetPort(msgPort)
  
configIR = CreateObject("roAssociativeArray")
'Built-in IR via usb c
configIR.source = "TypeC"
configIR.encodings = CreateObject("roArray", 1, false)
configIR.encodings[0] = "NEC"
IRRecep = CreateObject("roIRReceiver", configIR)
  
if (type(IRRecep) = "roIRReceiver") then
    IRRecep.SetPort(msgPort)
    scriptlog.SendLine(" @@@@ Please press a button on remote control to display IR code... ")
else if IRRecep = invalid then
    scriptlog.SendLine(" @@@@ IR receiver not detected, Please connect IR receiver and reboot player... ")
end if
  
Eventloop(msgport)
 
End Sub
 
 
Sub Eventloop(msgport as object)
    scriptlog = CreateObject("roSystemLog")   'display messages in system log
    while true
        event = wait(0, msgPort)
        scriptlog.SendLine("@@@@ Received event"+ type(event))  
        if (type(event) = "roIRDownEvent") then       
                IrData$ = stri(event)
                scriptlog.SendLine(" @@@@ "+IrData$)
        end If    
    End while
end Sub
```

### Creating a tvcontoller IR Receiver

```text
configIR = CreateObject("roAssociativeArray")
'tvcontroller IR type
configIR.source = "tvcontroller"
configIR.encodings = CreateObject("roArray", 0, false)
IRRecep = CreateObject("roIRReceiver", configIR)
```


[title] roBtManager
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object facilitates BLE one-way communication (i.e. "beaconing"): Use the *roBtManager* object to discover whether any BLE adapters are present and to send BLE advertisements using the adapters.

The JavaScript equivalent is [BSBtManager](docId\:Cf7q7xSA9dRtCq3bTXV-A).

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roBtEvent* to the attached message port. Use these messages to detect insertion or removal of Bluetooth adapters.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Retrieves an arbitrary object set via the `SetUserData()` method.

## ifIdentity

### GetIdentity() As Integer

Returns a unique number that can be used to identify events that originate from the object instance.

:::hint{type="info"}
The *ifIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::

## ifBtPeripheralManager

### GetFailureReason() As String

Returns additional diagnostic information if a method returns `False`.

### GetAdapterList() As roArray

Returns an array describing all available Bluetooth adapters. Each entry in the array consists of an associative array containing adapter properties. At present, each associative array contains a single `name` property that describes the adapter name. Use this method to determine if Bluetooth adapters are connected to the player.

Available as of BOS 9.0.198 and 9.1.21, this endpoint includes a boolean field in the returned array of adapter elements which indicates if the device is on or off.

### StopAdvertising() As Boolean

Stops all BLE advertisements. This method returns `True` on success and `False` on failure.

### GetAdvertisingList() As roArray

Returns an array describing all active Bluetooth advertisements. Each entry in the array consists of an associative array describing a single advertisement. The associative-array values correspond to the properties set using the `StartAdvertising()` method, but can also include default parameter values that were not set explicitly. Note that all UUID values will be returned in lowercase.

### StartAdvertising(data As roAssociativeArray) As Boolean

Begins transmitting a BLE "beacon" message. This method returns `True` on success and `False` on failure. Each message can contain data in a standard format or arbitrary custom values. The message format is specified using the `mode` parameter, and other required values in the associative array will depend on the value of this parameter:

- `mode:"beacon"`: This mode uses a simple beaconing format.
  - `beacon_uuid`: A string representation of a UUID, which can be in 16-bit, 32-bit, or 128-bit format. A 16-bit UUID must be exactly four hex digits with no punctuation;  a 32-bit UUID must be exactly eight hex digits with no punctuation; and a 128-bit UUID must be punctuated exactly as follows: "cd7b6f81-f738-4cad-aebf-d2a2ea36d996".
  - `beacon_major` <font color="#6B21A8">int: </font>The 2-byte Major value (0 to 65535)
  - `beacon_minor` <font color="#6B21A8">int: </font>The 2-byte Minor value (0 to 65535)
  - `beacon_level` <font color="#6B21A8">int</font> <font color="#14B8A6">optional</font>:  An 8-bit signed integer (-127 to 128) that corresponds to the measurement of the Tx power level (in dBm) at 1 meter. The default level is -60.
  - `beacon_manufacturer`<font color="#6B21A8">int</font> <font color="#14B8A6">optional</font>:  A 2-byte integer value (0 to 65535) specifying the beacon manufacturer. The default value is 76 (\&H4C).
  - `connectable` <font color="#6B21A8">bool</font> <font color="#14B8A6">optional</font>:  Whether the advertisement should be connectable or not. Advertisements are non-connectable by default.
  - `persistent`<font color="#6B21A8">bool</font> <font color="#14B8A6">optional</font>: Whether the advertisement should persist after every reboot. Beacon advertisements are persistent by default.
- `mode:"eddystone-url"`: This mode uses the [Eddystone-URL](https://github.com/google/eddystone/tree/master/eddystone-url) format.
  - `url`: The URL to encapsulate in the advertisement packet. If the URL is too long to fit in the packet, the `StartAdvertising()` call will return `False` and `GetFailureReason()` will report "Compressed URL is too long".
  - `tx_power` <font color="#6B21A8">int</font> <font color="#14B8A6">optional</font>:  The measurement of the Tx power level (in dBm) at 0 meters. The default value is -19, which corresponds to a level of -60dBm at 1 meter. The recommended calibration practice is to measure the RSSI in a circle at 1 meter from the beacon, then add 41 to the average measured signal strength to get the `tx_power` value: For example, measuring a -65dBm RSSI at 1 meter yields a TxPower value of -2.
    - Note that the `tx_power` value does not modify the power level of the Bluetooth transmitter (this requires [physical attenuation](docId\:WnlbAqwoS9ev7DitdDCnh)). Rather, the `tx_power` value is transmitted to Bluetooth clients in the BLE advertisement. Clients can then compare this value to the current RSSI of the signal to determine their approximate distance from the beacon.
  - `connectable` <font color="#6B21A8">bool</font> <font color="#14B8A6">optional</font>: Whether the advertisement should be connectable or not. Advertisements are non-connectable by default.
  - `persistent` <font color="#6B21A8">bool</font> <font color="#14B8A6">optional</font>:  Whether the advertisement should persist after every reboot. Eddystone-URL advertisements are persistent by default.
- `mode:"eddystone-uid"`: This mode uses the [Eddystone-UID](https://github.com/google/eddystone/tree/master/eddystone-uid) format.
  - `namespace`: A 10-byte value expressed as 20 hexadecimal digits
  - `instance`: A 6-byte value expressed as 12 hexadecimal digits
  - `tx_power` <font color="#6B21A8">int</font> <font color="#14B8A6">optional</font>:   Specifies the Tx power level in dBm at 0 meters. The default value is -19, which corresponds to a level of -60dBm at 1 meter. The recommended calibration practice is to measure at 1 meter and add 41: For example, -65dBm RSSI leads to a value of -24.
  - `connectable` <font color="#6B21A8">bool</font> <font color="#14B8A6">optional</font>: Whether the advertisement should be connectable (for GATT or other services).  Advertisements are non-connectable by default.
  - `persistent` <font color="#6B21A8">bool</font> <font color="#14B8A6">optional</font>: Whether the advertisement should persist after every reboot. Eddystone-URL advertisements are not persistent by default.
- `mode:"custom"`: This mode supports arbitrary custom data in a vendor-specific field. 
  - `cutom_manufacturer_data` <font color="#14B8A6">optional:</font> An associative array containing two keys:
    - `manufacturer`: A 2-byte integer value (0 to 65535)
    - `data`: An *roByteArray* instance containing data
  - `service_uuid` <font color="#14B8A6">optional</font>: A set of ServiceUUID elements, which can be specified as either an array of UUID strings or an array of associative arrays containing a `uuid` key/value pair. Each associative array can also contain a `data` key, which specifies ServiceData as an *roByteArray* instance.
  - `connectable` <font color="#6B21A8">bool</font> <font color="#14B8A6">optional</font>: Whether the advertisement should be connectable or not. Advertisements are non-connectable by default.
  - `persistent` <font color="#6B21A8">bool</font> <font color="#14B8A6">optional</font>:  Whether the advertisement should persist after every reboot. Custom advertisements are not persistent by default.

To specify multiple advertisements, pass an array of associative arrays to the `StartAdvertising()` method. Advertisements will be sent in rotation. The method will fail if one or more advertisement is incorrect—try each advertisement individually and call `GetFailureReason()` to determine which advertisement is causing the error.

Calling the `StartAdvertising()` method will replace any previous advertisements. You can change a list of advertisements by modifying the array and calling `StartAdvertising()` again.

## Examples

This script uses *roBtManager.GetAdapterList()* to determine if there are any Bluetooth adapters available:

```text
btm = CreateObject("roBtManager")
if btm.GetAdapterList().Count() > 0 then print "Bluetooth available"
```

This script constructs two associative arrays for advertising with the "beacon" format and then broadcasts them both:

```text
adv1 = { mode : "beacon", beacon_uuid : "41fac2b21-c8cb-41e7-b011-12d1016dd39e", beacon_major : 400, beacon_minor : 22 }
adv2 = { mode : "beacon", beacon_manufacturer: &H4C, beacon_uuid : "41fac221-c8cb-41e7-b011-12d1016dd39e", beacon_major : &H1234, beacon_minor : &HFF01, beacon_level : -50 }
 
advlist = [adv1, adv2]
bm.StartAdvertising(advlist)
```

The associative array can also be constructed in parts:

```text
adv1 = { mode: "beacon"}
adv1.Append({ beacon_uuid : "41fac221-c8cb-41e7-b011-12d1016dd39e" })
adv1.Append({ beacon_major : 32000, beacon_minor : 100 })
```

This script constructs an advertisement with the "Eddystone-URL" format. It uses the optional `tx_power` parameter as well:

```text
adv1 = { mode: "eddystone-url", url: "http://www.brightsign.biz", tx_power: -24}
```

This script constructs a custom-formatted advertisement:

```text
custom_adv = CreateObject("roByteArray")
custom_adv.FromHexString("0215434B2EB8C28F40898E7A1E644BB13B9FA000B001C5")
adv2 = { mode : "custom", custom_manufacturer_data : { manufacturer: &H4C, data : custom_adv } }
```


[title] roDatagramSocket
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

:::hint{type="danger"}
Use this object to receive multicast packets and join a multicast group by calling the `JoinMulticastGroup()` method.
:::

This object both sends and receives UDP packets. Use *roDatagramSocket* if you need the player to communicate using protocols such as SSDP, which only allow a server to respond to the source of a received request. The JavaScript equivalent is Node.js Dgram API.

Received packets are delivered to the message port as *roDatagramEvent* objects.

## ifDatagramSocket

### GetFailureReason() As String

Returns additional information if the `BindToLocalPort` or `Sendto` methods fail.

### BindToLocalPort(port As Dynamic) As Boolean

Prepares to accept incoming UDP packets on the specified port. Passing an integer to this method will specify a standard port number. This method can also accept an associative array to provide more control over the binding. The associative array must contain the `port` but can also contain the `interface` name. This method returns `True` upon success and `False` upon failure.

- `port` <font color="#704ae0">integer</font>: The local port number to bind to.
- `interface` <font color="#704ae0">integer</font> or <font color="#704ae0">string</font>: Either the name of a network interface as a string (such as "eth0" or "wlan0") or the integer associated with the network interface index:
  - -1: Any (this is the default value)
  - 0: Ethernet
  - 1: WiFi
  - 2: Modem
  - 32767: Loopback (i.e. packets will only be received from within the player itself)

### GetLocalPort() As Integer

Returns the local port to which the socket is bound. Use this method if you passed a port number of 0 to `BindToLocalPort` and need to determine which port the player has selected.

### SendTo(destination\_address As String, destination\_port As Integer, packet As Object) As Integer

Sends a single UDP packet, which can be an *roString* or *roByteArray*, to the specified address and port. This method returns 0 upon success and a negative error code upon failure.

### JoinMulticastGroup(address as String) as Boolean

Joins the multicast group for the specified address on all interfaces that are currently up. This method returns `True` upon success and `False` upon failure. In the event of failure, `GetFailureReason()` may provide additional information. To ensure that you are joined on all network interfaces, you should register for *roNetworkHotplug* events and call the `JoinMulticastGroup()` method in response to the arrival of new networks.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roDatagramEvent* to the attached message port.

## ifIdentity

### GetIdentity() As Integer

:::hint{type="info"}
The *ifIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::


[title] roSequenceMatcher
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object is used to send *roSequenceMatchEvent* events when the specified byte sequence patterns are matched. Once a pattern has been matched and the event has been posted, all contributing bytes are discarded. As a result, if one pattern is a prefix of another pattern, then the second, longer pattern will never be matched by the object.

This object provides both a standard interface and an overloaded interface for sending events to a message port.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roSequenceMatchEvent* to the attached message port.

## ifSequenceMatcher

### SetPort(a As Object)

Specifies the message port where *roSequenceMatchEvent* objects will be posted.

### Add(pattern As Object, user\_data As Object) As Boolean

Adds a pattern to be matched by the *roSequenceMatcher* object instance. The pattern should be specified as an object that is convertible to a byte sequence (e.g. *roByteArray*, *roString*). For the user data, pass the object that should be returned if the specified pattern is matched.

## Example

```text
Function FromHex(hex as String) as Object
    bytes = CreateObject("roByteArray")
    bytes.FromHexString(hex)
    return bytes
End Function
 
Sub Main()
    serial = CreateObject("roSerialPort", 1, 115200)
    mp = CreateObject("roMessagePort")
 
    button1_seq = FromHex("080a01040001e000")
    button2_seq = FromHex("080e01040001e000")
 
    matcher = CreateObject("roSequenceMatcher")
    matcher.SetMessagePort(mp)
    matcher.Add(button1_seq, { name: "button1" })
    matcher.Add(button2_seq, { name: "button2" })
    matcher.Add("flibbet", { name: "flibbet" })
    matcher.Add("flobbet", { name: "flobbet" })
 
    if not serial.SetMatcher(matcher) then
       stop
    end if
 
    finished = false
    while not finished
       ev = mp.WaitMessage(10000)
       if ev = invalid then
           finished = true
       else if type(ev) = "roSequenceMatchEvent" then
           print "Got button: "; ev.GetUserData().name
       else
           print "Unexpected event: "; type(ev)
       end if
    end while
End Sub
```


[title] roCecInterface
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object provides access to the HDMI® CEC channel.

Object Creation: The *roCecInterface&#x20;*&#x6F;bject can be created with no parameters if the interface is on HDMI-1:

```text
CreateObject("roCecInterface")
```

If the user wants to use CEC on other HDMI ports, they must specify the port name during object creation, where possible values for `port` are `hdmi-1`, `hdmi-2`, `hdmi-3`, `hdmi-4`, `hdmi-in`:

```text
CreateObject("roCecInterface", port as String)
```

When possible, JavaScript APIs should be used instead of BrightScript-Javascript Objects. The JavaScript API equivalent to this object is [cec](docId\:sgfokqfxwmjxxOfS13HtK).

## IfCecInterface

### SendRawMessage(packet As roByteArray) As Void

Sends a message on the CEC bus. The frame data should be provided as an *roByteArray*, with the destination address in the low 4 bits of the first octet.

The system software automatically replaces the high 4 bits of the first octet with the source address. It also copies the physical address of the player into the following messages automatically prior to transmission: ActiveSource, InactiveSource, SystemAudioModeRequest.

Sending the CEC commands for Standby and Wake will be reflected in the HDMI sensing  after a delay. We recommend waiting for at least five seconds before requesting the `GetHdmiOutputStatus()` output\_powered status.

:::hint{type="info"}
As of BrightSign OS 8.2.55, the CEC implementation for AU series 5 products will reply to these messages with the correct data, without involving the script:

- CEC\_MSG\_GET\_CEC\_VERSION
- CEC\_MSG\_ABORT
- CEC\_MSG\_GIVE\_DEVICE\_POWER\_STATUS
- CEC\_MSG\_GIVE\_OSD\_NAME
- CEC\_MSG\_GIVE\_DEVICE\_VENDOR\_ID
- CEC\_MSG\_GIVE\_FEATURES
- CEC\_MSG\_GIVE\_PHYSICAL\_ADDR
- CEC\_MSG\_USER\_CONTROL\_PRESSED
- CEC\_MSG\_USER\_CONTROL\_RELEASED
- CEC\_MSG\_REPORT\_PHYSICAL\_ADDR
:::

:::hint{type="success"}
Use the `UseInitiatorAddressFromPacket()` method to prevent the system software from replacing source bits.
:::

### UseInitiatorAddressFromPacket(enable As Boolean) As Boolean

Removes the source address included in CEC messages by system software if passed `true`. This method allows you to transmit unmodified bytes via CEC.

### GetLogicalAddress() As Integer

Returns the current logical address. This method will return the unregistered address (0x0f) to indicate that the logical address has not been negotiated. In this case, messages can still be sent, but the receivers will behave differently and may not process all messages.

### EnableCecDebug(filename As String) As Void

Enables CEC debugging. This method will write a log of all CEC packets to the specified file.

### GetPhysicalAddress() As roByteArray

Returns the CEC physical address, which is sometimes required when processing CEC messages.

### PortName ()

Optional. This can be:

- default: the default output for the platform, normally HDMI-1
- HDMI-X : X is a number from 1 up to the number of HDMI outputs on the platform
- eARC: on the AU335 (the default)

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via SetUserData(). It will return Invalid if no data has been set.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roCecRxFrameEvent and roCecTxCompleteEvent* to the attached message port.

## Example

See the BrightScript [roCecInterface example on GitHub](https://github.com/brightsign/dev-cookbook/tree/main/examples/cec-interface/brightscript).


[title] roHttpServer
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object allows for processing of RESTful HTTP/HTTPS requests from remote URLs to the embedded web server of the BrightSign player. Many of the requests are provided to the script as *roHttpEvent* objects for handling. The JavaScript equivalent is Node.js.

Object Creation: The *roHttpServer* object is created with an *roAssociativeArray*.

```text
CreateObject("roHttpServer", parameters As roAssociativeArray)
```

The associative array can contain the following parameters:

- `port` <font color="#6B21A8">int</font>: The port number of the embedded web server
- `https` <font color="#6B21A8">roAssociativeArray</font>: A set of HTTPS configuration parameters:
  - `key_file` <font color="#6B21A8">string</font>: The name of a file containing the private key in PEM format. If neither the `passphrase` nor `obfuscated_passphrase` are passed, then the key file must be unencrypted.
  - `certificate_file` <font color="#6B21A8">string</font>: The name of a file containing the certificate in PEM format
  - `passphrase` <font color="#6B21A8">string</font>: The passphrase to decrypt the key file
  - `obfuscated_passphrase` <font color="#6B21A8">string</font>: The obfuscated passphrase to decrypt the key file. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.
- `bind_to_interface` <font color="#6B21A8">string</font> or <font color="#6B21A8">int</font>: Accept connections on the specified network interface only. Using a string interface name (e.g. “eth0” for Ethernet, “wlan0” for WiFi, “lo” for loopback) is preferred. An integer is supported for backward compatibility with `0` for Ethernet, `1` for WiFi and `32767` for loopback. This is available as of BOS 9.1.92.

:::hint{type="info"}
If the key and certificate are contained in a single file, it may be passed as the `certificate_file` (and the `key_file` can be omitted).
:::

Example

```text
 server = CreateObject("roHttpServer", { port: 443, https: { certificate_file: "cert.pem", passphrase: "sekrit" } })
```

## ifHttpServer

Each “Add” handler method described below takes an associative array as its parameter. Values in the associative array specify how the handler behaves. See the table at the end of this section for common `key:value` pairs.

### GetFailureReason() As String

Yields additional useful information if an *roHttpServer* method fails.

### AddGetFromString(parameters As roAssociativeArray) As Boolean

Causes any HTTP GET requests for the specified URL path to be met directly with the contents of the "body" member of the parameter associative array. The MIME type (and potentially the entire character set) should be specified if the request is expected to come from a web browser. The request is handled entirely within the *roHttpServer* method; no events are sent to the message port.

### AddGetFromFile(parameters As roAssociativeArray) As Boolean

Causes any HTTP GET requests for the specified URL path to be met directly from the specified file. You should always specify the MIME type (and possibly the character set) if you expect the request to come from a web browser. The request is handled entirely within the *roHttpServer* method; no events are sent to the message port.

### AddGetFromFolder(parameters As roAssociativeArray) As Boolean

Constructs a dynamic handler that serves up static files, which will appear as children of the defined storage folder. This method accepts an associative array with the following parameters:

- `folder`: The file path of the folder that will act as the root directory of the server. If this parameter is absent, everything on the storage device will be served.
- `url_prefix`: The URL prefix under which files will be served. If this parameter is absent, the URL will match from root.
- `filters`: An array of filters. Each filter is an associative array with the following parameters. Note that if "re" and "ext" parameters are absent, the filter will match everything:
  - `re`: The regular expression to match against the request URL.
  - `ext`: The extension to match against the leaf file of the request URL.
  - `headers` : An associative array containing arbitrary headers to be included with the automatic response.
  - `content_type` : The contents of the "Content-Type" header included with the automatic response. This cannot be set in the same filter as the headers. The MIME type and character set can be specified together `(e.g. "text/plain; charset=utf-8")` .

You must define all of the folder content types for the folder to be correctly uploaded to the server. For example:

```text
mimeTypes = [{ext: ".html", content_type:"text/html;charset=utf-8"},{ext: ".js", content_type:"text/javascript;charset=utf-8"},{ext: ".css", content_type:"text/css;charset=utf-8"},{ext: ".png", content_type:"image/png"},{ext: ".otf", content_type:"font/otf"}]

server.AddGetFromFolder({ url_prefix: "/GetFolder", folder: "Example", filters: mimeTypes})
```

### AddGetFromEvent(parameters As roAssociativeArray) As Boolean

Requests that an event of type *roHttpEvent* be sent to the configured message port. This occurs when an HTTP GET request is made for the specified URL path.

### AddPostToString(parameters As roAssociativeArray) As Boolean

Requests that an event of type *roHttpEvent* be sent to the configured message port. This occurs when an HTTP POST request is made for the specified URL path. Use the *roHttpEvent.GetRequestBodyString()* method to retrieve the posted body.

### AddPostToFile(parameters As roAssociativeArray) As Boolean

Requests that, when an HTTP POST request is made to the specified URL path, the request body be stored in a temporary file according to the `parameters["destination_directory"]` value in the associative array. When this request is complete, an *roHttpEvent* event is sent to the configured message port. Use the *roHttpEvent.GetRequestBodyFile()* method to retrieve the name of the temporary file. If the file still exists at the time the response is sent, it will be automatically deleted. However, if the player reboots or loses power during the POST process, the file will not be deleted. For this reason, we recommend using a dedicated subdirectory as the `"destination_directory"` and wiping this subdirectory during startup (using `DeleteDirectory()`) before adding handlers that refer to it.

### AddPostToFormData(parameters As roAssociativeArray) As Boolean

Requests that, when an HTTP POST request is made to the specified URL path, an attempt be made to store form data (passed as `application/x-www-form-urlencoded` or `multipart/form-data`) in an associative array that can be retrieved by calling the *roHttpEvent.GetFormData()* method.

### AddMethodFromEvent(parameters As roAssociativeArray) As Boolean

Requests that an event of type *roHttpEvent* be sent to the configured message port. Unlike `AddGetFromEvent()`, this method can support arbitrary HTTP methods. The HTTP method is specified using the method member in the associative array.

### AddMethodToFile(parameters As roAssociativeArray) As Boolean

Requests that, when an arbitrary HTTP request is made to the specified URL path, the request body be stored in a temporary file according to the `parameters["destination_directory"]` value in the associative array. The HTTP method is specified using the `method` member in the associative array. When the request is complete, an *roHttpEvent* event is sent to the configured message port. Use the *roHttpEvent.GetRequestBodyFile()* method to retrieve the name of the temporary file. If the file still exists at the time the response is sent, it will be automatically deleted.

### AddMethodToString(parameters As roAssociativeArray) As Boolean

Attempts to support an arbitrary HTTP method. The request body is placed in a string and an event is raised. This makes the request body available via the *roHttpEvent.GetRequestBodyString()* method. A response can be sent in the same manner as the `AddGetToEvent()` method.

### SetupDWSLink(title As String) As Boolean

Generates a tab in the [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM) that links directly to the base \<ip\_address\:port> of the *roHttpServer* instance. The passed string specifies the title of the tab.

Example

```text
server1.SetupDWSLink("My AWS Link")
server2.SetupDWSLink("My Other AWS Link")
```

### Parameters for "Add" Handler Methods 

The following table describes common key\:value pairs for "Add" handler methods:

| **Name**               | **Applies to**                                                                               | **Value**                                                                                                                                                                                                                                        |
| ---------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| url\_path              | All                                                                                          | The path for which the handler method will be used                                                                                                                                                                                               |
| user\_data             | AddGetFromEvent()<br /><br />AddPostToString()<br />AddPostToFile()<br />AddMethodToString() | A user-defined value that can be retrieved by calling *roHttpEvent.GetUserData()*                                                                                                                                                                |
| method                 | AddMethodFromEvent()<br />AddMethodToFile()                                                  | The HTTP method associated with the generated *roHttpEvent*. The method type can then be retrieved using *roHttpEvent.GetMethod()*.                                                                                                              |
| passwords              | All                                                                                          | An associative array that contains a mapping between usernames and passwords                                                                                                                                                                     |
| auth                   | All                                                                                          | The authentication type to use when passwords are set. This value can be either "basic" or "digest". The value defaults to “digest” if not specified.                                                                                            |
| realm                  | All                                                                                          | The authentication realm, which will be displayed by web browsers when prompting for a username and password                                                                                                                                     |
| headers                | AddGetFromFile()                                                                             | An associative array that contains arbitrary headers to be included with the automated response                                                                                                                                                  |
| content\_type          | AddGetFromFile()                                                                             | The contents of the "Content-Type" header that is included with the automated response. This may not be set at the same time as the headers member. You can set both the MIME type and character set together (e.g. "text/plain; charset=utf-8") |
| body                   | AddGetFromString()                                                                           | The response body                                                                                                                                                                                                                                |
| filename               | AddGetFromFile()                                                                             | The path to the file used for the response body.                                                                                                                                                                                                 |
| destination\_directory | AddPostToFile()                                                                              | The path to the directory used for the temporary file containing the request body. A random filename will be generated automatically.                                                                                                            |

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roHttpEvent*  to the attached message port.

[title] roUsbFilesystem
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object allows supported BrightSign players to expose a local file as a USB mass storage device when connected to a USB host port on another device (for example, a PC or television.) The host acts as if it is talking to a USB thumb drive or USB hard drive, but the reads and writes go to the specified local file on the BrightSign. It requires a file containing a filesystem. One way to make such a file is:

```none
dd if=/dev/zero of=/storage/sd/test.img bs=4k count=2k
mkfs.vfat /storage/sd/test.img
```

Normally the local file would be prepared beforehand with a filesystem offline (any method that captures a raw copy of a filesystem should work).

BrightSign players with USB-C (except for LS3 and LS4) can use this object.

## ifUsbFilesystem

**Enable(filename As String) As Boolean**

Expose an existing filesystem image as a USB mass storage device.

**Disable() As Boolean**

Remove an existing filesystem image as a USB mass storage device.

## Examples

To create a filesystem (using the file from the example above):

```none
fs = CreateObject("roUsbFilesystem")
result = fs.Enable(

{filename: "SD:test.img"}

)
```

The result is a boolean. A result of `true` means that the filesystem has been successfully created.

## To remove a filesystem:

```none
result = fs.Disable()
```


[title] roUPnPActionResult
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object contains the results of an roUPnPService.Invoke() call. It is important to match the transaction ID of this object with the value returned by the `Invoke()` method.

## ifUPnPActionResult

**GetType() As Integer**

Returns the result type, which can be one of the following:

- 1 – Invoke result
- 2 – Subscribe result

**GetID() As Integer**

Returns the transaction ID of the result as an integer. Use it to match the roUPnPActionResult instance with the `roUPnPService.Invoke()` call that generated it.

**GetResult() As Boolean**

Returns True if the originating `Invoke()` call was successful.

**GetValues() As roAssociativeArray**

Returns an associative array containing the "out" values (if any) of the originating `Invoke()` call.

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.


[title] roCecTxCompleteEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

If an *roMessagePort* is attached to an *roCecInterface* instance, it may receive events of type *roCecTxCompleteEvent*.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned by `GetUserData()`.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifCecTxCompleteEvent   

### GetStatusByte() As Integer

Returns the message data as an integer.

|     |                                           |
| --- | ----------------------------------------- |
| 0   | Transmission successful                   |
| 128 | Unable to send, CEC hardware powered down |
| 129 | Internal CEC error                        |
| 130 | Unable to send, CEC line jammed           |
| 131 | Arbitration error                         |
| 132 | Bit-timing error                          |
| 133 | Destination address not acknowledged      |
| 134 | Data byte not acknowledged                |


[title] roNetworkStatistics
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object allows you to monitor and post how much bandwidth the player is using.

Object Creation: The *roNetworkStatistics* object is created with a single parameter.

```text
CreateObject("roNetworkStatistics", network_interface as Integer)
```

The network\_interface parameter is used to distinguish between the following:

- 0: The Ethernet port on the BrightSign player.
- 1: The optional internal Wi-Fi.

## ifNetworkStatistics

### GetTotals() As roAssociativeArray

Yields the total network figures since booting up.

### GetIncremental() As roAssociativeArray

Yields the total network figures since booting up. Then, every subsequent time this method is called, it will yield the amount each figure has changed since the previous call.

:::hint{type="info"}
If multiple instances of roNetworkStatistics are created, GetIncremental() calls for each instance will track changes independently.
:::

Both methods return the following statistics as floating point values:

- tx\_carrier\_errors
- tx\_packets 
- rx\_packets 
- tx\_errors
- rx\_frame\_errors
- tx\_bytes
- rx\_errors
- tx\_collisions
- rx\_dropped
- tx\_compressed
- rx\_multicast
- tx\_dropped
- rx\_fifo\_errors
- rx\_bytes
- tx\_fifo\_errors
- rx\_compressed

[title] roUPnPSearchEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This event object is returned when there is a response to a *roUPnPController.Search()&#x20;*&#x6F;peration. It is also returned when the *roUPnPController&#x20;*&#x6F;bject receives multicast UDP SSDP messages.

## ifUPnPSearchEvent

**GetObject() As Object**

Returns either an roUPnPDevice or an roAssociativeArray instance, depending on the value returned from the GetType() method.

**GetType() As Integer**

Returns an integer value indicating the type of response:

- 0 (Advertisement) – Indicates the receipt of an SSDP multicast message, which can be either a NOTIFY message or an M-SEARCH message. The `GetObject()` method will return an associative array with all SSDP headers and an "ssdpType" key, which can have a value of either "m-search" or "notify".
- 1 (Search response) – Indicates that the message is a response to an *roUPnPControllor.Search()&#x20;*&#x72;equest. The `GetObject()` method will return an associative array with all headers from the HTTP M-SEARCH response.
- 2 (New device added to the device list) – Indicates that the *roUPnPController&#x20;*&#x6F;bject has detected a new device and added it to the device list, which is maintained internally. Device detection can result from receiving either an `ssdp:alive` message or a response to an M-SEARCH message. The `GetObject()` method will return an *roUPnPDevice&#x20;*&#x69;nstance containing information about the added device. This message type is only delivered once per new device. Once a device is part of the device list, subsequent M-SEARCH requests will only return type 1 (Search response) values for that device.
- 3 (Device will be deleted from the device list) – Indicates that a device will be deleted from the device list, which is maintained internally. A device is deleted from the list when the player receives an ssdp\:byebye message from the device, when the device does not send an `ssdp:alive` message within the defined "max-age" interval, or when the device is forcibly removed using the *roUPnPController.RemoveDevice()&#x20;*&#x6D;ethod. The `GetObject()` method will return an *roUPnPDevice&#x20;*&#x69;nstance containing information about the device to be removed.

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.


[title] roBtClientManagerEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This event object is generated by the  [roBtClientManager](docId\:j-50zRJY-jTWE5E5SWoO-) object when a BLE client connects to or disconnects from the player.

## ifBtEvent

### GetEvent() As String

Returns the name of the event, which can be one of the following:

- `"client-new"`: This value is returned the first time a client connects only.
- `"client-delete"`: This value is returned when a client reaches the `client-timeout` interval and is disconnected.

### GetClient() As roBtClient

Returns the [roBtClient](docId\:fDPNJsZ_TkIciApE63OL9) object for the client associated with the event.

## ifUserData

### SetUserData(user\_data As Object) As Void

Sets the user data.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` (on either the event or source object). It will return `Invalid` if no data has been set.

[title] roRssArticle
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

Objects of type *roRssArticle* are returned by the *roRssParser.GetNextArticle()* method. These instances can be passed to the *roTextWidget* object to display the feed on-screen.

## ifRssArticle

### GetTitle() As String

Returns the title of the RSS item.

### GetDescription() As String

Returns the content of the RSS item.

### GetTimestampInSeconds(a As Integer) As Boolean

Returns in seconds the difference in publication date between this RSS item and the most recent item in the feed. The user can utilize this to decide if an article is too old to display.

### SetTitle(a As String) As Boolean

### SetDescription(a As String) As Boolean

### SetTimestampInSeconds(a As Integer) As Boolean

:::hint{type="danger"}
For firmware versions 4.7.x and above, if no alpha value is specified when *roTextWidget.SetForegroundColor()* is called, the text widget area will appear blank.
:::

### Example

```text
u=CreateObject("roUrlTransfer")
u.SetUrl("http://www.lemonde.fr/rss/sequence/0,2-3208,1-0,0.xml")
u.GetToFile("tmp:/rss.xml")
 
r=CreateObject("roRssParser")
r.ParseFile("tmp:/rss.xml")
 
EnableZoneSupport(1)
b=CreateObject("roRectangle", 0, 668, 1024, 100)
t=CreateObject("roTextWidget", b, 3, 2, 2)
t.SetForegroundColor(&hFFD0D0D0)
t.Show()
 
a = r.GetNextArticle()
while type(a) = "roRssArticle"
       t.PushString(a.GetDescription())
       sleep(1000)
       a = r.GetNextArticle()
end while
 
while true
       sleep(1000)
end while
```


[title] roMimeStream
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object passes an MJPEG stream in MIME format to the *roVideoPlayer.PlayFile()* method. There are some limitations to what MJPEG streams this object will play correctly. *roMimeStream* has been optimized to play streaming video from a local source with the smallest possible delay. The result is a short buffering window that is not appropriate for playing MJPEG streams from URLs outside of a local network. We are currently optimizing *roMimeStream* to work with different IP camera brands: see [this page](docId:0er0hhTcryaPJTXszy_55) for more details. 

Object Creation: To play an RTSP stream, first instantiate an *roUrlTransfer* object. Then wrap it in an *roMimeStream* object and pass the `PictureStream` to `PlayFile`, as shown in the following example.

```text
u=createobject("roUrlTransfer")
u.seturl("http://mycamera/video.mjpg")
r=createobject("roMimeStream", u)
p=createobject("roVideoPlayer")
p.PlayFile({ PictureStream: r })
```

## ifPictureStream

### GetUrl() As String

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts event messages to the attached message port. The event messages are of the type *roMimeStreamEvent*. There are currently two possible event messages:

- PICTURE\_STREAM\_FIRST\_PICTURE\_AVAILABLE = 0: The first picture is now available for decoding.
- PICTURE\_STREAM\_CONNECT\_FAILED: The object is unable to connect to the specified URL.


[title] Networking Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/

This section describes objects related to networking, client/server applications, and feeds.

- [roConfigurationElements](docId\:eSF-7FbLTpvTZGUOOCGWw)
- [roDatagramEvent](docId:20x5PqKFaEzaWkAgxzC5g)
- [roDatagramReceiver](docId\:D3lIL84sO__uMKarlzk3a)
- [roDatagramSender](docId:0d6HQl54DijwccX2UPZGo)
- [roDatagramSocket](docId\:ZUDWyDM6EHQOv_lVI3Xm-)
- [roHttpEvent](docId:7Nc-irdxH3h6N6_UKnN_3)
- [roHttpServer](docId\:uUV7Nrfu-nVjS-oJtJHu6)
- [roKeyStore](docId\:GhSZNW9eS8TEMURQXq-DU)
- [roMediaServer](docId\:BDWn4_TJl6XXWSmHaDePm)
- [roMediaStreamer](docId\:pBwsApQAumkLztujrwCdw)
- [roMediaStreamerEvent](docId\:mbMvR8pWrI3BlehHuUOB7)
- [roMimeStream](docId\:dexds9uHtrfSeCjAOqVVn)
- [roMimeStreamEvent](docId\:o1f_d9fG4AS77mxrPnz-G)
- [roNetworkAdvertisement](docId\:yQWTvcJm15Y4G2jNw5d5y)
- [roNetworkAttached](docId\:wrxOOghI0XfxsynqOktNf)
- [roNetworkConfiguration](docId\:U6ZceYQddlz9xdAKtTmJs)
- [roNetworkDetached](docId\:b2OC8VrdNORy84OaiNKmr)
- [roNetworkDiscovery](docId\:faxPdpIeevhSmUJn7d-eS)
- [roNetworkHotplug](docId\:qjUpJH-HFFX_ggfQ66Uhv)
- [roNetworkStatistics](docId\:BUBMuOoVGwhL3S4e0vbZw)
- [roOpenVpn](docId\:h5YUKxL66nblm7KMrdhRK)
- [roPtp](docId\:tXL7eC4VhjsuHtu13JGqJ)
- [roPtpEvent](docId\:kn9-9kGcxrr4KnKgyQddo)
- [roRssArticle](docId:9AeVmF2qOHpvpfd7FEJnM)
- [roRssParser](docId:71mYpUqG9kQL0_ETu1E9S)
- [roRtspStream](#)
- [roSnmpAgent](#)
- [roSnmpEvent](#)
- [roStreamByteArrayEvent](docId\:NkOTuGdwq1IlDVISW4ggB)&#x20;
- [roStreamByteEvent](#)
- [roStreamConnectResultEvent](#)
- [roStreamEndEvent](#)
- [roStreamLineEvent](#)
- [roSyncManager](#)
- [roSyncManagerEvent](#)
- [roTCPConnectEvent](#)
- [roTCPServer](#)
- [roTCPStream](#)
- [roUPnPActionResult](#)
- [roUPnPController](#)
- [roUPnPDevice](#)
- [roUPnPSearchEvent](#)
- [roUPnPService](#)
- [roUPnPServiceEvent](#)
- [roUrlEvent](#)
- [roUrlTransfer](#)


[title] roUsbHidEmulator
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object allows you to emulate USB HID devices, but currently, the only supported type of device is a USB keyboard. 

When operating on an XT1145 or XT2145 on BOS version 9.0.157 or later, this code must be added in order to use this object:

```none
'updated code needed for new firmware
dc=CreateObject("roDeviceCustomization")
dc.ConfigureAsUsbGadget(1)
```

BrightSign players with USB-C (except for LS3 and LS4) can use this object.

:::hint{type="danger"}
USB keyboard codes are different from PS/2, ASCII, and BrightSign keyboard codes. 
:::

## ifUsbHidEmulator 

**Enable() As Boolean&#xA0;**

Enables the HID device. This method returns `true` on success. If there's a failure, use `GetFailureReason()` to get the reason for the failure.

**KeyDown(a As Integer) As Boolean&#xA0;**

Sends a keydown event for the specified USB key code. This method returns `true` on success. If there's a failure, use `GetFailureReason()` to get the reason for the failure.

:::hint{type="info"}
USB keyboards only have 6-key rollover, therefore only six keys can be down at one time.
:::

**KeyUp(a As Integer) As Boolean&#xA0;**

Sends a keyup event for the specified USB key code. This method returns `true` on success, and returns `fails` on failure (e.g. if the specified key was not already down). If there's a failure, use `GetFailureReason()` to get the reason for the failure.

**KeyPress(a As Integer) As Boolean&#xA0;**

Equivalent to `KeyDown(key code)` followed by `KeyUp(key code)`. This method allows you to avoid leaving keys stuck down.

**Clear() As Boolean&#xA0;**

Clears all active keystrokes and modifiers.

**GetModifierState() As Object**

Returns an associative array with the current state of all modifiers (i.e. shift, alt, ctrl). 

**SetModifierState(a As Object) As Boolean&#xA0;**

Sets the current modifier state as specified by an associative array. Only modifiers that are listed will cause the state to change. Modifiers will persist until changed or `Clear()` is called.

**Example**

```none
hidkey.SetModifierState({ LeftShift : true });
```

**GetLedState() As Object**

Returns an associative array with the current state of all LED states on the keyboard. 

:::hint{type="info"}
The host may send an LED state change if a lock key (i.e. Number Lock, Capital Lock, Scrolling Lock) is pressed, generating the [roUsbHidLedEmulatorEvent](docId\:KmQrsgxeYHahPvhlsvuAd) object. The `GetLedState()` method can be used to get the current LED state without using an event.
:::

## ifUserData

**SetUserData(user\_data As Object)&#xA0;**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object&#xA0;**

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifMessagePort

**SetPort(port as roMessagePort)**

Posts messages of type roUsbHidEmulatorLedEvent to the attached message port.

## ifFailureReason 

**GetFailureReason() As String&#xA0;**

Returns additional information if a method fails. 

 


[title] Input/Output Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/

This section describes objects that enable input/output functions on hardware interfaces.

- [roBtClient](docId\:fDPNJsZ_TkIciApE63OL9)
- [roBtClientEvent](docId\:dR0EfVD1O9JQa1mfa33AW)
- [roBtClientManager](docId\:j-50zRJY-jTWE5E5SWoO-)
- [roBtClientManagerEvent](docId:0ya2SsCmiDFpWj_6W_XVI)
- [roBtManager](docId\:AkMxi8IWh0ER_tQdIQ3Yg)
- [roCecInterface](docId\:ezdh3By8IIBWQKy04obzU)
- [roCecRxFrameEvent](docId\:vGTbcnOi3ErEzlFVtT2TJ)
- [roCecTxCompleteEvent](docId\:GQCbJyp8HOAohrHoK7RLy)
- [roChannelManager](docId\:WvjNFNpCUTEpMnVwJyaN_)
- [roControlPort](docId:8ExDHgmoHqig7J-UvfCe1)
- [roControlUp, roControlDown](docId:_58TKuomyoD8uRhrP3uqY)
- [roGpioButton](docId\:DUTv09XYpa7lTySy-frTJ)
- [roGpioControlPort](docId\:fOD8ep73RJeXZchR63g2t)
- [roIRDownEvent, roIRRepeatEvent, roIRUpEvent](docId\:SBfRttEfWDTwWftbLqVPA)
- [roIRReceiver](docId\:V64tnBwIZ1Ythcch9cmRR)
- [roIRRemote](docId\:S84MPE1R1QJ7aeHgOaJhH)
- [roIRRemotePress](docId\:V0MM7Udc6tqkjMhxAanJx)
- [roKeyboard](docId\:VNJf6GnS75_lMizET3b1y)
- [roKeyboardPress](docId\:N5E953JR46u7kp9QBWCp9)
- [roPowerEvent](docId\:BIXI0Amud1OwjRD4Wu5d2)
- [roPowerManager](docId\:xMGa2-Vd4P67rwO4CSu-_)
- [roSequenceMatcher](docId\:T_nMVz0-JW369pjtIA2vm)
- [roSequenceMatchEvent](docId\:K7E1EkURdYb7Zkho3g6Ia)
- [roSerialPort](docId:25Ega25ABzfTXgITvvmmS)
- [roIRTransmitCompleteEvent](docId\:eYkTkNDge--I1crdndv3o)
- [roIRTransmitter](#)
- [roUsbFilesystem](#)
- [roUsbHidEmulator](#)
- [roUsbHidLedEmulatorEvent](#)
- [roUsbPowerControl](#)


[title] roNetworkAttached
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object implements the *ifInt* and *ifString* interfaces to report the index of an attached [network interface](docId\:U6ZceYQddlz9xdAKtTmJs). Instances of this object are posted by [roNetworkHotplug](docId\:qjUpJH-HFFX_ggfQ66Uhv) when a configured network connection becomes available. For Ethernet, it may take some time after the cable is inserted for this to take place. The JavaScript equivalent is [networkhotplug](docId\:NEizLJQNwCice75OcWKoL).

## ifInt

### GetInt() As Integer

Returns the interface ID of the event. This method returns -1 VLAN interfaces; use `GetString()` to retrieve the interface name.

### SetInt(value As Integer) As Void

Sets the value that will be returned by `GetInt()`. 

## ifString

### GetString() As String

Returns the interface name ("eth0", "wlan0", "ppp0") of the *roNetworkConfiguration* instance associated with the event. 

### SetString(value As String) As Void

Sets the value that will be returned by `GetString()`. 

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` (either on the source or event object). This method will return Invalid if no data has been set.

[title] roGpioControlPort
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

:::hint{type="danger"}
New scripts should use *roControlPort* instead of *roGpioControlPort*.
:::

This object is used to control and wait for events on the BrightSign generic GPIO control port. Typically, LEDs or buttons are connected to the GPIO port. Turning on a GPIO output changes the voltage on the GPIO port to 3.3V. Turning off a GPIO output changes the voltage on the GPIO port to 0V.

The GPIO ports are bidirectional and must be programmed as either inputs or outputs. The IDs range from 0–7. The `SetWholeState()` method will overwrite any prior output settings. The `SetOutputState()` takes an output ID (1, 2, or 6, for example). The `SetWholeState()` method takes a mask (for example, `SetWholeState(SetWholeState(2^1 + 2^2)` will set IDs 1 and 2).

The JavaScript equivalent is [controlport](docId\:N8yoCsdAGOgqCP1OyuoLw).

## ifMessagePort

### SetPort(obj As Object) As Void

## ifGpioControlPort

### IsInputActive(input\_id As Integer) As Boolean

### GetWholeState() As Integer

### SetOutputState(output\_id As Integer, onState As Boolean) As Void

### SetWholeState(on\_state As Integer) As Void

### EnableInput(input\_id As Integer) As Boolean

### EnableOutput(output\_id As Integer) As Boolean

###


[title] roNetworkDetached
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object implements the *ifInt* interface to report the index of a detached [network interface](docId\:U6ZceYQddlz9xdAKtTmJs). Instances of this object are posted by [roNetworkHotplug](docId\:qjUpJH-HFFX_ggfQ66Uhv) when a configured network connection becomes unavailable. The JavaScript equivalent is [networkhotplug](docId\:NEizLJQNwCice75OcWKoL).

## ifInt

### GetInt() As Integer

Returns the interface ID of the event. This method returns -1 VLAN interfaces; use `GetString()` to retrieve the interface name.

### SetInt(value As Integer) As Void

Sets the value that will be returned by `GetInt()`. 

## ifString

### GetString() As String

Returns the interface name ("eth0", "wlan0", "ppp0") of the *roNetworkConfiguration* instance associated with the event. 

### SetString(value As String) As Void

Sets the value that will be returned by `GetString()`. 

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` (either on the source or event object). This method will return `Invalid` if no data has been set.

[title] roSystemTime
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Date and Time Objects/

This object provides the ability to read and write the time stored in the real-time clock (RTC). It can also be used to read and write the time-zone setting. The JavaScript equivalent is [systemtime](docId\:pwLrn-rjiHDHgwl2TBwC0).

:::hint{type="info"}
Dates up to January 1, 2038 are supported.
:::

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of the type *roNetworkTimeEvent* to the attached message port.

## ifSystemTime

### GetLocalDateTime() As roDateTime

Returns the current time from the RTC (modulated using the current time zone) as an *roDateTime* instance.

### GetUtcDateTime() As roDateTime

Returns the current time from the RTC (modulated using the UTC/GMT time zone) as an *roDateTime* instance.

### GetZoneDateTime(timezone\_name As String) As Object

Returns the current time from the RTC (modulated using the specified time zone) as an *roDateTime* instance. Supported time zones are listed below.

### SetLocalDateTime(local\_DateTime As roDateTime) As Boolean

Specifies a new time for the RTC using the current time zone.

### SetUtcDateTime(utc\_DateTime As roDateTime) As Boolean

Specifies a new time for the RTC using the UTC/GMT time zone.

### GetTimeZone() As String

Returns the current time-zone setting of the player. A `POSIX:` value is appended to the beginning of the string if the time zone has been set using the POSIX format.

### SetTimeZone(zone\_name As String) As Boolean

Specifies a new time-zone setting for the player (supported time zones are listed below). Alternatively, a POSIX formatted time zone can be applied by appending a `POSIX:` value to the beginning of the string.

The following code specifies a POSIX-formatted time zone:

```text
t = CreateObject("roSystemTime")
t.SetTimeZone("POSIX:GMT-0BST-1,M3.5.0/1:00,M10.5.0/2:00")
```

### IsValid() As Boolean

Returns `True` if the system time is set to a valid value. The time can be set from the RTC or with NTP.

### GetLastNetworkTimeResult() As roAssociativeArray

Returns an associative array containing information about the last attempt to set the time via the network:

- `success_timestamp`: A value indicating when the clock was last set successfully via the network. This value is zero if the clock has never been set successfully via the network.
- `attempt_timestamp`: A value indicating when the last attempt was made to set the clock via the network. This value is zero if no attempt has been made yet.
- `failure_reason`: If the last attempt to set the clock via the network failed, this string will contain an error message. If the last attempt was successful, this string will be empty.

In this associative array, "timestamp" refers to the number of seconds since the player booted. This value can be compared against the total uptime of the player, which is retrieved by calling `UpTime(0)`.

## Supported Time Zones 

The following are supported system time zones (this list does not apply to POSIX-formatted time zones):

- EST: US Eastern Time
- CST: US Central Time
- MST: US Mountain Time
- PST: US Pacific Time
- AKST: Alaska Time
- HST: Hawaii-Aleutian Time with no Daylight Savings (Hawaii)
- HST1: Hawaii-Aleutian Time with Daylight Saving
- MST1: US MT without Daylight Saving Time (Arizona)
- EST1: US ET without Daylight Saving Time (East Indiana)
- AST: Atlantic Time
- CST2: Mexico (Mexico City)
- MST2: Mexico (Chihuahua)
- PST2: Mexico (Tijuana)
- BRT: Brazil Time (Sao Paulo)
- NST: Newfoundland Time
- AZOT: Azores Time
- GMTBST: London/Dublin Time
- WET: Western European Time
- CET: Central European Time
- EET: Eastern European Time
- MSK: Moscow Time
- SAMT: Delta Time Zone (Samara)
- YEKT: Echo Time Zone (Yekaterinburg)
- IST: Indian Standard Time
- NPT: Nepal Time
- OMST: Foxtrot Time Zone (Omsk)
- JST: Japanese Standard Time
- CXT: Christmas Island Time (Australia)
- AWST: Australian Western Time
- AWST1: Australian Western Time without Daylight Saving Time
- ACST: Australian Central Standard Time (CST) with Daylight Saving Time
- ACST1: Darwin, Australia/Darwin, and Australian Central Standard Time (CST) without Daylight Saving Time
- AEST: Australian Eastern Time with Daylight Saving Time
- AEST1: Australian Eastern Time without Daylight Saving Time (Brisbane)
- NFT: Norfolk (Island) Time (Australia)
- NZST: New Zealand Time (Auckland)
- CHAST: , Fiji Time, , Fiji, Pacific/Fiji, Yankee Time Zone (Fiji)
- SST: X-ray Time Zone (Pago Pago)
- GMT: Greenwich Mean Time
- GMT-1: 1 hour behind Greenwich Mean Time
- GMT-2: 2 hours behind Greenwich Mean Time
- GMT-3: 3 hours behind Greenwich Mean Time
- GMT-3:30: 3.5 hours behind Greenwich Mean Time
- GMT-4: 4 hours behind Greenwich Mean Time
- GMT-4:30: 4.5 hours behind Greenwich Mean Time
- GMT-5: 5 hours behind Greenwich Mean Time
- GMT-6: 6 hours behind Greenwich Mean Time
- GMT-7: 7 hours behind Greenwich Mean Time
- GMT-8: 8 hours behind Greenwich Mean Time
- GMT-9: 9 hours behind Greenwich Mean Time
- GMT-9:30: 9.5 hours behind Greenwich Mean Time
- GMT-10: 10 hours behind Greenwich Mean Time
- GMT-11: 11 hours behind Greenwich Mean Time
- GMT-12: 12 hours behind Greenwich Mean Time
- GMT-13: 13 hours behind Greenwich Mean Time
- GMT-14: 14 hours behind Greenwich Mean Time
- GMT+1: 1 hour ahead of Greenwich Mean Time
- GMT+2: 2 hours ahead of Greenwich Mean Time
- GMT+3: 3 hours ahead of Greenwich Mean Time
- GMT+3:30: 3.5 hours ahead of Greenwich Mean Time
- GMT+4: 4 hours ahead of Greenwich Mean Time
- GMT+4:30: 4.5 hours ahead of Greenwich Mean Time
- GMT+5: 5 hours ahead of Greenwich Mean Time
- GMT+5:30: 5.5 hours ahead of Greenwich Mean Time
- GMT+6: 6 hours ahead of Greenwich Mean Time
- GMT+6:30: 6.5 hours ahead of Greenwich Mean Time
- GMT+7: 7 hours ahead of Greenwich Mean Time
- GMT+7:30: 7.5 hours ahead of Greenwich Mean Time
- GMT+8: 8 hours ahead of Greenwich Mean Time
- GMT+8:30: 8.5 hours ahead of Greenwich Mean Time
- GMT+9: 9 hours ahead of Greenwich Mean Time
- GMT+9:30: 9.5 hours ahead of Greenwich Mean Time
- GMT+10: 10 hours ahead of Greenwich Mean Time
- GMT+10:30: 10.5 hours ahead of Greenwich Mean Time
- GMT+11: 11 hours ahead of Greenwich Mean Time
- GMT+11:30: 11.5 hours ahead of Greenwich Mean Time
- GMT+12: 12 hours ahead of Greenwich Mean Time
- GMT+12:30: 12.5 hours ahead of Greenwich Mean Time
- GMT+13: 13 hours ahead of Greenwich Mean Time
- GMT+14: 14 hours ahead of Greenwich Mean Time


[title] roChannelManager
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

You can use this object to manage RF channel scanning and tuning. The *roVideoPlayer* method also has channel scanning capabilities.

Object Creation: The *roChannelManager* object is created with no parameters.

```text
CreateObject("roChannelManager")
```

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

## ifMessagePort

### SetPort(port As roMessagePort)

## ifChannelManager

The *ifChannelManager* interface provides both a Synchronous and Asynchronous API:

### Synchronous API

### Scan(parameters As roAssociativeArray) As Boolean

Performs a channel scan on the RF input for both ATSC and QAM frequencies and builds a channel map based on what it finds. The *roChannelManager* object stores a list of all channels that are obtained using the `CreateChannelDescriptor()` method (described below). The list is cleared on each call to `Scan()` by default, but this behavior can be overridden.

Each channel takes approximately one second to scan; you can limit the scope of the channel scan with the following parameters:

- \["ChannelMap"] = "ATSC" or "QAM": Limits the frequency scan to either QAM or ATSC.
- \["ModulationType"] = "QAM64" or "QAM256": Limits the modulation type of the scan to QAM64 or QAM256.
- \["FirstRfChannel"] = Integer and/or \["LastRfChannel"] = Integer: Limits the scan to the specified range of channels. The high end of the channel range is an optional parameter.
- \["ChannelStore"] = "DISCARD ALL" or "MERGE": Controls how the script handles previous channel scan information. The default setting is DISCARD ALL, which clears all channel data prior to scanning. On the other hand, MERGE overwrites the data only for channels specified in the scan.

### GetChannelCount() As Integer

Returns the number of found channels.

### ClearChannelData() As Boolean

Clears all stored channel scanning data, including that which persists in the registry. This method also cancels any `AsyncScan()` calls that are currently running.

### GetCurrentSnr() As Integer

Returns the SNR (in centibels) of the currently tuned channel.

### ExporttoXML() As String

Serializes the contents of RF channels into XML. You can write the XML to a file that can be used at a later point on the same or other units. See below for an example of XML output.

### ImportFromXML(a As String) As Boolean

Retrieves the RF channel contents stored as XML. The formatting of the XML is controlled using version tags.

Example:

```text
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="7">
<ChannelList class_id="0" tracking_level="0" version="0">
<ChannelCount>2</ChannelCount>
<Channel class_id="1" tracking_level="0" version="0">
<RfChannel>42</RfChannel>
<ModulationType>7</ModulationType>
<SpectralInversion>0</SpectralInversion>
<MajorChannelNumber>1</MajorChannelNumber>
<MinorChannelNumber>1</MinorChannelNumber>
</Channel>
<Channel>
<RfChannel>42</RfChannel>
<ModulationType>7</ModulationType>
<SpectralInversion>0</SpectralInversion>
<MajorChannelNumber>1</MajorChannelNumber>
<MinorChannelNumber>2</MinorChannelNumber>
</Channel>
</ChannelList> 
```

### EnableScanDebug(filename As String) As Boolean

Allows all scan debugging to be written to a text file. By default, there is no debug output from a scan. You can close the debug file by passing an empty string.

Example:

```text
c=CreateObject("roChannelManager")
c.EnableScanDebug("tmp:/scandebug.txt")

v = CreateObject("roVideoPlayer")
aa = CreateObject("roAssociativeArray")
aa["RfChannel"] = 12
aa["VirtualChannel"] = "24.1"
print v.PlayFile(aa)

c.EnableScanDebug("")
```

### CreateChannelDescriptor(a As Object) As Object

Creates an associative array that can either be passed to the *roVideoPlayer.PlayFile()* method (to tune to a channel) or parsed for metadata. The generated channel object can be based on one of the following:

- Index:

```text
["ChannelIndex"] = 0
```

- Virtual channel number as a string in an associative array:

```text
["VirtualChannel"] = "12.1"
```

- Channel name as a string:

```text
["ChannelName"] = "KCBS"
```

:::hint{type="info"}
Channels are sorted internally by virtual channel, so you could use a Channel Index script to implement standard channel up/down behavior.
:::

These are the entries generated in the array:

- VirtualChannel
- ChannelName
- CentreFrequency
- ModulationType
- VideoPid
- VideoCodec
- AudioPid
- AudioCodec
- SpectralInversion
- ChannelMap
- FirstRfChannel
- LastRfChannel

The last three entries in this array allow you to use the same *roArray* as a parameter for `Scan()` and `PlayFile()`. The first and last RF channel values are set to the same value so that only one RF channel will be scanned. This kind of scan can be performed at the same time as playing the channel because it doesn’t require retuning.

Example:

```text
c=CreateObject("roChannelManager")
aa=CreateObject("roAssociativeArray")
aa["ChannelMap"] = "QAM"
aa["FirstRfChannel"] = 10
aa["LastRfChannel"] = 15
c.Scan(aa)

cinfo  = CreateObject("roAssociativeArray")
cinfo["ChannelIndex"] = 0
desc = c.CreateChannelDescriptor(cinfo)
print desc

v = CreateObject("roVideoPlayer")
v.PlayFile(desc)
c.Scan(desc) 
```

### Asynchronous API

### AsyncScan(parameters As roAssociativeArray) As Boolean

Begins a channel scan on the RF input and returns the results immediately. Otherwise, the behavior and parameters of this method are identical to `Scan()`. When completed or cancelled, `AsyncScan()` generates an *roChannelManagerEvent*, which supports *ifUserData* and outputs two types of event:

- 0 – Scan Complete: Generated upon the completion of a scan. No extra data is supplied.
- 1 – Scan Progress: Generated upon every tune that is performed during the scan. `GetData()` returns the percentage complete of the scan.

### CancelScan() As Boolean

Cancels any asynchronous scans that are currently running. This method does not generate an *roChannelManagerEvent*.

Synchronous Example:

```text
 c = CreateObject("roChannelManager")

' Scan the channels
aa  = CreateObject("roAssociativeArray")
aa["ChannelMap"] = "ATSC"
aa["FirstRfChannel"] = 12
aa["LastRfChannel"] = 50
c.Scan(aa)

' Start at the first channel
index = 0
cinfo  = CreateObject("roAssociativeArray")
cinfo["ChannelIndex"] = index
desc = c.CreateChannelDescriptor(cinfo)

' Play the first channel
v = CreateObject("roVideoPlayer")
v.PlayFile(desc)

' Play the second channel
index = index + 1
cinfo["ChannelIndex"] = index
desc = c.CreateChannelDescriptor(cinfo)
v.PlayFile(desc)
```

Asynchronous Example:

```text
 c = CreateObject("roChannelManager")
p = CreateObject("roMessagePort")
c.SetPort(p)

' Scan the channels
aa  = CreateObject("roAssociativeArray")
aa["ChannelMap"] = "ATSC"
aa["FirstRfChannel"] = 12
aa["LastRfChannel"] = 50
c.AsyncScan(aa)

loop:
  msg = Wait(2000,p)
  if msg = 0 then goto scan_complete
  goto loop

scan_complete:
' Start at the first channel
index = 0
cinfo  = CreateObject("roAssociativeArray")
cinfo["ChannelIndex"] = index
desc = c.CreateChannelDescriptor(cinfo)

' Play the first channel
v = CreateObject("roVideoPlayer")
v.PlayFile(desc)

' Rescan the current channel, and update the
desc["ChannelStore"] = MERGE
c.Scan(desc)
```


[title] roHttpEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This event object is used to handle requests generated by the *roHttpServer* object.

## ifHttpEvent

### GetFailureReason() As String

Yields additional useful information if a function return indicates an error.

### GetMethod() As String

Returns the type of HTTP method that triggered the event on the *roHttpServer* instance.

### SetResponseBodyString(body As String)

Sets the response body for an event generated via the `AddGetFromEvent()` or `AddMethodToString()` method on the *roHttpServer* object. This call is ignored with any other event.

### SetResponseBodyFile(filename As String) As Boolean

Specifies the name of a file to use as the source response body for an event generated via the `AddGetFromEvent()` or `AddMethodToString()` method on the *roHttpServer* object. This call is ignored with any other event. This function will return `False` if the file cannot be opened or another failure occurs.

The specified file is read gradually as it is sent to the client.

### GetRequestBodyString() As String

Returns the string received if the event was generated via *roHttpServer.AddPostToString()*. An empty string is returned with any other event.

### GetRequestBodyFile() As String

Returns the name of the temporary file created if the event is generated via *roHttpServer.AddGetFromEvent*. This call is ignored with any other event.

### GetRequestHeader(header\_name As String) As String

Returns the value of the specified HTTP request header. If the header does not exist, an empty string is returned.

### GetRequestHeaders() As Object

Returns an *roAssociativeArray* containing all the HTTP request headers.

### GetRequestParam(URI\_parameter As String) As String

Returns the value of the specified URI parameter. If the parameter does not exist, an empty string is returned.

### GetRequestParams() As Object

Returns an *roAssociativeArray* containing all the URI parameters.

### AddResponseHeader(header As String, value As String) As Boolean

Adds the specified HTTP header and value to the response. This function returns `True` upon success.

### AddResponseHeaders(a As Object) As Boolean

Adds the specified HTTP header/value pairs to the response. This method expects an *roAssociativeArray* of header names mapped to header values, which can be of type *roString*, *roInt*, or *roFloat*. Any other value types will cause the request to fail, though a subset of headers to might be set before the failure occurs. This function returns `True` upon success.

### SendResponse(http\_status\_code As Integer) As Boolean

Sends the HTTP response using the specified HTTP status code. To ensure that the response is sent, this function needs to be called once the script has finished handling the event. This function returns `False` upon failure.

### GetFormData() As Object

Returns an *roAssociativeArray* containing all the form data. See the entry on *roHttpServer.AddPostToFormData()* for more information.

### GetUrl() As String

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

[title] roGpioButton
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This object contains the input ID from *roGpioControlPort* instances:

## ifInt

### GetInt() As Integer

Returns the input ID of the event. 

### SetInt(value As Integer) As Void

Sets the input ID of the event.

[title] roUPnPServiceEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This event object is returned whenever a UPnP event message is received (for example, from a Subscribe() operation on the roUPnPService object). If a UPnP event message contains multiple state variables, separate event objects will be returned for each state variable.

## ifUPnPServiceEvent 

**GetUUID() As String**

Returns the subscription ID of the subscription service sending the event. This string matches the value returned by the GetSID() method of the roUPnPService instance that generated the event.

**GetVariable() As String**

Returns the name of the UPnP state variable to which the value corresponds.

**GetValue() As String**

Returns the value of the variable.

**GetSequence() As Integer**

Returns the incrementing sequence number, which denotes the UPnP message from which the update originated. The sequence number will be the same for multiple variable updates reported in a single UPnP event.

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via SetUserData(). It will return `Invalid` if no data has been set.


[title] roSnmpEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via SetUserData(). It will return `Invalid` if no data has been set.

## ifString

**GetString() As String**

**SetString(a As String)**


[title] roDatagramReceiver
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

:::hint{type="danger"}
This object can receive multicast packets, but it doesn't have a way to explicitly join a multicast group. Therefore, this object is not suitable for multicast use. Use [roDatagramSocket](docId\:ZUDWyDM6EHQOv_lVI3Xm-) for multicast receiving.
:::

This object sends *roDatagramEvent* instances to a message port when UDP packets are received on a specified port. The JavaScript equivalent is Node.js Dgram API.

Object Creation: The *roDatagramReceiver* object is created with a `port` parameter, which specifies the port on which to receive UDP packets.

```text
CreateObject("roDatagramReceiver ", port As Integer)
```

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifIdentity

### GetIdentity() As Integer

:::hint{type="info"}
The *ifIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::

## ifMessagePort

### SetPort(port As roMessagePort)

Posts messages of type *roDatagramEvent* to the attached message port.

This example script listens for UDP packets on port 21075:

```text
receiver = CreateObject("roDatagramReceiver", 21075)
mp = CreateObject("roMessagePort")
receiver.SetPort(mp)
while true
       event = mp.WaitMessage(0)
       if type(event) = "roDatagramEvent" then
             print "Datagram: "; event
       endif
end while
```


[title] roMimeStreamEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object is generated by the *roMimeStream* object. It will return an integer corresponding to the event on the *roMimeStream* object:

## ifInt

### GetInt() As Integer

Returns the event ID. 

### SetInt(value As Integer) As Void

Sets the value of the event.

[title] roRtspStreamEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Legacy Objects/

This object is no longer used to return events related to RTSP streams. The *roVideoPlayer* object now returns events related to an associated *roRtspStream*.

## ifInt 

### GetInt() As Integer

Returns the event ID. 

### SetInt(value As Integer) As Void

Sets the value of the event. 

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned by `GetUserData()`.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

[title] roSyncPool
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Legacy Objects/

We recommend using [roAssetPool](docId\:dz9ZC0Ke6JLQnIbuNuq0n) instead. BrightSign enables the *http\://, https\://, ftp\://,* and *file://* protocols.

Object Creation: The *roSyncPool* object is created with a single parameter that specifies the file path where the pool is located.

```text
CreateObject("roSyncPool", pool_path As String)
```

Example

```text
pool = CreateObject ("roSyncPool", "SD:/pool")
```

## ifSyncPool

### ValidateFiles(sync\_spec As roSyncSpec, directory As String, options\_array As roAssociativeArray) As Object

Validates the files in the specified directory against the hashes in the specified sync spec. Files that are not in the sync spec are ignored. The options array can currently contain the following optional parameters:

- `DelteCorrupt` <font color="#6B21A8">boolean</font>: Automatically delete files that do not match the sync spec. The method will return an associative array that maps each filename to an explanation of why it is corrupt. The array only contains corrupt files, so the success is reported by the method returning an empty associative array.

### GetFailureReason() As String

### AsyncDownload(a As Object) As Boolean

### AsyncCancel() As Boolean

### Realize(a As Object, b As String) As Object

### ProtectFiles(a As Object, b As Integer) As Boolean

### ReserveMegabytes(a As Integer) As Boolean

### GetPoolSizeInMegabytes() As Integer

### EstimateRealizedSizeInMegabytes(a As Object, b As String) As Integer

### IsReady(a As Object) As Boolean

### Validate(a As Object, b As Object) As Boolean

### EnablePeerVerification(a As Boolean)

### EnableHostVerification(a As Boolean)

### SetCertificatesFile(a As String)

### SetUserAndPassword(a As String, b As String) As Boolean

### AddHeader(a As String, b As String)

### SetHeaders(a As Object) As Boolean

### SetMinimumTransferRate(a As Integer, b As Integer) As Boolean

### AsyncSuggestCache(a As Object) As Boolean

### SetProxy(a As String) As Boolean

### SetProxyBypass(a As Array) As Boolean

### SetFileProgressIntervalSeconds(a As Integer) As Boolean

### QueryFiles(a As Object) As Object

### SetFileRetryCount(a As Integer) As Boolean

### SetRelativeLinkPrefix(prefix As String) As Boolean

### BindToInterface(interface As Integer) As Boolean

### EnableUnsafeAuthentication(a As Boolean)

### EnableUnsafeProxyAuthentication(enable As Boolean) As Boolean

### EnableEncodings(enable As Boolean) As Boolean

### SetMaximumReceiveBytesPerSecond(bytes\_per\_second as Double) As Boolean

### SetMaximumPoolSizeMegabytes(maximum\_size As Integer) As Boolean

## ifIdentity

### GetIdentity() As Integer

:::hint{type="info"}
The *ifSourceIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::

## ifMessagePort

### SetPort(a As Object)

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

[title] roConfigurationElements
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

*roConfigurationElements* provides an interface to enumerate configuration items which are accessed using a class which requires a name or index for construction. In these cases it is awkward to provide an enumeration as part of the class, since at least one valid name/index must be known to create an instance.

Object Creation: The *roConfigurationElements* object is created with no parameters.

```text
CreateObject("roConfigurationElements")
```

## ifConfigurationElements

### GetConfiguredNetworks()

This returns an roArray of configured interface names. These include both explicitly configured networks, and interfaces using the default configuration (DHCP).

### Example

```text
config_elements = CreateObject("roConfigurationElements")
iface_array = config_elements.GetConfiguredNetworks()
For Each iface in iface_array: print iface: Next
```


[title] roDatagramEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This event object is generated when datagram packets are received by the *roDatagramReceiver* or *roDatagramSocket* objects.

## ifDatagramEvent

### GetByteArray() as Object

Returns the contents of the packet as an *roByteArray*.

### GetSourceHost() as String

Returns the source IP address of the packet in dotted form

### GetSourcePort() as Integer

Returns the source port of the packet.

## ifString

### GetString() As String

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` (either on the source or event object). It will return `Invalid` if no data has been set.

## ifSourceIdentity

### GetSourceIdentity() As Integer

:::hint{type="info"}
The *ifSourceIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::


[title] roSyncPoolFiles
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Legacy Objects/

We recommend using [roAssetPoolFiles](docId\:CK1-zBEqIUwFQyWr4fRzs) instead.

## ifSyncPoolFiles

### GetFailureReason() As String

### GetPoolFilePath(a As String) As String

### GetPoolFileInfo(a As String) As Object

###


[title] roRssParser
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

The *roRssParser* object is used to parse an RSS feed before displaying it. Each item in an RSS feed is represented by an *roRssArticle* object.

## ifRssParser

### ParseFile(filename As String) As Boolean

Parses an RSS feed from a file.

### ParseString(filename As String) As Boolean

Parses an RSS feed from a string.

### GetNextArticle() As Object

Gets the next article parsed by the RSS parser. The articles are sorted by publication date, with the most recent article first. This returns an *roRssArticle* object if there is one. Otherwise, an integer is returned.

[title] BrightScript-JavaScript Objects
[path] Player APIs (BrightScript & JavaScript)/

:::hint{type="warning"}
New applications should avoid using BrightScript objects and should use [JavaScript API](docId\:o2uIyNVKbsyd1qXCvhVCN) objects instead. See the [BrightScript-JavaScript Migration Guide](docId:2KEwWxLmpYcwu8tffuf2Z) for the mapping between BrightScript and JavaScript APIs.
:::

The BrightSign HTML engine exposes several platform-specific JavaScript objects, which allow you to integrate your HTML content with hardware interfaces and system functions on the player. These objects allow you to link many standard interactive, database, and hardware elements (serial, CEC, device info, etc.) to HTML pages.

This section details the functions and parameters for each JavaScript object. For more information about the BrightScript objects that the JavaScript objects are linked to, see the [BrightScript](docId\:R7Xc0_ZE4u0BR662lI2Sj) section.

[title] roUsbHidLedEmulatorEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This event object is generated by the roUsbHidEmulator object when there is a LED state change.

## ifUsbHidEmulatorEvent 

**GetState() As Object**

Returns the new LED state. 

## ifUserData 

**SetUserData(user\_data As Object)&#xA0;**

Sets the user data that will be returned when events are raised. 

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.


[title] roTCPConnectEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

The event is posted when a new connection is made to an roTCPServer port. The normal response to receiving such an event is to create a new roTCPStream object and pass the event to its AcceptFrom call.

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifSocketInfo

**GetSourceAddress() As String**

Returns the IP address of the remote end of the TCP connection.


[title] roMediaStreamerEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object is sent by instances of *roMediaStreamer.* It provides information about the current state of an IP stream being sent by the player.  

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifMediaStreamerEvent

### GetEvent() As Integer

Returns an integer describing the status of an *roMediaStreamer* instance:

- `0 – EOS_NORMAL`: The end of the stream has been reached without any errors being detected. This signal is not sent if the loop parameter is specified using the r*oMediaStreamer.SetSource()* method.
- `1 – EOS_ERROR`: The stream has been aborted prematurely because of an error condition.


[title] roStreamConnectResultEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This event is sent to a message port associated with an roTCPStream object when an `AsyncConnectTo()` request has been completed or has failed.

## ifInt

**GetInt() As Integer**

Returns the result code of the event. If the connection was successfully established, then this method will return 0. If connection failed for any reason, this method will return a non-zero integer.

**SetInt(value As Integer) As Void**

Sets the value of the event. 

## ifUserData

**SetUserData(user\_data As Object) As Void**

Sets the user data.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()` (on either the event or source object). It will return `Invalid` if no data has been set.

 

 


[title] roStreamEndEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

## ifInt

**GetInt() As Integer**

Returns the event ID. 

**SetInt(value As Integer) As Void**

Sets the value of the event. 

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

 


[title] Date and Time Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/

This section describes objects that manipulate date and time settings on the player.

- [roDateTime](docId\:PiiR-bi7JY6p1fIw7kpA3)
- [roNetworkTimeEvent](docId\:Vddlyz9npkTMZeOSXp2Uk)
- [roSystemTime](docId\:HWR0ZojGTZxXnUHDLHlf9)
- [roTimer](docId\:aKe3Q11MV5Bif4jfmSdNR)
- [roTimerEvent](docId:8nHH2QCcnEeLLrKHDP79R)
- [roTimeSpan](docId\:AbLTGL6ZpkgIUonQloCC-)


[title] roTimerEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Date and Time Objects/

This event object is generated by the *roTimer* object.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()` (either on the source or event object). It will return `Invalid` if no data has been set.

## ifSourceIdentity

### GetSourceIdentity() As Integer

Retrieves the identity value that can be used to associate events with the source *roTimer* instance.

:::hint{type="info"}
The *ifSourceIdentity* interface has been deprecated. We recommend using the *ifUserData* interface instead.
:::


[title] roSyncPoolProgressEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Legacy Objects/

We recommend using [roAssetFetcherProgressEvent](docId:12_avNhhh5uVj2YEvYES2) instead.

## ifSourceIdentity

### GetSourceIdentity() As Integer

## ifSyncPoolProgressEvent

### GetFileName() As String

### GetFileIndex() As Integer

### GetFileCount() As Integer

### GetCurrentFileTransferredMegabytes() As Integer

### GetCurrentFileSizeMegabytes() As Integer

### GetCurrentFilePercentage() As Float

## ifUserData

### SetUserData(a As Object)

### GetUserData() As Object

###


[title] roIRTransmitCompleteEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

This event object is generated by the *roIRTransmitter.ASyncSend()* method. It does not return any information other than user data.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned by `GetUserData()`.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return Invalid if no data has been set.

[title] roSyncPoolEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Legacy Objects/

We recommend using [roAssetFetcherEvent](docId\:MTa3K5RAQthAwk4u3Ue3h) instead.

## ifSourceIdentity

### GetSourceIdentity() As Integer 

## ifSyncPoolEvent

### GetEvent() As Integer

### GetName() As String

### GetResponseCode() As Integer

### GetFailureReason() As String

### GetFileIndex() As Integer

## ifUserData

### SetUserData(a As Object)

### GetUserData() As Object


[title] Legacy Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/

This section describes objects that are still offered by BrightScript, even though their primary functionality has been replaced by more modern objects.

- [roRtspStreamEvent](docId\:l7eaxuzaQL1bGYbF0iu0Q)
- [roSyncPool](docId\:LvFaAYmtmopLLmZGSTm_C)
- [roSyncPoolEvent](docId\:e7z8JPkgQRzUJCYpVWxa1)
- [roSyncPoolFiles](docId\:WuIZ81ORV_BpIavmNuaeb)
- [roSyncPoolProgressEvent](docId\:qPiNtEJMgRBYITFfO91n5)


[title] roPtpEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This event object is generated by the *roPtp* object whenever the PTP status of the player changes.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned when events are raised.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifPtpEvent

### GetPtpStatus() As roAssociativeArray

Returns an associative array containing information about the network PTP state of the player:

- `state`: A string indicating the current PTP state of the player. Values can be "MASTER", "SLAVE", or "UNCALIBRATED".
- `timestamp`: A value indicating when the PTP state was last changed. This value is measured in seconds since the player booted. This value can be compared against the total uptime of the player, which is retrieved by calling `UpTime(0)`.


[title] roDatagramSender
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object allows UDP packets to be sent to a specified network destination. The JavaScript equivalent is Node.js Dgram API.

Object Creation: The *roDatagramSender* object is created with no parameters.

```text
CreateObject("roDatagramSender")
```

## ifDatagramSender 

### SetDestination(destination\_address As String, destination\_port As Integer) As Boolean

Specifies the destination IP address in dotted quad form along with the destination port. This function returns `True` if successful.

### Send(packet As Object) As Integer

Sends the specified data packet as a datagram. The packet may be a string or an *roByteArray*. This method returns 0 upon success and a negative error code upon failure.

This example script broadcasts a single UDP packet containing "HELLO" to anyone on the network listening on port 21075:

```text
sender = CreateObject("roDatagramSender")
sender.SetDestination("255.255.255.255", 21075)
sender.Send("Hello")
```


[title] roUPnPService
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object is returned by the `GetServces()` and `GetService()` methods on the roUPnPDevice object.

## ifUPnPService

**Invoke(actionName As String, params As Object) As Integer**

Invokes an action asynchronously on the UPnP service. This method returns a transaction ID that can be used to match it against the associated roUPnPActionResult instance.

**Subscribe() As Integer**

Subscribes to events on the UPnP service asynchronously.

**RenewSubscription() As Integer**

Resubscribes to events on the UPnP service asynchronously. This method should only be called after calling `Subscribe()`.

**GetSID() As String**

Returns the subscription ID. This method should only be called after calling `Subscribe()`.

**GetTimeout() As Integer**

Returns the service timeout period. This method should only be called after calling `Subscribe()`.

## ifMessagePort

**SetPort(port As roMessagePort)**

Specifies the port that will receive events generated by the roUPnPService instance.

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via SetUserData(). It will return `Invalid` if no data has been set.


[title] roStreamLineEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifString

**GetString() As String**

**SetString(a As String)**


[title] roOpenVpn
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

The *roOpenVpn* object can be used to connect players and servers through a VPN without making them accessible to everyone. 

Object Creation: 

```text
CreateObject("roOpenVpn")
```

## OpenVpnParams

### archive\_file as string

Path to the configuration zip

### obfuscated\_secret as string

Encrypted passphrase for protected certificates

### InstallAndRun(params as OpenVpnParams) as Boolean

Install the configuration and run it

### openvpn Uninstall() as Boolean

Stop and uninstall the configuration

## Example

```text
ovpn = CreateObject("roOpenVpn")
params = {}
params.archive_file = "openvpn.zip"
ovpn.InstallAndRun(params)
```

The following command should be called to close the vpn connection when it is no longer needed:

```text
ovpn.Uninstall()
```


[title] roCecRxFrameEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Input/Output Objects/

If an *roMessagePort* is attached to an *roCecInterface* instance, it may receive events of type *roCecRxFrameEvent*.

## ifCecRxFrameEvent

### GetByteArray() As roByteArray

Returns the message data as an *roByteArray*.

## ifUserData

### SetUserData(user\_data As Object)

Sets the user data that will be returned by `GetUserData()`.

### GetUserData() As Object

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

[title] System Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/

This section describes objects that interact with system software.

- [roDeviceCustomization](docId\:cHQy4-X5EJWVt6sD3dObw)
- [roDeviceInfo](docId\:uTKDmpos1ulxaoYLx1nS6)
- [roResourceManager](docId\:hGMJ3TApnhfVHd7vQ6hea)
- [roSystemLog](docId\:KrRnuJD7STbMMV3z3xjD3)


[title] roUrlTransfer
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

This object is used for reading from and writing to remote servers through URLs. It reports transfer status using the *roUrlEvent&#x20;*&#x6F;bject. BrightSign enables the *http\://, https\://, ftp\://,* and *file://* protocols. The JavaScript equivalent is http.

Object Creation: This object is created with no parameters.

```none
CreateObject("roUrlTransfer")
```

:::hint{type="info"}
You must create a separate roUrlTransfer instance for each asset you wish to read/write.
:::

## ifUserData

**SetUserData(user\_data As Object)**

Sets the user data that will be returned when events are raised.

**GetUserData() As Object**

Returns the user data that has previously been set via `SetUserData()`. It will return `Invalid` if no data has been set.

## ifIdentity

**GetIdentity() As Integer**

Returns a unique number that can be used to identify when events originate from this object.

:::hint{type="info"}
The ifIdentity interface has been deprecated. We recommend using the ifUserData interface instead.
:::

## ifMessagePort

**SetPort(port As roMessagePort) As Void**

Sets the message port to which events will be posted for asynchronous requests.

## ifUrlTransfer

**SetUrl(URL As String) As Boolean**

Sets the URL for the transfer request. This function returns False on failure. Use GetFailureReason to learn the reason for the failure.

**AddHeader(name As String, value As String) As Boolean**

Adds the specified HTTP header. This is only valid for HTTP URLs. This function returns False on failure. Use `GetFailureReason()` to learn the reason for the failure.

**GetToString() As String**

Connects to the remote service as specified in the URL and returns the response body as a string. This function cannot return until the exchange is complete, and it may block for a long time. Having a single string return means that much of the information (headers, response codes) has been discarded. If you need this information, you can use `AsyncGetToString()` instead.

:::hint{type="info"}
The size of the returned string is limited to 65,536 characters.
:::

**GetToFile(filename As String) As Integer**

Connects to the remote service as specified in the URL and writes the response body to the specified file. This function does not return until the exchange is complete and may block for a long time. The response code from the server is returned. It is not possible to access any of the response headers. If you need this information, use `AsyncGetToFile()` instead.

**AsyncGetToString() As Boolean**

Begins a GET request to a string asynchronously. Events will be sent to the message port associated with the object. If `False` is returned, then the request could not be issued and no events will be delivered.

**AsyncGetToFile(filename As String) As Boolean**

Begins a GET request to a file asynchronously. Events will be sent to the message port associated with the object. If `False` is returned, then the request could not be issued and no events will be delivered.

**EnableResume(enable As Boolean) As Boolean**

Specifies the file-creation behavior of the `GetToFile()` and `ASyncGetToFile()` methods. If this method is set to `False` (the default setting), each download will generate a temporary file: if the download is successful, the temporary file will be renamed to the specified filename; if the download fails, the temporary file will be deleted. If this method is set to True, the file with the specified filename will be created regardless of whether the download is successful or not—this allows the download to be resumed by a subsequent `GetToFile()` or `ASyncGetToFile()` call.

**Head() As Object**

Synchronously perform an HTTP HEAD request and return the resulting response code and headers through an roUrlEvent object. In the event of catastrophic failure (e.g. an asynchronous operation is already active), a null object is returned.

**AsyncHead() As Boolean**

Begins an ansynchronous HTTP HEAD request. Events will be sent to the message port associated with the object. If the request could not be issued, the method will return `False` and will not deliver any events.

**PostFromString(request As String) As Integer**

Uses the HTTP POST method to post the supplied string to the current URL and return the response code. Any response body is discarded.

**PostFromFile(filename As String) As Integer**

Uses the HTTP POST method to post the contents of the specified file to the current URL and then return the response code. Any response body is discarded.

**AsyncPostFromString(request As String) As Boolean**

Uses the HTTP POST method to post the supplied string to the current URL. Events of type roUrlEvent will be sent to the message port associated with the object. A `False` return indicates that the request could not be issued and no events will be delivered.

**AsyncPostFromFile(filename As String) As Boolean**
Uses the HTTP POST method to post the contents of the specified file to the current URL. Events of the type roUrlEvent will be sent to the message port associated with the object A `False` return indicates that the request could not be issued and no events will be delivered.

**SetUserAndPassword(user As String, password As String) As Boolean**

Enables HTTP authentication using the specified user name and password. Note that HTTP basic authentication is deliberately disabled due to it being inherently insecure. HTTP digest authentication is supported.

**SetMaximumReceiveBytesPerSecond(bytes\_per\_second as Double) As Boolean**

Limits the rate at which downloads are performed by the roUrlTransfer instance. The source data rate isn't under the direct control of the BrightSign player, but download rates should average below the specified value over time.

This method returns true on success and `false` on failure. In event of failure, the `GetFailureReason()` method may provide more information.

**SetMaximumSendBytesPerSecond(bytes\_per\_second as Double) As Boolean**

Limits the rate at which uploads are performed by the roUrlTransfer instance.

This method returns `true` on success and `false` on failure. In event of failure, the `GetFailureReason()` method may provide more information.

**SetMinimumTransferRate(bytes\_per\_second As Integer, period\_in\_seconds As Integer) As Boolean**

Causes the transfer to be terminated if the rate drops below `bytes_per_second` when averaged over  `period_in_seconds`. Note that if the transfer is over the Internet, you may not want to set `period_in_seconds` to a small number in case network problems cause temporary drops in performance. For large file transfers and a small `bytes_per_second` limit, averaging fifteen minutes or more might be appropriate.

**GetFailureReason() As String**

May provide additional information if any of the roUrlTransfer methods indicate failure.

**SetHeaders(a As Object) As Boolean**

**AsyncGetToObject(type As String) As Boolean**

Begins an asynchronous GET request and uses the contents to create an object of the specified type. Events will be sent to the message port associated with the object. If this method returns False, the request could not be issued and no events will be delievered. Only supported types are roSyncSpec and roXMLElement.

**AsyncCancel() As Boolean**

Cancels any outstanding async requests on the roURLEvent object.

**RetainBodyOnError(retain as Boolean) as Boolean**

Specifies whether to return the response body when there is an HTTP error response code. If retain is true, roUrlTransfer provides the body and headers of the response even if the HTTP status code indicates that an error occurred (e.g. a 4x or 5xx status code). If retain is false, roUrlTransfer does not provide the body and headers of the response if the HTTP status code indicates that an error occurred. This method returns `True` on success, and `False` if it fails. The default behavior of roUrlTransfer is equivalent to passing `False` into the method.

:::hint{type="info"}
If `RetainBodyOnError()` returns as `False`, call `GetFailureReason()` to get details.
:::

**EnableUnsafeAuthentication(enable As Boolean) As Boolean**

Supports basic HTTP authentication if `True`. HTTP authentication uses an insecure protocol, which might allow others to easily determine the password. The roUrlTransfer object will still prefer the stronger digest HTTP if it is supported by the server. If this method is `False` (which is the default setting), it will refuse to provide passwords via basic HTTP authentication, and any requests requiring this authentication will fail.

**EnableUnsafeProxyAuthentication(enable As Boolean) As Boolean**

Supports basic HTTP authentication against proxies if True (which, unlike `EnableUnsafeAuthentication()`, is the default setting). HTTP authentication uses an insecure protocol, which might allow others to easily determine the password. If this method is False, it will refuse to provide passwords via basic HTTP authentication, and any requests requiring this authentication type will fail.

**EnablePeerVerification(verification As Boolean) As Boolean**

Enables checking of TLS/SSL certificates. This method is set to `true` by default. Disabling peer verficiation allows you to bypass an expired certificate check.

**EnableHostVerification(verification As Boolean) As Boolean**

Enables checking of the TLS/SSL certificate for the correct hostname. This method is set to `true` by default. Disabling host verification allows you to accept a certificate being sent for the wrong hostname.

:::hint{type="danger"}
Peer verification and host verification are important security checks that prevent "man-in-the-middle" attacks. These features should only be disabled after careful consideration of the security implications.
:::

**SetCertificatesFile(filename As String) As Boolean**

Configures an alternative set of CA certificates for the connection. This method is useful if the connection certificates are signed by a CA that is not on the the default trusted list (for example, if your organization uses a private CA hierarchy that is not signed by a well known root CA). This method replaces the default list, so the passed certificate file must contain all acceptable CA certificates required for the connection. 

**SetClientCertificate(parameters As roAssociativeArray) As Boolean**

Specifies an HTTPS Client Certificate for use with server authentication. PKCS#12 certificates are not supported. This method accepts an associative array with the following parameters:

- `certificate_file`: The filename of the Client Certificate file
- `key_file`: The filename of the key file. You do not need to specify a key file if the key is embedded in the Client Certificate file (which might be the case when using PEM format).
- `type:` Either "PEM" or "DER"
- `passphrase`: The string passphrase to use if the key is encrypted
- `obfuscated_passphrase`: The obfuscated string passphrase to use if the key is encrypted.

:::hint{type="info"}
If any of the parameters are set incorrectly, you'll likely get a -35 error when making a request.
:::

**SetCookie(cookie As String) As Boolean**

Adds the specified cookie to the player storage and enables the cookie parsing/sending engine. The cookie can be either a single line in Netscape/Mozilla format or a standard HTTP-style header (i.e. `Set-Cookie`:). You can also carry out commands by passing these exact strings to the method:

- "ALL": Erases all cookies held in memory.
- "SESS": Erases all session cookies held in memory.
- "RELOAD": Loads all cookies from files specified by SetCookieFile() calls.

**SetCookieFile(filename As String) As Boolean**

Adds cookies to the player storage using the specified cookie file and enables the cookie parsing/sending engine. The cookie data can be in either Netscape/Mozilla format or standard HTTP format.

**GetCookies() As roList**

Returns a string list of all cookies (including expired cookies).

**EnableEncodings(enable As Boolean) As Boolean**

Enables HTTP compression, which communicates to the server that the system can accept any encoding that the roUrlTransfer object is capable of decoding by itself. This currently includes "deflate" and "gzip", which allow for transparent compression of responses. Clients of the roUrlTransfer instance see only the decoded data and are unaware of the encoding being used.

:::hint{type="info"}
HTTP compression is enabled by default in firmware versions 6.0.x and later.
:::

**SetUserAndPassword(a As String, b As String) As Boolean**

**Head() As Object**

Performs a synchronous HTTP HEAD request and returns the resulting response code and headers through an roURLEvent object. In the event of catastrophic failure (e.g. an asynchronous operation is already active), a null object is returned.

**Escape(unescaped As String) As String**

Converts the provided string to a URL-encoded string. All characters that could be misinterpreted in a URL context are converted to the `%XX `form.

**Unescape(a As String) As String**

**GetUrl() As String**

**SetProxy(proxy As String) As Boolean**

Sets the name or address of the proxy server that will be used by the *roUrlTransfer&#x20;*&#x69;nstance. The proxy string should be formatted as follows: "http\://user\:password\@hostname\:port". It can contain up to four "\*" characters; each "\*" character can be used to replace one octet from the current IP address. For example, if the IP address is currently 192.168.1.2, and the proxy is set to "proxy-\*-\*", then the player will attempt to use a proxy named "proxy-192.168".

**SetProxyBypass(hostnames As Array) As Boolean**

Exempts the specified hosts from the proxy setting. The passed array should consist of one or more hostnames. The player will attempt to reach the specified hosts directly rather than using the proxy that has been specified with the `SetProxy()` method. For example, the hostname "http\://example.com " would exempt "http\://example.com ", "http\://example.com:80 ", and "Example Domain " from the proxy setting.

**PutFromString(a As String) As Integer**

Uses the HTTP PUT method to write the supplied string to the current URL and return the response code. Any response body is discarded; use `roUrlTransfer.SyncMethod()` to retrieve the response body.

**SetTimeout(milliseconds As Integer) As Boolean**

Terminates the transfer if the request takes longer than the specified number milliseconds. Note that this includes the time taken by any name lookups, so setting this value too low will cause undesirable results. Passing 0 to the method disables the timeout. This method returns `True` upon success and `False` upon failure. In the event of failure, using the `GetFailureReason()` method may provide more information. If the operation times out, the status return is -28.

**SetUserAgent(a As String) As Boolean**

**PutFromFile(a As String) As Integer**

Uses the HTTP PUT method to write the contents of the specified file to the current URL and return the response code. Any response body is discarded; use `roUrlTransfer.SyncMethod()` to retrieve the response body.

**AsyncPutFromString(a As String) As Boolean**

Uses the HTTP PUT method to write the supplied string to the current URL. Events of type roUrlEvent will be sent to the message port associated with the object. A `False` return indicates that the request could not be issued and no events will be delivered. Any response body is discarded; use roUrlTransfer.AsyncMethod to retrieve the response body.

**AsyncPutFromFile(a As String) As Boolean**

Uses the HTTP PUT method to write the contents of the specified file to the current URL. Events of type roUrlEvent will be sent to the message port associated with the object. A False return indicates that the request could not be issued and no events will be delivered. Any response body is discarded; use `roUrlTransfer.AsyncMethod()` to retrieve the response body.

**Delete() As Object**

Uses the HTTP DELETE method to delete the resource at the current URL and return the response code. Any response body is discarded; use roUrlTransfer.SyncMethod to retrieve the response body.

**AsyncDelete() As Boolean**

Uses the HTTP DELETE method to delete the resource at the current URL. Events of type roUrlEvent will be sent to the message port associated with the object. A False return indicates that the request could not be issued and no events will be delivered. Any response body is discarded; use `roUrlTransfer.AsyncMethod()` to retrieve the response body.

**ClearHeaders() As Void**

Removes all headers that would be supplied with an HTTP request.   

**AddHeaders(a As Object) As Boolean**

Adds one or more headers to HTTP requests. Pass headers to this object as an roAssociativeArray of name/value pairs. This method returns True upon success and False upon failure. All headers that are added with this method will continue to be sent with HTTP requests until `ClearHeaders()` is called.

**SyncMethod(a As Object) As Object**

Begins a synchronous HTTP request using the specified parameters (see the parameters described for AsyncMethod.) If the parameters are malformed then the method returns Invalid and calling `GetFailureReason()` may provide more information, otherwise the method returns a roUrlEvent instance containing the results of the request. It may take several minutes for a failing request to time out and BrightScript will be blocked waiting during that time, so use of this method is not recommended. The AsyncMethod method does not block and should be used instead.

**SetRelativeLinkPrefix(prefix As String) As Boolean**

Places the specified prefix in front of the URL if the URL is relative. Use this method to easily make `file:///` URLs drive agnostic.

**BindToInterface(interface As Integer) As Boolean**

Ensures that the request only goes out over the specified network interface. By default, the request goes out over the most appropriate network interface (which may depend on the routing metric configured via roNetworkConfiguration). Note that if both interfaces are on the same layer 2 network, this method may not always work as expected due to the Linux weak host model. The default behavior can be selected by passing -1 to the method. This method returns `False` upon failure. In this case, the `GetFailureReason()` method may provide more information.

**AsyncMethod(parameters As roAssociativeArray) As Boolean**

Begins an asynchronous HTTP method request using the specified parameters (see below). If the request is started successfully, the method returns True and and will deliver an event. If the request could not be started, then the method returns False and will not deliver an event. If this occurs, you may be able to use the `GetFailureReason()` method to get more information.

The parameters are specified using an roAssociativeArray instance that may contain the following members:

| **Name**                     | **Type**  | **Description**                                                                                                                                                                                          |
| ---------------------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| method                       | String    | An HTTP method. Normal values include "HEAD", "GET", "POST", "PUT", and "DELETE". Other values are supported; however, depending on server behavior, they may not work as expected.                      |
| request\_body\_string        | String    | A string containing the request body.                                                                                                                                                                    |
| request\_body\_file          | String    | The name of a file that contains the request body                                                                                                                                                        |
| response\_body\_string       | Boolean   | If specified and set to True, the response will be stored in a string and provided via the *roUrlEvent.GetString()* method.                                                                              |
| response\_body\_file         | String    | The name of the file that will contain the response body. The body is written to a temporary file and then renamed to the specified filename if successful.                                              |
| response\_body\_resume\_file | String    | The name of the file that will contain the response body. For a GET request, a RANGE header is sent based on the current size of the file, which is written in place rather than using a temporary file. |
| response\_body\_object       | String    | Uses the response body to create an object of the specified type. See the entry for AsyncGetToObject() for supported object types.                                                                       |
| response\_pipe               | *roArray* | Use a pipeline of handlers to process the response body as it is received. See below for more details.                                                                                                   |

The roArray response for `response_pipe` consists of one or more roAssociativeArray instances containing a filter description (see below). The last associative array is usually an output filter.

| **Name**        | **Type** | **Description**                                                                                                                                                                                                                                                                                                     |
| --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| hash            | String   | Calculate a hash (digest) of the data using the specified algorithm as it passes through the pipeline. Supported hashes include the following: "CRC32", "MD5", "SHA1", "SHA256", "SHA384", "SHA512". The resulting hash can be retrieved as a hexadecimal string using the *roUrlEvent.GetHash()&#x20;*&#x6D;ethod. |
| decompress      | String   | Decompress the response body using the specified algorithm. Currently, the only supported algorithm is “gzip”. It is often easier to use an HTTP Content-Encoding rather than explicitly decompressing the body.                                                                                                    |
| prefix\_capture | Integer  | Capture the specified number of bytes (between 1 and 16384) from the start of the stream and store them separately. The bytes can be retrieved using the *roUrlEvent.GetPrefix()&#x20;*&#x6D;ethod, but they cannot be passed on to subsequent filters.                                                             |
| output file     | String   | Output the pipeline to the specified file. The output is written to a temporary file and then renamed to the specified filename if successful.                                                                                                                                                                      |
| output\_string  | Boolean  | If specified and set to True, the response will be stored in a string and provided via the *roUrlEvent.GetString()* method.                                                                                                                                                                                         |

The following example code specifies an array of handlers to filter the response body of an HTTP request.

```none
url = CreateObject("roUrlTransfer")
pipe = [ { decompress: "gzip"}, { hash: "MD5" }, { output_file: "test.txt" } ]
result = url.AsyncMethod({ method: "GET", response_pipe: pipe })
```


[title] Enabling BrightScript-JavaScript Objects
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

For security reasons, all BrightScript JavaScript objects are disabled by default. As a result, you will encounter DOM errors like those shown below if you do not enable first enable them (to view a console log of BrightScript/JavaScript events, go to the [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM) or use the JavaScript console).

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/qQoHk4Yy01LWA4nRrFo_i_dom-exception-console-output.png)

Follow the below steps to enable BrightScript JavaScript objects.

## Enabling with BrightAuthor Classic

Make sure that you are using BrightAuthor Classic version 4.1 or later. Earlier versions do not have the code that enables BrightScript objects for JavaScript.

Also, ensure that the **Enable external data** box is checked within the HTML5 state that is displaying your page.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/yKk6e8D0FIRW9-zgv2uvm_ba-enable-external-data.png" size="60" width="895" height="724" position="center" darkWidth="895" darkHeight="724" showCaption="false"}

## Enabling with BrightScript

Include the `brightsign_js_objects_enabled:true` entry with the associative array that is passed during creation of the [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) instance:

**Example:**

```text
r=createobject("rorectangle",0,0,1920,1080)
aa=createobject("roassociativearray")

aa.url="http://test-server/index.html"
aa.brightsign_js_objects_enabled=true

bb=createobject("roassociativearray")
bb.port=3000
aa.inspector_server=bb

h=createobject("rohtmlwidget",r,aa)
h.show()
```

The above method enables all BrightScript-JavaScript objects on an *roHtmWidget* instance. To enable only a subset of BrightScript-JavaScript objects, or to restrict the objects to certain URLs, use the `AllowJavaScriptUrls()` method on a *roHtmlWidget* instance. This method accepts an associative array that maps BrightScript-JavaScript classes to the URL(s) that are allowed to use them.

- An `all` key indicates that all classes are authorized for the associated URL(s).
- An asterisk `"*"` value indicates that all URLs are authorized for the associated BrightScript-JavaScript class.
- A `"local"` value indicates that all local pages are authorized for the associated BrightScript-JavaScript class.

This will enable all BrightScript classes for all URLs:

```text
html.AllowJavaScriptUrls({ all: "*" })
```

This call will enable all BrightScript-JavaScript classes for local pages and the BrightSign homepage:

```text
html.AllowJavaScriptUrls({ all: ["local", "http://www.brightsign.biz"]})
```


[title] roStreamByteArrayEvent
[path] Player APIs (BrightScript & JavaScript)/BrightScript/Object Reference/Networking Objects/

Stream receive objects that implement the `ifStreamReceive` interface (like [roTCPStream](docId\:Klp1luePYZlmAq0HBXbpi)   or  [roSerialPort](docId:25Ega25ABzfTXgITvvmmS)) include a `SetByteArrayEventPort(message_port as Object)` method. This method ensures that `roStreamByteArrayEvent` events are posted to the message port when bytes are received.&#x20;

For some object types when bytes are expected to be received in chunks (for example, `roTCPStream`), this can be much more efficient since data no longer needs to be delivered to BrightScript a byte at a time, but since serial ports are comparatively slow it's possible that each event will still contain only a single character. 

## ifUserData

**GetByteArray() As Object**

Returns the received bytes that have been set via `SetByteArrayEventPort()`. It will return `Invalid` if no data has been set.


[title] networkstatus
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *networkstatus* component provides access to the current networking status of the player. It provides the current state as opposed to the intended configuration. For example, the current IP addresses assigned to network interfaces can be retrieved from networkstatus when the player is configured to use DHCP. This component can be used to determine the actual IP addresses and other network settings that are currently active.

**networkstatus IDL**

```javascript
[
    Constructor()
] interface NetworkStatus {
    Promise<NetworkHostStatus> getHostStatus();
    Promise<DiagnosticWebServerStatus> getDiagnosticWebServerStatus();
    Promise<RemoteLoginStatus> getRemoteLoginStatus();
    Promise<NetworkInterfaceStatus> getInterfaceStatus(string interfaceName);
    Promise<WifiInterfaceStatus> getInterfaceWifiStatus(string interfaceName);
    Promise<Array<string>> getPresentNetworkInterfaces();
    Promise<Array<NetworkStatusRoute>> getRoutes(string protocol); // "IPv4" or "IPv6"
};

interface NetworkHostStatus {
    attribute string hostName;
    attribute string mDnsHostName;

    attribute Array<string> domainSearchPath;
    attribute Array<string> domainNameServers;
    attribute Array<string> timeServers;
    attribute string? proxy;
    attribute Array<string>? proxyBypass;

    attribute string? crashUrl;
    attribute string? errorUrl;
    attribute string? recoveryUrl;
};

interface DiagnosticWebServerStatus {
    attribute short? port;
};

interface RemoteLoginStatus {
    attribute unsigned short? telnetPort; // Not present if not enabled
    attribute unsigned short? sshPort; // Not present if not enabled
};

interface NetworkInterfaceStatus {
    attribute string? type;
    attribute bool present; // Interface is actually present (e.g. WiFi may be configured but removed)
    attribute string presentStatus;
    attribute bool? hasLink;
    attribute string? macAddress;
    attribute bool? isVlan; // This interface is itself a VLAN
    attribute short? vlanTag;
    attribute string? parentInterface; // The underlying physical interface for a VLAN
    attribute Array<short>? vlanChildTagList; // VLANs on this interface. Includes zero for untagged.
    attribute Array<NetworkStatusIpAddress>? ipAddressList; // Includes all IPv4 and IPv6 addresses
    attribute long? inboundShaperRate;
    attribute Array<string>? domainSearchPath;
    attribute Array<string>? domainNameServers;
};

interface NetworkStatusIpAddress {
    attribute string family; // "IPv4" or "IPv6"
    attribute string scope;
    attribute string? address; // "172.30.1.30" or "fd44:d8b8:cab5:cb01::19"
    attribute string? netmask; // IPv4 only
    attribute string? broadcast; // IPv4 only
    attribute int? prefixLength; // IPv4 and IPv6
    attribute string? cidr; // Address with prefix length in CIDR notation
};

interface WifiInterfaceStatus {
    attribute string mode; // "AP" or "STA"
    attribute bool? connected; // (Not present in AP mode.)
    attribute string? essid;
    attribute string? bssid; // (Not present in AP mode.)
    attribute string? frequency; // In MHz to match other APIs
    attribute int? signalStrength; // In dBm
};

interface NetworkStatusRoute {
    attribute string destination; // or "default"
    attribute string? source;
    attribute int metric;
    attribute Array<NextHops> nextHops;
};

interface NetworkStatusNextHop {
    attribute string? gateway;
    attribute string? interface;
}                                                                                                       
```

## Object Creation

To create a *networkstatus* component, load the *@brightsign/networkstatus* module using the `require()` method.&#x20;

```javascript
const NetworkStatus = require("@brightsign/networkstatus");
let networkStatus = new NetworkStatus();
```

## NetworkStatus

**getHostStatus()**

```javascript
Promise<NetworkHostStatus> getHostStatus()                                                                                        
```

Returns information about the network status of the player as a whole.

**getDiagnosticWebServerStatus()**

```javascript
Promise<DiagnosticWebServerStatus> getDiagnosticWebServerStatus()                                                                               
```

Returns information about the status of the diagnostic web server.

**getRemoteLoginStatus()**

```javascript
Promise<RemoteLoginStatus> getRemoteLoginStatus()                                                                              
```

Returns information about the status of the player related to remote shell access.

**getInterfaceStatus()**

```javascript
Promise<NetworkInterfaceStatus> getInterfaceStatus(string interfaceName)
```

Returns information about the current status of the specified network interface.

**getInterfaceWifiStatus()**

```javascript
Promise<WifiInterfaceStatus> getInterfaceWifiStatus(string interfaceName)
```

Returns information about the current WiFi status of the specified wireless network interface.

**getPresentNetworkInterfaces()**

```javascript
Promise<Array<string>> getPresentNetworkInterfaces()
```

Returns an array containing the names of all the external network interfaces present on the player. Does not include the loopback interface.

**getRoutes()**

```javascript
Promise<Array<NetworkStatusRoute>> getRoutes(string protocol); // "IPv4" or "IPv6"
```

Returns an array of the current network routes for the specified protocol.

## NetworkHostStatus

- `hostName` <font color="#6554c0">string</font>: The player's current host name.
- `mDnsHostName `<font color="#6554c0">string</font>: The player's current Multicast DNS host name. This will usually be the player's host name with ".local" on the end, but can differ if there are conflicts on the local network.
- `domainSearchPath` <font color="#6554c0">Array&lt;string&gt;</font>: A list of suffices that will be applied to unqualified domain names when looking them up in DNS. This is the combination of the search paths for all active network interfaces.
- `domainNameServers` <font color="#6554c0">Array&lt;string&gt;</font>:   A list of the current DNS servers that will be consulted when performing name look ups. This is the combination of all the DNS servers for all active network interfaces.
- `timeServers` <font color="#6554c0">Array&lt;string&gt;</font>: A list of the current time servers that will be used to set the player's clock. Currently this will contain either zero or one entry, but it may contain more in the future.
- `proxy`  <font color="#6554c0">string</font> <font color="#01a0af">optional</font>: The currently active network proxy server, if any.
- `proxyBypass` <font color="#6554c0">Array&lt;string&gt;</font> <font color="#01a0af">optional</font><font color="#00b8d9">:</font>  A list of host name suffices for which the proxy will be bypassed (IP addresses cannot be used)
- `crashUrl` <font color="#6554c0">string</font> <font color="#01a0af">optional</font><font color="#00b8d9">:</font> The URL to which player crash dumps will be posted, if any.
- `errorUrl ` <font color="#6554c0">string</font> <font color="#01a0af">optional</font>: The URL to which BrightScript errors will be posted, if any.
- `recoveryUrl`  <font color="#6554c0">string</font> <font color="#01a0af">optional</font>: The URL which will be consulted to determine whether the player should enter recovery, if any.

## DiagnosticWebServerStatus

- `port` <font color="#6554c0">short</font> <font color="#01a0af">optional</font>: The port number that the web server will be run on. If the web server is disabled then this attribute will not be present.

## RemoteLoginStatus

- `telnetPort` <font color="#6554c0">unsigned short</font> <font color="#01a0af">optional</font><font color="#00b8d9">:</font> The port number that the player will listen to telnet connections on. If telnet is not enabled then this attribute will not be present.
- `sshPort` <font color="#6554c0">unsigned short</font> <font color="#01a0af">optional</font><font color="#00b8d9">:</font> The port number that the player will listen for secure shell connections on. If ssh is not enabled then this attribute will not be present.

## NetworkInterfaceStatus

- `type` <font color="#6554c0">string</font> <font color="#01a0af">optional</font>: If the interface is present, this attribute will contain "Wired", "WiFi", "Dialup" or "Unknown". Note that some USB network devices may appear to the BrightSign player to be of one type when they are actually a different type. For example, some broadband modems appear as "Wired" Ethernet devices.
- `present` <font color="#6554c0">bool</font>: Whether the specified network interface is currently present on the player.
- `presentStatus`<font color="#6554c0"> string</font>: Provides extra human-readable information explaining why the interface is not present. For example, a VLAN interface may not have been enabled on its corresponding physical interface.
- `hasLink` <font color="#6554c0">bool </font><font color="#01a0af">optional</font>: Indicates whether the network interface currently has link
- `macAddress`<font color="#6554c0">string</font> <font color="#01a0af">optional</font>: Contains the hardware MAC address for network interfaces that have one.
- `isVlan` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font>: Indicates whether this network interface is a VLAN on another lower network interface.
- `vlanTag` <font color="#6554c0">short</font> <font color="#01a0af">optional</font>: If this interface is a VLAN, this attribute contains the tag value that will be used on the lower interface.
- `parentInterface` <font color="#6554c0">string</font> <font color="#01a0af">optional</font>: If this interface is a VLAN, this attribute contains the name of the lower interface that packets will be sent on.
- `vlanChildTagList` <font color="#6554c0">Array&lt;short&gt;</font> <font color="#01a0af">optional</font>: If this network interface has VLAN interfaces running above it then this array contains all of their tag values. The special tag value of zero indicates that this interface is also used itself untagged.
- `ipAddressList` <font color="#6554c0">Array&lt;NetworkStatusIpAddress&gt;</font> <font color="#01a0af">optional</font>: A list of all IPv4 and IPv6 addresses assigned to this network interface.
- `inboundShaperRate` <font color="#6554c0">long</font> <font color="#01a0af">optional</font>: If an inbound bandwidth shaper is enabled for this interface, this attribute contains the rate in bits per second.
- `domainSearchPath` <font color="#6554c0">Array&lt;string&gt;</font> <font color="#01a0af">optional</font>: A list of suffices that this network interface contributes to the host configuration when this network interface is active. See NetworkHostStatus.
- `domainNameServers` <font color="#6554c0">Array&lt;string&gt;</font> <font color="#01a0af">optional</font>:  A list of DNS servers that this network interface contributes to the host configuration when this network interface is active. See NetworkHostStatus.

## NetworkStatusIpAddress

- `family` <font color="#6554c0">string:</font> Contains the address family: "IPv4" or "IPv6"
- `scope` <font color="#6554c0">string</font>: Mainly useful for IPv6 addresses, this attribute indicates the scope of the address. Possible values are "global", "site", "link", "host" and "nowhere".
- `address` <font color="#6554c0">string </font><font color="#01a0af">optional</font>: The actual address as a string.
- `netmask` <font color="#6554c0">string</font> <font color="#01a0af">optional</font>: For IPv4 addresses only this attribute contains the prefix length expressed as a traditional netmask.
- `broadcast `<font color="#6554c0">string</font> <font color="#01a0af">optional</font>: For IPv4 addresses only this attribute contains the network broadcast address.
- `prefixLength` <font color="#6554c0">int </font><font color="#01a0af">optional</font>: For IPv4 and IPv6 addresses this attribute contains the number of bits of the address that are used to identify the network.
- `cidr `<font color="#6554c0">string</font> <font color="#01a0af">optional</font>: For IPv4 and IPv6 addresses this attribute contains the address and prefix length in classless inter-domain routing (CIDR) syntax: address/prefix.

## WifiInterfaceStatus

- `mode` <font color="#6554c0">string</font>: Indicates which mode the WiFi interface is currently in. When in "AP" mode the interface is acting as a wireless access point for other wireless devices to connect to. In "STA" mode the interface is acting as a client to another wireless access point.
- `connected `<font color="#6554c0">bool</font> <font color="#01a0af">optional</font>: If the interface is in "STA" mode, indicates whether the interface is connected to an access point. In "AP" mode this attribute is not present.
- `essid` <font color="#6554c0">string</font> <font color="#01a0af">optional</font><font color="#00b8d9">:</font> If the interface is in "STA" mode, indicates the ESSID of the AP that the interface is connected to. In "AP" mode, indicates the ESSID that the wireless interface is advertising for clients to connect to.
- `bssid` <font color="#6554c0">string</font> <font color="#01a0af">optional</font>: If the interface is in "STA" mode, indicates the BSSID of the AP that the interface is connected to. In "AP" mode this attribute is not present.
- `frequency` <font color="#6554c0">int </font><font color="#01a0af">optional</font>: The frequency that the wireless interface radio is currently using, in MHz.
- `signalStrength` <font color="#6554c0">int </font><font color="#01a0af">optional</font>: The current signal strength, in dBm.

## NetworkStatusRoute

- `destination` <font color="#6554c0">string</font>: The route destination or "default" for the default route.
- `metric` <font color="#6554c0">int</font>: The priority for the route. Lower priority routes are preferred.
- `nextHops` <font color="#6554c0">Array&lt;NextHops&gt;</font>: A list of where packets subject to this route will be sent next. This list currently contains only one element.

## NetworkStatusNextHop

- `gateway` <font color="#6554c0">string</font> <font color="#01a0af">optional</font>: The address to which packets will be sent.
- `interface` <font color="#6554c0"> string</font> <font color="#01a0af">optional</font>: The network interface on which packets will be sent. 


[title] usbfilesystem
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *usbfilesystem* object allows supported BrightSign players to expose a local file as a USB mass storage device when connected to a USB host port on another device (for example, a PC or television.) The host acts as if it is talking to a USB thumb drive or USB hard drive, but the reads and writes go to the specified local file on the BrightSign. Normally the local file would be prepared beforehand with a filesystem offline or using [filesysteminfile](docId\:kEg9ZrLJkkJK2dfHPjX65) on the player itself.

BrightSign players with USB-C (except for LS3 and LS4) can use this object.

**usbfilesystem IDL**

```javascript
interface UsbFilesystem {                                                                                                                                                                                                                                               
    constructor();                                                                                                                                                                                                                                                      
    Promise<void> enable(String filename);                                                                                                                                                                                                                              
    Promise<void> disable();                                                                                                                                                                                                                                            
};  
```

## Object Creation

To create a *usbfilesystem* object, load the *@brightsign/usbfilesystem* module using the require() method. 

```javascript
var FilesystemClass = require('@brightsign/usbfilesystem');
var usbfilesystem = new FilesystemClass();
```

## UsbFilesystem

**enable()**

```javascript
Promise<void> enable(String filename)
```

Exposes an existing filesystem image as a USB mass storage device.

- `filename` <font color="#6554c0">string</font>: The name of the file to expose as a USB mass storage device.

**disable()**

```javascript
Promise<void> disable()
```

Removes an existing filesystem image as a USB mass storage device.

## Example

```javascript
var FilesystemClass = require('@brightsign/usbfilesystem');
var usbfilesystem = new FilesystemClass();

// Additional Description: Using filesysteminfile will help build a .img file

// Mount an already built filesystem image
usbfilesystem.enable("/storage/sd/usbstore.img")
.then(function (result) {
  console.log("Successfully mounted!");
})
.catch(function(err) {
  console.log(JSON.stringify(err));
});

// Unmount a filesystem image
usbfilesystem.disable()
.then(function() {
  console.log("Successfully unmounted");
})
.catch(function(err) {
  console.log( JSON.stringify(err) );
});
```


[title] storage
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *storage&#xA0;*&#x6F;bject provides functions related to the player storage (USB1, SD, SD2, SSD, and/or Flash). This object is available as of BOS 9.0.168.

:::hint{type="info"}
See [this page](docId\:qcEvA3OCMVeT4jzT5L6PE) for more information about device storage paths.
:::

**system IDL**

```javascript
[
    constructor()
] interface Storage {
    Promise<void> eject(String mountPoint);
    Promise<void> format(String mountPoint, String fileSystemType);
    attribute Array<String> priorityOrder;
};
```

## Object Creation

To create a *storage* object, first load the `brightsign/storage` module using the `require()` method. Then create an instance of the *storage* class.

```javascript
const Storage = require("@brightsign/storage");
let priorityOrder = new Storage().priorityOrder;
```

## Storage

Use this interface to call the following methods:

**eject()**

```javascript
Promise<void> eject(String mountPoint)
```

The storage device is prepared for safe removal and may be physically ejected if that is supported by the storage device.

**format()**

```javascript
Promise<void> format(String mountPoint, String fileSystemType)
```

Formats the specified drive using one of the file systems listed below:

- `vfat` (FAT32, DOS/Windows file system): Readable and writable by Windows, Linux, and MacOS.
- `exfat` (DOS/Windows file system): Supported on Series 3, 4 and 5 players. 
- `ext2` (Linux file system): Writable by Linux and readable by Windows and MacOS with additional software.
- `ext3` (Linux file system): Writable by Linux and readable by Windows and MacOS with additional software. 
- `ext4` (Linux file system): Writable by Linux and readable by Windows and MacOS with additional software. This is the recommended file system for SSD devices and USB hard drives.

## priorityOrder

This read-only property contains the array of storage devices that will be searched by BrightSign OS for autorun scripts in order. Some of these storage devices may not be present on a particular player. For example:&#x20;

:::BlockQuote
\[ '/storage/usb1', '/storage/sd', '/storage/sd2', '/storage/ssd' ]
:::

## Examples

```javascript
const Storage = require("@brightsign/storage");
let storage = new Storage();
storage.eject("/storage/sd").then(() => { console.log("SD card can now be removed\n"); } );
```

```javascript
const Storage = require("@brightsign/storage");
let storage = new Storage();
storage.format("/storage/sd", "vfat").then(() => { console.log("SD card has been formatted\n");});
```

```javascript
const Storage = require("@brightsign/storage");
let storage = new Storage();
storage.format("/storage/usb1", "exfat").then(() => { console.log("USB card has been formatted\n");});
```

```javascript
const Storage = require("@brightsign/storage");
let storage = new Storage();
storage.format("/storage/flash", "exfat").then(() => { console.log("LGUV5N internal storage has been formatted\n");});
```

```javascript
const Storage = require("@brightsign/storage");
let storage = new Storage();
storage.format("/storage/sd2", "exfat").then(() => { console.log("Interal sd storage has been formatted\n");});
```


[title] BSDeviceInfo
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

For more information about available methods, refer to the *roDeviceInfo* entry. The JavaScript equivalent is [deviceinfo](docId\:xCvijzYTq6jq780KLOGLu).

## Attributes

- `model`  DOMString readonly&#x20;
- `version `  DOMString readonly&#x20;
- `deviceUptime ` int readonly&#x20;
- `deviceLifetime ` int readonly&#x20;
- `deviceBootCount ` int readonly&#x20;
- `bootVersion `  DOMString readonly&#x20;
- `deviceUniqueId `  DOMString readonly&#x20;
- `family` DOMString readonly&#x20;

## Methods

- `VersionCompare(in DOMString version)` int&#x20;
- `BootVersionCompare(in DOMString version)` int&#x20;
- `HasFeature(in DOMString feature) ` boolean&#x20;

## Example

The following JavaScript example posts device information on the page when the button is clicked:

```javascript
function deviceInfo()
{
    var device_info = new BSDeviceInfo();
    document.getElementById("modelText").innerHTML = device_info.model;
    document.getElementById("versionText").innerHTML = device_info.version;
    document.getElementById("bversionText").innerHTML = device_info.bootVersion;
    document.getElementById("serialText").innerHTML = device_info.deviceUniqueId;
    document.getElementById("familyText").innerHTML = device_info.family;

    document.getElementById("uptime").innerHTML = device_info.deviceUptime;
    document.getElementById("lifetime").innerHTML = device_info.deviceLifetime;
    document.getElementById("bootcount").innerHTML = device_info.deviceBootCount;

    if(device_info.VersionCompare("4.7.36") > 0)
    {
        document.getElementById("version1").innerHTML = "Version > 4.7.36"
    }
    else
    {
        document.getElementById("version1").innerHTML = "Version <= 4.7.36"
    }
    
	if(device_info.HasFeature("Six Channel Audio"))
    {
        document.getElementById("feature").innerHTML = "6 Channel Audio Available"
    }
    else
    {
        document.getElementById("feature").innerHTML = "6 Channel Audio NOT Available"
    }
}
```


[title] assetpoolfiles
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

This *assetpoolfiles* object provides direct access to the files for assets in the pool.

**assetrealizer IDL**

```text
interface AssetPoolFiles {                                                                                                                                                                                   
    AssetPoolFiles(AssetPool pool, AssetList assets);                                                                                                                                                        
    Promise<String> getPath(String assetName);                                                                                                                                                               
    Promise<AssetInfo> getInfo(String assetName);                                                                                                                                                            
    Promise<void> moveFileIntoPool(String sourceFileName, String destinationAssetName);                                                                                                                          
}                                                                                                                                                                                                            
```

## Object Creation

To create an *assetpoolfiles* object, you will first need to create an *assetpool* instance and download files to it using an *assetpoolfetcher* instance. Then, load the  `brightsign/assetrealizer` module using the `require()` method, and create an instance of the *assetrealizer* class using the *assetpool* instance and the destination directory for realization.

```javascript
const AssetPoolClass = require("@brightsign/assetpool");
let assetPool = new AssetPoolClass("SD:/pool");
  
const AssetPoolFilesClass = require("@brightsign/assetpoolfiles");
let assetPoolFiles = new AssetPoolFilesClass(assetPool, assetCollection);
```

## AssetPoolFiles

Use this interface to gain access to information about the files for assets in the pool.

### getPath()

```javascript
Promise<String> getPath(String assetName)
```

Returns the full path to the file in the pool that corresponds to the named asset. This can be used to read, play or execute the corresponding asset as required. You must not modify the file since this will change its hash.

### getInfo()

```javascript
Promise<AssetInfo> getInfo(String assetName)
```

Returns the [AssetInfo](docId:1PwrkHCrG58LdHTSImJ-g) for the named asset if it is present in the pool. If the asset is not present then the returned promise is rejected.

### moveFileIntoPool()

```javascript
Promise<void> moveFileIntoPool(String sourceFileName, String destinationAssetName)
```

Move an existing file on the same storage device as the pool into the pool as the asset with the corresponding name. This is a quick operation because the hash is not checked. Note that this method does not cause any pruning of assets already in the pool to take place (although it may cause a subsequent operation that can prune the pool to do so.) This method is only rarely useful.

[title] usbhotplug
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *usbhotplug* object can be used to generate events when USB devices are added or removed. 

**usbhotplug IDL**

```javascript
interface usbhotplugevent {
    attribute String action;    // "add", "remove"
    attribute String path;      // platform specific device path
};

callback UsbHotplugEventCallback = void (usbhotplugevent event);

interface UsbHotplug {
    void addEventListener(String type, UsbHotplugEventCallback callback);
    void removeEventListener(String type, UsbHotplugEventCallback callback);
};

```

## Event Creation

To create a *usbhotplug* event, load the *@brightsign/usbhotplug* module using the `require()` method:

```javascript
let usbhotplugClass = require("@brightsign/usbhotplug");
let usbhotplug = new usbhotplugClass();
```

## UsbHotPlug 

Use this interface to configure a *usbhotplug* event.

- `usbhotplugevent`: This event is raised when the hotplug status changes. Use the `addEventListener()` method to listen for this event, or the `removeEventListener()` method to remove an event listener.

## usbhotplugevent Properties 

- `action` <font color="#6554c0">string</font>: Indicates whether a USB device has been added or removed.
- `path` <font color="#6554c0">string</font>: The path is an arbitrary string which varies between models and should not be parsed.  It may be useful for diagnostics. The path will be the same for add and remove events for a particular USB device. Use `@brightsign/deviceinfo` `getUsbBusTopology()` to examine attached devices. These events are hints that the topology has changed.

## Example

```javascript
let usbhotplugClass = require("@brightsign/usbhotplug");
let usbhotplug = new usbhotplugClass();

function onusbhotplugevent(event) {
  if (event.action == 'add') {
     console.log('New device at' + event.path)
  } else if (event.action == 'remove')
  {
     console.log('Device removed from' + event.path)
  }
}

usbhotplug.addEventListener("usbhotplugevent", onusbhotplugevent);
```


[title] B-Deploy Setup Entities  (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/


[title] B-Deploy/Provisioning APIs
[path] Cloud APIs/

The B-Deploy service allows for automated provisioning of BrightSign players over the Internet. This page outlines how to develop an application and file server (FS) that will integrate with B-Deploy. 

# Authentication

All B-Deploy calls require a valid authentication token. Authentication is carried out using the same OAUTH endpoint as other BSN.Cloud services. See Step 8 on [this page](docId\:HmKkvVtaUL2U2x8p6byb0) for more details.

# Required Components

To integrate with the B-Deploy server, you will need to create two components:

- **Application**: The application registers player serial numbers and Setup files with the B-Deploy server.
- **File Server**: The HTTP file server hosts presentation packages for distribution to players. Each presentation package is a ZIP file named *autorun.zip*, which contains presentation files along with an *autozip.brs* boilerplate script (see [this page](docId:1Dr98_7Il7GYneOwnX2cr) for more information). In most cases, the boilerplate script will not need to be modified.

# Workflow Overview

## B-Deploy

1. The user uploads one or more presentation packages to the file server (FS) and records the download URL for each package.
2. The user creates a player Setup File by posting a JSON payload containing Player Setup parameters to the B-Deploy server. The Player Setup contains the download URL for the presentation package.
3. Via the B-Deploy API, the user registers player serial numbers that should be associated with the Player Setup.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/HXVHJvzjsIrdW08105Gsn_pss-api-configuration.png" size="70" width="736" height="679" position="center" alt="PSS API Configuration.png" darkWidth="736" darkHeight="679" showCaption="false"}

## BrightSign Player

1. The user inserts a blank storage device (e.g. a microSD card) into the player and powers it on.
2. The player boots up and, lacking an *autorun.brs* or *autorun.zip* file on the storage device, launches on-screen Player Setup. The user must avoid activating the player using the Activation screen (or setting up the player with the Player Setup screen). These actions may prevent automated provisioning.
3. When on-screen Player Setup times out, the player queries the B-Deploy server (unless the local network infrastructure is configured for provisioning via DHCP Option 43).
4. The B-Deploy server responds with a provisioning script URL if the player serial number in the request matches a serial number in the database. If the B-Deploy server does not recognize the serial number, it will return status code 204.
5. The player reboots, downloads the provisioning script, and runs it. The provisioning script directs the player to download the Player Setup package from B-Deploy.
6. The player reboots and runs Player Setup, which sets the recovery URL to a handler on B-Deploy.
7. The player reboots, downloads a recovery script from the recovery URL, and runs it. The recovery script instructs the player to download the presentation package from the file server.
8. The player reboots and runs the presentation.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/EnJ44S5pFNiOwl0PyfmYp_device-workflow-v2.png" size="74" width="755" height="1416" position="center" darkWidth="755" darkHeight="1416" showCaption="false"}

## VLAN Network Setup via B-Deploy

Using B-Deploy with VLAN(s) has a few components to consider while configuring the network controller and the B-Deploy Setup Package. In order to download and apply a Setup package from B-Deploy on your player, an internet connection must first be connected without any manual Setup needed. This internet connection could be established through various methods; either through a physical ethernet connection (or BrightSign USB-C Ethernet adapter) possibly using DHCP to avoid a manual configuration needed; or WiFi configured through the player's On-Device Setup WiFi Access Point Mode (see [url.com](https://url.com/)); or connecting a BrightSign Mobile cellular modem. Keep in mind that the Setup package may configure this current network interface by adjusting, removing, or leaving it as is once the B-Deploy Setup Package has been applied. 

If the Setup package download has VLANs configured, your network controller interface must be configured to maintain internet connectivity. For example, if you download a Setup package via ethernet that prioritizes Wifi, and Wifi is expected to have an internet connection, the network controller must have Wifi configured with an internet connection. Then, although ethernet was used to download the Setup package, Wifi will be the only interface used for network traffic since it is a higher priority. The same is true for BrightSign Mobile and USB ethernet interfaces that are downloaded via ethernet.

If the Setup package does change the current configuration of the physical ethernet, the ethernet port in the network controller must support the VLAN configuration in the Setup package. If the current settings use ethernet to download the Setup package, then the network controller must allow the default/native VLAN (untagged) connectivity to support tagged VLANs.

[title] Firmware Update Collection Entity (v3)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 3.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v3)/

- `Camaro` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to HS6, XD6, and XS6 players
- `Cobra` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to HS5, HD5, LS5, XD5, and XT5 players
- `Thor` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to LGUV5N players.
- `Raptor` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to XC5 players
- `Sebring` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to AU5 players
- `Pagani` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to LS4, HD4, and HS4  players
- `Malibu` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to XD4 and XT4 players
- `Impala` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to XD3 and XT3 players
- `Pantera` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to HD3, HS3, HO3, and LS3 players
- `Panther` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to LS2, HD2, and HD0 players
- `Lynx` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to XD2 players
- `Tiger` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to 4K2 players
- `Cheetah` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to XD0 players
- `Monaco` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to HD0 players


[title] FirmwareUpdatebyFamily Entity (v3)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 3.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v3)/

This entity contains an array of the following properties by player family (Cobra, Raptor, Impala, Pantera, Tiger, Pagani, Malibu, and Sebring). These fields are only required if you need to do a firmware update.

For examples of how to update the OS for a particular player family, see the section at the bottom of the page.

## Properties

- `firmwareUpdateSource` <font color="#704ae0">string</font>: The enum source from which to get the firmware update. Possible values are “Production”, “Beta”, “MinimumCompatible”, “SpecificUrl”, “None”, or “Existing”. If you use “Production”, “Beta”, or “MinimumCompatible”, no additional values need to be defined.
- `firmwareUpdateStandardTargetFileName` <font color="#704ae0">string</font>: The name of the .bsfw firmware file that is targeted for updates. The update contained in the file is applied and if successful the file is deleted from the storage medium containing it. If the delete succeeds then the system reboots. If it fails then the device behaves as if the file had been named `*_save.bsfw` - see below. The delete always fails if the card uses an NTFS or HFS+ filesystem.
- `firmwareUpdateDifferentTargetFileName` <font color="#704ae0">string</font>: The name of a .bsfw firmware file. In run mode the update contained in this file is applied only if the version it contains does not match the version that is currently running. The file is not deleted but the infinite loop is avoided because on subsequent boots the version number will be the same so the update file will be ignored. In rescue mode the update is always applied.
- `firmwareUpdateNewerTargetFileName` <font color="#704ae0">string</font>: The name of a .bsfw firmware file. In run mode the update contained in the file is applied only if the version it contains is strictly newer than the version that is currently running. The file is not deleted but the infinite loop is avoided because on subsequent boots the version number will be the same so the update file will be ignored. In rescue mode, the update is always applied because the version of run mode cannot be checked and the infinite loop won't occur because the device will reboot into run mode.
- `firmwareUpdateSaveTargetFileName` <font color="#704ae0">string</font>: The name of a .bsfw firmware file. The update contained in the file is applied but the file is not deleted, because if the player rebooted at this point it would just apply the update against the player and will not automatically reboot when applying updates named like this until the storage device containing the update has been removed. This makes this filename useful if you wish to update many units from a USB key.
- `firmwareUpdateVersion` <font color="#704ae0">string</font>: This can be an empty string or the version number of the firmware you want to update to
- `firmwareUpdateSourceUrl` <font color="#704ae0">string</font>: Required if the source is “SpecificUrl”. This can be a source URL for the firmware update.

:::hint{type="info"}
If you want to source a BrightSign URL for any of the following parameters, you can find them in the publicly available manifest file ([https://bsncloud.s3.amazonaws.com/public/FirmwareManifest.json](https://bsncloud.s3.amazonaws.com/public/FirmwareManifest.json)):
:::

- `productionReleaseURL` <font color="#704ae0">string</font>: The URL to the .bsfw file that the player will pull the setup files from for use in production
- `betaReleaseURL` <font color="#704ae0">string</font>: The URL to the .bsfw file for the beta release version in production
- `compatibleReleaseURL` <font color="#704ae0">string</font>: The URL to the .bsfw file for the minimum compatible release version in production

## Examples

These examples all use the Cobra family, but other player families can be substituted. These examples contain the minimum required parameters for each firmware source and update type.

### Updating to the OS Production Version

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.59-update.bsfw"
  }
}
```

### Updating to the Minimum Compatible Version

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.59-update.bsfw"
  }
}
```

### Updating to the OS Beta Version

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.59-update.bsfw"
  }
}
```

### Updating using a Specific URL

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

### Updating to a Different OS

These examples update the OS if it is different from the one already on the player:

```json
// Different OS update - Production version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Different OS update - Beta version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Different OS update - Minimum compatible version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Different OS update - Specific URL version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

### Updating to a Newer OS

These examples update the OS version if that version is higher/newer than the one on the player:

```json
// Newer OS update - Production version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Newer OS update - Beta version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Newer OS update - Minimum compatible version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Newer OS update - Specific URL version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

### Updating and Saving the .bsfw File

These examples update the OS to a new version without deleting the .bsfw file from the SD card after the update is done, and does not reboot the player after the update is applied (to avoid a reboot loop):

```json
// Save OS update - Production version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateSaveTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Save OS update - Beta version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Save OS update - Minimum compatible version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Save OS update - Specific URL version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```


[title] htmlwidget
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *htmlwidget object* allows you to instantiate additional HTML browsers. 

**htmlwidget IDL**

```javascript
interface HtmlWidgetEvent {
    attribute String type;
    [optional] attribute String url;
};

callback HtmlWidgetEventCallback = void (HtmlWidgetEvent event);
[
    Constructor(HtmlWidgetParams params)
] interface HtmlWidget {
    void postMessage(Object data);
    void close();
    void raise();
    void lower();
    void addEventListener(String type, HtmlWidgetEventCallback callback);
    void removeEventListener(String type, HtmlWidgetEventCallback callback);
};
  
interface HtmlWidgetParams {
    attribute HtmlWidgetRect rect;
    attribute String url;
    [optional] attribute NodeParams node;
    [optional] attribute JavascriptInjection javascriptInjection;
    [optional] attribute bool bsObjects;
    [optional] attribute Storage storage;
    [optional] attribute String inspectorServer;
    [optional] attribute bool inputEnabled;
    [optional] attribute Security security;
    [optional] attribute String transform;
    [optional] attribute String hwzDefault;
    [optional] attribute bool interceptReloads;
};
  
interface HtmlWidgetRect {
    attribute long x;
    attribute long y;
    attribute long w;
    attribute long h;
};
  
interface NodeParams {
    attribute bool enabled;
    [optional] attribute Array<String> arguments;
};
  
interface JavascriptInjection {
    [optional] attribute JavascriptInjectionDetailList documentCreation;
    [optional] attribute JavascriptInjectionDetailList documentReady;
    [optional] attribute JavascriptInjectionDetailList deferred;
};
  
interface JavascriptInjectionDetail {
    [optional] attribute String world;
    [optional] attribute String source;
    [optional] attribute String uri;
    [optional] attribute String code;
};
  
interface Storage {
    attribute String path;
    attribute long quota;
    attribute bool forceSharedStorage;
    attribute bool forceUnsharedStorage;
};
  
interface Security {
    [optional] attribute bool insecureOriginEnabled;
    [optional] attribute bool cameraEnabled;
    [optional] attribute bool desktopCaptureEnabled;
    [optional] attribute bool audioCaptureEnabled;
    [optional] attribute bool insecureHttpsEnabled;
    [optional] attribute bool trustedIframesEnabled;
};
```

## Object Creation

To create a *htmlwidget* object first load the `brightsign/htmlwidget` module using the `require()` method. Then create an instance of the *htmlwidget* class. 

```javascript
var HtmlWidgetClass = require("@brightsign/htmlwidget");
var htmlwidget = new HtmlWidgetClass({ rect:{x: 0, y:0, w: 640, h: 480 }, url: "https://brightsign.biz" });
```

## HtmlWidgetEvent

Available as of BOS 9.0.168. See [JavaScript Event Handling](docId\:SurGnnHZ666sb1Wh6PbD9)

The cause of the event can be one of the following:

- `"load-started"`: The HTML widget has started loading a page.
- `"load-finished"`: The HTML widget completed loading a page.
- `"load-error"`: The HTML widget failed to load a page. Use the `url` key to identify the failing resource and the `message` key to retrieve some explanatory text.

## HtmlWidget

### postMessage()

```javascript
void postMessage(Object data)
```

Sends an asynchronous message to the child browser process. If the child process has an @brightsign/messageport object open, this message will generate a "bsmessage" event on that object. The payload can be any JavaScript object but must be only one level deep (that is, it cannot include other nested objects).

### close()

```javascript
void close()
```

Shuts down the child browser process. This is equivalent to calling *window\.close()* from inside the child browser.  Node.js® parent processes won't exit automatically and the HTML widget can't be garbage collected until the widget is closed.

### raise()

```javascript
void raise()
```

Changes the stacking order of HTML widgets

### lower()

```javascript
void lower()
```

Changes the stacking order of HTML widgets

## HtmlWidgetParams

This interface contains the HTML widget parameters.

- `rect` <font color="#704ae0">HtmlWidgetRect</font>: Contains the set parameters of the size and positioning of the widget. 
- `url` <font color="#704ae0">String</font>: The URL to use for display. 
- `node` <font color="#704ae0">NodeParams</font> <font color="#01a0af">optional</font>: Contains the parameters used to specify added Node.js functionality. 
- `javascriptInjection` <font color="#704ae0">JavascriptInjection</font> <font color="#01a0af">optional</font>: Contains the parameters that specify JavaScript code to inject at different initialization points.
- `bsObjects` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Enables or disables [BrightScript-JavaScript Objects](docId\:URrXhU7L-V9ea-Zhy0JV3). This value is disabled by default. 
- `storage` <font color="#704ae0">Storage</font> <font color="#01a0af">optional</font>:  Used to configure HTML storage.
- `inspectorServer` <font color="#704ae0">String</font> <font color="#01a0af">optional</font>: Enables the [Chromium Inspector](docId:4qlK1krr1cnx7xypWXRY5), which allows you to debug JavaScript applications while a webpage is running. Starting in BOS 8.5.31 you will need to also set the enable\_web\_inspector registry key (in the "html" section) to enable the JavaScript console. 
  - To access the console, navigate to the player IP address at the specified port number. See [this page](https://trac.webkit.org/wiki/WebInspector) for documentation relating to the JavaScript console.
  - In “enable\_web\_inspector”, "1" will allow the inspector and "0" or not present will disable it.  A reboot will be needed for these changes to take effect (if you enable/disable this through the LDWS UI, it may trigger a reboot to apply the change)

:::hint{type="danger"}
For security reasons, `enable_web_inspector` should only be used in non-production presentations. Make sure to disable JavaScript console before publishing to a production environment. In the Chromium version found in BOS 8.5.31 and beyond, the JavaScript console will log information in memory even when you are not connected to the inspector. This will consume memory until the player runs out, which will result in a crash.
:::

- `inputEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Enables mouse/touchscreen events. This value is false by default.
- `security` <font color="#704ae0">Security</font> <font color="#01a0af">optional</font>:  Override Chromium security checks.
- `transform` <font color="#704ae0">String</font> <font color="#01a0af">optional</font>: Sets the screen orientation of content in the widget (note that the coordinates and dimensions of the *roRectangle* containing the widget are not affected by rotation). The following values are accepted:
  - `"identity"`: There is no transform (i.e. the widget content is oriented as landscape). This is the default setting.
  - `"rot90"`: The widget content is rotated to portrait at 90 degrees (clockwise).
  - `"rot180"`: The widget content is rotated to portrait at 180 degrees (clockwise).
  - `"rot270"`: The widget content is rotated to portrait at 270 degrees (clockwise).
- `hwzDefault` <font color="#704ae0">String</font> <font color="#01a0af">optional</font>: Specifies the default [HWZ Video](docId\:e6uJleH69Q0JmMv8kyTrp) behavior. This value is `off` by default. To enable it, set it to `on`.
- `interceptReloads` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Prevents `window.location.reload()` or similar constructs from taking effect in the browser. Instead the parent will receive a `reloadRequested` event.

## HtmlWidgetRect

This interface allows you to set the size and positioning of the widget rectangle. 

- `x` long: Specifies the x coordinate for the widget.
- `y` long: Specifies the y coordinate for the widget. 
- `w` long: Sets the width of the widget in pixels.
- `h` long: Sets the height of the widget in pixels. 

## NodeParams

This interface allows you to enable Node.js and define the parameters of the Node.js command-line arguments. 

- `enabled` <font color="#704ae0">bool</font>: Enables [Node.js](docId\:vlSKfVzeQu04pD58rvXam) on the widget. The value is `false` by default. 
- `arguments` <font color="#704ae0">Array</font> <font color="#01a0af">optional</font>:  An array specifying command-line arguments. 

## JavascriptInjection 

Use this interface to inject user scripts into the JavaScript engine. 

- `documentCreation` <font color="#704ae0">JavascriptInjectionDetailList</font> <font color="#01a0af">optional</font>: The script will run as soon as the document is created. This behavior is not suitable for any DOM operation. 
- `documentReady` <font color="#704ae0">JavascriptInjectionDetailList</font> <font color="#01a0af">optional</font>: The script will run as soon as the DOM is ready. This behavior is equivalent to the `DOMContentLoaded` event firing in JavaScript. 
- `deferred` <font color="#704ae0">JavascriptInjectionDetailList</font> <font color="#01a0af">optional</font>: The script will run when the page load finishes. 

## JavascriptInjectionDetail

This interface defines the user scripts that are used by the JavascriptInjection interface. Exactly one of the `source`, `uri`, or `code` fields must be defined.

- `world` <font color="#704ae0">String</font> <font color="#01a0af">optional</font>: Isolates user scripts into different worlds. This string can be assigned one of the following values: `application`, `user`, or `main` (see [this page](https://doc.qt.io/archives/qt-5.6/qwebenginescript.html#ScriptWorldId-enum) for more details); if the `world` parameter is not included in the array, "`application`" is selected by default. 
- `source` <font color="#704ae0">String</font> <font color="#01a0af">optional</font>: Deprecated. Use `uri` or `code` instead.  
- `uri` <font color="#704ae0">String</font> <font color="#01a0af">optional</font>: If defined, this must contain either a "file" URI, or a "data" URI with one of the following supported formats:
  - "data\:text/javascript;charset=utf-8;"
  - "data\:text/javascript;charset=utf-8;base64,"
  - "data\:text/javascript;charset=us-ascii;"
  - "data\:text/javascript;charset=us-ascii;base64,"
- `code` <font color="#704ae0">String</font> <font color="#01a0af">optional</font>: If defined, the content will be executed as JavaScript code.

## Storage

This interface allows you to define the following HTML storage parameters:

- `path` <font color="#704ae0">String</font>: The folder used by local storage applications such as the JavaScript storage class. 
- `quota` <font color="#704ae0">long</font>: The size (in bytes) allotted to all local storage applications (including IndexedDB). If the storage path is specified without a storage quota, Chromium defaults to reserving 1GB plus 10% of the total size of the storage device.
- `forceSharedStorage` <font color="#704ae0">bool</font>: Allows HTTP/HTTPS loaded URLs to share local storage if they are loaded from the same domain. 
- `forceUnsharedStorage` <font color="#704ae0">bool</font>: Prevents file loaded URLs from sharing storage.

:::hint{type="info"}
Data can be corrupted if two HTML widgets access the database at the same time, but some applications rely on this type of access. Use the `force_unshared_storage` flag to avoid sharing on local URLs if you experience data problems, or use the `force_shared_storage` flag to allow sharing on HTTP/HTTPS sites.
(If both flags are set, file storage is separated and HTTP storage is not.)
:::

## Security 

Overrides Chromium security checks for these parameters:

- `insecureOriginEnabled`  <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Ignore insecure origins and treat them as enabled.
- `cameraEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Enables webpage access to USB cameras connected to the player (access is disabled by default). This allows support for WebRTC applications. 
- `desktopCaptureEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Enables desktop capture.
- `audioCaptureEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Enables audio capture.
- `insecureHttpsEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Ignore security errors when connecting to insecure HTTPS hosts (insecure HTTPS is disabled by default). Enabling this feature makes the player insecure; it is not suitable for production environments and should only be used for testing.
- `trustedIframesEnabled` <font color="#704ae0">bool </font><font color="#01a0af">optional</font>: Controls if content loaded in iframes is permitted access to Node.js and BrightSign-JavaScript objects. This flag will be available for BOS versions 9.1.75.3 and later. It will result as a failure to load HTML widget if used in earlier versions.
  - To enable Node in iframes, initialize `enabled` and `trustedIframesEnabled` to be `true`.
  - To enable [BrightSign-JavaScript](docId\:URrXhU7L-V9ea-Zhy0JV3) objects in iframes, initialize `bsObjects` and `trustedIframesEnabled` to be `true`.

With BOS 8.2 and later (Chromium69 and later), several new CORS checks have been added. `security_params.websecurity` or `enableSecurity(false)` do not disable all these checks. Use the following registry setting instead:

`registry write html disable-web-security 1`

This flag will take effect on all `htmlwidget` instances, as opposed to previous flags which are only effective on the instance they are called on.

To write this to the registry using [roRegistrySection](docId\:FfM73tjd_BThW4-P-0JVG):

```javascript
RegHtml = CreateObject("roRegistrySection", "html")
RegHtml.Write("disable-web-security", "1")
RegHtml.Flush()
```


[title] BrightSign Asset Pool
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The BrightSign Asset Pool provides a reliable and resilient mechanism for downloading, storing and retrieving media assets and other files required by the player for its presentations.

## Core Concepts

### The Pool

An asset pool is a directory hierarchy under a single root. The directory is often simply named "pool", but the underlying implementation does not require that. Each asset is stored in one of a number of sub-directories to improve performance on simple filesystems like FAT.

The destination for a particular asset in the pool is determined by its [hash](https://en.wikipedia.org/wiki/Cryptographic_hash_function) (or digest) of its contents (or, in some cases, a hash of its metadata) which makes it a content-addressable store. In order to refer to an asset either before or after it has been downloaded it is necessary to know its hash. (This is similar to the way that objects are stored in a Git repository.)

The pool can be configured with a maximum size and/or to ensure that a particular amount of space remains free on the storage device that contains it. In order to stop the pool growing beyond these bounds old files are "pruned". Files that must not be pruned must be "protected" before any operations are started that may write to the pool.

An asset that is stored in the pool using a particular hash will only be stored once until it is pruned. Requests to download an asset that is already in the pool will immediately succeed since the asset is already present. This means that switching between presentations that share assets, even perhaps ones that haven't been used for a while, can avoid downloading assets unnecessarily.

### Asset Collections

An asset collection is a list of asset metadata. The metadata either directly contains the hash as a specific field or the hash can be generated directly from other fields. The metadata also provides a name for each asset which allows assets and therefore files in the pool to be looked up by name. An asset collection is necessary to provide meaning for the assets stored in the pool. Asset collections themselves exist only in memory and are not stored in the pool itself.

### Synchronization Specification

Synchronization specifications are often refered to as "sync specs". They consist of formatted XML or JSON that can be used to generate an asset collection but also have space for extra information that can be useful when downloading assets. They are not recommended unless compatibility with existing systems that use them is required.

### Asset Fetcher

An asset fetcher runs asynchronously downloading any assets mentioned in an asset collection that are not currently available in the pool. The file contents are automatically verified against the supplied hash during the download.

### Protocols

Assets are expected to primarily be downloaded using HTTP or HTTPS. However, the fetcher also supports FTP and file URLs.

### Authentication

Arbitrary HTTP headers can be provided when fetching all the assets in an asset collection. The fetcher supports HTTP Basic, Digest and NTLM authentication. Individual assets within a collection can be marked as opting out of providing these headers and authentication.

## Managing Pool Size

The pool is intended to live for a long time with assets being fetched into it as required. If the pool becomes too full then unused assets will be pruned to make space. This means that any assets that are still required (or will be required) must be protected before performing any operations that may prune such as fetching or realizing.

The pool size can be restricted in two ways:

- by requiring that a certain amount of space on the storage device always be kept free. This means that space can be reserved for logs to grow into and any pool operations that can prune will ensure that at least the requested amount of space remains free. Checking the amount of free space on a storage device is a lightweight operation so this method should be preferred.
- by setting a maximum size that the pool can occupy. This can be used in combination with the previous method and attempting to exceed either threshold will trigger pruning. Calculating the size of the pool requires adding up the size of each file individually, so the first operation can take longer than usual. Once the first calculation is complete the pool size is only updated based on modifications to the pool so subsequent operations have less overhead.

Files are considered for pruning based on how long ago they were last fetched, or would have been fetched had they not already been present in the pool. The least-recently fetched unprotected files will be pruned first. Note that unless the "working set" of assets is close to the maximum size of the pool this can often mean that any failures to protect assets have no ill effects.

## Referring To Assets In The Pool

Asset files can often be used directly from the pool. The pool filename corresponding to an asset can be looked up by name in an asset collection.

Sometimes it is necessary for the asset files to appear with their names within the filesystem. Asset files can be copied to a destination directory. This is known as "realization" and should only be used when necessary since it can be very slow. Alternatively, an asset collection can be made to appear as a virtual filesystem.

## Hash Uniqueness

The hash for a particular asset file must be unique. This happens automatically for normal hash algorithms such as SHA-256 since hash collisions should not be possible. If two files with different contents generate the same hash, this is known as a "hash collision". Some older hash algorithms such as MD5 and SHA-1 are known to have hash collisions, but these only occur when files have been deliberately constructed to create such collisions – they do not occur by accident.

Sometimes the actual hash of the asset is not available prior to the download. In this case parts of the asset metadata, such as the URL and a change hint are hashed together instead. If the asset changes then some part of the metadata must also change so that the asset fetcher knows to download the asset again.

It is not possible to use HTTP headers like ETag or Last-Modified as part of the hash since these aren't known prior to the download and can change independently.

## Asset Metadata

| **Tag**      | **Description**                                                                                                                                                                                                                                                                                                                                                                              |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| name         | Relative filename (may contain slashes but if so the file may not be realized.) Asset names must be unique within an asset collection, but it is expected that different asset collections will contain assets with the same name. The asset name is not stored in the pool, and the same asset file in the pool may be referenced by multiple names, even within the same asset collection. |
| size         | File length in bytes                                                                                                                                                                                                                                                                                                                                                                         |
| hash         | Hash algorithm and hash of file contents.                                                                                                                                                                                                                                                                                                                                                    |
| link         | Source URL                                                                                                                                                                                                                                                                                                                                                                                   |
| change\_hint | An arbitrary value used by the client to ensure that files that have the same hash are not considered to be identical unless this value and the URL also matches.                                                                                                                                                                                                                            |
| auth         | Specify extra authentication information (see below).                                                                                                                                                                                                                                                                                                                                        |
| probe        | Media probe data (useful for Cheetah and Panther).                                                                                                                                                                                                                                                                                                                                           |
| pattern      | Wildcard pattern to match against                                                                                                                                                                                                                                                                                                                                                            |

## Hashing

### Simple Hash Algorithms

md5, sha1, sha224, sha256, sha384, sha512

### BESHA1 Algorithm

This algorithm is only useful for referring to remote content that is too large to download during authoring. Its use is not recommended.

### No Hash

If no hash is specified then the hash is generated internally by hashing together the "link" and "change\_hint" fields.

## Usage Overview

The BrightSign asset pool can be used from BrightScript or from Javascript but it is not possible to share a single pool across both. However, the BrightScript  `roHtmlWidget.MapFileFromAssetPool` method can be used to make a particular asset collection appear as files under a particular URI prefix.

### BrightScript

TBD

### Javascript

1. Create @brightsign/assetpool object to represent the asset pool passing the path to the pool directory.
2. Create the asset collection data structure. This is a JavaScript array of objects containing the metadata for the assets you wish to use.
3. Protect the assets by calling the `assetpool.protectAssets` method to stop them being deleted in order to make space.
4. Create a @brightsign/assetfetcher object passing the pool.
5. Call the assetfetcher.start method passing the asset collection. Any assets that are not present in the pool will start to be downloaded.
   1. Progress can be monitored by adding handlers for the progressevent and fileevent events.
   2. If the fetch attempt completes successfully then the promise returned by assetfetcher.start will be resolved. If at least one of the assets could not be fully downloaded then the promise will be rejected.&#x20;
   3. When the promise returned by assetfetcher.start resolves, the fetch attempt is complete. 
6. Create your set of assets as a JavaScript array of objects containing the metadata.
7. Create a @brightsign/assetfiles object passing the pool and asset collection.This object can be used to retrieve the full path to the files in the pool that correspond to the asset name specified. See [assetpoolfiles](docId\:NhoCAmfrJ0AvAHJ-Vearr) for more information.
8. Create a @brightsign/assetrealizer object passing the pool and call the realize method if you wish to copy assets from the pool to a directory using the asset names. Note that this is slow and is only recommended for files that must exist in the filesystem such as BrightSignOS upgrade files (bsfw).
9. Create a @brightsign/assetcollectionview object passing the pool and the asset collection to create a virtual storage device containing the assets using the names and directory structure in the asset collection. See [assetpoolfiles](docId\:NhoCAmfrJ0AvAHJ-Vearr) for more information.

## Example

[BrightSign Asset Pool Example](docId\:i3EKdHEt5Fkspb_MVfjFl) shows how the Asset Pool can be used from JavaScript. It works from both NodeJS and Chromium, and can be run from the BrightSign shell as follows:

```javascript
node bs-assetpool-example.js
```


[title] systemtime
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *systemtime&#xA0;*&#x6F;bject provides the ability to read and write the time stored in the real-time clock (RTC). It can also be used to read and write the time-zone setting.

**systemtime IDL**

```javascript
interface SystemTime {
    Promise<void> setDate(Date date);
    Promise<void> setTimeZone(String timezone_string); // requires reboot
    Promise<String> getTimeZone();
    Promise<LastNetworkTimeResult> lastNetworkTimeResult();
    void addEventListener(String type, NetworkTimeEventCallback callback);
    void removeEventListener(String type, NetworkTimeEventCallback callback);
};

interface LastNetworkTimeResult {
    readonly attribute long successTimestamp;
    readonly attribute long attemptTimestamp;
    readonly attribute String failureReason;
};
```

## Object Creation

To create a *systemtime* object, first load the `brightsign/systemtime` module using the `require()` method. Then create an instance of the *systemtime* class.

```javascript
var systemTimeClass = require("@brightsign/systemtime");
var systemTime = new systemTimeClass();
```

## SystemTime

Use this interface to set the date and time zone and retrieve network time data.

### Events

`[EventHandler] networktimeevent`:  An event that is is raised when the player attempts to update its clock via the network. Use the `addEventListener()` method to listen for this event. Results are returned as a *NetworkTimeEvent&#xA0;*&#x69;nterface.

### Methods

**setDate()**

```javascript
Promise<void> setDate(Date date)
```

Specifies a new time for the RTC using the current time zone.

**setTimeZone()**

```javascript
Promise<void> setTimeZone(String timezone_string)
```

Specifies a new time-zone setting for the player (supported time zones are listed on [this page](docId\:HWR0ZojGTZxXnUHDLHlf9)). Alternatively, a POSIX-formatted time zone can be applied by appending a `POSIX:` value to the beginning of the string. This method requires a reboot to go into effect.

**getTimeZone() As Promise\<String>**

```javascript
Promise<String> getTimeZone()
```

Returns the current time-zone setting of the player. A `POSIX:` value is appended to the beginning of the string if the time zone has been set using the POSIX format.

**lastNetworkTimeResult()**

```javascript
Promise<LastNetworkTimeResult> lastNetworkTimeResult()
```

Returns a LastNetworkTimeResult interface containing information about the last attempt to set the time via the network.

## LastNetworkTimeResult

This interface contains information about the last attempt to set the time via the network. It contains the following read-only attributes:

- `successTimestamp` <font color="#6554c0">long</font>: A value indicating when (in seconds) the clock was last set successfully via the network. This value is zero if the clock has never been set successfully via the network.
- `attemptTimestamp` <font color="#6554c0">long</font>:  A value indicating when (in seconds) the last attempt was made to set the clock via the network. This value is zero if no attempt has been made yet.
- `failureReason` <font color="#6554c0">String</font>:  If the last attempt to set the clock via the network failed, this string will contain an error message. If the last attempt was successful, this string will be empty.

## NetworkTimeEvent

This interface is returned by the event listener for `networktimeevent`. It contains the following read-only attributes:

- `success` <font color="#6554c0">bool:</font> A flag indicating whether the last attempt to set the time via the network was successful or not.
- `reason` <font color="#6554c0">string</font>: An error message that will be included if the last attempt failed.

## Example

```javascript
var SystemTimeClass = require("@brightsign/systemtime");
var systemTime = new SystemTimeClass();

//Set the date to 2018
var date = new Date();
date.setFullYear(2018);
systemTime.setDate(date);

//Set the time zone
systemTime.setTimeZone("PST")

//Listen for a network time event
systemTime.addEventListener("networktimeevent",
    function(data) {
        console.log("Last network update:" + JSON.stringify(data.detail));
    });
```


[title] cookiestore
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *cookiestore* object retrieves a list of cookies from the containing browser (which implies that this class is only available for code running inside a browser instance, not from roNodeJs).

**cookiestore IDL**

```text
interface Cookie {
    attribute String domain;
    attribute String path;
    attribute String name;
    attribute String value;
};
 
interface cookiestore {
    Array<Cookie> getCookies();
}
```

## Object Creation

```javascript
let CookieStoreClass = require("@brightsign/cookiestore");
let cookieStore = new CookieStoreClass();
```

## Cookie

### getCookies()

```javascript
    Array<Cookie> getCookies()
```

Gets cookies from the containing browser.

- `domain` <font color="#704ae0">string</font>: Specifies the hosts that are allowed to receive the cookie, including subdomains.
- `path` <font color="#704ae0">string</font>: To send the Cookie header, this URL path must exist in the URL request. 
- `name` <font color="#704ae0">string</font>: The name of the cookie
- `value` <font color="#704ae0">string</font>: The value of the cookie

## Example

To list the cookies saved on a browser instance on a console:

```javascript
let CookieStoreClass = require("@brightsign/cookiestore");
let cookieStore = new CookieStoreClass();

let cookies = cookieStore.getCookies();

cookies.forEach((cookie) => {console.log("Cookie domain: " + cookie.domain + " Cookie path:" + cookie.path + " Cookie name:" + cookie.name + " Cookie value:" + cookie.value)});
```


[title] JavaScript APIs
[path] Player APIs (BrightScript & JavaScript)/

The BrightSign API for JavaScript allows you to interface with the BrightSign player firmware to configure the player, retrieve system data, and interface with peripheral devices. This API allows for operation of a digital signage platform–including playback, scheduling, diagnostics, and network configuration–using HTML/JavaScript, without the need for extensive coding in BrightScript.

## JavaScript APIs Replace Previous “BrightScript-JavaScript Objects”

This API replaces the [BrightScript-JavaScript objects](docId\:URrXhU7L-V9ea-Zhy0JV3). Those older JavaScript objects are still offered for backwards-compatibility purposes. See the [BrightScript-JavaScript Migration Guide](docId:2KEwWxLmpYcwu8tffuf2Z) for the mapping between BrightScript and JavaScript APIs.

JavaScript objects are embedded into the browser runtime. They only exist in the global JavaScript namespace, and can only be used with *roHtmlWidget*.

Thus JavaScript API uses node modules. It works seamlessly with [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) and [roNodeJs](docId\:x9c4JHn6rnqgryflY1wdQ). It is a superset of legacy JavaScript objects.

BrightSign has not added new features to the legacy BrightScript-JavaScript objects for several years, and all of our current development efforts go into JavaScript APIs. The legacy BrightScript-Javascript objects exist to support customers who use them in deployed software, and to maintain that support during OS upgrades. 

Unlike the legacy BrightScript-JavaScript objects, there is no one-to-one relationship between BrightScript objects and objects in the new JavaScript API. Many BrightScript functions (e.g. HTTP server and file storage capabilities) are not exposed in the new API because JavaScript and Node.js® expose standardized, popular equivalents.

## Enabling the JavaScript API

The BrightSign API for JavaScript is implemented with the Node.js module, which is included with the Chromium engine on the player. To use the BrightSign API with an *roHtmlWidget* instance, you must enable Node.js when creating the widget:

### Example

```javascript
r=createobject("rorectangle",0,0,1920,1080)
aa=createobject("roassociativearray")

aa.url="http://test-server/index.html"
aa.nodejs_enabled=true

bb=createobject("roassociativearray")
bb.port=3000
aa.inspector_server=bb

h=createobject("rohtmlwidget",r,aa)
h.show()
```

In the above example, Node.js is enabled by including the `nodejs_enabled:true` entry in the associative array that is passed during creation of the *roHtmlWidget* instance.

## Loading BrightSign Modules

The BrightSign API does not exist in the global (window) namespace of the JavaScript runtime. Instead, like Node.js objects, BrightSign modules are loaded using the `require()` function (i.e. `require("@brightsign/<module_name>")`). BrightSign modules are actually part of the firmware, but in terms of usage, they are identical to other Node.js modules.

### Example

```javascript
var NetworkConfigClass = require("@brightsign/networkconfiguration");   // Call the class constructor for the networkconfiguration object.
var wifi = new NetworkConfigClass("ethernet"); 							// Create an instance of the networkconfiguration class.
```

## Synchronous and Asynchronous Methods

BrightSign modules contain both synchronous and asynchronous methods. Synchronous methods return an object that can be used immediately, while asynchronous methods return a Promise object, which will itself return the object data when the operation is resolved. Scripts must handle these delayed returns (typically using the `.then()` and `.catch()` methods available on the Promise object).

### Example

```javascript
var NetworkConfigClass = require("@brightsign/networkconfiguration");
var wifi = new NetworkConfigClass("wlan0"); 
wifi.scan().then(											 // Call the Scan() method, which returns a promise.
		function(data){console.log(JSON.stringify(data));}) // The resolve/success case, which prints the scan results 
	.catch(
		function(data){console.log(JSON.stringify(data));}) // The reject/failure case, which prints the failure reason
```


[title] syncmanager
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

As of BrightSignOS 8.2.10, the *syncmanager&#xA0;*&#x6F;bject provides synchronization capabilities for video walls and other deployments that require closely calibrated interaction among players. See [roSyncManager](docId\:Wwc22ZsPhu1e689xe7en6) for more details, including information about PTP domains.

**syncmanager IDL**

```javascript
[
    constructor(String networkInterface, String domain, String multicast_address, unsigned multicast_port)
] interface SyncManager {
            attribute boolean leader;
            attribute String networkInterface;
   readonly attribute String domain;
            attribute boolean encrypted;
            attribute boolean encryptionKeyIsObfuscated;
  writeonly attribute String encryptionKey;
   void synchronize(in String id, in unsigned long ms_delay);
   void close()
};
```

## Object Creation

To create an *syncmanager* object, first load the `brightsign/syncmanager` module using the `require()` method. 

```javascript
const BSSyncManager = require("@brightsign/syncmanager");
let sm = new BSSyncManager(network_interface, domain, multicast_address, multicast_port);
```

The constructor for a syncmanager object takes four arguments:

- `network_interface` <font color="#6554c0">string</font>: The network interface (for example, "eth0")
- `domain` <font color="#6554c0">string</font>: The domain identifier used to distinguish among different *roSyncManager* instances.
- `multicast_address` <font color="#6554c0">string</font>: The multicast address to which synchronization messages are communicated.
- `multicast_port` <font color="#6554c0">int</font>: The multicast port to which synchronization messages are communicated.

## SyncManager

**synchronize()**

```javascript
void synchronize(in String id, in unsigned long ms_delay)
```

Broadcasts a time-stamped message to other players. This method is used on the leader unit only. The message will be rebroadcasted every second to allow follower units that are powered on late to catch up. The network message contains the sync ID, as well as the domain and a timestamp. The timestamp is created at the point when this method is called; however, it can be offset by passing a non-zero `ms_delay` value, allowing synchronization points to be set slightly in the future and giving the client enough time to switch video files and perform other actions. The `identifier` parameter allows the script on the leader unit to pass a filename, or some other useful marker, to the follower units as part of the synchronization message. This method returns the message that is sent out so that the leader can access the timestamp. 

The synchronization message is sent over all available networks (including WiFi), but follower units will use only the first message received.

:::hint{type="info"}
Because synchronization can involve follower units seeking to catch up with the playback of a leader unit, we recommend using the more efficient MOV/MP4 container format when synchronizing video files. Transport Stream files (MPEG-TS) are also supported, but they must begin with a presentation timestamp (PTS) of 0. Program Stream files (MPEG-PS) are not supported.
:::

**close()**

```javascript
void close()
```

Shuts down the instance, freeing the underlying sync manager. 

## SyncManager Properties

- `leader` <font color="#6554c0">boolean</font>: A read/write attribute to set/get whether the sync manager is a leader, or a follower.
- `networkInterface `<font color="#6554c0">string</font>: A read/write string attribute to set/get which network interface the sync manager uses (for example, "`eth0`", "`wifi0`"). The networkInterface parameter can be "" to allow any network interface.
- `domain` <font color="#6554c0">boolean</font>:  A read-only string attribute which returns the domain for the sync manager

`encrypted`, `encryptionKey` and `encryptionKeyIsObfuscated` are used to configure the use of encryption with the sync manager:

- `encrypted` <font color="#6554c0">boolean</font>: A read/write attribute that controls whether the sync manager uses encryption: If `true`, encryption is enabled on the unit. 
- `encryptionKeyIsObfuscated` <font color="#6554c0">boolean</font>: A write-only string attribute which is used to set the key used for encryption. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.
- `encryptionKey` <font color="#6554c0">string:</font> A write-only string attribute which is used to set the key used for encryption

## Synchronizing Video Playback

When using syncmanager for video synchronization, sync events are broadcast repeatedly (\~1 Hz) to ensure all players receive them. Your code must track the sync ID and only respond to the first occurrence of each new ID to avoid reloading the video on every repeated event.

See our GitHub repo for syncmanager leader and follower code examples:&#x20;

[https://github.com/brightsign/dev-cookbook/tree/main/examples/browser/syncmanager-js](https://github.com/brightsign/dev-cookbook/tree/main/examples/browser/syncmanager-js)&#x20;

:::hint{type="danger"}
Without tracking \`currentSyncId\`, the video will reload every second when repeated events arrive, disrupting playback.
:::


[title] decoderconfiguration
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *decoderconfiguration* object allows you to configure video decoders for Mosaic Mode.

**decoderconfiguration IDL**

```text
interface DecoderConfiguration {
    Promise<DecoderConfigRead> getConfig();
    Promise<void> applyConfig(DecoderConfig config);
};

interface DecoderConfigWritable {
    attribute String name;
    attribute String friendlyName;
    attribute String configuredSize;
    attribute int zIndex;
    attribute bool mosaicDeinterlace;
};

interface DecoderConfig : DecoderConfigWritable {
    attribute String maxSize;
    attribute String mode;
    attribute int usageCount;
    attribute int maxUsage;
};
```

## Object Creation

To create a *decoderconfiguration* object, first load the `brightsign/decoderconfiguration`  module using the `require()` method. Then create an instance of the *decoderconfiguration* class.

```javascript
var DecoderConfigurationClass = require("@brightsign/decoderconfiguration");
var decoderConfig = new DecoderConfigurationClass();
```

## DecoderConfiguration

Use this interface to retrieve and modify video decoder data.

### getConfig()

```javascript
Promise <DecoderConfigArray> getConfig() 
```

Returns an array of *DecoderConfig* interfaces. Each interface describes a video decoder.

### applyConfig()

```javascript
Promise <void> applyConfig(DecoderConfigArray config) 
```

Configures video decoder(s) for either standard mode or Mosaic mode. In standard mode, a single decoder is used to play a single video; in Mosaic mode, the decoder can be used to decode multiple videos from different local or remote sources. This method accepts an array of *DecoderConfig* interfaces–attributes that are read-only (e.g. `maxSize`) will be ignored.

The system software selects which video decoder to use based on the resolution probed from the video file. In standard mode, it will attempt to select the decoder that has the closest maximum supported resolution (i.e. 1920x1080 for the HD decoder and 3840x2160 for the 4K decoder), without exceeding that maximum resolution. If a decoder has been configured for Mosaic mode, it will match the video resolution against the specified  `configuredSize` instead. If two decoders support the same maximum resolution, you can select a decoder manually using the `friendlyName` attribute.

To select a decoder for an HTML video, include the `decoder:[Friendlyname]` property with the [HWZ attribute](docId\:e6uJleH69Q0JmMv8kyTrp):

```javascript
<video hwz= "decoder:main-video;" > </video>
<video hwz= "decoder:sd-video;" > </video> 
```

The `maxUsage` value of a decoder determines how many video players can be assigned to the decoder using the system software algorithm described above—video players beyond the `max_usage` limit may be assigned to another decoder or not displayed at all. On the other hand, if you manually assign video players using the `friendly_name` of the decoder, you can assign more video players to the decoder than the `max_usage` limit, but this may cause unpredictable video-display behavior.

## DecoderConfig

This interface contains the settings of a video decoder. It contains both editable and read-only attributes.

### Editable

- `name` <font color="#704ae0">string</font>: The system name of the video decoder (decoder availability differs by model):
  - "4K1": The primary 4K decoder (XTx44 models only)
  - "4K2": The secondary 4K decoder (XTx44 models only)
  - "4K": The sole 4K decoder (HDx24, XTx43, 4Kx42, XDx34, and XDx33 models only)
  - "HD1": The first HD decoder
  - "HD2": The second HD decoder
- `friendlyName` <font color="#704ae0">string</font>: A name for referencing the decoder in HTML or BrightScript
- `configuredSize` <font color="#704ae0">string</font>: The maximum resolution that the decoder will accept (at framerates up to 60p). If this resolution is the same as the decoder's maximum resolution limit, the decoder will use standard mode; otherwise, it will use Mosaic mode.
  - "4K": 3840x2160
  - "HD": 1920x1080
  - "SD": 720x576
  - "CIF": 352x288
  - "QCIF": 176x144

:::hint{type="danger"}
Upscaling videos in Mosaic mode currently causes severe performance degradation.
:::

- `zIndex` <font color="#704ae0">int</font>: The z-index of the video window (in standard mode) or group of video windows (in Mosaic mode) relative to the graphics plane:
  - 1: The video window (or group of windows) is positioned in front of the graphics plane.
  - -1: The video window (or group of windows) is positioned behind the graphics plane.
- `mosaicDeinterlace` <font color="#704ae0">bool</font>: Whether Mosaic-mode videos can be interlaced or not. Enabling the deinterlacer will allow playback of interlaced videos in Mosaic mode, but will reduce the number of Mosaic-mode videos that can be decoded simultaneously as well.

### Read-Only

- `maxSize` <font color="#704ae0">string</font>: The maximum resolution of the decoder, as set by system software. This value can be either `"4K"` or `"HD"`
- `mode` <font color="#704ae0">string</font>: The current mode of the decoder, which can be either `"regular"` or `"mosaic"`
- `usageCount` <font color="#704ae0">int</font>:  The number of videos currently being decoded by the decoder
- `maxUsage` <font color="#704ae0">int</font>: The maximum number of videos that can be decoded simultaneously by the decoder (this value is always 1 in `"regular"` mode). The optimum  `max_usage` limits are described below; the limit may be lower depending on a number of factors, including interlacing and frame rate.
  - 4K decoder:
    - 1 4K video
    - 2 HD videos
    - 4 SD videos
    - 8 CIF videos
    - 10 QCIF videos
  - HD decoder:
    - 0 4K videos
    - 1 HD video
    - 3 SD videos
    - 4 CIF videos
    - 5 QCIF videos

## Example

This script retrieves the current video decoder configuration and modifies it so that the 4K decoder can be used to decode 2 HD videos.

```javascript
var DecoderConfigurationClass = require("@brightsign/decoderconfiguration");
var decoderConfig = new DecoderConfigurationClass();

function findDecoder(element) {
    return element.name === "4K";
};

function setDecoder(decoderList) {
    decoder = decoderList.find(findDecoder);
    decoder.friendlyName = "main-video";
    decoder.configuredSize = "HD";
    decoder.zIndex = 1;
    decoderConfig.applyConfig(decoderList).then()
        .catch(
            function(data) {
                console.log(JSON.stringify(data));
            });
};

decoderConfig.getConfig().then(
        function(data) {
            setDecoder(data);
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });
```


[title] BSIRTransmitter
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

This class receives IR events. For more information, refer to the Object Reference Manual entry on *roIRTransmitter*.

## Object Creation

A *BSIRTransmitter* object must specify the hardware interface that will output the IR signal:

`BSIRTransmitter (in DOMString interface)`

Valid hardware interfaces include the following:

- "IR-out": The 3.5mm IR input connector (available on XDx30 players) or 3.5mm IR input/output connector (available on XTx43, 4Kx42, XDx33, and XDx32 players)
- "Iguana": The [Iguanaworks](http://iguanaworks.net/) IR transceiver

## Methods

- `Send(in DOMString Type, in unsigned long code)` boolean&#x20;
- `SetSendPolarity(in boolean polarity)` boolean&#x20;
- `Close()` void&#x20;

Shuts down the instance, preventing it from further consuming resources. If this method is not called, garbage collection determines when the instance will be destroyed.

## Example

```text
<script>
    var irTransmitter = new BSIRTransmitter("IR-out");

    function irCode1()
    {
        console.log('############ irCode1');
        irTransmitter.Send("NEC", 65284);
    }
    function irCode2()
    {
        console.log('############ irCode2');
        irTransmitter.Send("NEC", 65288);
    }
    function irCode3()
    {
        console.log('############ irCode3');
        irTransmitter.Send("NEC", 65290);
    }
</script>
```


[title] Setup Package Info Entity (v3)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 3.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v3)/

The Setup Package info entity contains the following properties:

- `_id` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: A unique identifier of a given Setup Package
- `username` <font color="#704ae0">string</font><font color="#01a0af"> read-only</font>: Login of a person which created a given Setup Package
- `client` <font color="#704ae0">string</font><font color="#01a0af"> read-only</font>: A client ID of an application used to create a given Setup Package
- `packageName` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: A name of a Setup Package
- `setupType` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: A player Setup type which defines the content delivery method. One of "Standalone", "LFN", "SFN", "PartnerApplication", "BSN" enumeration values.
- `networkName` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: The name of a BSN.com/BSN.Cloud network to which a given Setup Package belongs
- `deviceName` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: A user-defined name for a player to be set during registration
- `deviceDescription` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: A user-defined description for a player to be set during registration
- `bsnGroupName` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: The name of a BSN.com/BSN.Cloud group to which to assign players
- `setupJson` <font color="#704ae0">string</font> <font color="#01a0af">rite</font>: A JSON representation of a Device Setup entity
- `version` <font color="#704ae0">string </font><font color="#01a0af">only</font><font color="#704ae0">: </font>A numeric version of a Setup Package format
- `createdAt` <font color="#704ae0">string</font><font color="#01a0af"> </font><font color="#01a0af">read-only</font>: A UTC timestamp indicating when the player Setup was created. The date/time is formatted as `yyyy-mm-ddThh:mm:ss.sssZ`
- `updatedAt` <font color="#704ae0">string </font><font color="#01a0af">read-only: </font>A UTC timestamp indicating when the player Setup was last modified. The date/time is formatted as `yyyy-mm-ddThh:mm:ss.sssZ`


[title] controlport
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

This *controlport* object is used to configure output levels on the I/O connector and monitor inputs and provides support for the BP200/BP900 USB button boards and GPIO ports. Typically, LEDs and buttons are attached to the GPIO connector on the BrightSign player or the BrightSign Expansion Module.

**controlport IDL**

```text
    Constructor(String port)
] interface ControlPort {
    bool SetOutputValue(unsigned param);
    bool SetOutputValues(unsigned p1, unsigned p2, unsigned p3, unsigned p4);
    bool SetPinValue(unsigned pin, unsigned param);
    bool GetPinValue(unsigned pin);
    bool ConfigureAsInput(unsigned pin);
    bool ConfigureAsOutput(unsigned pin);
    void Close()
};
```

## Object Creation

To create an *controlport* object, use the `require()` method:

```javascript
let control_port_class = require("@brightsign/legacy/controlport")
let control_port = new control_port_class("TouchBoard-0-GPIO");
```

The c*ontrolport* object is created with a parameter that specifies the port being used (`TouchBoard-0-GPIO` in the example above). The port parameter can be one of the following:

- `BrightSign`: Specifies the onboard GPIO connector (including the SVC (GPIO12) button).
- `Expander-GPIO`: Specifies the DB-25 connector on the BrightSign Expansion Module. If no BrightSign Expansion module is attached, then object creation will fail and Invalid will be returned.
- `Expander-<n>-GPIO`: Specifies a [USB-to-GPIO device](https://www.brightsign.biz/digital-signage-products/accessories/USB-C-Cables) connected to the player. Multiple USB-to-GPIO devices can be controlled using separate *roControlPort*  instances: The first device corresponds to `"Expander-0-GPIO"`, the second to `"Expander-1-GPIO"`, etc.
- `Expander-DIP`: Specifies the eight DIP switches on the BrightSign Expansion Module. If no BrightSign Expansion module is attached, then object creation will fail and `Invalid` will be returned. Note that hot plugging the BrightSign Expansion Module is not supported.
- `Touchboard-<n>-GPIO`: Retrieves events from the specified BP200/BP900 button board. Events are handled in the same manner as events from the BrightSign port.
- `Touchboard-<n>-LED-SETUP`: Sets various LED output options for the specified BP200/BP900 button board.
- `Touchboard-<n>-LED`: Sets the bits for each button on the specified BP200/BP900 button board. The bits indicate whether the associated LED should be on or off.

:::hint{type="info"}
Since multiple BP200/BP900 button boards can be connected to a player simultaneously, the \<n> value specifies the port enumeration of each board. The ordering of multiple attached boards is dependent on the order they appear in the data structure returned by [roDeviceInfo.GetUSBTopology()](docId\:uTKDmpos1ulxaoYLx1nS6). An unspecified enumeration value is synonymous with a button board with an enumeration value of 0 (e.g. Touchboard-GPIO and Touchboard-0-GPIO are identical).
:::

## ControlPort

### SetOutputValue()

```javascript
bool SetOutputValue(unsigned param)
```

Specifies the desired state of all outputs attached to the control port as bits in an integer. 

### SetOutputValues()

```javascript
bool SetOutputValues(unsigned p1, unsigned p2, unsigned p3, unsigned p4)
```

Configures buttons on a BP200/BP900 button board. This method can only be used when the c*ontrolport* object is instantiated with the `Touchboard-<n>-LED-SETUP` or  `Touchboard-<n>-LED` parameter. See [BP200/BP900 Setup](docId:8ExDHgmoHqig7J-UvfCe1) for more details.

The parameters are integer values.

### SetPinValue()

```javascript
bool SetPinValue(unsigned pin, unsigned param)
```

Returns a bool and configures either:

- The output of the specified GPIO button and the value (either 0 or 1). If the button is not configured as an output, the resulting level is undefined. For example, `SetPinValue(0,1), SetPinValue(1,1), SetPinValue(2,1), SetPinValue(3,1) ... etc ...`
- The LED output behavior on [BP200/BP900 button boards](docId:8ExDHgmoHqig7J-UvfCe1). In this case, the offset is the pin value and the bit-mask is the unsigned parameter.

### bool GetPinValue()

Returns `true` if the specified input pin is active (low). Returns `false` if the pin is inactive (not connected or high).

### bool ConfigureAsInput()

```javascript
bool ConfigureAsInput(unsigned pin)
```

Marks the specified button as an input. If an invalid button number is passed, `false` will be returned. If successful, the function returns `true`. Input buttons are tri-stated and can be driven high or low externally.

### bool ConfigureAsOutput()

```javascript
bool ConfigureAsOutput(unsigned pin)
```

Marks the specified button as an output. If an invalid button number is passed, `false` will be returned. If successful, the function returns `true`. The output will be driven high or low depending on the current output state of the pin. See the Hardware Interfaces section for your player in the [Hardware](docId\:UYYJYeJ6qoJy1HKSbRlPu) space for a table of pins and corresponding buttons for the onboard GPIO connector.

### Close()

```javascript
void Close()
```

Shuts down the c*ontrolport* instance

## Events

Use [addEventListener](docId\:SurGnnHZ666sb1Wh6PbD9) to listen for controldown, controlup, and controlevent, which are defined as follows:

- controldown signals a button/port getting pressed
- controlup signals a button/port getting released
- controlevent is an event that delivers input state changes that may not be categorized  as down or up (for example, the raw change of a pin state or a hardware button event that doesn’t map cleanly to a simple press)

## Example

This example script sets a BP900 to “twinkle” by turning off each button LED at a different point in the cycle:

```javascript
const control_port_class = require('@brightsign/legacy/controlport');
const led = new control_port_class("TouchBoard-0-LED");
const led_setup = new control_port_class("TouchBoard-0-LED-SETUP");

led_setup.SetPinValue(0, 0x000B00A0);

led.SetPinValue(0, 0x07fe);
led.SetPinValue(1, 0x07fd);
led.SetPinValue(2, 0x07fb);
led.SetPinValue(3, 0x07f7);
led.SetPinValue(4, 0x07ef);
led.SetPinValue(5, 0x07df);
led.SetPinValue(6, 0x07bf);
led.SetPinValue(7, 0x077f);
led.SetPinValue(8, 0x06ff);
led.SetPinValue(9, 0x05ff);
led.SetPinValue(10, 0x03ff);
```


[title] BSIRReceiver
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

This class receives IR events. For more information, refer to the Object Reference Manual entry on *roIRReceiver*.

## Object Creation

A *BSIRReceiver* object must specify the hardware interface that will receive IR events, as well as the encoding(s) to look for:

`BSIRReceiver(DOMString interface, DOMString encoding)`

Valid hardware interfaces include the following:

- "GPIO": Pin 1 of the GPIO connector
- "IR-in": The 3.5mm IR input/output connector
- "Iguana": The [Iguanaworks](http://iguanaworks.net/) IR transceiver. This source can support both NEC and RC5 encodings simultaneously.
- “tvcontroller” : This virtual IR driver is only available on BrightSign built-in products. It reads the IR messages from UART and drives the roIRReceiver object like other IR receivers. A creation example would be:

```text
BSIRReceiver(tvcontroller)
```

Valid encodings include the following (multiple encodings can be specified in the string using a ";"):

- "NEC"
- "RC5" (supported on the Iguanaworks device only)

NEC codes are expressed in 24 bits:

- Bits 0-7: Button code
- Bits 8-23: Manufacturer code

:::hint{type="info"}
If the manufacturer code is zero, then the code is considered to be intended for the Roku SoundBridge remote control.
:::

## Methods

- `Close()` void : Shuts down the instance, preventing it from further consuming resources. If this method is not called, garbage collection determines when the instance will be destroyed.

## Events

These events are available on the *BSIRReceiver* object. Each event can receive an IRReceiverEvent event.

- `onremotedown`
- `onremoterepeat`
- `onremoteup` (supported on the Iguanaworks device only)

### IRReceiverEvent – Attributes

- `irType` DOMString readonly
- `code` unsigned long readonly

## Example

The following JavaScript example displays messages on the log when remote codes are received:

```javascript
function myFunction()
{
    var ir_receiver = new BSIRReceiver("IR-in","NEC");

    ir_receiver.onremotedown = function(e){
        console.log('############ onremotedown: ' + e.irType + " - " + e.code);
    }

    ir_receiver.onremoteup = function(e){
        console.log('############ onremoteup: ' + e.irType + " - " + e.code);
    }
}
```


[title] BSSyncManager
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

For more information about available methods, refer to the [roSyncManager](docId\:Wwc22ZsPhu1e689xe7en6) entry. To enable Genlock in JavaScript, pass the *BSSyncManager*/*roSyncManager* domain to the [videooutput](docId\:Kzf34hnXF53R9owSdUD6e)*&#x20;setSyncDomain()* method

## Object Creation

`BSSyncManager(in DOMString interface, in DOMString domain, in DOMString multicast_address, in DOMString multicast_port)`

Setting the interface to `""` (empty) will use all interfaces, and omitting the `interface` parameter is equivalent to specifying an empty interface name. 

## Methods

- `SetAsLeader(in boolean leader_mode) raises(DOMException)` void
- `Synchronize(in DOMString id, in unsigned long ms_delay) raises(DOMException)` void
- `Close()` void: Shuts down the instance, preventing it from further consuming resources. If this method is not called, garbage collection determines when the instance will be destroyed.
- `BindToInterface(in DOMString interface)`: Binds the SyncManager to a specific network interface (for example, "eth0", "wifi0"). Setting the interface to `""` (empty) will use all interfaces.
- `SetEncryptionEnable(in boolean enable)` boolean
- `SetEncryptionEnable(in boolean enable, in DOMString key)` boolean
- `SetEncryptionEnable(in boolean enable, in ArrayBuffer key)` boolean: Enables or disables encryption of *BSSyncManager* messages over the network. This method returns `true` on success and `false` on failure. The key may be specified as a string or binary array. Alternatively, a `key` value may not be supplied, in which case a pseudo-randomly generated key is used. Setting `enable` to `false` and supplying a `key` at the same time will cause this method to fail. Encryption is available (and enabled by default) in OS8 and later. Note the following behavior in mixed-version environments:
  - Follower units that have encryption enabled can ingest unencrypted synchronization messages from a leader unit. Once a follower unit receives encrypted packets, it will no longer accept unencrypted packets from a leader unit, unless encryption is explicitly disabled using this method.
  - Follower units that have encryption disabled (or do not support encryption) cannot ingest encrypted messages from a leader unit. Therefore, if a synchronization group includes mixed versions of OS, the leader unit should always have an older version of OS than the follower units.
- `SetEncryptionEnableWithObfuscatedKey(in DOMString obfuscated_key) As Boolean` boolean : Enables encryption of *BSSyncManager* messages using an obfuscated key. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.

## HTML Video Functions

`setSyncParams(in DOMString domain, in DOMString id, in DOMString iso_timestamp)`

HTML video tags include the `setSyncParams()` function. Calling this function synchronizes the video with the specified sync group.

## Events

The following event is available on the *BSSyncManager* object. It can receive events of the type *BSSyncManagerEvent*.

`onsyncevent` 

### BSSyncManagerEvent – Attributes

The following attributes are relevant to the onsyncevent event:

- `domain` DOMString readonly
- `id` DOMString readonly
- `iso_timestamp` DOMString readonly

## Examples

The following JavaScript example contains two videos being synchronized locally with *BSSyncManager*. If a follower player is configured to be in the same PTP domain as the leader player and uses the follower HTML script, then it will display the videos in sync with the leader player. This can be implemented on multiple follower players.

### Leader Script

```javascript
<video id="one" hwz="on">
    <source id="one_src" src="pirates.mov">
</video>

<script>
    // Create the sync manager with provided multicast settings
    var sync = new BSSyncManager("domain1", "224.0.126.10", 1539);

    sync.onsyncevent = function (e) {
        document.getElementById("one").setSyncParams(e.domain, e.id, e.iso_timestamp);
        document.getElementById("one").load();
        document.getElementById("one").play();
        console.log(e.domain);
        console.log(e.id);
        console.log(e.iso_timestamp);
    };

    function startTimer() {
        setTimeout(function () {
            restartLeader()
        }, 30000);
    }
    function restartLeader() {
        // Synchronize the videos to start playing in 1000ms
        sync.SetAsLeader(1);
        sync.Synchronize("sync_event1", 1000);
        startTimer();
    }
    restartLeader();

</script>
```

### Follower Script

```javascript
<video id="one" hwz="on">
    <source id="one_src" src="pirates.mov">
</video>

<script>
    // Create the sync manager with provided multicast settings
    var sync = new BSSyncManager("domain1", "224.0.126.10", 1539);

    sync.onsyncevent = function (e) {
        document.getElementById("one").setSyncParams(e.domain, e.id, e.iso_timestamp);
        document.getElementById("one").load();
        document.getElementById("one").play();
        console.log(e.domain);
        console.log(e.id);
        console.log(e.iso_timestamp);
    };
 
</script>

</body>
</html>
```


[title] Firmware Reference Entity (v3)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 3.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v3)/

This entity contains an array of the following properties by player family (Cobra, Raptor, Impala, Pantera, Tiger, Pagani, Malibu, and Sebring). These fields are only required if you need to do a firmware update.

For examples of how to update the OS for a particular player family, see the section at the bottom of the page.

## Properties

- `firmwareUpdateSource` <font color="#704ae0">string</font>: The enum source from which to get the firmware update. Possible values are “Production”, “Beta”, “MinimumCompatible”, “SpecificUrl”, “None”, or “Existing”. If you use “Production”, “Beta”, or “MinimumCompatible”, no additional values need to be defined.
- `firmwareUpdateStandardTargetFileName` <font color="#704ae0">string</font>: The name of the .bsfw firmware file that is targeted for updates. The update contained in the file is applied and if successful the file is deleted from the storage medium containing it. If the delete succeeds then the system reboots. If it fails then the device behaves as if the file had been named `*_save.bsfw` - see below. The delete always fails if the card uses an NTFS or HFS+ filesystem.
- `firmwareUpdateDifferentTargetFileName` <font color="#704ae0">string</font>: The name of a .bsfw firmware file. In run mode the update contained in this file is applied only if the version it contains does not match the version that is currently running. The file is not deleted but the infinite loop is avoided because on subsequent boots the version number will be the same so the update file will be ignored. In rescue mode the update is always applied.
- `firmwareUpdateNewerTargetFileName` <font color="#704ae0">string</font>: The name of a .bsfw firmware file. In run mode the update contained in the file is applied only if the version it contains is strictly newer than the version that is currently running. The file is not deleted but the infinite loop is avoided because on subsequent boots the version number will be the same so the update file will be ignored. In rescue mode, the update is always applied because the version of run mode cannot be checked and the infinite loop won't occur because the device will reboot into run mode.
- `firmwareUpdateSaveTargetFileName` <font color="#704ae0">string</font>: The name of a .bsfw firmware file. The update contained in the file is applied but the file is not deleted, because if the device rebooted at this point it would just apply the update against the device and will not automatically reboot when applying updates named like this until the storage device containing the update has been removed. This makes this filename useful if you wish to update many units from a USB key.
- `firmwareUpdateVersion` <font color="#704ae0">string</font>: This can be an empty string or the version number of the firmware you want to update to
- `firmwareUpdateSourceUrl` <font color="#704ae0">string</font>: Required if the source is “SpecificUrl”. This can be a source URL for the firmware update.

:::hint{type="info"}
If you want to source a BrightSign URL for any of the following parameters, you can find them in the publicly available manifest file ([https://bsncloud.s3.amazonaws.com/public/FirmwareManifest.json](https://bsncloud.s3.amazonaws.com/public/FirmwareManifest.json)):
:::

- `productionReleaseURL` <font color="#704ae0">string</font>: The URL to the .bsfw file that the device will pull the setup files from for use in production
- `betaReleaseURL` <font color="#704ae0">string</font>: The URL to the .bsfw file for the beta release version in production
- `compatibleReleaseURL` <font color="#704ae0">string</font>: The URL to the .bsfw file for the minimum compatible release version in production

## Examples

These examples all use the Cobra family, but other player families can be substituted. These examples contain the minimum required parameters for each firmware source and update type.

### Updating to the OS Production Version

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.59-update.bsfw"
  }
}
```

### Updating to the Minimum Compatible Version

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.59-update.bsfw"
  }
}
```

### Updating to the OS Beta Version

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.59-update.bsfw"
  }
}
```

### Updating using a Specific URL

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

### Updating to a Different OS

These examples update the OS if it is different from the one already on the player:

```json
// Different OS update - Production version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Different OS update - Beta version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Different OS update - Minimum compatible version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Different OS update - Specific URL version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

### Updating to a Newer OS

These examples update the OS version if that version is higher/newer than the one on the player:

```json
// Newer OS update - Production version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Newer OS update - Beta version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Newer OS update - Minimum compatible version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Newer OS update - Specific URL version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

### Updating and Saving the .bsfw File

These examples update the OS to a new version without deleting the .bsfw file from the SD card after the update is done, and does not reboot the player after the update is applied (to avoid a reboot loop):

```json
// Save OS update - Production version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateSaveTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Save OS update - Beta version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Save OS update - Minimum compatible version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Save OS update - Specific URL version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```


[title] Token Entity  (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v2)/

This object is used to register the device with a BSN.Cloud network and contains the following required properties:

- `token` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: A player registration token returned by the server. This token allows players to provision themselves for a BSN.Cloud network. Note that this is not a user token.
- `validFrom` <font color="#704ae0">dates</font> <font color="#01a0af">required</font>: The start of the validity date for the token. The date/time is formatted as `yyyy-mm-ddThh:mm:ss.sssZ`.
- `validTo`  <font color="#704ae0">dates</font> <font color="#01a0af">required</font>: The end of the validity date for the token. The date/time is formatted as `yyyy-mm-ddThh:mm:ss.sssZ`.

This optional property can also be used:

- `scope` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The scope of the device registration token. The default is "cert".

### Sample Request

To get the player registration token:

```curl
curl --location 
	 --request POST 'https://api.bsn.cloud/2020/10/REST/provisioning/setups/tokens/' \
	 --header 'Accept: application/json' \
	 --header 'Accept-Encoding: gzip,deflate' \
	 --header 'Content-Type: application/x-www-form-urlencoded' \
	 --header 'Authorization: Bearer 5BfFL3npQscN4RQUeO3V1EI8QKQzToBoVFkLAGg3qmcvsDSgFIt1OIc2P' \
	 --data-urlencode 'grant_type=user_access_token' \
	 --data-urlencode 'user_access_token=<redacted>' \
	 --data-urlencode 'client_id=<redacted>' \
	 --data-urlencode 'client_secret=<redacted>'
```

See [this page](docId:0QHiBo6rAs8zwYJybEH0R) for information about how to get a user access token.

### Sample Response

```json
{
    "token": "cW7OQJPG21d3ao1wDzpUXTKMn2dyog7AvgD1qHm0XRNEWfw6kiqhZnWBNG7XJWt74o2nCZiIuedVOE894pz0OdoNZlXjOqgUPs6yrz7HMPPLBEOzZpvluN5shAXjJeES",
    "scope": "cert",
    "validFrom": "2024-03-05T19:50:25Z",
    "validTo": "2026-03-05T19:50:25Z"
}
```


[title] BSDatagramSocket
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

For more information about available methods, refer to the *roDatagramReceiver* and *roDatagramEvent* entries.

## Methods

- `BindLocalPort(in long port)` boolean&#x20;
- `GetLocalPort()` long&#x20;
- `JoinMulticastGroup(in DOMString group)` boolean&#x20;
- `SendTo(in DOMString dest, in long port, in ArrayBufferView data)` boolean&#x20;
- `SendTo(in DOMString dest, in long port, in DOMString data)` boolean&#x20;
- `Close()` void : Shuts down the instance, preventing it from further consuming resources. If this method is not called, garbage collection determines when the instance will be destroyed.

## Events

The following event is available on the *BSDatagramSocket* object. It can receive an event of the type DatagramSocketEvent. Use getBytes() to retrieve the body of the UDP message.

- `ondatagram`

### DatagramSocketEvent

The DatagramSocketEvent has the following attributes:

- `remoteHost` DOMString readonly &#x20;
- `remotePort` int readonly &#x20;

The DatagramSocketEvent supports the following methods:

- `getBytes()` ArrayBuffer&#x20;

## Example

:::hint{type="info"}
See [here](https://stackoverflow.com/questions/6965107/converting-between-strings-and-arraybuffers) to learn how to convert between strings and an `ArrayBuffer`.
:::

```text
var bsSocketMessage = new BSDatagramSocket();
bsSocketMessage.BindLocalPort(1234)
bsSocketMessage.ondatagram = function(e){

  var txtDec = new TextDecoder("utf-8");
  console.log("Received " + txtDec.decode(e.getBytes()));
};
```


[title] usbhidemulator
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *usbhidemulator* allows you to emulate USB HID devices. USB keyboards are currently the only supported device type. 

BrightSign players with USB-C (except for LS3 and LS4) can use this object.

**usbhidemulator IDL**

```javascript
[                                                                                                                                                                                                                                
    constructor(String path, String type)                                                                            
] interface UsbHidEmulator {                                                                                               
    Promise<void> enable();                                                                                                
    Promise<void> disable();                                                                                               
    Promise<void> clear();                                                                                                 
    Promise<void> keyDown(int keycode);  
	Promise<void> keyPress(int keycode);                                                                                  
    Promise<void> keyUp(int keycode);                                                                                      
    Promise<LedState> getLedState();                                                                                       
    Promise<ModifierState> getModifierState();                                                                             
    Promise<void> setModifierState(ModifierState)                                                                          
};

interface LedState {
    [optional] attribute bool numLock;
    [optional] attribute bool capsLock;
    [optional] attribute bool scrollLock;
};

interface ModifierState {
    [optional] attribute bool leftCtrl;
    [optional] attribute bool leftShift;
    [optional] attribute bool leftAlt;
    [optional] attribute bool leftGui;
    [optional] attribute bool rightCtrl;
    [optional] attribute bool rightShift;
    [optional] attribute bool rightAlt;
    [optional] attribute bool rightGui;
};                                                                                                                          
                                                                                                                           
```

## Object Creation

To create a *usbhidemulator* object, first load the *@brightsign/usbhidemulator* module using the *require()* method.

```javascript
keyem = require('@brightsign/usbhidemulator')
kbd = new keyem()
```

## UsbHideEmulator

Use this interface to configure a *usbhidemulator* interface. The *usbhidemulator* class also generates "ledupdate" events which can be listened for with *AddEventListener().*

**enable()**

```javascript
Promise<void> enable()
```

Enables the HID device.

**disable()**

```javascript
Promise<void> disable()
```

Disables the HID device. This method is not currently supported.

**clear()**

```javascript
Clears all active keystrokes and modifiers.
```

Clears all active keystrokes and modifiers.

**keyDown()**

```javascript
Promise<void> keyDown(int keycode)
```

Sends a keydown event for the specified USB key code.

**keyPress()**

```javascript
Promise<void> keyPress(int keycode)
```

This is the same as keyDown() followed by keyUp().

**keyUp()**

```javascript
Promise<void> keyUp(int keycode)
```

Sends a keyup event for the specified USB key code.

**getLedState()**

```javascript
Promise<LedState> getLedState()
```

Returns an associative array with the current state of all LED states on the keyboard.

**getModifierState()**

```javascript
Promise<ModifierState> getModifierState()
```

Returns an associative array with the current state of all modifiers (such as, shift, alt, ctrl).

**setModifierState()**

```javascript
Promise<ModifierState> setModifierState(ModifierState)
```

Sets the current modifier state as specified by an associative array. Only modifiers that are listed will cause the state to change.

## Keycode

This interface contains the USB key code. 

- `keycode`<font color="#6554c0"> int</font>

:::hint{type="warning"}
USB HID keyboard codes are in section 10 of [www.usb.org/sites/default/files/documents/hut1\_12v2.pdf](http://www.usb.org/sites/default/files/documents/hut1_12v2.pdf).
:::

## LedState

This interface sends an LED state change if number lock, capital lock, or scroll lock is pressed.

- `numLock` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font>
- `capsLock` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font>
- `scrollLock` <font color="#6554c0">bool </font><font color="#01a0af">optional</font>

## ModifierState

Listed modifiers will cause the state to change.

- `leftCtrl` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font>
- `leftShift`<font color="#6554c0"> bool</font> <font color="#01a0af">optional</font>
- `leftAlt` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font>
- `leftGui` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font>
- `rightCtrl` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font>
- `rightShift` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font>
- `rightAlt` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font>
- `rightGui` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font>

## Example

```javascript
keyem = require('@brightsign/usbhidemulator')
kbd = new keyem()
kbd.addEventListener("ledupdate", function f(e) { console.log(e);})
kbd.enable()

kbd.keyPress(4)
```


[title] BSTicker
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

For more information about available methods, refer to the *roTextWidget* entry. This object can be used to display a scrolling type ticker.

BSTicker uses BrightScript-style paths rather than native paths (a Unix-style path or a URI).

:::hint{type="info"}
This object supports both right-to-left and left-to-right (for example, Arabic, Hebrew) scrolling modes, depending on the language of the first string or file added to the widget. To change the scrolling direction, first remove all strings from the ticker.
:::

## Object Creation

`BSTicker(in unsigned long x, in unsigned long y, in unsigned long w, in unsigned long h, in long rotation);`

The `x` and `y` integers specify the position of the ticker widget (via the top-left corner), while the  `w` and `h` integers specify the size of the widget. The `rotation` parameter accepts the following values (rotation is counter-clockwise from landscape mode):

- `0`: 0 degrees
- `90`: 90 degrees
- `180`: 180 degrees
- `270`: 270 degrees

:::hint{type="info"}
The `rotation` parameter only affects the text inside the ticker; it does not alter the screen coordinates of the widget itself. If you are creating a vertical ticker or rotating the ticker to match portrait-mode HTML content, you will need to use the `x, y, w, h`  coordinate parameters to match the rotation of the text.
:::

## Methods

- `SetRectangle(in unsigned long x, in unsigned long y, in unsigned long w, in unsigned long h)` boolean: Modifies the (`x,y)` position and (`w,h)` size of the ticker widget. Changing the size of the widget will reset the ticker animation. As long as the size of the widget remains unchanged, modifying the position will not interrupt the ticker animation. This method returns `True` on success, or `False` on failure.
- `AddString(in DOMString str)` int: Adds a string to the queue. This method returns a `string_id` integer that can be used to identify which string was removed when the `ontickerstringremoved` event is generated; a zero return indicates that the method failed to add the string. Adding too many strings without popping them from the stack will cause `AddString()` to return a non-zero value (the exact number depends on the font size for each string). The maximum recommended number of stored strings is 64.
- `AddSurface(in ImageData image)`int:  Adds a bitmap image to the list of strings to display. The image must be of type `ImageData`. This method returns a `string_id` integer that can be used to identify which surface is removed when the `ontickerstringremoved` event is generated. See the code at the bottom of this page for an example of using a canvas/image with this method.
- `PopStrings(in unsigned long count)` boolean: Removes designated number of strings from the queue. This method returns `True` on success, or `False` on failure.
- `SetAutoPop(in boolean)` boolean: If this method is set to `True`, strings are automatically removed (popped from the stack) once they have scrolled offscreen.
- `SetForegroundColor(in unsigned long argb)`boolean: Specifies the foreground color as a 32-bit number in ARGB (Alpha, Red, Green, Blue) format. This method returns `True` on success, or `False` on failure.
- `SetForegroundColor(in unsigned long a, in unsigned long r, in unsigned long g, in unsigned long b)`boolean: Sets the foreground color in red, green, and blue (foreground alpha values are currently unsupported and are ignored by this method, though this may change in future firmware versions). `a, r, g` and `b` are integer values between 0 and 255. This method returns `True` on success, or `False` on failure.
- `SetBackgroundColor(in unsigned long argb)`boolean: Specifies the background color as a 32-bit number in ARGB (Alpha, Red, Green, Blue) format. This method returns `True` on success, or `False` on failure.
- `SetBackgroundColor(in unsigned long a, in unsigned long r, in unsigned long g, in unsigned long b)`boolean: Sets the background color in alpha, red, green, and blue. While standard alpha values are between 0.0 and 1.0, the values in BSTicker are `unsigned long` (or the upper 8 bits of an `unsigned long`). The values are mapped between 0x00 and 0xff to correspond to 0.0 to 1.0. This method returns `True` on success, or `False` on failure.
- `SetSeparatorString(in DOMString str)`boolean: Use a text string to separate individual messages. This method returns `True` on success, or `False` on failure.
- `SetSeparatorCircle()`boolean: Use a circle to separate individual messages. This method returns `True` on success, or `False` on failure.
- `SetSeparatorDiamond()`boolean: Use a diamond to separate individual messages. This method returns `True` on success, or `False` on failure.
- `SetSeparatorSquare()`boolean: Use a square to separate individual messages. This method returns `True` on success, or `False` on failure.
- `SetPixelsPerSecond(in unsigned long pps)` unsigned long: Sets the speed of the ticker.
- `SetFont(in DOMString font)` boolean: Specifies a font for the BSTicker (as well as the roTextWidget BrightScript object). This method accepts a list of font-family names (similar to the CSS \<font-family> property). The string can also have a `font-face:` prefix to indicate that this is a font description (for example, `font-face:DejaVu Serif,Serif Italic Bold`). Fonts must be added to the HTML widget using the `roHtmlWidget.AddFont()` method before they can be used in a BSTicker instance. This method returns `True` on success, or `False` on failure.
- `SetSyncManager(in DOMString domain)` boolean: Specifies a BSSyncManager domain to use when executing the `SetMultiscreen()` call. When this method is called, it creates an internal domain based on the existing BSSyncManager domain and uses the same network parameters. We recommend using this method instead of passing a multicast IP address and port to the `SetMultiscreen()` method itself. This method returns `True` on success, or `False` on failure.
- `SetMultiscreen(in unsigned long offset, in unsigned long size, in DOMString ip_address, in unsigned long port) ` boolean: Call the `SetMultiscreen()`  method to create a ticker that smoothly scrolls across multiple screens. This method returns `True` on success, or `False` on failure.
  - `offset:` Determines the left starting point (in pixels) in the multiscreen array. The parameter value will always be 0 for the leftmost display. This parameter should be calculated using the length of the multiscreen ticker, *not the total length of the multiscreen display*. For example, using an offset of 1920 in a two-screen array of 1920x1080 screens would specify this player as the right-hand (master) display.To create a ticker that smoothly scrolls across multiple screens, call the `SetMultiscreen()` method on each page. 
  - `size:` The total width (in pixels) of the multiscreen array across all displays. This parameter should be the same value for each `SetMultiscreen()` call. Note that the size of a multiscreen ticker can be different from the total width of a multiscreen display (for example, if the width of a BSTicker widget is smaller than the width of the screen). Defining a size of 3840 would specify a two-screen array of 1920x1080 screens.
  - `ip_address:` A string specifying the multicast IP address for the PTP synchronization process (for example, "239.192.0.0")
  - `port:` A string specifying the multicast port for the PTP synchronization process (for example, "1234").

The following example diagram and code snippets specify a multiscreen display with two monitors. The width of each monitor is 1024 pixels, while the width of each ticker is 768 pixels:

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/maynzvzhidgbr8b-X5h8X_setmultiscreen-diagram.png)

## Events

`bsTicker.ontickerstringremoved`

This event handler is triggered when a string has been removed and is no longer visible. The event contains the `string_id` property, which is returned by a successful `AddString()` call.

## Examples

The following script shows how to use many of the available *BSTicker* methods:

```text
var bsTicker = new BSTicker(10, 110, 600, 30);
 
function addText1()
{
    console.log('############ addText1');
    bsTicker.AddString("addText1");
}
function addText2()
{
    console.log('############ addText2');
    bsTicker.AddString("addText2");
}
function addText3()
{
    console.log('############ addText3');
    bsTicker.AddString("addText3");
}

function setBackground1()
{
    console.log('############ setBackground1');
    bsTicker.SetBackgroundColor(0xFFFF0000);
}
function setBackground2()
{
    console.log('############ setBackground2');
    bsTicker.SetBackgroundColor(0xFF00FF00);
}

function setForeground1()
{
    console.log('############ setForeground1');
    bsTicker.SetForegroundColor(0xFF007700);
}
function setForeground2()
{
    console.log('############ setForeground2');
    bsTicker.SetForegroundColor(0xFF000077);
}

function setSeparatorString()
{
    console.log('############ setSeparatorString');
    bsTicker.SetSeparatorString(" ### ");
}
function setSeparatorCircle()
{
    console.log('############ setSeparatorCircle');
    bsTicker.SetSeparatorCircle();
}
function setSeparatorDiamond()
{
    console.log('############ setSeparatorDiamond');
    bsTicker.SetSeparatorDiamond();
}
function setSeparatorSquare()
{
    console.log('############ setSeparatorSquare');
    bsTicker.SetSeparatorSquare();
}

function setTickerSpeed()
{
    console.log('############ setTickerSpeed');
    var speed = bsTicker.SetPixelsPerSecond(180);
    console.log('############ SetPixelsPerSecond(180), Resulting speed: ' + speed);
}
```

The following examples allow for adding a canvas or image to the ticker with the `AddSurface()` method:

```text
//Loading a canvas
var ctx = canvas.getContext("2d");
var img = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);

ticker.AddSurface(img); 

//Loading an image
var imageObj = new Image();
imageObj.onload = function() {
	canvas.width = this.width;
	canvas.height = this.height;

	var ctx = canvas.getContext("2d");
	ctx.drawImage(this, 0, 0); // Use getImage Data as above
 };
 imageObj.src = "filename.jpg";
```


[title] chardisplay
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *chardisplay* object lets you set the properties of characters on a display. It is available in BOS 9.0.203 and later, and BOS 9.1.29 and later.

**chardisplay IDL**

```text
interface CharDisplay {
    Promise<void> show(in unsigned long row, in unsigned long col, in DOMString text)
    Promise<void> clear()
    Promise<void> setPos(in unsigned long row, in unsigned long col)
    Promise<void> setCursor(in unsigned long cursor) // 0=off, 1=blink, 2=underline, 3=both
    Promise<void> setContrast(in unsigned long contrast) // 0-100
    Promise<int> getContrast()
    Promise<void> setBrightness(in unsigned long brightness) // 0-100
    Promise<int> getBrightness()
    Promise<int> getColumns()
    Promise<int> getRows()
}
```

## Object Creation

To create a *chardisplay* object, load the *@brightsign/chardisplay* module using the Node.js® require() method:

```javascript
var chardisplayClass = require("@brightsign/chardisplay");
var chardisplay = new chardisplayClass();
```

## CharDisplay

### show()

```javascript
Promise<void> show(in unsigned long row, in unsigned long col, in DOMString text)
```

Displays text at a prescribed position

### clear()

```javascript
Promise<void> clear()
```

Clears the display

### setPos()

```javascript
Promise<void> setPos(in unsigned long row, in unsigned long col)
```

Positions the cursor

### setCursor()

```javascript
Promise<void> setCursor(in unsigned long cursor)
```

Sets the cursor style:&#x20;

- 0 is off
- 1 is blink
- 2 is underline
- 3 is both

### setContrast()

```javascript
Promise<void> setContrast(in unsigned long contrast)
```

Set the display contrast in values from 0 to 100

### getContrast()

```javascript
Promise<void> getContrast()
```

Gets the display contrast

### setBrightness()

```javascript
Promise<void> setBrightness(in unsigned long brightness)
```

Set the display brightness in values from 0 to 100

### getBrightness()

```javascript
Promise<int> getBrightness()
```

Gets the display brightness

### getColumns()

```javascript
Promise<int> getColumns()
```

Returns the number of columns. This is useful for writing code that loops over the available rows and columns. 

### getRows()

```javascript
Promise<int> getRows()
```

Returns the number of rows. This is useful for writing code that loops over the available rows and columns.

[title] devicecustomization
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

This object provides a method to encrypt storage and is released in BOS version 9.0.146.

**devicecustomization IDL**

```text
interface DeviceCustomization {
    Promise<void> encryptStorage(String device, StorageEncryptionOptions params);
};

interface StorageEncryptionOptions {
attribute String method;
attribute String passphrase;
attribute Boolean format;
};
```

## Object Creation

```javascript
let DeviceCustomizationClass = require("@brightsign/devicecustomization");
let devicecustomization = new DeviceCustomizationClass();
```

## DeviceCustomization

### encryptStorage()

```javascript
Promise<void> encryptStorage(String device, StorageEncryptionOptions params)
```

Encrypts the contents of a storage device using an encryption key stored in the private section of the player registry. This prevents other devices from reading the names or contents of files on the storage device (though file metadata will still be readable). The storage device can still be mounted on other devices, which can list, delete, and copy files (even though they cannot read them).

The device parameter specifies which storage drive to encrypt (for example, `/storage/sd`, `/storage/usb1`, `/storage/ssd`), and the process is configured with the passed *StorageEncryptionOptions* parameters.

## StorageEncryptionOptions

### Attributes

- `method` <font color="#704ae0">string</font>: The encryption method, which can be one of the following:
  - `"none"`: Encryption is disabled and any encryption keys for the storage device are deleted from the registry. 
  - `"passphrase"`: The storage device is encrypted using an un-obfuscated passphrase.
  - `"obfuscated_passphrase"`: The storage device is encrypted using an obfuscated passphrase. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player. 
  - `"brightsign_key"`: The storage device is encrypted using an encryption key that is common to all BrightSign players, but is not shared with outside parties. 
  - `"generate_key"`: The storage device is encrypted using an encryption key that is generated on-demand using a secure random generator. The private registry of the player contains the only copy of the key; if the value in the registry is erased or becomes corrupted, there will be no way to recover data from that storage device. The private registry does not distinguish between different physical volumes of the same drive. For example, if you encrypt two SD cards, the key for the first SD card will be overwritten when the second SD card is encrypted; in the case of a randomly generated key, the data from the first SD card will be irretrievable.
- `passphrase` <font color="#704ae0">string</font>: The passphrase for encrypting the storage device. This parameter must be included if the method is specified as `"passphrase"` or `"obfuscated_passphrase"`. 
- `format` <font color="#704ae0">boolean</font>: Setting this to `true` will cause the specified storage device to be reformatted–all existing files will be deleted (but are not guaranteed to be securely erased) before the device is encrypted; however, if the device cannot be reformatted, the operation will fail. If set to `false`, the storage device will be mounted as if it has been previously encrypted using the supplied key.
  - If the storage device hasn't been previously encrypted, it will be encrypted while leaving any preexisting files unencrypted. If the storage device has been encrypted using a different key, the operation will fail.
  - If the `format` parameter is not specified, the storage device will be mounted as if it has been previously encrypted using the supplied key. If the storage device hasn't been previously encrypted, the operation will fail.


[title] BSBtManager
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

Use the *BSBtManager* object to discover whether any BLE adapters are present and to receive events (for example, when adapters are added or removed). It can also be used to retrieve and modify Bluetooth advertising.

## Attributes

The *BSBtManager* object has the following attribute:

`readonly attribute Array adapters`: A list of all available Bluetooth adapters. If this list is empty, there are no adapters present.

## Events

Use the `onBtEvent()` callback to receive events:

- `"add-adapter"`: An adapter has been added. The value reports the name of the adapter.
- `"startup-complete"`: The initial advertising list has been built. This event is sent after any initial "add-adapter" events. Applications should wait for this event before detecting a missing adapter.
- `"remove-adapter"`: An adapter has been removed. The value reports the name of the adapter.
- `"update-advertising"`: Bluetooth advertising has changed. The value identifies the source of the change (from "brightscript" or "javascript"). If your script maintains a variable containing the advertising list, this event indicates that it may need to be refreshed.

:::hint{type="info"}
Since additional events may be added in the future, your script should have the capacity to handle unrecognized events.
:::

### Example

`btm.onbtevent = function (ev) { console.log("Event " + ev.name + "; parameter " + ev.parameter); }`

## Methods

The *BSBtManager* object has the following methods:

- `object GetCurrentAdvertising()`: Returns a *BSBtAdvertisementList* object containing current advertisement parameters.
- `boolean StartAdvertising(in object advertisement_list)`: Begins sending BLE advertisements using the specified *BSBtAdvertisementList* object. Calling this method will replace all previous advertisements, including persistent advertisements, regardless of whether they were set from JavaScript or BrightScript. To preserve advertisements, retrieve the current *BSBtAdvertisementList* and make changes as needed before passing it to `StartAdvertising()`.
- `StopAdvertising(new BSBtAdvertisementList())`: Stops all advertisements.
- `void Close()`: Shuts down the instance, preventing it from further consuming resources. If this method is not called, garbage collection determines when the instance will be destroyed.
- `BSBtAdvertisementList`: The *BSBtAdvertisementList* object is a container for *BSBtAdvertisement* objects. Elements can be added to the end of the list using `push()` or removed using `pop()`. Existing elements can be accessed with indexing.
- `BSBtAdvertisement`: The *BSBtAdvertisement* object represents a single BLE advertisement. It supports advertising data in standard formats or arbitrary custom values. Standard format values can be initialized on construction using a dictionary, but advanced custom fields must be set on the object. Supported modes are described below.

### Beacon Format

This mode uses a simple beaconing format:

`mode:"beacon"` 

- `beaconUUID`: A string representation of a UUID, which can be in 16-bit, 32-bit, or 128-bit format. A 16-bit UUID must be exactly four hex digits with no punctuation;  a 32-bit UUID must be exactly eight hex digits with no punctuation; and a 128-bit UUID must be punctuated exactly as follows: "cd7b6f81-f738-4cad-aebf-d2a2ea36d996".
- `beaconMajor`: An integer specifying the 2-byte Major value (0 to 65535)
- `beaconMinor`: An integer specifying the 2-byte Minor value (0 to 65535)
- `beacon_level`:(optional) An 8-bit signed integer (-127 to 128) that corresponds to the measurement of the Tx power level (in dBm) at 1 meter. The default level is -60.
- `beaconManufacturer`:(optional) A 2-byte integer value (0 to 65535) specifying the beacon manufacturer. The default value is 76 (\&H4C).
- `connectable`:(optional) A Boolean value indicating whether the advertisement should be connectable (for GATT or other services). Advertisements are non-connectable by default.
- `persistent`:(optional) A Boolean value indicating whether the advertisement should persist after every reboot. Beacon advertisements are not persistent by default.

### Eddystone-URL Format

This mode uses the [Eddystone-URL](https://github.com/google/eddystone/tree/master/eddystone-url) format:

`mode:"eddystone-url"` 

- `url`: The URL to encapsulate in the advertisement packet. If the URL is too long to fit in the packet, the StartAdvertising() call will return an AbortError exception that includes the description "Compressed URL is too long".
- `tx_power`:(optional) An integer value specifying the Tx power level in dBm at 0 meters. The default value is -19, which corresponds to a level of -60dBm at 1 meter. The recommended calibration practice is to measure at 1 meter and add 41: For example, -65dBm RSSI leads to a value of -24.
- `connectable`:(optional) A Boolean value indicating whether the advertisement should be connectable (for GATT or other services).  Advertisements are non-connectable by default.
- `persistent`:(optional) A Boolean value indicating whether the advertisement should persist after every reboot. Eddystone-URL advertisements are not persistent by default.

### Eddystone-UID format

This mode uses the [Eddystone-UID](https://github.com/google/eddystone/tree/master/eddystone-uid) format:

`mode`:"eddystone-uid"

- `nameSpace`: A 10-byte value expressed as 20 hexadecimal digits
- `instance`: A 6-byte value expressed as 12 hexadecimal digits
- `tx_power`:(optional) An integer value specifying the Tx power level in dBm at 0 meters. The default value is -19, which corresponds to a level of -60dBm at 1 meter. The recommended calibration practice is to measure at 1 meter and add 41: For example, -65dBm RSSI leads to a value of -24.
- `connectable`:(optional) A Boolean value indicating whether the advertisement should be connectable (for GATT or other services).  Advertisements are non-connectable by default.
- `persistent`:(optional) A Boolean value indicating whether the advertisement should persist after every reboot. Eddystone-URL advertisements are not persistent by default.

### Custom Format

This mode supports arbitrary custom data. Binary fields are specified as hexadecimal-encoded strings (e.g. the decimal values 12, 128 would be specified as "0C80"). All lists support `push()`/`pop()` calls and indexing. Duplicate values should not be included.

- `mode:"custom"`
- `manufacturerData`:(optional) A *BSBtManufacturerData* object containing the following fields:
  - `manufacturer`: An unsigned 16-bit integer value
  - `data`: Binary data
- `serviceUUID`:(optional) A list of UUID strings.
- `serviceData`:(optional) A *BSBtUUIDData* object containing the following fields:
  - `uuid`: The UUID string
  - `data`: Binary data
- `soliciitUUID`:(optional) A list of UUID strings.
  - connectable:(optional) A Boolean value indicating whether the advertisement should be connectable (for GATT or other services). Advertisements are non-connectable by default.
- `persistent`:(optional) A Boolean value indicating whether the advertisement should persist after every reboot. Custom advertisements are not persistent by default.

## Examples

This script configures a simple advertisement and an Eddystone-URL advertisement and then begins advertising:

```text
ads = new BSBtAdvertisementList();
ad1 = new BSBtAdvertisement({ mode: "beacon", beaconUUID: "41fac221-c8cb-41e7-b011-12d1016dd39e", beaconMajor: 400, beaconMinor: 123});
ads.push(ad1);
ad2 = new BSBtAdvertisement({ mode:"eddystone-url", url: "http://www.brightsign.biz"})
ads.push(ad2);

btm.StartAdvertising(ads);
```

This script finds beacons matching a UUID and forms a string with Major/Minor codes:

```text
s = "";
for(i = 0; i < adList.length; i++) {
	if (adList[i].mode == "beacon"
		&& adList[i].beaconUUID == "434b2eb8-c28f-4089-8e7a-1e644bb13b9f") {
			s = s + "Beacon: " +  adList[i].beaconMajor + "," + adList[i].beaconMinor + " "
		}
}
```

This script looks for Eddystone-URL beacons and sends updates based on the current URL:

```text
btm = new BSBtManager()
adList = btm.GetCurrentAdvertising()
for(i = 0; i < adList.length; i++) {
	// Brightsign.biz is now https
		if (adList[i].mode == "eddystone-url" && adList[i].url == "http://www.brightsign.biz")      {
			adList[i].url = "https://www.brightsign.biz"
		}
}
btm.StartAdvertising(adList)
```

This script produces an exception because the compressed URL is too long:

```text
al = new BSBtAdvertisementList()
ad4 = new BSBtAdvertisement( { mode: "eddystone-url", url:"http://www.brightsign.biz/thisistoolong"} )
al.push(ad4)
b.StartAdvertising(al)
```


[title] BSVideoMode
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

For more information about available methods, refer to the *roVideoMode* page.  If you’d like to change the video mode of the player, you will need to use BrightScript instead of this JavaScript class. 

The JavaScript equivalent is [videomodeconfiguration](docId\:uupZxkYFlBSOLyh8oLcES).

## Attributes

- `resX` int readonly
- `resY` int readonly &#x20;
- `safeX` int readonly &#x20;
- `safeY` int readonly &#x20;
- `safeWidth` int readonly &#x20;
- `safeHeight` int readonly   
- `mode` DOMString readonly &#x20;
- `decoderModeList` BSDecoderModeList readonly&#x20;

## Methods

:::hint{type="warning"}
The methods used by this object are obsolete and can be found in the [videooutput](docId\:Kzf34hnXF53R9owSdUD6e)  and [videomodeconfiguration](docId\:uupZxkYFlBSOLyh8oLcES) JavaScript API documentation. The `HdmiAudioDisable()` method can be found in the *roVideoMode* BrightScript API documentation.
:::

```text
boolean IsAttached(in DOMString connector)

DOMString GetBestMode(in DOMString connector)

boolean SetBackgroundColour(in unsigned long rgb)

boolean SetBackgroundColour(in unsigned long r,
	in unsigned long g,
	in unsigned long b)

boolean SetPowerSaveMode(in boolean disable)

boolean HdmiAudioDisable(in boolean disable)
 
boolean SetDecoderMode(in DOMString decoder,
	in DOMString timeslice_mode,
	in int z_order,
	in DOMString friendly_name,
	in boolean enable_mosaic_deinterlacer)


boolean SetSyncManager(in BSSyncManager sync); //See the roVideoMode.SetSyncDomain() entry for more details.
```

## BSDecoderMode

The `decoderModeList` attribute contains an array of *BSDecoderMode* objects, each containing information about a configured decoder on the player.

See the `SetDecoderMode()` and `GetDecoderMode()` entries on the [roVideoMode](docId\:QQ734nQz0hCwNI0uNSdMP) page for more information about decoder parameters.

```text
interface BSDecoderMode {
    readonly attribute DOMString decoderName;
    readonly attribute DOMString friendlyName;
    readonly attribute DOMString maxSize;
    readonly attribute DOMString configuredSize;
    readonly attribute unsigned long currentUsage;
    readonly attribute unsigned long maxUsage;
    readonly attribute boolean mosaic;
    readonly attribute boolean enableDeinterlacer;
};
```

## Example

The following JavaScript example illustrates how to retrieve information about the current video mode:

```javascript
function fillInVideoData()
    {
        var videomode_info = new BSVideoMode();
        document.getElementById("resX").innerHTML = videomode_info.resX;
        document.getElementById("resY").innerHTML = videomode_info.resY;
        document.getElementById("safeX").innerHTML = videomode_info.safeX;
        document.getElementById("safeY").innerHTML = videomode_info.safeY;
        document.getElementById("safeWidth").innerHTML = videomode_info.safeWidth;
        document.getElementById("safeHeight").innerHTML = videomode_info.safeHeight;
        document.getElementById("videoMode").innerHTML = videomode_info.mode;
        document.getElementById("bestMode").innerHTML = videomode_info.GetBestMode("hdmi");
        document.getElementById("connectedFlag").innerHTML = videomode_info.IsAttached("vga");
    }

function changeBackground()
    {
        var videomode_info = new BSVideoMode();
        videomode_info.SetBackgroundColour(0xFF0000);
    }
```


[title] pointer
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The pointer object provides information about screen-input devices connected to the player.

**pointer IDL**

```javascript
interface Pointer {
    Promise<bool> isMousePresent();
    Promise<bool> isMultiTouchPresent();
    Promise<void> enableCursor(bool);
};
```

## Object Creation

To create a *pointer* object, first load the `brightsign/pointer` module using the `require()` method. Then create an instance of the *pointer* class.

```javascript
var pointerClass = require("@brightsign/pointer");
var pointer = new pointerClass();
```

## Pointer

Use this interface to determine whether a screen-input device is present.

**isMousePresent()**

```javascript
Promise<bool> isMousePresent()
```

Returns `true` if a mouse is connected to the player.

**isMultiTouchPresent()**

```javascript
Promise<bool> isMultiTouchPresent()
```

Returns `true` if a multitouch device is connected to the player.

**enableCursor()**

```javascript
Promise<void> enableCursor(bool)
```

Display a cursor if the parameter passed is `true`.

## Example

```javascript
var PointerClass = require("@brightsign/pointer");
var pointer = new PointerClass();

pointer.isMousePresent().then(
        function(data) {
            console.log("***Mouse Present***");
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });

pointer.isMultiTouchPresent().then(
        function(data) {
            console.log("***MultiTouch Present***");
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });
```


[title] ptp
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

ptp allows you to retrieve information about the network PTP state of the player.

**ptp IDL**

```javascript
interface PtpEvent {
    attribute String type;
};

callback PtpEventCallback = void (PtpEvent event);

interface Ptp {
    Promise<PtpStatus> getStatus();
    void addEventListener(String type, PtpEventCallback callback);
    void removeEventListener(String type, PtpEventCallback callback);
};

interface PtpStatus {
    attribute long timestamp;
    attribute String state;
};                                                                                                           
```

## Object Creation

To create a *ptp* object, load the *@brightsign/ptp* module using the `require()` method. 

```javascript
var ptpclass = require('@brightsign/ptp');
var ptp = new ptpclass();                                                                                 
```

## Ptp

**getStatus()&#x20;**

```javascript
Promise<PtpStatus> getStatus()                                                                                             
```

Gets the status of a PTP network for a player.

## PtpEvent

This event object is generated by the *roPtp* object whenever the PTP status of the player changes.

- `type` <font color="#6554c0">string</font>: The name of the event ( which will always be PtpEvent).

## PtpStatus

- `timestamp`<font color="#6554c0"> long</font>:  The number of seconds since the PTP state was last changed. This value can be compared against the total uptime of the player, which is retrieved by calling `UpTime(0)`.
- `state` <font color="#6554c0">string</font>: Indicates the current PTP state of the player.  Values can be Master, Slave, or Uncalibrated.

## Example

```javascript
// code placeholder
var ptpclass = require('@brightsign/ptp');  
var ptp = new ptpclass();
function main() {    
    console.log("Starting PTP javascript API...");    
    // ptp status test    
    // Two examples of result from getStatus() for Master & Slave player    
    // {"state":"MASTER","timestamp":20}     
    // {"state":"SLAVE","timestamp":24}     
    var status = ptp.getStatus();    
    status.then( function(result) {              
       console.log(JSON.stringify(result)); })    
     .catch( function(err){     
       console.log(JSON.stringify(err)); 
    });

    // add event test 
    if(ptp.addEventListener){ 
       console.log("adding test event"); 
       ptp.addEventListener("ptpevent", EventHandler);     
    }
    // remove event test    
    // set 5 sec timeout for the purpose of testing removeEventListener     
    setTimeout(function (){      
       console.log("removing test event");        
       ptp.removeEventListener("ptpevent", EventHandler) }, 5000);
}
function EventHandler(event){   
    console.log(JSON.stringify(event));  
}                                                                                      
```

As of BrightSignOS 8.3.20, to get the current data set: 

```javascript
var ptpclass = require('@brightsign/ptp');
 var ptp = new ptpclass();
var ds = ptp.getCurrentDataSet();
ds
 .then( function(result) {
   console.log(JSON.stringify(result));
 })
 .catch( function(err){
   console.log(JSON.stringify(err)); }
 );

```

This will return a promise that, when successful, resolves to type: 

```javascript
type CurrentDataSet
{
 stepsRemoved: number;
 offsetFromMaster: number;
 meanPathDelay: number;
}
```


[title] securestore
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *securestore* object provides a mechanism for securely storing customer data within the player. Data held in the *securestore* are encrypted using root keys which are held securely within the player hardware and are unique to each unit. In general, the *securestore* is used to hold a second-level key which in turn is used for subsequent decryption. The key itself cannot be retrieved, but the user can ask the *securestore* to perform decryption using it.

The capacity of the *securestore* is limited and customers should not store more than 256kB of keys.

**securestore IDL**

```javascript
interface SecureStore {
    Promise<void> writePkcs8DecryptionKey(String name, Array<byte> data)
    Promise<void> writePkcs8MediaDecryptionKey(String name, Array<byte> data)
    Promise<Array<byte>> decryptWithPkcs8Key(String name, String algorithm, String hash, Array<byte> data)
    Promise<void> eraseSecureStore();
}; 
```

## Object Creation

To create a *securestore* object, load th&#x65;*&#xA0;@brightsign/securestore* module using the Node.js® require() method:

```javascript
var securestoreClass = require("@brightsign/securestore");
var securestore = new securestoreClass();
```

## SecureStore

**writePkcs8DecryptionKey()**

```javascript
Promise<void> writePkcs8DecryptionKey(String name, Array<byte> data)
```

Writes the key in pkcs8 format to the securestore.

- `name` <font color="#6554c0">string:</font> The filename of the key within the secure store.
- `data` <font color="#6554c0">Array:</font>  The key as a Uint8 data array.

**decryptWithPkcs8Key()**

```javascript
Promise<Array<byte>> decryptWithPkcs8Key(String name, String algorithm, String hash, Array<byte> data)
```

Decrypts a data array using the designated key stored in the securestore and using the designated algorithm and hash.

- `name` <font color="#6554c0">string</font>: The filename of the key within the secure store.
- `algorithm` <font color="#6554c0">string</font>: For the moment, the only algorithm supported is ""RSA-OAEP".  
- `hash` <font color="#6554c0">string</font>:  Hash values can be any of the following: "SHA-1", "SHA-256", "SHA-384" or "SHA-512".
- `data` <font color="#6554c0">Array</font>:  Uint8Array data

**eraseSecureStore()**

```javascript
Promise<void> eraseSecureStore()
```

Completely deletes the securestore.

## Examples

Write example:

```javascript
window.crypto.subtle.generateKey(
    {
    name: "RSA-OAEP", 
    modulusLength: 2048, //can be 1024, 2048, or 4096
    publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
    hash: {name: "SHA-1"}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
    },
    true, //whether the key is extractable (i.e. can be used in exportKey)
    ["encrypt", "decrypt"] //must be ["encrypt", "decrypt"] or ["wrapKey", "unwrapKey"]
)
.then(function(key){
    window.crypto.subtle.exportKey("pkcs8", key.privateKey)
    .then(function(exportKey) {
        var SecureClass = require("@brightsign/securestore");
        var secure = new SecureClass();
        secure.writePkcs8DecryptionKey("testkey.bin", Array.from(new Uint8Array(exportKey)))
        .then(function(){

        ....

       }

    ....

    });
```

Decrypt example:

```javascript
var SecureClass = require("@brightsign/securestore");
var secure = new SecureClass();

decryptWithPkcs8Key("testkey.bin", "RSA-OAEP", "SHA-1", Array.from(new Uint8Array(encrypted)))
    .then(function(decryptedArray){

        ....
})
```

Delete example:

```javascript
var SecureClass = require("@brightsign/securestore");
var secure = new SecureClass();

secure.eraseSecureStore()
```


[title] screenshot
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *screenshot&#xA0;*&#x6F;bject allows you to capture a screenshot of the composite video and graphics layers.

**screenshot IDL**

```javascript
interface Screenshot {                                                                                                                                                                                                                                                  
    void syncCapture(ScreenshotParams params);                                                                                                                                                                                                                          
    Promise<void> asyncCapture(ScreenshotParams params);                                                                                                                                                                                                                
};                                                                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                        
interface ScreenshotParams {                                                                                                                                                                                                                                            
    [optional] attribute String destinationFileName;                                                                                                                                                                                                                    
    [optional] attribute String fileName;                                                                                                                                                                                                                               
    [optional, Default=JPEG] attribute String fileType;                                                                                                                                                                                                                 
    [optional, Default=""] attribute String description;                                                                                                                                                                                                                
    [optional, Default=640] attribute int width;                                                                                                                                                                                                                        
    [optional, Default=480] attribute int height;                                                                                                                                                                                                                       
    [optional, Default=50] attribute int quality;                                                                                                                                                                                                                       
    [optional, Default=0] attribute int rotation;                                                                                                                                                                                                                       
};  
```

## Object Creation

To create a *screenshot* object, first load the `brightsign/screenshot` module using the `require()` method. Then create an instance of the *screenshot* class.

```javascript
var ScreenshotClass = require("@brightsign/screenshot");
var screenshot = new ScreenshotClass();
```

## Screenshot

Use this interface to take screenshots.

**syncCapture()**

```javascript
void syncCapture(ScreenshotParams params) 
```

Takes a screenshot at nearly the exact moment that it is called. Because this method might interrupt on-screen operations, it is more appropriate for debugging applications.

**asyncCapture()**

```javascript
Promise<void> asyncCapture(ScreenshotParams params)
```

Takes a screenshot without interrupting other operations. This method is appropriate for production environments–where the timing of the capture is less important than seamless operation.

## ScreenshotParams

This interface contains screenshot settings.

- `destinationFileName` <font color="#6554c0">string</font>: The native path and filename that will be saved (for example, *storage/sd/myscreenshots/screen.jpg*). If the specified directory does not exist, the screenshot will fail.
- `fileName` <font color="#6554c0">string</font>:  The name and path of the image file that will be saved (e.g. "SD:/myscreenshots/screen.jpg"). If the specified directory does not exist, the screenshot will fail. This is deprecated in favor of `destinationFileName`, but is still supported. 
- `fileType` <font color="#6554c0">string</font>: The file type of the image ("JPEG" or "BMP"). The default file type is "JPEG". Note that the file extension (".jpg" or ".bmp") is not appended to the filename by default and, if needed, should be included in the `fileName` string.
- `description` <font color="#6554c0">string </font><font color="#01a0af">optional</font>: An optional description.
- `width` <font color="#6554c0">int</font>: The width of the image file. The default value is 640.
- `height` <font color="#6554c0">int</font>: The height of the image file. The default value is 480.
- `quality`<font color="#6554c0"> int</font>: The image quality of the screenshot (between 0 and 100). The default value is 50.
- `rotation` <font color="#6554c0">int</font>: The rotation of the screenshot image (in degrees). The default value is 0. Accepted values are 0, 90, 180, and 270.

## Example

This script takes a screenshot asynchronously every five minutes, saving it to the root of the SD card. Note that the previous image is erased with each new screenshot.

```javascript
var ScreenshotClass = require("@brightsign/screenshot");
var screenshot = new ScreenshotClass();

function takeAsyncScreenshot(args) {
    screenshot.asyncCapture(args).then().catch();
};

screenshotParams = {};
screenshotParams.fileName = "SD:/screen.jpg";
screenshotParams.quality = 75;

setInterval(takeAsyncScreenshot(screenshotParams), 10000);
```


[title] filesysteminfile
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *filesysteminfile* allows you to create and update filesystems for use as storage devices. 

**filesysteminfile IDL**

```text
interface FileSystemInFile {
    constructor(String path);
    Promise<String> getFilename();
    Promise<long long> getSize();
    Promise<void> format(String fileSystem);
    Promise<void> mount();
    Promise<void> unmount();
};                                                                                                                  
```

## Object Creation

To create a *filesysteminfile* object, load the *@brightsign/filesysteminfile* module using the Node.js® require() method:

```javascript
var FileSystemInFile = require('@brightsign/filesysteminfile');
var fsif = new FileSystemInFile("/storage/sd/usbstore.img"); // Node's native 'fs' can create an .img file                                                                                 
```

## filesysteminfile

Use this interface to configure a *filesysteminfile*.

### getFilename()

```javascript
Promise<String> getFilename()                                                                                                   
```

Gets the name of the file that was used to create *FileSystemInFile.*

### getSize()

```javascript
Promise<long long> getSize()                                                                                           
```

Retrieves the size (in bytes) of the filesystem file used to create the *FileSystemInFile* class.

### format()

```javascript
Promise<void> format(String fileSystem)                                                                                            
```

Creates the specified filesystem in a file that already exists. The supported filesystem types are "fat" and "exfat".

### mount()

```javascript
Promise<String> mount()                                                                                                 
```

Mounts the filesystem. There is no need to format the filesystem if it already exists and is formatted.

The return string is *filepath* and the return value is the path to where the filesystem has been mounted. It cannot be mounted more than once.

### unmount()

```javascript
Promise<void> unmount()                                                                                                 
```

Unmounts the filesystem.

## Example

The example below creates a file system, formats, mounts, and unmounts it using the npm package *fs*, 

```javascript
const fs = require('fs');
const FileSystemInFile = require('@brightsign/filesysteminfile');

var fsif;
var fd;

open()
.then(function(fileDescriptor) {
	fd = fileDescriptor;
	return write(fd);
})
.then(function(bytes) {
	console.log(`${bytes} written to new file`);
	return close(fd);
})
.then(function() {
	// Create FileSystemInFile using the backing file
	fsif = new FileSystemInFile('/storage/sd/usbstore');

	return format();
})
.then(function() {
	return mount();
})
.then(function() {
	/* This is where you can actually do stuff with the mounted filesystem. */

	// Unmount the mounted file after 10 seconds
	setTimeout(function() {
		return unmount();
	}, 10000);
})
.catch(function(error) {
	console.log(JSON.stringify(error));
});


// Create a writable file for the file system
function open() {
	return new Promise(function(resolve, reject) {
		fs.open('/storage/sd/usbstore', 'w', function(error, fd) {
			if (error) reject(error);
			resolve(fd);
		});	
	});
};

// Write a buffer allocating 1GB of disk space for the file
function write(fd) {
	return new Promise(function(resolve, reject) {
		fs.write(fd, Buffer.alloc(1), 0, 1, (1024*1024*1024) - 1, function(error, bytesWritten) {
			if (error) reject(error);
			resolve(bytesWritten);
		});
	});
};

// Close the created file
function close(fd) {
	return new Promise(function(resolve, reject) {
		fs.close(fd, function(error) {
			if (error) reject(error);
			resolve();
		});
	});
};

// Format the file system
function format() {
	return new Promise(function(resolve, reject) {
		fsif.format("exfat")
		.then(function() {
		  console.log('Filesystem formatted');
		  resolve();
		})
		.catch(function(error) {
		  reject(error);
		});		
	});
};


// Mount the filesystem internally
function mount() {
	return new Promise(function(resolve, reject) {
		fsif.mount()
		.then(function(mount_point) {
		  console.log('Filesystem mounted' + mount_point);
		  resolve();
		})
		.catch(function(error) {
		  reject(error);
		});
	});
};

// Unmount filesystem from internal mount point. Only can unmount a mounted file
function unmount() {
	return new Promise(function(resolve, reject) {
		fsif.unmount()
		.then(function() {
		  console.log('Filesystem unmounted');
		  resolve();
		})
		.catch(function(error) {
		  reject(error);
		});
	});
};                                                                                    
```

You can also reference our public [github example](https://github.com/brightsign/usb-filesystem) which uses a BrightSign device as a filesystem over USB.

[title] resolver
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *resolver* object allows you to flush the player's DNS cache. This is available in BrightSignOS 8.3.32 and later releases.

**resolver IDL**

```javascript
[
    Constructor()
] interface Resolver {
    Promise<void> flushDnsCache();
};
```

## Object Creation

To create a *resolver* object, first load the `brightsign/resolver` module using the `require()` method:

```javascript
const Resolver = require('@brightsign/resolver')
let resolver = new Resolver;
```

## Resolver

**flushDnsCache()**

```javascript
Promise<void> flushDnsCache()
```

Use this method to flush the player's DNS cache.

## Example

```javascript
const Resolver = require('@brightsign/resolver')
let resolver = new Resolver;
await resolver.flushDnsCache();
```


[title] BSCECReceiver
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

For more information about available methods, refer to the [roCecInterface](docId\:ezdh3By8IIBWQKy04obzU) entry. Note that you can only use this JavaScript class to receive CEC messages. Use [BSCECTransmitter](docId\:mA-PNB9N4I6NIn_IXnr0R) to send CEC messages.

The JavaScript equivalent is [cec](docId\:sgfokqfxwmjxxOfS13HtK).

## Events

The following events are available on the *BSCECReceiver* object. They can receive an event of the type *CECReceiverEvent*. 

- `onececrxframe`
- `oncectxcomplete`

### BSCECReceiverEvent – Attributes

- `readonly attribute int status`
- `readonly attribute DOMString data`

### BSCECReceiverEvent – Methods

- `ArrayBuffer getBytes()`

## Methods

- `void Close()`: Shuts down the instance, preventing it from further consuming resources. If this method is not called, garbage collection determines when the instance will be destroyed.

## Example

```text
<script>
    function loadCec()
    {
        console.log("*** loadCec ***");

        var cec_in = new BSCECReceiver();

        cec_in.oncecrxframe = function(e){
           console.log('############ oncecrxframe: ' + e.data);
        }

        cec_in.oncectxcomplete = function(e){
           console.log('############ oncectxcomplete: ' + e.status);
        }
    }
</script>
```


[title] Network Entity (v3)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 3.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v3)/

The Network entity contains the following optional properties:

- `timeServers` <font color="#704ae0">string[]</font> <font color="#01a0af">optional</font>: An array of URLs for time synchronization (if a user does not add a time server, the default is "http\://time.brightsignnetwork.com")
- `hostname` <font color="#704ae0">string or null</font> <font color="#01a0af">optional</font>: The name of the host device on the network.
- `dns` <font color="#704ae0">string[] or null</font> <font color="#01a0af">optional</font>: An array of DNS server addresses
- `ProxyServer` <font color="#704ae0">string or null</font> <font color="#01a0af">optional</font>: The proxy server URL address
- `proxyBypass` <font color="#704ae0">string[] or null</font> <font color="#01a0af">optional</font>:  An array of proxy bypass server names
- `interfaces` <font color="#704ae0">interfaces[]</font> <font color="#01a0af">optional</font>:  An array of [Interfaces Entity (v3)](docId\:UPh1UInwnzlfMGifaxthv)
  - The order of the interface objects indicates the priority (“metric“) of each interface. If nothing is provided, the ethernet interface will be used by default.
  - The first interface object in the array is the highest priority interface and traffic will be sent to that interface if there is an active connection. All other interfaces are considered secondary interfaces. See [this page](docId:7Yk3I2x7TWfjHoyUEmv3a) for more information.
- `certificateName` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The name of the certificate
  - `certificateFile` <font color="#704ae0">string or file</font>:  A certificate file. This is required if you add a certificate name.


[title] Firmware Build Info Entity (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v2)/

Firmware Build Info entities contain the following required properties: 

- `firmwareUpdateSource` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The enum source from which to get the firmware update. Possible values are “Production”, “Beta”, “MinimumCompatible”, “SpecificUrl”, “None”, or “Existing”. If you use “Production”, “Beta”, or “MinimumCompatible”, no additional values need to be defined.
- `firmwareUpdateSourceFilePath` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: Local file path to the bsfw file. This is only applicable for BrightSign Author desktop version when \` firmwareUpdateSource\` is \`SpecificFile\`.&#x20;
- `firmwareUpdateSourceUrl` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: URL link to the bsfw file (must be publicly accessible). Applicable when \` firmwareUpdateSource\` is \`SpecificUrl\`.
- `firmwareUpdateStandardTargetFileName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the .bsfw firmware file that is targeted for updates. The update contained in the file is applied and if successful the file is deleted from the storage medium containing it. If the delete succeeds then the system reboots. If it fails then the device behaves as if the file had been named `*_save.bsfw` - see below. The delete always fails if the card uses an NTFS or HFS+ filesystem.
- `firmwareUpdateDifferentTargetFileName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of a .bsfw firmware file. In run mode the update contained in this file is applied only if the version it contains does not match the version that is currently running. The file is not deleted but the infinite loop is avoided because on subsequent boots the version number will be the same so the update file will be ignored. In rescue mode the update is always applied.
- `firmwareUpdateNewerTargetFileName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of a .bsfw firmware file. In run mode the update contained in the file is applied only if the version it contains is strictly newer than the version that is currently running. The file is not deleted but the infinite loop is avoided because on subsequent boots the version number will be the same so the update file will be ignored. In rescue mode, the update is always applied because the version of run mode cannot be checked and the infinite loop won't occur because the device will reboot into run mode.
- `firmwareUpdateSaveTargetFileName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of a .bsfw firmware file. The update contained in the file is applied but the file is not deleted, because if the device rebooted at this point it would just apply the update against the device and will not automatically reboot when applying updates named like this until the storage device containing the update has been removed. This makes this filename useful if you wish to update many units from a USB key.
- `firmwareUpdateVersion` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: This can be an empty string or the version number of the firmware you want to update to
- `productionReleaseURL` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The URL to the .bsfw file that the device will pull the Setup files from for use in production. This is o<font color="#0C121D"> of .</font>
- `betaReleaseURL` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The URL to the .bsfw file for the beta release version in production. This is o<font color="#0C121D"> of </font><font color="#0C121D"></font><font color="#0C121D">.</font>
- `compatibleReleaseURL` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The URL to the .bsfw file for the minimum compatible release version in production. This is o<font color="#0C121D"> of </font><font color="#0C121D"></font><font color="#0C121D">.</font>
- These additional fields will be returned in the GET response. The values are set in the Firmware Manifest. They are not required in a PUT request:
  - `productionVersion` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>
  - `betaVersion` <font color="#704ae0">string</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>    &#x20;
  - `compatibleVersion` <font color="#704ae0">string</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>
  - `productionVersionNumber` <font color="#704ae0">number</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>
  - `betaVersionNumber` <font color="#704ae0">number</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>
  - `compatibleVersionNumber` <font color="#704ae0">number</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>
  - `productionReleaseSHA1` <font color="#704ae0">string</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>
  - `betaReleaseSHA1` <font color="#704ae0">string</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>
  - `compatibleReleaseSHA1` <font color="#704ae0">string</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>
  - `productionReleaseFileLength` <font color="#704ae0">number</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>&#x20;
  - `betaReleaseFileLength` <font color="#704ae0">number</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>
  - `compatibleReleaseFileLength` <font color="#704ae0">number</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>
  - `existingFWContentID` <font color="#704ae0">string</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>&#x20;


[title] audioconfig
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

This object allows for mixing and leveling of audio streams before they are passed to audio outputs. 

**audioconfig IDL**

```text
interface AudioConfiguration {
    Promise<AudioConfig> getConfig();
    Promise<void> applyConfig(AudioConfig config);
};

interface AudioConfig {
    attribute String modeName;
    [optional] attribute int srcRate;
    [optional] attribute bool pcmOnly;
    [optional] attribute bool autoLevel;
};
```

## Object Creation

To create an *audioconfig* object, load the `brightsign/audioconfiguration` module using the `require()` method.

```javascript
var AudioConfigurationClass = require("@brightsign/audioconfiguration");
var audioconfig = new AudioConfigurationClass();
```

## AudioConfiguration

Use this interface to create *audioconfig* objects.

### getConfig()

```javascript
Promise<AudioConfig> getConfig()
```

Returns the audio configuration information.

### applyConfig()

```javascript
Promise<void> applyConfig(AudioConfig config)
```

Configures the audio mode to switch between dynamic and pre-routed.

## AudioConfig

This interface contains the audio configuration parameters for all but the AU series 5 product line. See the note below for more information about those products.

- `modeName` <font color="#6B21A8">string</font>: Sets the audio routing mode:
  - `"dynamic"`: The default mode. Mixing audio streams with differing sampling rates will cause playback to fail; differing volume levels will not be normalized; and audio streams cannot be added to an output that currently has audio playing on it. Other parameters in the associative array are ignored. However, in the AU product line, only a single audio stream can be played to an output at any one time. All other parameters in the associative array are ignored.
  - `"prerouted"`: Add and remove audio streams on an output that currently has audio playing on it; additional audio routing behavior is determined with the `srcrate`,  `pcmonly`, and `autolevel` parameters. 
- `srcRate` <font color="#6B21A8">int</font> <font color="#01a0af">optional</font>: Sets the sample rate to which all PCM audio streams are converted in the the "pre-routed" audio mode. This value can be either 44100 or 48000.
- `pcmOnly` <font color="#6B21A8">bool</font> <font color="#01a0af">optional</font>: Enables ("true") or disables ("false") compressed audio support in the "pre-routed" audio mode. 
- `autoLevel` <font color="#6B21A8">bool</font> <font color="#01a0af">optional</font>: Enables ("on") or disables ("off") volume leveling for audio outputs in the "pre-routed" audio mode. When this setting is enabled, all PCM audio streams on a particular output will play at a similar volume. 

:::hint{type="info"}
These audio configuration parameter definitions are specific to AU series 5 products:

- `modeName` <font color="#6B21A8">string</font>: Sets the audio routing mode:
  - `"dynamic"`: The default mode. Only a single audio stream can be played to an output at any one time. All other parameters in the associative array are ignored.
  - `"prerouted"`:  Multiple audio streams can be played simultaneously to analog or eARC outputs (not USB). Audio is always the sample rate converted to the value set in *srcRate*. Streams can be started and stopped without affecting other playing streams.
- `srcRate` <font color="#6B21A8">int</font> <font color="#01a0af">optional</font>: Sets the sample rate to which all PCM audio streams are converted in the the "pre-routed" audio mode. This value can be from 32000 to 96000.
- `pcmOnly` <font color="#6B21A8">bool</font> <font color="#01a0af">optional</font>: This feature is not available on the AU series 5 product line.
- `autoLevel` <font color="#6B21A8">bool</font> <font color="#01a0af">optional</font>: This feature is not available on the AU series 5 product line.
:::

## Example

In this example, the code gets the current audio configuration, alters it (though it doesn't check that the values are changing), and writes it back:

```javascript
var AudioConfigurationClass = require("@brightsign/audioconfiguration");
var audioconfig = new AudioConfigurationClass();
var config_state = await audioconfig.getConfig();
config_state.mode = "prerouted"
config_state.srcRate = 48000;
await audioconfig.applyConfig(config_state);
```


[title] BrightSign Asset Pool Example
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/Untitled/

This script shows how the BrightSign Asset Pool can be used from JavaScript. It works from both NodeJS and Chromium. It is not intended as a full application and it doesn’t do anything with the assets that are downloaded.

```javascript
// MIT License
//
// Copyright (c) 2020 BrightSign
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

// Customise these settings for your environment
const storagePath = "/storage/sd/";
const poolPath = storagePath + "examplePool";
const serverPrefix = "https://github.com/brightsign/javascript-assetpoolfetcher/blob/video-training/";

const fs = require('fs');
const AssetPool = require("@brightsign/assetpool");
const AssetPoolFiles = require("@brightsign/assetpoolfiles");
const AssetFetcher = require("@brightsign/assetfetcher");
const AssetRealizer = require("@brightsign/assetrealizer");

// Create the asset collection array to be used by the rest of the
// program. The asset collection will usually come either directly or
// indirectly from a server somewhere rather than being generated in
// code like this.
function makeAssetCollection()
{
    // Assets must have a name and a link. Everything else is
    // optional. You can add your own properties if required. For
    // example, the "osUpdate" property here is only used by this
    // script.
    let videoAsset1 = {
	name: "brightlink.mp4",
	hash: { method: "SHA256",
		hex: "82e5e800ff4b2608ae996b6c9fce78c0d84b82cba0da270251846324f48fb076" },
	link: serverPrefix + "brightlink%201min.mp4?raw=true",
	size: 17219989,
    };

    let videoAsset2 = {
	name: "CMScontrol.mp4",
	hash: { method: "SHA512",
		hex: "d476296b114fda612917b1568a9f7ffe6f54f3f927b2d1ecc932816e912619eeef980e1adc16d8b1d7914d3f172cd6a2ef17172ea3251ddcdbb3d151faa6818f" },
	link: serverPrefix + "CMS%2BControl%201%20min.mp4?raw=true",
	size: 5633877,
    };

    // We don't want to risk actually changing the OS version on the
    // BrightSign running this example cript, so this is not a real
    // BrightSignOS file. It will be realized into the root of the
    // storage device, but the OS will fail to find the expected
    // header and rename it to placeholder.bsfw_invalid.
    let osUpdateAsset = {
	name: "placeholder.bsfw",
	hash: { method: "SHA1", hex: "20e89c9ba0491590e3c34bc704171c0c02e643c3" },
	link: serverPrefix + "placeholder.bsfw?raw=true",
	size: 43,
	osUpdate: true,
    };

    let assetCollection = [
	videoAsset1,
	videoAsset2,
	osUpdateAsset,
    ];

    return assetCollection;
}

// Convert a progress event to a useful string for reporting
function progressString(event)
{
    if (event.currentFileTotal === undefined) {
	// If the size of the asset was not specified in the asset collection, then the total size may not be reported
	// during the fetch.
	return event.currentFileTransferred.toString() + " of unknown";
    } else {
	return event.currentFileTransferred.toString() + " of " + event.currentFileTotal.toString() + " "
	    + (100*event.currentFileTransferred / event.currentFileTotal).toFixed(0) + "%";
    }
}

// Download any assets that aren't already in the pool into the pool
// whilst reporting progress.
async function fetchAssets(assetPool, assetCollection)
{
    console.log("Fetch: " + JSON.stringify(assetCollection.map(asset => asset.name)));

    let assetFetcher = new AssetFetcher(assetPool);

    assetFetcher.addEventListener("fileevent", (event) => {
	// This is called each time the fetcher has finished trying to
	// download an asset, whether successful or not. It is not
	// called for any assets that are already in the pool.
	console.log("ASSET [" + (event.index + 1).toString() + "] "
		    + event.fileName + " complete: " + event.responseCode.toString() + " " + event.error);
    });

    assetFetcher.addEventListener("progressevent", (event) => {
	// This is called at approximately the progress interval
	// specified in the options to indicate how far through the
	// download
	console.log("ASSET [" + (event.index + 1).toString() + "/" + event.total.toString() + "] " + event.fileName
		    + " progress: " + progressString(event));
    });

    const fetchOptions = {
	// receive asset progress events about every five seconds.
	progressInterval: 5,
	// try to download each asset three times before giving up.
	fileRetryCount: 3,
	// Give up if we fail to download at least 1024 bytes in each
	// ten second period.
	minimumTransferRate: { bytesPerSecond: 1024, periodInSeconds: 10 },
    };

    try {
	await assetFetcher.start(assetCollection, fetchOptions);
    }
    catch (err) {
	console.log("FETCH FAILED: " + err.message);
	throw(err);
    }
}

// In order to make use of an asset from the pool you need to look up
// its pool filename so you can refer to it there.
async function useAssets(assetPool, assetCollection)
{
    let files = new AssetPoolFiles(assetPool, assetCollection);

    for (const fileName of [ 'brightlink.mp4', 'CMScontrol.mp4' ]) {
	const path = await files.getPath(fileName);
	console.log("Asset " + fileName + " is at " + path);
    }
}

// Some files need to appear in the filesystem outside the pool. For
// example, BrightSignOS update files must be written to the root of
// a storage device for them to be found. Realizing will copy files,
// so can be slow on large files.
async function realizeAssets(assetPool, assetCollection)
{
    let realizer = new AssetRealizer(assetPool, storagePath);

    // We only want to realize the files that we have to
    const assetsToRealize = assetCollection.filter(asset => asset.osUpdate);
    console.log("Realize: " + JSON.stringify(assetsToRealize.map(asset => asset.name)));
    await realizer.realize(assetsToRealize);
}

function ensureDirectoryExists(path) {
    try {
	fs.mkdirSync(path);
    } catch (err)
    {
	if (err.code != 'EEXIST')
	    throw(err);
    }
}

function exceptionToString(err)
{
    if (err instanceof Error)
        return err.name + ":" + err.message;
    else if (typeof(err) === "string")
        return err;
    else
        return JSON.stringify(err);
}

async function runExample()
{
    console.log("Start");
    ensureDirectoryExists(poolPath);

    // Only one AssetPool instance should be created for a given pool
    // path. Having multiple instances risks them disagreeing over
    // which assets are protected during pruning.
    let assetPool = new AssetPool(poolPath);

    // Don't let the pool grow any larger than 500MiB
    await assetPool.setMaximumPoolSize(500 * 1024 * 1024);

    // Don't let free space on the storage device fall below 100MiB
    await assetPool.reserveStorage(100 * 1024 * 1024);

    const assetCollection = makeAssetCollection();

    // We need to stop the fetcher from pruning any of the assets we
    // currently care about in order to make space for fetching new
    // assets or realizing existing ones. Assets are protected until
    // the AssetPool instance is destroyed or unprotectAssets is
    // called for the same name.
    await assetPool.protectAssets("collection1", assetCollection);

    await fetchAssets(assetPool, assetCollection);

    // In this case any failure to fetch the assets will cause
    // fetchAssets to have thrown an exception, so we won't get this
    // far. However, in a larger script it may be more convenient to
    // call areAssetsReady to determine whether the asset collection
    // is ready for use.
    if (await assetPool.areAssetsReady(assetCollection)) {
	await useAssets(assetPool, assetCollection);
	await realizeAssets(assetPool, assetCollection);
    } else {
	console.log("Assets were not downloaded successfully");
    }
}

runExample()
    .then(() => {
	console.log("Complete");
	process.exit(0);
    })
    .catch((err) => {
	console.log("Failed " + exceptionToString(err));
	process.exit(1);
    });
```


[title] dwsconfiguration
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

<font color="hsl(var(--ab-gray-900))">The *dwsconfiguration* object allows you to configure the  on the player. </font>

<font color="hsl(var(--ab-gray-900))">he LDWS is enabled on port 80, with the player serial number as password and "admin" as the username.</font>

**dwsconfiguration IDL**

```text
[
   GarbageCollected,
] interface DWS {
    DWSConfig defaultConfig();
    Promise<DWSConfig> getConfig();
    Promise<DWSResult> applyConfig(DWSConfigWritable config);
};

interface DWSConfig {
    attribute int port;
    attribute Password password;
    attribute Array<String> authenticationList;
};

interface DWSConfigWritable : DWSConfig {
    attribute Password password;
};

interface Password {
    attribute String value;
    attribute bool obfuscated;
};

interface DWSResult {
    attribute bool restartRequired;
};
```

## Object Creation

To create a *dwsconfiguration* object, first load the `brightsign/dwsconfiguration` module using the `require()` method. Then create an instance of the *dwsconfiguration* class.

```javascript
var DWSConfigurationClass = require("@brightsign/dwsconfiguration");
var dwsConfig = new DWSConfigurationClass();
```

## DWS

Use this interface to retrieve and modify the DWS configuration.

### getConfig()

```javascript
Promise <DWSConfig> getConfig() 
```

Returns a `DWSConfig` interface containing current DWS-configuration information. If there is a set password, `getConfig()` will return True for the `password` parameter. If there isn't a set password, If there is a set password, `getConfig()` will return False for the `password` parameter.

### applyConfig()

```javascript
Promise <DWSResult> applyConfig(DWSConfigWritable config) 
```

Applies DWS-configuration settings to the player. This method accepts a `DWSConfig` interface. It returns a `DWSResult` interface that indicates whether or not a reboot is required for the changes to take effect (the caller is responsible for requesting the reboot). The `restartRequired` property of the `DWSResult` indicates whether the reboot is required.

The `config` parameter should contain the complete desired configuration. Any previous configuration is overwritten. If you wish to change one item while keeping the rest of the configuration the same, then call `getConfig` and modify the returned object (see the example in the Examples section).

## DWSConfig

This interface contains DWS configuration parameters:

- `port` <font color="#704ae0">int</font>: The port number of the DWS, located at the IP address of the player. The default for the DWS is port 80. Setting this value to 0 will disable the DWS. 
- `password` <font color="#704ae0">Password</font>: A `Password` interface containing password settings for the DWS. We highly recommended that you set a strong password, especially in production scenarios. To enable the DWS without password protection, set `value` to an empty string and `obfuscated` to false.
- `authenticationList` <font color="#704ae0">Array</font>: The authentication scheme for the DWS password. This entry currently accepts a single value only. The following are accepted values:
  - `"basic"`: The password will be validated using basic authentication.
  - `"digest"`: The password will be validated using digest access authentication.

:::hint{type="info"}
To enable the DWS without password authentication, set the `password.value` to be an empty string and `password.obfuscated` to be false, when calling the `applyConfig()` method.
:::

## DWSConfigWritable

- `password` <font color="#704ae0">Password</font>: A `Password` interface containing password settings for the DWS

## Password

This interface contains password settings for the DWS:

- `value` <font color="#704ae0">String</font>: The DWS password
- `obfuscated` <font color="#704ae0">bool</font>: A flag indicating whether the password string is obfuscated. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.

## DWSResult

This interface contains results from an `applyConfig()` operation.

- `restartRequired` <font color="#704ae0">bool</font>: A flag indicating whether a reboot is required for changes to go into effect (the script must perform the reboot)

## Examples

```javascript
var DWSConfigurationClass = require("@brightsign/dwsconfiguration");
var dwsConfig = new DWSConfigurationClass();

var configData = {};
var pw = {};

configData.port = 1010;
configData.password = pw;
configData.authenticationList = ["basic"];

pw.value = "password";
pw.obfuscated = false;

dwsConfig.applyConfig(configData).then(
        function(data) {
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });
dwsConfig.getConfig().then(
        function(data) {
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });
```

To change one item while keeping the rest of the configuration the same, then call `getConfig` and modify the returned object:

```text
  var DWSConfigurationClass = require("@brightsign/dwsconfiguration");
  var dwsConfig = new DWSConfigurationClass();
  var pw = {};
  dwsConfig.getConfig()
  .then(function(config) {
    pw.value = "password";
    pw.obfuscated = false;
    config.password = pw;
    dwsConfig.applyConfig(config);
  })
  .then(function() {
    console.log("Success");
  })
  .catch(function(error) {
    console.log(JSON.stringify(error));
  });
```


[title] assetpool
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *assetpool* object represents a directory on a storage device used to store downloaded assets. 

:::hint{type="warning"}
See [BrightSign Asset Pool](docId:1PwrkHCrG58LdHTSImJ-g) for more general information and examples.
:::

**assetpool IDL**

```text
interface AssetPool {
    AssetPool(String poolPath);
    Promise<void> protectAssets(String assetCollectionName, AssetList assets);
    Promise<void> unprotectAssets(String assetCollectionName);
    Promise<void> reserveStorage(long reservedStorageInBytes);
    Promise<void> setMaximumPoolSize(long? maximumPoolSizeInBytes);
    Promise<long> getPoolSize();
    Promise<AssetValidationResult> validate(AssetList assets, AssetValidationOptions options);
    Promise<AssetQueryResult> queryFiles(AssetList assets);
    Promise<bool> areAssetsReady(AssetList assets);
};

interface AssetInfo {
    attribute String name;
    attribute String link;
    [optional] attribute long size;
    [optional] attribute AssetHash hash;
    [optional] attribute String changeHint;
    [optional] attribute AssetFetchAuthentication? auth;
    [optional] attribute AssetFetchHeaders? headers;
};

interface AssetHash {
    attribute String method;
    attribute String hex;
};

interface AssetFetchAuthentication {
    [optional] attribute String user;
    [optional] attribute String password;
};

interface AssetFetchHeaders {
};

interface AssetValidationOptions {
    attribute deleteCorrupt;
};

interface AssetQueryResult {
    attribute String name;
    attribute bool present;
};

interface AssetValidationResult {
    attribute String name;
    attribute String reason;
};
```

## Object Creation

To create an *assetpool* object, first load the `brightsign/assetpool` module using the `require()` method. Then create an instance of the *assetpool* class with a string value specifying the pool path. You must create only one *assetpool* instance per pool path. This means that it is not possible to safely share a single pool path between BrightScript and JavaScript code.

```text
const AssetPoolClass = require("@brightsign/assetpool");
let assetPool = new AssetPoolClass("SD:/pool");
```

## AssetPool

Use this interface to perform operations on the asset pool.

### protectAssets()

```javascript
Promise<void> protectAssets(String assetCollectionName, AssetList assets)
```

Requests that a set of files in the asset pool be protected from deletion when the system software needs to prune files from the pool to make space. The passed `assetCollectionName` is used to reference the set of files if their protection needs to be removed later using the `unprotectAssets()` method. Protection only affects this `assetpool` instance and the other objects that use it. You must protect all the assets you care about before performing any operation that might prune files from the pool in order to be sure that the assets you still need are not pruned. This setting is not persistent beyond the lifetime of the `assetpool` instance.

### unprotectAssets()

```javascript
Promise<void> unprotectAssets(String assetCollectionName)
```

Removes protection from a set of files that have been protected by passing the corresponding `assetCollectionName` to the the `protectAssets()` method.

### reserveStorage()

```javascript
Promise<void> reserveStorage(long reservedStorageInBytes)
```

Operations on this assetpool instance, and any other assetpoolfetcher and assetrealizer instances using it, will attempt to keep the specified amount of space free on the storage device containing the pool. As other files are written to the storage device, the maximum size occupied by the pool will be reduced to compensate. This setting is not stored persistently in the pool, so the method must be called each time an assetpool object is created.

### setMaximumPoolSize()

```javascript
Promise<void> setMaximumPoolSize(long? maximumPoolSizeInBytes)
```

Specifies the maximum size of the asset pool. This method is more resource-intensive than `reserveStorage()`, but it is useful when creating multiple pools on a storage device to ensure they don't grow unevenly. This setting is not stored persistently in the pool, so the method must be called each time an assetpool object is created.

### getPoolSize()

```javascript
Promise<long> getPoolSize()
```

Returns the current size of the asset pool in bytes. It is necessary to walk the pool directory structure looking at every asset file to do this, which may slow down other access to the storage device. This method should not be called regularly in production code.

### validate()

```javascript
Promise<AssetValidationResult> validate(AssetList assets, AssetValidationOptions options)
```

Recalculates the hashes of every file in the pool and compares them with the expected values in the passed AssetList. This means every asset file needs to be read in its entirety which may take a long time and may slow down other access to the storage device. This method can be used to detect storage and file system corruption. This method returns an *AssetValidationResult* interface containing validation results for each file. The second parameter is an *AssetValidationsOptions* interface specifying validation options. The only option currently supported indicates whether any assets with mismatched hashes are automatically deleted. The default behaviour is to leave such asset files in place.

### queryFiles()

```javascript
Promise<AssetQueryResult> queryFiles(AssetList assets)
```

Determines whether the specified files are present in the asset pool. This method returns an *AssetQueryResult* interface containing query results. This method is normally only useful for debugging during development.

### areAssetsReady()

```javascript
Promise<bool> areAssetsReady(AssetList assets)
```

Returns `true` if every asset in the AssetList is present in the asset pool.

## AssetInfo 

This interface represents a single asset file that may be in the pool may not yet be in the pool. Each asset has a subset of the following properties:

- `name` <font color="#6B21A8">string</font>: The name that can be used to look up the asset. For a file to be realized, it must have a valid filename without any slashes. Asset names must be unique within an asset collection, but different asset collections may use the same asset name to refer to the same asset in the pool or a different asset in the pool. Asset names are not stored in the pool, the only way to refer to an asset by name is using an asset collection.
- `link` <font color="#6B21A8">string</font>: The URI that can be used by assetpoolfetcher to download the file. http, https, ftp and file URIs are supported.
- `size` <font color="#6B21A8">long</font> <font color="#01a0af">optional</font>: The file length (in bytes) if known.
- `hash` <font color="#6B21A8">AssetHash</font> <font color="#01a0af">optional</font>: A *Hash* interface specifying the hash algorithm and hash value of the file. If no hash is provided then one is created automatically from the link and changeHint.
- `changeHint` <font color="#6B21A8">string</font> <font color="#01a0af">optional</font>: An arbitrary value that can be used by the client to specify that a file has changed even when the hash value and download URL remain the same. This is mostly useful when the hash is not known but the provider of the asset collection can tell when the content has changed. For example, MediaRSS feeds often provide a GUID for the content.
- `auth` <font color="#6B21A8">AssetFetchAuthentication</font><font color="#6B21A8">?</font> <font color="#01a0af">optional</font>: An *AssetFetchAuthentication* interface specifying the credentials to use when downloading the asset. By default, credentials are inherited from the [assetpoolfetcher](docId\:hg03EuSH_xKKpfoFWdgCz) instance used to download the asset.
- `headers` <font color="#6B21A8">AssetFetchHeaders?</font> <font color="#01a0af">optional</font>: By default, the HTTP headers specified via the `headers` property passed to the s`tart` method will be used for each asset. The use of these headers can be disabled for a particular asset by setting this property to `null`. This is useful if a particular subset of assets are retrieved from somewhere else that does not require authentication. It is not currently possible to provided specific headers for a single asset.

## AssetHash

This interface contains hash information about the file.

- `method` <font color="#6B21A8">string</font>: The hash algorithm. Accepted values include "SHA1", "SHA224", "SHA256", "SHA384", "SHA512", "MD5" and "BESHA1". "BESHA1" is a custom hash algorithm that is only useful for referring to large assets that are stored remotely and its use is not recommended.
- `hex` <font color="#6B21A8">string</font>: The hash value in hexadecimal format

## AssetFetchAuthentication

This interface contains authentication information for downloading files.

- `user` <font color="#6B21A8">string</font> <font color="#01a0af">optional</font>: The user name for authentication
- `password` <font color="#6B21A8">string</font> <font color="#01a0af">optional</font>: The password for authentication

## AssetValidationOptions

This interface contains validation options for the `validate()` method.

- `deleteCorrupt`: A flag specifying whether corrupt files should be deleted during validation

## AssetQueryResult

This interface is returned by the `queryFiles()` method. Each entry in the list contains the following parameters:

- `name` <font color="#6B21A8">string</font>: The name of the queried file
- `present` <font color="#6B21A8">bool</font>: A flag indicating whether the queried file exists in the asset pool

## AssetValidationResult

This interface is returned by the `validate()` method. Each entry in the list contains the following parameters:

- `name` <font color="#6B21A8">string</font>: The name of the checked file
- `reason` <font color="#6B21A8">string</font>: An explanation for a failed validation


[title] usbpowercontrol
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *usbpowercontrol* object is used to control the power of the USB port for specific supported platforms. The supported platforms are XT1144, XD1034, AU325, and AU335.  This object is available on BrightSignOS 8.2.20 and above.

**usbpowercontrol IDL**

```javascript
interface UsbPowerControl {
    Promise<void> powerCyclePort(String friendly_name);
    Promise<void> powerCycleAllPorts();
    Promise<void> portPowerOn(String friendly_name);
    Promise<void> portPowerOff(String friendly_name);
};
```

## Object Creation

```javascript
var UsbPowerControlClass = require("@brightsign/usbpowercontrol");
var usbPowerControl = new UsbPowerControlClass();
```

## usbpowercontrol

Use this interface to control power on USB ports.

**powerCyclePort()**

```javascript
Promise<void> powerCyclePort(String friendly_name)
```

Allows you to power cycle the VBus on a device that may be stuck on a specific port.

- `friendly_name` <font color="#6554c0">string</font>: The friendly name of the specific USB port.  Please refer to the table below to map friendly names to supported platforms. For example, call `usbPowerControl.powerCyclePort("USB:A")` to turn the USB power on port 1 of AU325 off and on again.

| **Platform**   | **USB**          | **Friendly Name**                                          |
| -------------- | ---------------- | ---------------------------------------------------------- |
| AU325          | 1, 2, 3, 4, 5, 6 | "USB\:A", "USB\:B", "USB\:C", "USB\:D", "USB\:E", "USB\:F" |
| AU335          | Type-C           | "USB\:A"                                                   |
| XD1034, XT1144 | Type-C, Type-A   | "USB\:A", "USB\:B"                                         |

**powerCycleAllPorts()**

```javascript
Promise<void> powerCycleAllPorts()
```

Call `usbPowerControl.powerCycleAllPorts()` to turn the power off and on for all USB ports and power cycle all plugged in devices.

**portPowerOn()**

```javascript
Promise<void> portPowerOn(String friendly_name)
```

Allows you to power on the specified port. 

- `friendly_name` <font color="#6554c0">string</font>: The friendly name of the specific USB port. Please refer to the table above to map friendly names on supported platforms.

**portPowerOff()**

```javascript
Promise<void> portPowerOff(String friendly_name)
```

Allows you to power off the specified port. 

- `friendly_name` <font color="#6554c0">string</font>: The friendly name of the specific USB port.  Please refer to the table above to map friendly names on supported platforms.

## Example

This example power cycles USB\:A and USB\:B ports:

```javascript
const UsbPowerControlClass = require("@brightsign/usbpowercontrol");
const usbPowerControl = new UsbPowerControlClass();

let promise = usbPowerControl.portPowerOff("USB:A");
promise.then(function(){
        console.log("A is turned off");
        return usbPowerControl.portPowerOff("USB:B");
}).then(function(){
        console.log("B is turned off");
        return usbPowerControl.portPowerOn("USB:A");
}).then(function(){
        console.log("A is back on");
        return usbPowerControl.portPowerOn("USB:B");
}).then(function(){
        console.log("B is back on" );
}).catch(function(err){
        console.log("error");
});
```


[title] pointercalibration
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The pointercalibration object allows you to calibrate a touchscreen connected to the player.

**pointercalibration IDL**

```javascript
interface PointerCalibration {
    Promise<void> startCalibration();
    Promise<int> getCalibrationStatus();
    Promise<void> setCalibrationRanges(int XMin, int XMax, int YMin, int YMax);
    Promise<bool> clearStoredCalibration();
    Promise<bool> isCalibrated();

    Promise<String> getDiagnosticInfoHTML(bool deviceInfo = true, bool events = true);
    Promise<void> startEventLogging();
    Promise<void> stopEventLogging();
};
```

## Object Creation

To create a *pointcalibration* object, first load the `brightsign/pointercalibration`  module using the `require()` method. Then create an instance of the *pointcalibration* class.

```javascript
var pointerCalibrationClass = require("@brightsign/pointercalibration");
var pointerCalibration = new pointerCalibrationClass();
```

## PointerCalibration

**startCalibration()**

```javascript
Promise<void> startCalibration()
```

Begins touchscreen calibration. This method may fail if no suitable devices are present.

**getCalibrationStatus()**

```javascript
Promise<int> getCalibrationStatus()
```

Returns the current touchscreen calibration status as an integer. This method may fail if no suitable devices are present. The following are possible return values:

- 0: Calibrating the top-left point
- 1: Calibrating the top-right point
- 2: Calibrating the bottom-right point
- 100: Calibration complete

**setCalibrationRanges()**

```javascript
Promise<void> setCalibrationRanges(int XMin, int XMax, int YMin, int YMax)
```

Overrides the screen range values provided by the touchscreen. This method is useful when the entirety of the video output is not being displayed on the touch surface. Practical use of this method usually requires a custom calibration script, appropriate images, and a calibration setting matched to a particular setup.

**clearStoredCalibration()**

```javascript
Promise<bool> clearStoredCalibration()
```

Clears the stored calibration setting for a touch screen. This method may fail if no suitable devices are present. 

**isCalibrated()**

```javascript
Promise<bool> isCalibrated()
```

Returns `true` if calbration data is present in system software.

**getDiagnosticInfoHTML()**

```javascript
Promise<DOMString> getDiagnosticInfoHTML(bool deviceInfo, bool events)
```

Returns touch-screen diagnostics. If `deviceInfo` is `true`, this method will return hardware and kernel-configuration information; if `events` is `true`, this method will return a log of events (the event log is then deleted up to that point).

**startEventLogging()**

```javascript
Promise<void> startEventLogging()
```

Begins logging for touchscreen events.

**stopEventLogging()**

```javascript
Promise<void> stopEventLogging()
```

Stops logging for touchscreen events.

## Example

```javascript
const pointerClass = require("@brightsign/pointer");
var pointer = new pointerClass();
const pointerCalibClass = require("@brightsign/pointercalibration");
var pointerCalib = new pointerCalibClass();
var bsMessage = new BSMessagePort();
var present = {
    mouse: undefined,
    TouchScreen: undefined
}

function runThis() {
    pointerCalib.startEventLogging().then(() => {
        console.log("Started Event Logger.");
        bsMessage.PostBSMessage({
            startLogger: "Success"
        });
    }).catch((err) => {
        console.log("ERROR: " + err);
        bsMessage.PostBSMessage({
            startLogger: "Failed"
        });
    });
    function eventInfo() {
        pointerCalib.getDiagnosticInfoHTML(false, true).then((val) => {
            console.log("----------------------------Events Info-----------------------------")
            console.log(val);
        }).catch((err) => {
            console.log("ERROR: " + err);
        });
    }

    function checkPeripherals() {
        pointer.isMousePresent().then((val) => {
            console.log("Checking to see if a mouse if present.");
            present.Mouse = val;
            if (val === false) {
                console.log("No mouse attached.");
                console.log("value: " + val);
                bsMessage.PostBSMessage({
                    mouse: "Success"
                });
            } else if (val === true) {
                console.log("Mouse Detected.");
                console.log("value: " + val);
                bsMessage.PostBSMessage({
                    mouse: "Success"
                });
            } else {
                console.log("Recieved unexpected return value.");
                console.log("value: " + val);
                bsMessage.PostBSMessage({
                    mouse: "Failed"
                });
            }
        }).catch((err) => {
            console.log("ERROR: " + err);
            bsMessage.PostBSMessage({
                mouse: "Failed"
            });
        });
        pointer.isMultiTouchPresent().then((val) => {
            present.TouchScreen = val;
            if (val === true) {
                console.log("TouchScreen found.");
                console.log(val);
                bsMessage.PostBSMessage({
                    touch: "Success"
                });
            } else {
                console.log("TouchScreen not found.");
                console.log(val);
                bsMessage.PostBSMessage({
                    touch: "Success"
                });
            }
        }).catch((err) => {
            console.log("ERROR: " + err);
            console.log("isMultiTouchPresent failed.");
            bsMessage.PostBSMessage({
                touch: "Failed"
            });
        });
    }

    function Calibrate() {
        pointerCalib.setCalibrationRanges(0, 1920, 0, 1080).then((val) => {
            console.log("Range has been set.");
            bsMessage.PostBSMessage({
                CalibRange: "Success"
            });
        }).catch((err) => {
            console.log("ERROR: " + err);
            console.log("SetCalibrationRanges Failed.");
            bsMessage.PostBSMessage({
                CalibRange: "Failed"
            });
        });
        pointerCalib.startCalibration().then((value) => {
            console.log("Starting Calibration:");
            bsMessage.PostBSMessage({
                Calib: "Success"
            });
            pointerCalib.getCalibrationStatus().then((val) => {
                console.log("Calibration Status: " + val);
                bsMessage.PostBSMessage({
                    CalibStat: "Success"
                });
            }).catch((err) => {
                console.log("ERROR: " + err);
                console.log("getCalibrationStatus Failed.");
                bsMessage.PostBSMessage({
                    CalibStat: "Failed"
                });
            });
        }).catch((err) => {
            console.log("ERROR: " + err);
            console.log("startCalibration Failed.");
            bsMessage.PostBSMessage({
                Calib: "Failed"
            });
        });
    }

    function CheckandClear() {
        pointerCalib.isCalibrated().then((value) => {
            console.log("Checking for calibration.");
            if (value === true) {
                console.log("Calibrated: " + value);
                bsMessage.PostBSMessage({
                    isCalib: "Success"
                });
                pointerCalib.clearStoredCalibration().then((val) => {
                    console.log("Attempting to clear calibration.");
                    if (value === true) {
                        console.log("Calibration Cleared: " + val);
                        bsMessage.PostBSMessage({
                            clearCalib: "Success"
                        });
                    } else {
                        console.log("Calibration Cleared: " + val);
                        bsMessage.PostBSMessage({
                            clearCallib: "Success"
                        });
                    }
                }).catch((err) => {
                    console.log("ERROR: " + err);
                    console.log("Failed to clear calibration.");
                    bsMessage.PostBSMessage({
                        clearCalib: "Failed"
                    });
                });
            } else {
                console.log("Calibrated: " + value);
                bsMessage.PostBSMessage({
                    isCalib: "Success"
                });
            }
        }).catch((err) => {
            console.log("ERROR: " + err);
            console.log("Calibration Check Failed.");
            bsMessage.PostBSMessage({
                isCalib: "Failed"
            });
        });
    }

    function diagInfHTML() {
        pointerCalib.getDiagnosticInfoHTML(true, true).then((value) => {
            console.log("Success in getting diagnostics info. Printing below.");
            console.log("Info: " + value);
            bsMessage.PostBSMessage({
                getDiagInf: "Success"
            });
        }).catch((err) => {
            console.log("ERROR: " + err);
            console.log("Failed to get diagnostics information.");
            bsMessage.PostBSMessage({
                getDiagInf: "Failed"
            });
        });
    }

    bsMessage.PostBSMessage({
        BSMessagePort: "CREATED"
    });
    setTimeout(checkPeripherals, 1000);
    setTimeout(() => {
        if (present.TouchScreen === true) {
            setTimeout(Calibrate, 4000);
            setTimeout(CheckandClear, 8000);
        } else {
            console.log("TouchScreen Not Found. Calibration Tests Skipped.");
            console.log("TouchScreen Value: " + present.TouchScreen);
            console.log("Mouse Value: " + present.Mouse);
            bsMessage.PostBSMessage({
                CalibTest: "Skipped"
            });
        }
    }, 3000);
    setTimeout(diagInfHTML, 10000);
    setTimeout(eventInfo, 11500);
    setTimeout(() => {
        console.log("Ending Test.");
        pointerCalib.stopEventLogging().then(() => {
            console.log("Stopped Event Logger.");
            bsMessage.PostBSMessage({
                stopLogger: "Success"
            });
        }).catch((err) => {
            console.log("ERROR STOPPING EVENT LOGGER: " + err);
            bsMessage.PostBSMessage({
                stopLogger: "Failed"
            });
        });
    }, 12000);
    setTimeout(() => {
        bsMessage.PostBSMessage({
            BSMessagePort: "COMPLETE"
        });
    }, 16000);
}
```


[title] keystore
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *keystore&#xA0;*&#x6F;bject allows you to register client certificates with the player.

While CA packages (added using the `AddCAPackage()` method) are persistent, individual certificates (added using the `AddCACertificate()` and `AddClientCertificate()`  methods) are not; individual certificates must be registered with the certificate database after each reboot.

:::hint{type="warning"}
You can’t access certificates that were added to the keystore using JavaScript or BrightScript. Developers wanting to use a certificate with their Java application will have to access it directly from their application.
:::

**keystore IDL**

```javascript
interface KeyStore {
    Promise<void> addCaCertificate(String filename);
    Promise<void> addCaPackage(String filename);
    Promise<void> removeCaPackage(String filename);
    Promise<PackageList> getCaPackagesInstalled();
    Promise<void> addClientCertificate(ClientCertificateObject object);
};

interface ClientCertificateObject {
    attribute String certificateFile;
    attribute String passphrase;
    attribute String obfuscatedPassphrase;
};

```

## Object Creation

To create a *keystore* object, first load the brightsign/keystore module using the require() method. Then create an instance of the *keystore* class.

```javascript
var keystoreClass = require("@brightsign/keystore");
var keystore = new keystoreClass();
```

## KeyStore

Use this interface to add certificates to the certificate database.

**addCaCertificate()**

```javascript
Promise<> addCaCertificate(DOMString filename)
```

Registers the specified CA certificate with the certificate database. Client certificates can be either self-signed or signed using a 3rd-party certificate issuer (Versign, DigiCert, etc.). 

:::hint{type="warning"}
Chromium version 69 or later will refuse SHA-1 certificates. See [this page](https://www.chromium.org/Home/chromium-security/education/tls/sha-1/) for more information.
:::

**addCaPackage()**

```javascript
Promise<> addCaPackage(DOMString filename)
```

Adds the specified CA package file to the certificate database. The package name resides in the file and does not need to be the same as the filename. See the [roKeyStore](docId\:GhSZNW9eS8TEMURQXq-DU)*&#xA0;*&#x70;age for more information on generating CA packages.

:::hint{type="info"}
Attempting to modify a CA package file that has been added to the database will invalidate it. If a package is invalidated, it will need to be removed from the database (using the `removeCaPackage()` method) and added again.
:::

**removeCaPackage()**

```javascript
Promise<PackageList> getCaPackagesInstalled()
```

Removes the specified CA package from the certificate database. Use the `getCaPackagesInstalled()` method to retrieve a list of package names in the database.

**getCaPackagesInstalled()**

```javascript
Promise<PackageList> getCaPackagesInstalled()
```

Returns a list of names of CA packages contained in the certificate database.

**addClientCertificate()**

```javascript
Promise<> addClientCertificate(ClientCertificateObject object)
```

Registers a .p12 client certificate with the certificate database. 

## ClientCertificateObject

This interface represents a .p12 certificate file.

- `certificateFile` <font color="#6554c0">String</font>: The file name and path of the .p12 client certificate
- `passphrase` <font color="#6554c0">String</font>:  A passphrase for the .p12 client certificate
- `obfuscatedPassphrase` <font color="#6554c0">String</font>: An obfuscated passphrase for the .p12 client certificate

:::hint{type="danger"}
Only one of `obfuscatedPassphrase` and `passphrase` is required, and `obfuscatedPassphrase` takes priority if both are present. We recommend using `obfuscated_passphrase` in production environments, while `passphrase` should be used for testing purposes only. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.
:::

## Example

```javascript
ksf = require('@brightsign/keystore');
k = new ksf()
k.addCaPackage("/storage/sd/example.bsca").then(() => console.log('ok'), () => console.log('failed'))
k.getCaPackagesInstalled().then((pkgs) => console.log(pkgs))
k.removeCaPackage('example').then(() => console.log('ok'), () => console.log('failed'))
```


[title] Token Entity (v3)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 3.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v3)/

This object is used to register the device with a BSN.Cloud network and contains the following required properties:

- `token` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: A player registration token returned by the server. This token allows devices to provision themselves for a BSN.Cloud network. Note that this is not a user token.
- `validFrom` <font color="#704ae0">dates</font> <font color="#01a0af">required</font>: The start of the validity date for the token. The date/time is formatted as `yyyy-mm-ddThh:mm:ss.sssZ`.
- `validTo`  <font color="#704ae0">dates</font> <font color="#01a0af">required</font>: The end of the validity date for the token. The date/time is formatted as `yyyy-mm-ddThh:mm:ss.sssZ`.

This optional property can also be used:

- `scope` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The scope of the player registration token. The default is "cert".

### Sample Request

To get the player registration token:

```curl
curl --location 
	 --request POST 'https://api.bsn.cloud/2020/10/REST/provisioning/setups/tokens/' \
	 --header 'Accept: application/json' \
	 --header 'Accept-Encoding: gzip,deflate' \
	 --header 'Content-Type: application/x-www-form-urlencoded' \
	 --header 'Authorization: Bearer 5BfFL3npQscN4RQUeO3V1EI8QKQzToBoVFkLAGg3qmcvsDSgFIt1OIc2P' \
	 --data-urlencode 'grant_type=user_access_token' \
	 --data-urlencode 'user_access_token=<redacted>' \
	 --data-urlencode 'client_id=<redacted>' \
	 --data-urlencode 'client_secret=<redacted>'
```

See [this page](docId:0QHiBo6rAs8zwYJybEH0R) for information about how to get a user access token.

### Sample Response

```json
{
    "token": "cW7OQJPG21d3ao1wDzpUXTKMn2dyog7AvgD1qHm0XRNEWfw6kiqhZnWBNG7XJWt74o2nCZiIuedVOE894pz0OdoNZlXjOqgUPs6yrz7HMPPLBEOzZpvluN5shAXjJeES",
    "scope": "cert",
    "validFrom": "2024-03-05T19:50:25Z",
    "validTo": "2026-03-05T19:50:25Z"
}
```


[title] B-Deploy Setup Endpoints (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/

These endpoints allow users to manage Setup packages used to provision BrightSign players over the internet.

Base URL for these endpoints:  ***https\://provision.bsn.cloud/rest-setup/v2/setup/***

***

# GET

Retrieves B-Deploy Setup packages from the specified network

**URL Parameters**

- `username` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The login of the person who created the Setup package&#x20;
- `NetworkName` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The name of the network that the Setup package belongs to&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

- `username` is set to `JaneDoe@brightsign.biz`
- `NetworkName` is set to `JaneDoeNetwork`

```text
GET /rest-setup/v2/setup/?username=JaneDoe%40brightsign.biz&NetworkName=JaneDoeNetwork HTTP/1.1
Host: provision.bsn.cloud
Authorization: {{Bearer Token}}
Accept: application/json
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: Returns a list of [Setup Package Info Entity (v2)](docId:6rciEq-KaTuVWxGI_Izvt)&#x20;

**Success Response** **Example**

```json
{
  "error": null,
  "result": [
    {
      "_id": "1a2b3c4d5e6f7a8b9c0d1e2f",
      "username": "JaneDoe@brightsign.biz",
      "client": "bacon",
      "packageName": "My Setup Package",
      "setupType": "bsn",
      "networkName": "JaneDoeNetwork",
      "deviceName": "My Player",
      "deviceDescription": "",
      "bsnGroupName": "Default",
      "setupJson": "{\"version\":\"2.0.0\",\"_id\":\"1a2b3c4d5e6f7a8b9c0d1e2f\",\"bDeploy\":{\"username\":\"JaneDoe@brightsign.biz\",\"networkName\":\"JaneDoeNetwork\",\"client\":\"bacon\",\"packageName\":\"NewTimezone\"},\"firmwareUpdatesByFamily\":{\"Impala\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"impala-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"impala-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"impala-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"impala-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/impala-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/impala-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/impala-8.0.146-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.0.146\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524434,\"productionReleaseSHA1\":\"4dcf3e2dae41d05e49f3bc6a8ed49925d1cbb75a\",\"betaReleaseSHA1\":\"4dcf3e2dae41d05e49f3bc6a8ed49925d1cbb75a\",\"compatibleReleaseSHA1\":\"789cf557fbb0a5f70ecc103e5d071186b57eb38f\",\"productionReleaseFileLength\":144788480,\"betaReleaseFileLength\":144788480,\"compatibleReleaseFileLength\":137811964,\"existingFWContentID\":\"\"},\"Pantera\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"pantera-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"pantera-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"pantera-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"pantera-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pantera-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pantera-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pantera-8.0.146-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.0.146\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524434,\"productionReleaseSHA1\":\"ee9ef5265c5ff85c77e4a87f264f8cf1112225ed\",\"betaReleaseSHA1\":\"ee9ef5265c5ff85c77e4a87f264f8cf1112225ed\",\"compatibleReleaseSHA1\":\"58196ad8707b6e62185f1aba6d124ed1adfa7f67\",\"productionReleaseFileLength\":144337538,\"betaReleaseFileLength\":144337538,\"compatibleReleaseFileLength\":137509058,\"existingFWContentID\":\"\"},\"Tiger\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"tiger-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"tiger-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"tiger-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"tiger-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/tiger-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/tiger-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/tiger-8.0.146-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.0.146\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524434,\"productionReleaseSHA1\":\"45df4348e6ce1039fa54f8a3fa3bf0e6e95dacca\",\"betaReleaseSHA1\":\"45df4348e6ce1039fa54f8a3fa3bf0e6e95dacca\",\"compatibleReleaseSHA1\":\"f02173d13f800d8d264d761226f783baa27b44b2\",\"productionReleaseFileLength\":156481838,\"betaReleaseFileLength\":156481838,\"compatibleReleaseFileLength\":147734484,\"existingFWContentID\":\"\"},\"Pagani\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"pagani-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"pagani-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"pagani-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"pagani-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pagani-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pagani-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pagani-8.0.146-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.0.146\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524434,\"productionReleaseSHA1\":\"8dd2ede70c9095392fb30e031b9376922af98528\",\"betaReleaseSHA1\":\"8dd2ede70c9095392fb30e031b9376922af98528\",\"compatibleReleaseSHA1\":\"9af7416c055f9fe45d3b492ad00a7cb8b0e5f7ff\",\"productionReleaseFileLength\":190350854,\"betaReleaseFileLength\":190350854,\"compatibleReleaseFileLength\":167649562,\"existingFWContentID\":\"\"},\"Malibu\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"malibu-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"malibu-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"malibu-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"malibu-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/malibu-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/malibu-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/malibu-8.0.146-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.0.146\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524434,\"productionReleaseSHA1\":\"5358940fe1aa6742aa8a9e0f82c1920991476867\",\"betaReleaseSHA1\":\"5358940fe1aa6742aa8a9e0f82c1920991476867\",\"compatibleReleaseSHA1\":\"b897e81655879cc0cf7a73fad79aa615cb17da31\",\"productionReleaseFileLength\":191643784,\"betaReleaseFileLength\":191643784,\"compatibleReleaseFileLength\":178140054,\"existingFWContentID\":\"\"},\"Sebring\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"sebring-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"sebring-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"sebring-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"sebring-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/sebring-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/sebring-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/sebring-8.2.17.3-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.2.17.3\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524817,\"productionReleaseSHA1\":\"8c14e14c01251e6dae32bba286b3bf79ec34cffa\",\"betaReleaseSHA1\":\"8c14e14c01251e6dae32bba286b3bf79ec34cffa\",\"compatibleReleaseSHA1\":\"399b5dd4203a8283f8e357a41e0168c33eb2418a\",\"productionReleaseFileLength\":81108806,\"betaReleaseFileLength\":81108806,\"compatibleReleaseFileLength\":74604516,\"existingFWContentID\":\"\"},\"Raptor\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"raptor-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"raptor-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"raptor-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"raptor-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/raptor-9.0.145.1-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/raptor-9.0.145.1-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/raptor-9.0.22.3-update.bsfw\",\"productionVersion\":\"9.0.145.1\",\"betaVersion\":\"9.0.145.1\",\"compatibleVersion\":\"9.0.22.3\",\"productionVersionNumber\":589969,\"betaVersionNumber\":589969,\"compatibleVersionNumber\":589846,\"productionReleaseSHA1\":\"06ffdc99949dddf1645ad738ce4508597f0e8db0\",\"betaReleaseSHA1\":\"06ffdc99949dddf1645ad738ce4508597f0e8db0\",\"compatibleReleaseSHA1\":\"245ef90811a7bcd2e1ca862b451c4d8abfaa5526\",\"productionReleaseFileLength\":443631114,\"betaReleaseFileLength\":443631114,\"compatibleReleaseFileLength\":343723720,\"existingFWContentID\":\"\"},\"Cobra\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"cobra-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"cobra-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"cobra-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"cobra-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.145.1-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.145.1-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.75-update.bsfw\",\"productionVersion\":\"9.0.145.1\",\"betaVersion\":\"9.0.145.1\",\"compatibleVersion\":\"9.0.75\",\"productionVersionNumber\":589969,\"betaVersionNumber\":589969,\"compatibleVersionNumber\":589899,\"productionReleaseSHA1\":\"7d53871f30852a7851b5fa4a88f4640b4d18aa40\",\"betaReleaseSHA1\":\"7d53871f30852a7851b5fa4a88f4640b4d18aa40\",\"compatibleReleaseSHA1\":\"a213680fa5d8fb9437bee43888c37b9fd932f62d\",\"productionReleaseFileLength\":361576318,\"betaReleaseFileLength\":361576318,\"compatibleReleaseFileLength\":259763696,\"existingFWContentID\":\"\"}},\"firmwareUpdateType\":\"standard\",\"setupType\":\"bsn\",\"bsnDeviceRegistrationTokenEntity\":{\"token\":\"QBzIU4fdYEvWZ8R7EdwK3ISDRH72sDUi6K7FEl2cmNA5pZBxBNDn12qgWF78zGGMMOBoDTp898SsdTCSZy469ZKxwBoXxtarHTl71F3Y6ImfGXkyHnsxIwNCZYfctXoD\",\"scope\":\"cert\",\"validFrom\":\"2024-05-08T18:42:18.000Z\",\"validTo\":\"2026-05-08T18:42:18.000Z\"},\"enableSerialDebugging\":false,\"enableSystemLogDebugging\":false,\"remoteDwsEnabled\":true,\"dwsEnabled\":true,\"dwsPassword\":\"\",\"dwsPasswordPreviousSavedTimeStamp\":1714573782270,\"lwsEnabled\":true,\"lwsConfig\":\"status\",\"lwsUserName\":\"\",\"lwsPassword\":\"\",\"lwsEnableUpdateNotifications\":true,\"bsnCloudEnabled\":true,\"deviceName\":\"Series 5\",\"deviceDescription\":\"\",\"unitNamingMethod\":\"appendUnitIDToUnitName\",\"timeZone\":\"EST\",\"bsnGroupName\":\"Default\",\"timeBetweenNetConnects\":300,\"sfnWebFolderUrl\":\"\",\"sfnUserName\":\"\",\"sfnPassword\":\"\",\"sfnEnableBasicAuthentication\":false,\"playbackLoggingEnabled\":false,\"eventLoggingEnabled\":false,\"diagnosticLoggingEnabled\":false,\"stateLoggingEnabled\":false,\"variableLoggingEnabled\":false,\"uploadLogFilesAtBoot\":false,\"uploadLogFilesAtSpecificTime\":false,\"uploadLogFilesTime\":0,\"logHandlerUrl\":\"\",\"enableRemoteSnapshot\":false,\"remoteSnapshotInterval\":15,\"remoteSnapshotMaxImages\":5,\"remoteSnapshotJpegQualityLevel\":50,\"remoteSnapshotScreenOrientation\":\"Landscape\",\"remoteSnapshotHandlerUrl\":\"\",\"idleScreenColor\":{\"r\":112,\"g\":40,\"b\":150,\"a\":1},\"networkDiagnosticsEnabled\":false,\"testEthernetEnabled\":false,\"testWirelessEnabled\":false,\"testInternetEnabled\":false,\"useCustomSplashScreen\":false,\"BrightWallName\":\"\",\"BrightWallScreenNumber\":\"\",\"contentDownloadsRestricted\":false,\"contentDownloadRangeStart\":0,\"contentDownloadRangeEnd\":0,\"usbUpdatePassword\":\"\",\"inheritNetworkProperties\":true,\"internalCaArtifacts\":[],\"network\":{\"timeServers\":[\"http://time.brightsignnetwork.com\"],\"hostname\":null,\"dns\":null,\"proxyServer\":null,\"proxyBypass\":null,\"interfaces\":[{\"id\":\"wired_eth0\",\"name\":\"eth0\",\"type\":\"Ethernet\",\"proto\":\"DHCPv4\",\"ip\":[],\"gateway\":null,\"dns\":[],\"rateLimitDuringInitialDownloads\":0,\"rateLimitInsideContentDownloadWindow\":0,\"rateLimitOutsideContentDownloadWindow\":null,\"contentDownloadEnabled\":true,\"textFeedsDownloadEnabled\":true,\"mediaFeedsDownloadEnabled\":true,\"healthReportingEnabled\":true,\"logsUploadEnabled\":true,\"wpaSettings\":{\"enableWPAEnterpriseAuthentication\":false,\"wpaEnterpriseVariant\":\"WPAEnterpriseEapTls\",\"eapCertificateType\":\"WPAEapTlsPKCS\",\"eapCertificateFile\":null,\"eapCertificatePassphrase\":\"\",\"eapPemOrDerKeyFile\":null,\"peapUsername\":\"\",\"peapPassphrase\":\"\",\"caCertificateFile\":null}}]}}",
      "version": "2.0.0",
      "createdAt": "2024-03-28T22:22:36.900Z",
      "updatedAt": "2024-05-08T18:42:18.692Z",
      "__v": 0
    }
  ]
}
```

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid.

<font color="#9a0808">401</font>: The access token is invalid or not specified.

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error.

# GET /setup/:\_id/

Retrieves the B-Deploy Setup package that has the specified ID.

**URL Parameters**

- `_id` <font color="#704ae0">string </font><font color="#01a0af">required</font>: The unique identifier of the Setup package to retrieve&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

- `_id` is set to `1a2b3c4d5e6f7a8b9c0d1e2f`

```text
GET /rest-setup/v2/setup/1a2b3c4d5e6f7a8b9c0d1e2f/ HTTP/1.1
Host: provision.bsn.cloud
Authorization: {{Bearer Token}}
Accept: application/json
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Contains [B-Deploy Setup Entities  (v2)](docId:7TR-MW8sHf10WKt6FsmCq)&#x20;

**Response Example**

:::ExpandableHeading
Expand

```json
{
   "error": null,
   "result": [   {
      "uiDeviceSetupErrors": [],
      "version": "2.0.0",
      "bDeploy":       {
         "username": "JaneDoe@brightsign.biz",
         "networkName": "JaneDoeNetwork",
         "client": "bacon",
         "packageName": "My Setup Package"
      },
      "firmwareUpdatesByFamily":       {
         "Impala":          {
            "firmwareUpdateSource": null,
            "firmwareUpdateSourceFilePath": "",
            "firmwareUpdateSourceUrl": "",
            "firmwareUpdateStandardTargetFileName": "impala-update.bsfw",
            "firmwareUpdateDifferentTargetFileName": "impala-update_different.bsfw",
            "firmwareUpdateNewerTargetFileName": "impala-update_newer.bsfw",
            "firmwareUpdateSaveTargetFileName": "impala-update_save.bsfw",
            "firmwareUpdateVersion": "",
            "productionReleaseURL": "https://bsncloud.s3.amazonaws.com/public/impala-8.5.47-update.bsfw",
            "betaReleaseURL": "https://bsncloud.s3.amazonaws.com/public/impala-8.5.47-update.bsfw",
            "compatibleReleaseURL": "https://bsncloud.s3.amazonaws.com/public/impala-8.0.146-update.bsfw",
            "productionVersion": "8.5.47",
            "betaVersion": "8.5.47",
            "compatibleVersion": "8.0.146",
            "productionVersionNumber": 525615,
            "betaVersionNumber": 525615,
            "compatibleVersionNumber": 524434,
            "productionReleaseSHA1": "4dcf3e2dae41d05e49f3bc6a8ed49925d1cbb75a",
            "betaReleaseSHA1": "4dcf3e2dae41d05e49f3bc6a8ed49925d1cbb75a",
            "compatibleReleaseSHA1": "789cf557fbb0a5f70ecc103e5d071186b57eb38f",
            "productionReleaseFileLength": 144788480,
            "betaReleaseFileLength": 144788480,
            "compatibleReleaseFileLength": 137811964,
            "existingFWContentID": ""
         },
         "Pantera":          {
            "firmwareUpdateSource": null,
            "firmwareUpdateSourceFilePath": "",
            "firmwareUpdateSourceUrl": "",
            "firmwareUpdateStandardTargetFileName": "pantera-update.bsfw",
            "firmwareUpdateDifferentTargetFileName": "pantera-update_different.bsfw",
            "firmwareUpdateNewerTargetFileName": "pantera-update_newer.bsfw",
            "firmwareUpdateSaveTargetFileName": "pantera-update_save.bsfw",
            "firmwareUpdateVersion": "",
            "productionReleaseURL": "https://bsncloud.s3.amazonaws.com/public/pantera-8.5.47-update.bsfw",
            "betaReleaseURL": "https://bsncloud.s3.amazonaws.com/public/pantera-8.5.47-update.bsfw",
            "compatibleReleaseURL": "https://bsncloud.s3.amazonaws.com/public/pantera-8.0.146-update.bsfw",
            "productionVersion": "8.5.47",
            "betaVersion": "8.5.47",
            "compatibleVersion": "8.0.146",
            "productionVersionNumber": 525615,
            "betaVersionNumber": 525615,
            "compatibleVersionNumber": 524434,
            "productionReleaseSHA1": "ee9ef5265c5ff85c77e4a87f264f8cf1112225ed",
            "betaReleaseSHA1": "ee9ef5265c5ff85c77e4a87f264f8cf1112225ed",
            "compatibleReleaseSHA1": "58196ad8707b6e62185f1aba6d124ed1adfa7f67",
            "productionReleaseFileLength": 144337538,
            "betaReleaseFileLength": 144337538,
            "compatibleReleaseFileLength": 137509058,
            "existingFWContentID": ""
         },
         "Tiger":          {
            "firmwareUpdateSource": null,
            "firmwareUpdateSourceFilePath": "",
            "firmwareUpdateSourceUrl": "",
            "firmwareUpdateStandardTargetFileName": "tiger-update.bsfw",
            "firmwareUpdateDifferentTargetFileName": "tiger-update_different.bsfw",
            "firmwareUpdateNewerTargetFileName": "tiger-update_newer.bsfw",
            "firmwareUpdateSaveTargetFileName": "tiger-update_save.bsfw",
            "firmwareUpdateVersion": "",
            "productionReleaseURL": "https://bsncloud.s3.amazonaws.com/public/tiger-8.5.47-update.bsfw",
            "betaReleaseURL": "https://bsncloud.s3.amazonaws.com/public/tiger-8.5.47-update.bsfw",
            "compatibleReleaseURL": "https://bsncloud.s3.amazonaws.com/public/tiger-8.0.146-update.bsfw",
            "productionVersion": "8.5.47",
            "betaVersion": "8.5.47",
            "compatibleVersion": "8.0.146",
            "productionVersionNumber": 525615,
            "betaVersionNumber": 525615,
            "compatibleVersionNumber": 524434,
            "productionReleaseSHA1": "45df4348e6ce1039fa54f8a3fa3bf0e6e95dacca",
            "betaReleaseSHA1": "45df4348e6ce1039fa54f8a3fa3bf0e6e95dacca",
            "compatibleReleaseSHA1": "f02173d13f800d8d264d761226f783baa27b44b2",
            "productionReleaseFileLength": 156481838,
            "betaReleaseFileLength": 156481838,
            "compatibleReleaseFileLength": 147734484,
            "existingFWContentID": ""
         },
         "Pagani":          {
            "firmwareUpdateSource": null,
            "firmwareUpdateSourceFilePath": "",
            "firmwareUpdateSourceUrl": "",
            "firmwareUpdateStandardTargetFileName": "pagani-update.bsfw",
            "firmwareUpdateDifferentTargetFileName": "pagani-update_different.bsfw",
            "firmwareUpdateNewerTargetFileName": "pagani-update_newer.bsfw",
            "firmwareUpdateSaveTargetFileName": "pagani-update_save.bsfw",
            "firmwareUpdateVersion": "",
            "productionReleaseURL": "https://bsncloud.s3.amazonaws.com/public/pagani-8.5.47-update.bsfw",
            "betaReleaseURL": "https://bsncloud.s3.amazonaws.com/public/pagani-8.5.47-update.bsfw",
            "compatibleReleaseURL": "https://bsncloud.s3.amazonaws.com/public/pagani-8.0.146-update.bsfw",
            "productionVersion": "8.5.47",
            "betaVersion": "8.5.47",
            "compatibleVersion": "8.0.146",
            "productionVersionNumber": 525615,
            "betaVersionNumber": 525615,
            "compatibleVersionNumber": 524434,
            "productionReleaseSHA1": "8dd2ede70c9095392fb30e031b9376922af98528",
            "betaReleaseSHA1": "8dd2ede70c9095392fb30e031b9376922af98528",
            "compatibleReleaseSHA1": "9af7416c055f9fe45d3b492ad00a7cb8b0e5f7ff",
            "productionReleaseFileLength": 190350854,
            "betaReleaseFileLength": 190350854,
            "compatibleReleaseFileLength": 167649562,
            "existingFWContentID": ""
         },
         "Malibu":          {
            "firmwareUpdateSource": null,
            "firmwareUpdateSourceFilePath": "",
            "firmwareUpdateSourceUrl": "",
            "firmwareUpdateStandardTargetFileName": "malibu-update.bsfw",
            "firmwareUpdateDifferentTargetFileName": "malibu-update_different.bsfw",
            "firmwareUpdateNewerTargetFileName": "malibu-update_newer.bsfw",
            "firmwareUpdateSaveTargetFileName": "malibu-update_save.bsfw",
            "firmwareUpdateVersion": "",
            "productionReleaseURL": "https://bsncloud.s3.amazonaws.com/public/malibu-8.5.47-update.bsfw",
            "betaReleaseURL": "https://bsncloud.s3.amazonaws.com/public/malibu-8.5.47-update.bsfw",
            "compatibleReleaseURL": "https://bsncloud.s3.amazonaws.com/public/malibu-8.0.146-update.bsfw",
            "productionVersion": "8.5.47",
            "betaVersion": "8.5.47",
            "compatibleVersion": "8.0.146",
            "productionVersionNumber": 525615,
            "betaVersionNumber": 525615,
            "compatibleVersionNumber": 524434,
            "productionReleaseSHA1": "5358940fe1aa6742aa8a9e0f82c1920991476867",
            "betaReleaseSHA1": "5358940fe1aa6742aa8a9e0f82c1920991476867",
            "compatibleReleaseSHA1": "b897e81655879cc0cf7a73fad79aa615cb17da31",
            "productionReleaseFileLength": 191643784,
            "betaReleaseFileLength": 191643784,
            "compatibleReleaseFileLength": 178140054,
            "existingFWContentID": ""
         },
         "Sebring":          {
            "firmwareUpdateSource": null,
            "firmwareUpdateSourceFilePath": "",
            "firmwareUpdateSourceUrl": "",
            "firmwareUpdateStandardTargetFileName": "sebring-update.bsfw",
            "firmwareUpdateDifferentTargetFileName": "sebring-update_different.bsfw",
            "firmwareUpdateNewerTargetFileName": "sebring-update_newer.bsfw",
            "firmwareUpdateSaveTargetFileName": "sebring-update_save.bsfw",
            "firmwareUpdateVersion": "",
            "productionReleaseURL": "https://bsncloud.s3.amazonaws.com/public/sebring-8.5.47-update.bsfw",
            "betaReleaseURL": "https://bsncloud.s3.amazonaws.com/public/sebring-8.5.47-update.bsfw",
            "compatibleReleaseURL": "https://bsncloud.s3.amazonaws.com/public/sebring-8.2.17.3-update.bsfw",
            "productionVersion": "8.5.47",
            "betaVersion": "8.5.47",
            "compatibleVersion": "8.2.17.3",
            "productionVersionNumber": 525615,
            "betaVersionNumber": 525615,
            "compatibleVersionNumber": 524817,
            "productionReleaseSHA1": "8c14e14c01251e6dae32bba286b3bf79ec34cffa",
            "betaReleaseSHA1": "8c14e14c01251e6dae32bba286b3bf79ec34cffa",
            "compatibleReleaseSHA1": "399b5dd4203a8283f8e357a41e0168c33eb2418a",
            "productionReleaseFileLength": 81108806,
            "betaReleaseFileLength": 81108806,
            "compatibleReleaseFileLength": 74604516,
            "existingFWContentID": ""
         },
         "Raptor":          {
            "firmwareUpdateSource": null,
            "firmwareUpdateSourceFilePath": "",
            "firmwareUpdateSourceUrl": "",
            "firmwareUpdateStandardTargetFileName": "raptor-update.bsfw",
            "firmwareUpdateDifferentTargetFileName": "raptor-update_different.bsfw",
            "firmwareUpdateNewerTargetFileName": "raptor-update_newer.bsfw",
            "firmwareUpdateSaveTargetFileName": "raptor-update_save.bsfw",
            "firmwareUpdateVersion": "",
            "productionReleaseURL": "https://bsncloud.s3.amazonaws.com/public/raptor-9.0.120-update.bsfw",
            "betaReleaseURL": "https://bsncloud.s3.amazonaws.com/public/raptor-9.0.120-update.bsfw",
            "compatibleReleaseURL": "https://bsncloud.s3.amazonaws.com/public/raptor-9.0.22.3-update.bsfw",
            "productionVersion": "9.0.120",
            "betaVersion": "9.0.120",
            "compatibleVersion": "9.0.22.3",
            "productionVersionNumber": 589944,
            "betaVersionNumber": 589944,
            "compatibleVersionNumber": 589846,
            "productionReleaseSHA1": "0047bebeb8bb1d504832f0bc3c7c3bc166f0c959",
            "betaReleaseSHA1": "0047bebeb8bb1d504832f0bc3c7c3bc166f0c959",
            "compatibleReleaseSHA1": "245ef90811a7bcd2e1ca862b451c4d8abfaa5526",
            "productionReleaseFileLength": 363823386,
            "betaReleaseFileLength": 363823386,
            "compatibleReleaseFileLength": 343723720,
            "existingFWContentID": ""
         },
         "Cobra":          {
            "firmwareUpdateSource": null,
            "firmwareUpdateSourceFilePath": "",
            "firmwareUpdateSourceUrl": "",
            "firmwareUpdateStandardTargetFileName": "cobra-update.bsfw",
            "firmwareUpdateDifferentTargetFileName": "cobra-update_different.bsfw",
            "firmwareUpdateNewerTargetFileName": "cobra-update_newer.bsfw",
            "firmwareUpdateSaveTargetFileName": "cobra-update_save.bsfw",
            "firmwareUpdateVersion": "",
            "productionReleaseURL": "https://bsncloud.s3.amazonaws.com/public/cobra-9.0.120-update.bsfw",
            "betaReleaseURL": "https://bsncloud.s3.amazonaws.com/public/cobra-9.0.120-update.bsfw",
            "compatibleReleaseURL": "https://bsncloud.s3.amazonaws.com/public/cobra-9.0.75-update.bsfw",
            "productionVersion": "9.0.120",
            "betaVersion": "9.0.120",
            "compatibleVersion": "9.0.75",
            "productionVersionNumber": 589944,
            "betaVersionNumber": 589944,
            "compatibleVersionNumber": 589899,
            "productionReleaseSHA1": "606d941cd45a069054cc8a2579eae53fa7d74dc3",
            "betaReleaseSHA1": "606d941cd45a069054cc8a2579eae53fa7d74dc3",
            "compatibleReleaseSHA1": "a213680fa5d8fb9437bee43888c37b9fd932f62d",
            "productionReleaseFileLength": 259911328,
            "betaReleaseFileLength": 259911328,
            "compatibleReleaseFileLength": 259763696,
            "existingFWContentID": ""
         }
      },
      "firmwareUpdateType": "standard",
      "setupType": "bsn",
      "bsnDeviceRegistrationTokenEntity":       {
         "token": "kuemTu0rDHKUJHbgvgkBHKJvbJjgghyfsatf7wsef542VKA1SymZD4Lbz8sgY999KIETcjHB4qviHteRVtHa6K9oRLaNGfnsE5OiSpPTMLlwXE8od2ZpkW2",
         "scope": "cert",
         "validFrom": "2024-03-01T15:38:35.000Z",
         "validTo": "2026-03-01T15:38:35.000Z"
      },
      "enableSerialDebugging": true,
      "enableSystemLogDebugging": true,
      "remoteDwsEnabled": true,
      "dwsEnabled": true,
      "dwsPassword": "§default",
      "dwsPasswordPreviousSavedTimeStamp": 1709307313212,
      "lwsEnabled": true,
      "lwsConfig": "status",
      "lwsUserName": "",
      "lwsPassword": "",
      "lwsEnableUpdateNotifications": true,
      "bsnCloudEnabled": true,
      "deviceName": "My Player",
      "deviceDescription": "",
      "unitNamingMethod": "unitNameOnly",
      "timeZone": "GMT",
      "bsnGroupName": "Default",
      "timeBetweenNetConnects": 300,
      "timeBetweenHeartbeats": 900,
      "sfnWebFolderUrl": "",
      "sfnUserName": "",
      "sfnPassword": "",
      "sfnEnableBasicAuthentication": false,
      "playbackLoggingEnabled": true,
      "eventLoggingEnabled": true,
      "diagnosticLoggingEnabled": true,
      "stateLoggingEnabled": true,
      "variableLoggingEnabled": true,
      "uploadLogFilesAtBoot": true,
      "uploadLogFilesAtSpecificTime": true,
      "uploadLogFilesTime": 0,
      "logHandlerUrl": "",
      "enableRemoteSnapshot": true,
      "remoteSnapshotInterval": 1,
      "remoteSnapshotMaxImages": 10,
      "remoteSnapshotJpegQualityLevel": 80,
      "remoteSnapshotScreenOrientation": "Landscape",
      "remoteSnapshotHandlerUrl": "",
      "idleScreenColor":       {
         "r": 0,
         "g": 0,
         "b": 0,
         "a": 1
      },
      "networkDiagnosticsEnabled": false,
      "testEthernetEnabled": false,
      "testWirelessEnabled": false,
      "testInternetEnabled": false,
      "useCustomSplashScreen": false,
      "BrightWallName": "",
      "BrightWallScreenNumber": "",
      "contentDownloadsRestricted": false,
      "contentDownloadRangeStart": 0,
      "contentDownloadRangeEnd": 0,
      "heartbeatsRestricted": false,
      "heartbeatsRangeStart": 0,
      "heartbeatsRangeEnd": 0,
      "usbUpdatePassword": "",
      "inheritNetworkProperties": true,
      "internalCaArtifacts": [],
      "_id": "1a2b3c4d5e6f7a8b9c0d1e2f"
   }]
}
```
:::

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid.

<font color="#9a0808">401</font>: The access token is invalid or not specified.

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method.

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error.

# POST 

Creates a new B-Deploy Setup package in the current network

**Request Body**

The [Device Setup Entity  (v2)](docId\:B1XzcRu3Ltg9cDZ1yNqB6)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request** **Example**

```text
POST /rest-setup/v2/setup HTTP/1.1
Host: provision.bsn.cloud
Authorization: {{Bearer Token}}
Content-Type: application/json
Content-Length: 10427
Accept: application/json
```

This is the example request body:

:::ExpandableHeading
Expand

```json
{
  "version": "2.0.0",
  "bDeploy": {
    "username": "JaneDoe@gmail.com",
    "networkName": "JaneDoeNetwork",
    "packageName": "FullSetup2"
    },
  "setupType": "bsn",
  "bsnDeviceRegistrationTokenEntity": {
    "token": {{token}},
    "scope": "certs",
    "validFrom": "2024-09-28T19:47:09.577Z",
    "validTo": "2026-09-28T19:47:09.577Z"
    },
  "firmwareUpdateType": "standard",
  "enableSerialDebugging": true,
  "enableSystemLogDebugging": true,
  "dwsEnabled": true,
  "dwsPassword": "",
  "lwsEnabled": true,
  "lwsConfig": "status",
  "lwsUserName": "",
  "lwsPassword": "",
  "lwsEnableUpdateNotifications": true,
  "deviceName": "",
  "deviceDescription": "",
  "unitNamingMethod": "appendUnitIDToUnitName",
  "timeZone": "PST",
  "bsnGroupName": "Default",
  "timeBetweenNetConnects": 300,
  "timeBetweenHeartbeats": 900,
  "sfnWebFolderUrl": "",
  "sfnUserName": "",
  "sfnPassword": "",
  "sfnEnableBasicAuthentication": false,
  "playbackLoggingEnabled": false,
  "eventLoggingEnabled": false,
  "diagnosticLoggingEnabled": false,
  "stateLoggingEnabled": false,
  "variableLoggingEnabled": false,
  "uploadLogFilesAtBoot": false,
  "uploadLogFilesAtSpecificTime": false,
  "uploadLogFilesTime": 0,
  "logHandlerUrl": "",
  "enableRemoteSnapshot": false,
  "remoteSnapshotInterval": 69,
  "remoteSnapshotMaxImages": 69,
  "remoteSnapshotJpegQualityLevel": 100,
  "remoteSnapshotScreenOrientation": "Landscape",
  "remoteSnapshotHandlerUrl": "",
  "useWireless": false,
  "ssid": "",
  "passphrase": "",
  "timeServer": "http://time.brightsignnetwork.com",
  "idleScreenColor": {
    "r": 0,
    "g": 0,
    "b": 0,
    "a": 1
  },
  "contentDataTypeEnabledWired": true,
  "textFeedsDataTypeEnabledWired": true,
  "healthDataTypeEnabledWired": true,
  "mediaFeedsDataTypeEnabledWired": true,
  "logUploadsXfersEnabledWired": true,
  "contentDataTypeEnabledWireless": true,
  "textFeedsDataTypeEnabledWireless": true,
  "healthDataTypeEnabledWireless": true,
  "mediaFeedsDataTypeEnabledWireless": true,
  "logUploadsXfersEnabledWireless": true,
  "rateLimitModeOutsideWindow": "default",
  "rateLimitRateOutsideWindow": 0,
  "rateLimitModeInWindow": "unlimited",
  "rateLimitRateInWindow": 0,
  "rateLimitModeInitialDownloads": "unlimited",
  "rateLimitRateInitialDownloads": 0,
  "networkConnectionPriority": "wired",
  "networkDiagnosticsEnabled": false,
  "testEthernetEnabled": false,
  "testWirelessEnabled": false,
  "testInternetEnabled": false,
  "useCustomSplashScreen": false,
  "BrightWallName": "",
  "BrightWallScreenNumber": "",
  "specifyHostname": false,
  "hostname": "",
  "useProxy": false,
  "proxyAddress": "",
  "proxyPort": 0,
  "networkHosts": [],
  "contentDownloadsRestricted": false,
  "contentDownloadRangeStart": 0,
  "contentDownloadRangeEnd": 0,
  "heartbeatsRestricted": false,
  "heartbeatsRangeStart": 0,
  "heartbeatsRangeEnd": 0,
  "useDHCP": true,
  "staticIPAddress": "",
  "subnetMask": "",
  "gateway": "",
  "dns1": "",
  "dns2": "",
  "dns3": "",
  "useDHCP_2": true,
  "staticIPAddress_2": "",
  "subnetMask_2": "",
  "gateway_2": "",
  "dns1_2": "",
  "dns2_2": "",
  "dns3_2": "",
  "rateLimitModeOutsideWindow_2": "default",
  "rateLimitRateOutsideWindow_2": 0,
  "rateLimitModeInWindow_2": "unlimited",
  "rateLimitRateInWindow_2": 0,
  "rateLimitModeInitialDownloads_2": "unlimited",
  "rateLimitRateInitialDownloads_2": 0,
  "usbUpdatePassword": "",
  "remoteDwsEnabled": true
}
```
:::

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: The request is executed successfully and the unique identifier of the newly-created  Setup package is returned

**Response**

```json
{
  "error": null,
  "result": "1a2b3c4d5e6f7a8b9c0d1e2f"
}
```

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

# PUT 

Updates an existing player setup on the B-Deploy server. You must include the `_id`  property in the player setup object to specify the player setup to update.

**Request Body**

- `_id` <font color="#704ae0">string</font>: The unique identifier of the player setup object to modify
- `version` <font color="#704ae0">string</font>: The B-Deploy Cloud version. This value should currently be "2.0.0".
- `setupType` <font color="#704ae0">string</font>: The player setup type. This value is currently always "bsn".
- `bsnGroupName` <font color="#704ae0">string</font>: The name of the BSN.cloud group to which provisioned players will be assigned. This value defaults to the "Default" group if undefined.
- `url` <font color="#704ae0">string </font><font color="#01a0af">optional</font>: A value of the Partner Application URL specified for a player to use when finding the application to download.
- `remoteDwsEnabled` <font color="#704ae0">bool</font>: A flag indicating whether the Remote DWS is enabled or disabled on the player
- `bDeploy`<font color="#704ae0"> bDeploy[]</font>: A [B-Deploy Entity (v2)](docId:4bWEdvEQFCxy47VVPOfle)
- `bsnDeviceRegistrationTokenEntity` <font color="#704ae0">tokenEntity[]</font>: A [Token Entity (v2)](docId\:zdEKpsPiP0NbHT48yJ19L)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: The existing player setup has been updated

**Failure Response**

<font color="#9a0808">400</font>: Either the request or request body is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

# DELETE 

Deletes a player setup from the B-Deploy server.

**URL Parameters**

- `_id` <font color="#704ae0">string</font>: The unique identifier of the player setup to delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request** **Example**

- `_id` is set to `1234567890`

```text
DELETE /rest-setup/v2/setup/?_id=1234567890 HTTP/1.1
Host: provision.bsn.cloud
Content-Type: application/json
Authorization: {{Bearer Token}}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: The specified player setup has been removed

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Ownership Info Entity (v3)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 3.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v3)/

B-Deploy objects contain the following required properties: 

- `username` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The BSN.Cloud username
- `networkName` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The BSN.Cloud network name
- `packageName` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The client-defined name for the device setup package. This value must be unique among device Setup packages that belong to your person entity.

This optional property can also be used: 

- `url` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: A URL address for a custom application URL. This value will be ignored if `setupType` is NOT set to `partnerApplication`.


[title] BSControlPort
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

This object provides support for the BP200/BP900 USB button boards and GPIO ports. Button presses are returned as `oncontroldown` and `oncontrolup` events. The object is used to configure output levels on the I/O connector and monitor inputs. Typically, LEDs and buttons are attached to the GPIO connector on the BrightSign player or the BrightSign Expansion Module.

The JavaScript equivalent is [controlport](docId\:N8yoCsdAGOgqCP1OyuoLw).

## Object Creation

The *roControlPort* object is created with a single parameter that specifies the port being used.

```text
BSControlPort(in DOMString PortName)
```

The port parameter can be one of the following:

- `BrightSign`: Specifies the onboard GPIO connector (including the SVC (GPIO12) button).
- `Expander-GPIO`: Specifies the DB-25 connector on the BrightSign Expansion Module. If no BrightSign Expansion module is attached, then object creation will fail and Invalid will be returned.
- `Expander-<n>-GPIO`: Specifies a [USB-to-GPIO device](https://www.brightsign.biz/digital-signage-products/accessories/USB-C-Cables) connected to the player. Multiple USB-to-GPIO devices can be controlled using separate *roControlPort*  instances: The first device corresponds to `"Expander-0-GPIO"`, the second to `"Expander-1-GPIO"`, etc.
- `Expander-DIP`: Specifies the eight DIP switches on the BrightSign Expansion Module. If no BrightSign Expansion module is attached, then object creation will fail and Invalid will be returned.

:::hint{type="info"}
Hot-plugging the BrightSign Expansion Module is not supported.
:::

- `Touchboard-<n>-GPIO`: Retrieves events from the specified BP200/BP900 button board. Events are handled in the same manner as events from the BrightSign port.
- `Touchboard-<n>-LED-SETUP`: Sets various LED output options for the specified BP200/BP900 button board.
- `Touchboard-<n>-LED`: Sets the bits for each button on the specified BP200/BP900 button board. The bits indicate whether the associated LED should be on or off.

:::hint{type="info"}
Since multiple BP200/BP900 button boards can be connected to a player simultaneously, the \<n> value specifies the port enumeration of each board. This value corresponds to the `<raw>` or `<fid>` value returned by the [roDeviceInfo.GetUSBTopology()](docId\:uTKDmpos1ulxaoYLx1nS6) method. An unspecified enumeration value is synonymous with a button board with an enumeration value of 0 (e.g. Touchboard-GPIO and Touchboard-0-GPIO are identical).
:::

## Methods

:::hint{type="success"}
See the Hardware Interfaces section for your player in [this section](docId\:UYYJYeJ6qoJy1HKSbRlPu) for a table of pins and corresponding buttons for the onboard GPIO connector.
:::

- `boolean ConfigureAsInput (unsigned Button)`: Marks the specified button as an input. If an invalid button number is passed, `false` will be returned. If successful, the function returns `true`. Input buttons are tri-stated and can be driven high or low externally.
- `boolean ConfigureAsOutput (unsigned Button)`: Marks the specified button as an output. If an invalid button number is passed, `false` will be returned. If successful, the function returns `true`. The output will be driven high or low depending on the current output state of the pin.
- `boolean SetPinValue(unsigned Button, unsigned Output)`: Configures the output of the specified button, which can be either low (0) or high (1). If the button is not configured as an output, the resulting level is undefined. This method can also be used to configure LED output behavior on [BP200/B900 button boards](docId:8ExDHgmoHqig7J-UvfCe1).
- `boolean GetPinValue(unsigned Button)`: Returns the output of the specified button.
- `void Close(): `Shuts down the *BSControlPort* instance, preventing it from further consuming resources. If this method is not called, garbage collection determines when the instance will be destroyed.
- `boolean SetOutputValue(unsigned Param)`: Specifies the desired state of all outputs attached to the control port as bits in an integer. The individual buttons can be set using binary operations. The parameter is an 8-bit integer and each bit represents an output.
- `boolean SetOutputValues(unsigned Param1, unsigned Param2, unsigned Param3, unsigned Param4)`: Configures buttons on a BP200/BP900 button board. This method can only be used when the *BSControlPort* object is instantiated with the `Touchboard-<n>-LED-SETUP` or `Touchboard-<n>-LED` parameter. The parameters are integer values.

## Events

The following events are available on the *BSControlPort* object. Each event can receive a *ControlPortEvent* event.

- `oncontroldown`
- `oncontrolup`
- `oncontrolevent`

### ControlPortEvent – Attributes

- `readonly attribute unsigned long code`

## Examples

The following example code configures four GPIO outputs:

```text
var gpio = new BSControlPort("BrightSign");
 
// set outputs
gpio.ConfigureAsOutput(0);
gpio.ConfigureAsOutput(1);
gpio.ConfigureAsOutput(2);
gpio.ConfigureAsOutput(3);
 
// set desired states
gpio.SetPinValue(0, 1);
gpio.SetPinValue(1, 1);
gpio.SetPinValue(2, 0);
gpio.SetPinValue(3, 0);
```

The following example causes the LEDs on a BP900 button board to twinkle:

```text
var bp900_gpio;
function myFunction()
{
    var bp900_setup = new BSControlPort("TouchBoard-0-LED-SETUP");
    bp900_setup.SetPinValue(0, 11)

    var bp900 = new BSControlPort("TouchBoard-0-LED");
    bp900.SetPinValue(0, 0x07fe)
    bp900.SetPinValue(1, 0x07fd)
    bp900.SetPinValue(2, 0x07fb)
    bp900.SetPinValue(3, 0x07f7)
    bp900.SetPinValue(4, 0x07ef)
    bp900.SetPinValue(5, 0x07df)
    bp900.SetPinValue(6, 0x07bf)
    bp900.SetPinValue(7, 0x077f)
    bp900.SetPinValue(8, 0x06ff)
    bp900.SetPinValue(9, 0x05ff)
    bp900.SetPinValue(10, 0x03ff)

    bp900_gpio = new BSControlPort("TouchBoard-0-GPIO");
    bp900_gpio.oncontroldown = function(e)
    {
        console.log('###### oncontroldown' + e.code);
    }
}
```

The following example displays events from a GPIO expander board. Note that using the equivalent *roGpioControlPort* object in BrightScript at the same time will result in unpredictable I/O behavior.

```text
<html>
    <head>
    <script>
        var bp900_gpio = new BSControlPort("BrightSign");

        bp900_gpio.oncontroldown = function(e){
            console.log('### oncontroldown ' + e.code);
            newtext = " DOWN: " + e.code + "\n";
            document.myform.outputtext.value += newtext;
            document.myform.outputtext.scrollTop = document.myform.outputtext.scrollHeight;
        }

        bp900_gpio.oncontrolup = function(e){
            console.log('### oncontrolup ' + e.code);
            newtext = "   UP: " + e.code + "\n";
            document.myform.outputtext.value += newtext;
            document.myform.outputtext.scrollTop = document.myform.outputtext.scrollHeight;
        }

        bp900_gpio.oncontrolevent = function(e){
            console.log('### oncontrolevent ' + e.code);
            newtext = "EVENT: " + e.code + "\n";
            document.myform.outputtext.value += newtext;
            document.myform.outputtext.scrollTop = document.myform.outputtext.scrollHeight;
        }

        function ledOn(output_index)
        {
            bp900_gpio.ConfigureAsOutput(output_index);
            newtext = "  LED: " + output_index + "\n";
            document.myform.outputtext.value += newtext;
            document.myform.outputtext.scrollTop = document.myform.outputtext.scrollHeight;
        }

        function buttonOn(output_index)
        {
            bp900_gpio.ConfigureAsInput(output_index);
            newtext = "INPUT: " + output_index + "\n";
            document.myform.outputtext.value += newtext;
            document.myform.outputtext.scrollTop = document.myform.outputtext.scrollHeight;
        }
    </script>
    </head>

    <body bgcolor="#E6E6FA">

    <h1>GPIO/Expander Test Page</h1>
    Note this does NOT play well with <em>roGpioControlPort</em>!!<br><br>
    <input type="button" onclick="ledOn(0)" value="led0">
    <input type="button" onclick="ledOn(1)" value="led1">
    <input type="button" onclick="ledOn(2)" value="led2">
    <input type="button" onclick="ledOn(3)" value="led3">
    <input type="button" onclick="ledOn(4)" value="led4">
    <input type="button" onclick="ledOn(5)" value="led5">
    <input type="button" onclick="ledOn(6)" value="led6">
    <input type="button" onclick="ledOn(7)" value="led7">
    <br>
    <input type="button" onclick="buttonOn(0)" value="button0">
    <input type="button" onclick="buttonOn(1)" value="button1">
    <input type="button" onclick="buttonOn(2)" value="button2">
    <input type="button" onclick="buttonOn(3)" value="button3">
    <input type="button" onclick="buttonOn(4)" value="button4">
    <input type="button" onclick="buttonOn(5)" value="button5">
    <input type="button" onclick="buttonOn(6)" value="button6">
    <input type="button" onclick="buttonOn(7)" value="button7">
    <br>

    <form name="myform">
        <textarea readonly rows="50" cols="100" name="outputtext" style="font-family:monospace"></textarea>
    </form>

</body>
</html>
```


[title] networkconfiguration
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *networkconfiguration&#xA0;*&#x6F;bject allows for configuration of the network interfaces on the player. Each object instance corresponds to a single network interface (Ethernet, WiFi, or modem), which is specified using the `type` attribute.

This object only allows you to configure/retrieve settings related to the network interfaces on the device. For other network information, use the Node.js® OS module.

**networkconfiguration IDL**

```javascript
[
    Constructor(String ifName)
] interface NetworkInterface {
    readonly attribute String type; // values: wifi, ethernet, modem
    NetworkInterfaceConfig defaultConfig();
    Promise<NetworkInterfaceConfig> getConfig(NetworkInterfaceConfigRequestParams params[optional]); // Promise will be resolved as WifiInterfaceConfig, ModemInterfaceConfig, EthernetInterfaceConfig
    Promise<void> applyConfig(NetworkInterfaceConfig config);
    [type == "ethernet"] Promise<LLDPNeighborInformation> getNeighborInformation();
    [type == "ethernet"] Promise<void> enableLeds();
    [type == "wifi"] Promise<WifiAccessPointList> scan();
    [type == "wifi"] Promise<void> reassociate();


interface WifiAccessPointList {
    attribute String essId;
    attribute String bssId;
    attribute long signal;
};

interface LLDPNeighborInformation {
    // information is directly converted from LLDP. Fields are defined deep down there.
};

interface NetworkInterfaceConfigRequestParams {
    attribute bool includeEncryptedSecrets;
};

interface NetworkInterfaceConfig {
    attribute bool enable;
    attribute long metric;
    [optional = CONFIG_DHCP_SERVER] attribute DHCPServerConfig dhcpServerConfig;
    attribute Array<String> dnsServerList;
    attribute Array<IPAddress> ipAddressList;
    attribute long inboundShaperRate;
    attribute long mtu;
    [optional = CONFIG_VLAN] attribute Array<int> vlanIdList;
    attribute String clientIdentifier;
    attribute String domain;
	attribute Array<String> enabledProtocolList;
};

[optional = CONFIG_DIALUP] interface DialUpInterfaceConfig : public NetworkInterfaceConfig {
    attribute String user;
    attribute String password;
    attribute String number;
    attribute String initString;
};

interface DHCPServerConfig {
    attribute String start;
    attribute String end;
    [optional] attribute String gateway;
    [optional] attribute Array<String> dnsServerList;
    [optional] attribute String domain;
};

interface IPAddress {
    attribute String family;
    attribute String address;
    attribute String netmask;
    attribute String gateway;
    attribute String broadcast;
};

interface EthernetInterfaceConfig : public NetworkInterfaceConfig {
    attribute String securityMode;
    attribute String identity;
    attribute String eapTlsOptions;
    attribute String caCertificates;
    attribute String clientCertificate;
    attribute String privateKey;
};

interface WifiInterfaceConfig : public NetworkInterfaceConfig{
    attribute String essId;
    attribute String passphrase;
    [optional = CONFIG_SECURE_STORE] attribute String obfuscatedPassphrase;
    attribute String securityMode;
    attribute String identity;
    attribute String eapTlsOptions;
    attribute String caCertificates;
    attribute String clientCertificate;
    attribute String privateKey;
    attribute String frequencies;
    [optional = CONFIG_WIFI_AP] attribute bool accessPointMode;
    [optional = CONFIG_WIFI_AP] attribute long accessPointFrequency;
    [optional = CONFIG_WIFI_AP] attribute bool accessPointHidden;
};
```

## Object Creation

To create a *networkconfiguration* object, first load the `brightsign/networkconfiguration` module using the `require()` method. Then create an instance of the *networkconfiguration* class using a string value that indicates the network interface associated with the instance.

```javascript
var NetworkConfigClass = require("@brightsign/networkconfiguration");
var networkConfigEth = new NetworkConfigClass("eth0");     
```

The `ifName` parameter  can be any of the following: 

- `0` or `"eth0"`: The Ethernet port on the BrightSign player
- `"eth1"`: The “control” Ethernet port on players that have one. This port is for screen control only (DNS relay is not supported). Note that the port is not enabled by default and must be explicitly enabled (which can be done from the BrightSign shell prompt, JavaScript or BrightScript). &#x20;
- `1` or `"wlan0"`: The internal WiFi
- `2` or `"ppp0"`: A connected modem
- `"usb0"`, `"usb1"`, etc: USB ethernet interfaces

## NetworkInterface

Use this interface to configure a network interface on the player. 

- `type` <font color="#6321ae">String</font>: The network interface type, which is read-only. It can be one of the following:
  - `"ethernet"`: An Ethernet port on the BrightSign player.&#x20;
  - `"wifi"`: The internal WiFi
  - `"modem"`: A connected modem

:::hint{type="info"}
The “control” Ethernet port on players that have one, such as the XD6 and HD6, is not enabled by default. It must be explicitly enabled, which can be done from the BrightSign shell prompt, JavaScript or BrightScript.
:::

:::hint{type="success"}
The network interface can be configured as a VLAN using the following string format: "\[parent\_interface].\[vlan\_id]" (e.g "eth0.42"). Once the VLAN interface(s) are configured, they must be enabled on the parent network interface (e.g. "eth0") by including them in the vlanIdList of the parent interface. VLAN interfaces use DHCP by default. They are supported on Series 4 (XTx44, XDx34, HDx24, LS424) and Series 3 (XTx43, XDx33, HDx23, LS423, HO523) players only. Also see [Default Routing Metrics](docId:0jDtAGrV4AlBWLYFJNj45).
:::

**getConfig()**

```javascript
Promise<NetworkInterfaceConfig> getConfig(NetworkInterfaceConfigRequestParams params[optional])
```

Returns configuration settings for the network interface. Depending on the specified `type`, this method will return an `EthernetInterfaceConfig`,  `WiFiInterfaceConfig`, or `ModemInterfaceConfig` interface.  If there is a set password, `getConfig()` will return true for the `password` parameter. If there isn't a set password, `getConfig()` will return false for the `password` parameter.

Note that this class concerns itself with the player's persistent network configuration. If you wish to determine the current settings (for example the IP address that has been retrieved via DHCP) then use the [Node.js® OS module](https://nodejs.org/api/os.html#os_os_networkinterfaces).

**applyConfig()**

```javascript
Promise<void> applyConfig(NetworkInterfaceConfig config)
```

Configures the network interface using the parameters in the passed *NetworkInterfaceConfig* object. This method returns void upon success. 

To reset a network-interface setting to its default value, pass the *NetworkInterfaceConfig &#x20;*&#x6F;bject without the corresponding attribute.

The `config` parameter should contain the complete desired configuration. Any previous configuration is overwritten. If you wish to change one item while keeping the rest of the configuration the same then first call `getConfig` and modify the returned object (see the example in the Examples section).

**getNeighborInformation()**

```javascript
Promise<LLDPNeighborInformation> getNeighborInformation()
```

Returns LLDP information related to the network, or null. This method is available with the ethernet interface only.

**enableLeds()**

```javascript
Promise<void> enableLeds()
```

Enables or disables the ethernet activity LEDs (that is, flashing during link and activity behavior). Ethernet LEDs are enabled by default. Changes to this setting do not persist across reboots. This method is available with the ethernet interface only.

**scan()**

```javascript
Promise<WifiAccessPointList> scan()
```

Scans for WiFi access points are returns a list of detected access points. This method is available with the WiFi interface only.

**reassociate()**

```javascript
Promise<void> reassociate()
```

Attempts to disconnect and reconnect to the currently-configured WiFi network asynchronously. This should not normally be necessary, but could be useful when diagnosing network problems. If successful, the returned promise will be resolved. If unsuccessful, the returned promise will be rejected with error information.

This method is present in BOS 8.4.20 and above, BOS 8.5.26 and above, and in all BOS 9.0 versions.&#x20;

Note that the promise may be resolved before the network has been reconnected. Use `@brightsign/networkhotplug` to determine when reconnection is complete.

## WifiAccessPointList

This interface represents the results of a scan for wireless networks. Each entry in the list contains the following parameters:

- `essID` <font color="#6321ae">String:</font> WiFi ESSId network name
- `bssID` <font color="#6321ae">String</font>: BSSId of the access point
- `signal` <font color="#6321ae">long</font>: The received signal strength. The absolute value of this attribute is usually not relevant, but it can be compared with the reported value on other networks or in different locations.

## LLDPNeighborInformation

This interface contains location information received from the network infrastructure using the [LLDP-MED](docId\:U6ZceYQddlz9xdAKtTmJs) protocol.

## NetworkInterfaceConfigRequestParams 

- <font color="#0C121D">`includeEncryptedSecrets` </font><font color="#6554c0">bool</font>: If set to `true`, encrypted secrets are included, if set to `false` they are not.

## NetworkInterfaceConfig

This interface contains settings related to a network interface.

- `metric` <font color="#6321ae">long</font>: The routing metric for the default gateway on the interface. Routes with lower metrics are preferred over routes with higher metrics. If not specified the metric will be set to ensure that interfaces are preferred consistently for a given configuration.
- `dhcpServerConfig` <font color="#6321ae">DHCPServerConfig</font>:  A *DHCPServerConfig* interface that specifies the DHCP server configuration for the interface. The DHCP server can be disabled by setting this attribute to a null value when calling `applyConfig()`.
- `dnsServerList` <font color="#6321ae">Array&lt;String&gt;</font>: A string list containing a maximum of three DNS servers. Each string should contain the dotted-quad IP address of a DNS server. 
- `ipAddressList` <font color="#6321ae">Array&lt;IPAddress&gt;:</font> An array containing zero or one static IPv4 address configurations. Players do not currently support more than one IPv4 address per interface or static configuration of IPv6 addresses. If the array is empty then IP addresses will be assigned using DHCP.
- `inboundShaperRate`<font color="#6321ae"> long</font>: The bandwidth limit for inbound traffic in bits per second. If undefined, there is no bandwidth limit.
- `mtu` <font color="#6321ae">long</font>: The maximum transmission unit (MTU) for the network interface in bytes. If not specified an appropriate mtu value will be chosen automatically.
- `vlanIdList` <font color="#6321ae">Array&lt;unsigned short&gt;</font>: A list of VLAN IDs that this network interface is the parent for.
- `clientIdentifier` <font color="#6321ae">String</font>: The DHCP client identifier for the network interface
- `domain`  <font color="#6321ae">String</font>: The domain name for the network interface
- `enabledProtocolList` <font color="#6321ae">Array&lt;String&gt;</font>: An optional array containing the set of enabled IP protocols. The default value is \[`IPv4`, `IPv6`].

## DialUpInterfaceConfig

This interface contains attributes related to the modem interface:

- `user` <font color="#6321ae">String</font>: The username that has been entered: some operators will require the username, others will not.
- `password` <font color="#6321ae">String</font>: The password that has been entered: some operators will require the password, others will not.
- `number` <font color="#6321ae">String</font>: The "start connection" command, which previously dialed a number. Now, number is almost always "\*99#". 
- `initString` <font color="#6321ae">String</font>: The general modem setup string, which varies between operators. 

## DHCPServerConfig

This interface configures a DHCP server on the Ethernet port or wireless access point. If configuring DHCP for WiFi, note that the WiFi interface must be in access point mode.

A static IP address must be assigned to the wlan0 interface for the DHCP server to work correctly. To apply a static `IP address`, refer to [NetworkInterfaceConfig](docId:6MS7rdjWWhP21clMeDRwv), and use the `ipAddressList` setting.

- `start` <font color="#6321ae">String</font>: The beginning of the range of offered IP addresses
- `end` <font color="#6321ae">String</font>: The end of the range of offered IP addresses
- `gateway` <font color="#6321ae">String</font> <font color="#01a0af">optional</font>:  IPv4 address of the gateway to be used by clients.
- `dnsServerList` <font color="#6554c0">Array&lt;String&gt;</font> <font color="#01a0af">optional</font>:  An array of strings containing the IPv4 addresses of name servers (IPv6 addresses are not currently supported)
- `domain ` <font color="#6554c0">String</font> <font color="#01a0af">optional</font>: The domain suffix to be used by clients

## IPAddress

This interface represents an IP address configuration.

- `family` <font color="#6554c0">String</font>: The IP configuration (must be set to IPv4).
- `address` <font color="#6554c0">String</font>: The IP4 address. This a string dotted decimal quad, for example "192.168.1.42".
- `netmask` <font color="#6554c0">String</font>: The IP4 netmask. This a string dotted decimal quad, for example "255.255.255.0".
- `gateway` <font color="#6554c0">String</font>: The IP4 interface configuration. This a string dotted decimal quad, for example "192.168.1.2".
- `broadcast` <font color="#6554c0">String</font>: The IP4 broadcast address. This a string dotted decimal quad, for example "192.168.1.255".

## EthernetInterfaceConfig

- `securityMode` <font color="#6554c0">String</font>: Sets the encryption method.
- `identity` <font color="#6554c0">String</font>: The RADIUS (Remote Authentication Dial-In User Service) identity. If this value is blank, it will be taken from the specified client certificate ("subjectAltName" will be used if present; otherwise, the "commonName" is used).
- `eapTlsOptions` <font color="#6554c0">String</font>: A string containing EAP-specific options
- `caCertificates` <font color="#6554c0">String</font>: The contents of a CA certificate file in text form (that is, a "pem" file)
- `clientCertificate` <font color="#6554c0">String</font>: The contents of a client certificate file in text form (that is, a "pem" file)
- `privateKey` <font color="#6554c0">String:</font> The private key for authentication

## WiFiInterfaceConfig

This interface contains attributes related to the WiFi interface:

- `essId` <font color="#6554c0">String</font>: The ESSID of the wireless network
- `passphrase` <font color="#6554c0">String</font>: The plain-text passphrase/key for the wireless network
- `obfuscatedPassphrase` <font color="#6554c0">String</font> <font color="#01a0af">optional</font>: The passphrase/key for the wireless network that has been obfuscated using a shared secret. Contact [support@brightsign.biz](mailto\:support@brightsign.biz)  to learn more about generating a key for obfuscation and storing it on the player.

The following attributes relate to WPA Enterprise support:

- `securityMode` <font color="#6554c0">String</font>: Sets the WiFi encryption method. By default, both WPA (TKIP) and WPA2 (CCMP) encryption are permitted. This method accepts a space-separated, case-insensitive list that can include either "tkip" or "ccmp" values. Passing an empty string sets the default mode. If both CCMP and TKIP are allowed, CCMP always has priority.
- `identity` <font color="#6554c0">String</font>: The RADIUS identity. If this value is blank, it will be taken from the specified client certificate ("subjectAltName" will be used if present; otherwise, the "commonName" is used).
- `eapTlsOptions` <font color="#6554c0">String</font>: A string that contains EAP-specific options. Currently, this string can be used to enable or disable MD5 support ("md5=enable" or "md5=disable").
- `caCertificates` <font color="#6554c0">String</font>: The contents of a CA certificate file in text form (i.e. a "pem" file). Certificates can also be sent from an EAP peer.
- `clientCertificate` <font color="#6554c0">String</font>: The contents of a client certificate in text form (i.e. a "pem" file)
- `privateKey` <font color="#6554c0">String</font>: The private key for authentication. If the private key is password protected, use the passphrase/obfuscatedPassphrase attribute to set the password. If the client certificate and associated private key are in the same PKCS#12 file, the file contents should be specified in the privateKey field and the clientCertificate field should be left blank.
- `frequencies` <font color="#6554c0">String</font>: Gets the WiFi frequencies list
- `accessPointMode` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font><font color="#00b8d9">:</font> Whether WiFi access-point mode is enabled or disabled. The ESSID and passphrase of the WiFi access point is set with the essId and passphrase/obfuscatedPassphrase attributes. If a passphrase has been set, the wireless access point will use WPA2 authentication–otherwise, it will use no authentication.
- `accessPointFrequency` <font color="#6554c0">long</font> <font color="#01a0af">optional</font><font color="#00b8d9">:</font> The [frequency](https://en.wikipedia.org/wiki/List_of_WLAN_channels) of the WiFi access point (in MHz)
- `accessPointHidden` <font color="#6554c0">bool</font> <font color="#01a0af">optional</font>: If hidden is `true`, the SSID is hidden, if `false` it is visible. The default is non-hidden, which was the previous behavior.

## Examples

The following example queries a BrightSign device for the network settings of a specific interface and prints the results (or any error) to the console:

```javascript
var networkConfigClass = require("@brightsign/networkconfiguration");
var nc = new networkConfigClass("ethO");

nc.getConfig().then(
        function(data) {
            console.log("***General Interface Data***");
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });
```

The following download example applies a static IP address to the ethernet interface. If a static IP address is not provided, it configures the interface for DHCP instead:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/BKHvC_APRGVsZs01Qs_yp-20260128-192327.zip" label="js-networkconfiguration-staticip_updated.zip"}

The following code example restricts IP version support to IPv4 only:

```javascript
var networkConfigClass = require("@brightsign/networkconfiguration");
var networkConfigEthernet = new networkConfigClass("eth0");
networkConfigEthernet.getConfig()
    .then(
        function(data) {
            networkConfig = {}
            networkConfig.enabledProtocolList = ["IPv4"];
            networkConfigEthernet.applyConfig(networkConfig)
                .then(
                    function() {
                        console.log("Success");
                    })
                .catch(
                    function(err) {
                        console.log(err);
                    });
        })
    .catch(
        function(err) {
            console.log(err);
        });
```

To change one item while keeping the rest of the configuration the same, call getConfig and modify the returned object:

```javascript
  var NetworkConfiguration = require('@brightsign/networkconfiguration');
  var address = {
    ipAddress:"10.0.1.20",
    defaultGateway:"10.0.1.1",
    subnetMask:"255.255.255.0",
    broadcast: "10.0.1.255"
  };
  var networkConfig = new NetworkConfiguration("eth0");
  networkConfig.getConfig()
  .then(function(config) {
    var ipAddress = {
      family: "IPv4",
      address: address.ipAddress,
      netmask: address.subnetMask,
      gateway: address.defaultGateway,
      broadcast: address.broadcast,
    };
    config.ipAddressList = [ipAddress];
    networkConfig.applyConfig(config);
  })
  .then(function() {
    console.log("Success");
  })
  .catch(function(error) {
    console.log(`${JSON.stringify(error)}`);
  });
```


[title] assetrealizer
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

This *assetrealizer* object contains functions for realizing files (i.e. extracting files from an asset pool and placing them into the standard file directory).

**assetrealizer IDL**

```text
interface AssetRealizer {
    constructor(AssetPool pool, String destinationPath);
    Promise<unsigned long long> estimateRealizedSize(AssetList assets);
    Promise<void> realize(AssetList assets);
    Promise<Array<ValidationResult>> validateFiles(AssetList assets, AssetValidationOptions options);
};
 
interface AssetValidationOptions {
    attribute deleteCorrupt;
};
 
interface ValidationResult {
    attribute String name;
    attribute String reason;
};
```

## Object Creation

To create an *assetrealizer* object, you will first need to create an *assetpool* instance and download files to it using an *assetpoolfetcher* instance. Then, load the `brightsign/assetrealizer` module using the `require()` method, and create an instance of the *assetrealizer* class using the *assetpool* instance and the destination directory for realization.

```javascript
const AssetPoolClass = require("@brightsign/assetpool");
let assetPool = new AssetPoolClass("SD:/pool");
   
const AssetRealizerClass = require("@brightsign/assetrealizer");
let assetRealizer = new AssetRealizerClass(assetPool, "SD:/");
```

## AssetRealizer

Use this interface to copy assets out of the pool into real named files in the file system and perform related functions.

### estimateRealizedSize()

```javascript
Promise<unsigned long long> estimateRealizedSize(AssetList assets)
```

Returns the estimated amount of space (in megabytes) that would be taken up if the files specified in the [AssetList](docId\:NY8nhRk1-740WPRYL_p8d) object are realized.

### realize()

```javascript
Promise<void> realize(AssetList assets)
```

Places the files into the destination directory specified in the passed AssetList object. If the pool does not contain the full set of required files, then this method will immediately fail before any files are changed (this method attempts to do as much work as possible before destructively modifying the file system). This method automatically checks the length of the file and that any hashes that match those specified. If there is a mismatch, then the affected file is deleted from the pool and realization fails. This method may cause unprotected assets to be pruned from the pool. The method indicates failure by rejecting the returned promise.

:::hint{type="info"}
The pool and the destination must be on the same storage device in the same file system.
:::

### validateFiles()

```javascript
Promise<Array<ValidationResult>> validateFiles(AssetList assets, AssetValidationOptions options)
```

Checks the hash of every file in the passed AssetList against the corresponding file in the destination path and returns a string list containing each mismatched file name mapped to the reason. This operation can take a long time and slow down access to the storage device. It is normally only useful if file system or storage corruption is suspected or for debugging. The `options` parameter is a string list, which can currently support a single option:

- `"deleteCorrupt"`: Automatically deletes any files that do not match the expected hash. By default, these files are not deleted.

## ValidationResult

This interface is returned by the `validateFiles()` method to indicate the results of the realize operation.

- `name` <font color="#6B21A8">string</font>: The name of the mismatched file (if the realize operation fails)
- `reason` <font color="#6B21A8">string</font>: An explanation for a failed realize operation. See the [roAssetRealizerEvent](docId\:I9xynYU27ccntHOBfhpHU) page for a list of possible reason strings.


[title] networkdiagnostics
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *networkdiagnostics&#xA0;*&#x6F;bject allows you to retrieve information about network interfaces and Internet connectivity.

**networkdiagnostics IDL**

```javascript
interface NetworkDiagnostics {
    Promise<NetworkDiagnosticsResult> testInternetConnectivity()
    Promise<NetworkDiagnotsticsResult> testNetworkInterface(String interface_name)
    Promise<PingResult> ping(String host_name, PingConfig config)
    Promise<TracerouteResult> traceroute(String host_name, TracerouteConfig config)
    //< For BrightSign internal use. Behaviour subject to change without notice.
};

interface InterfaceTestResult {
    String diagnosis;
    bool    ok;
    Array<Log> log;
};

interface Log {
    String name;
    bool pass;
    String result;
    Array<String> info;
    //< For BrightSign internal use. Behaviour subject to change without notice.
};

interface PingConfig {
    unsigned? short count; // default 10
    unsigned long? interval; // in milliseconds, default 100
    unsigned long? timeout; // in seconds, default 10000
    unsigned long? packetsize; // in bytes, default 56
    bool? ipv4; // enable pinging IPv4 addresses, default true
    bool? ipv6; // enable pinging IPv6 addresses, default false
    bool? allAddresses; // if true then ping all addresses returned from DNS query,
                        // if false then each will be pinged in turn until one responds, default false
};

interface PingResult {
    String hostname; // host name or literal address pinged
    PingResults results;
};

interface PingResults {
    bool up; // true if at least one address responded to at least 50% of the echo requests
    Array<ProtocolPingResult>? ipv4;
    Array<ProtocolPingResult>? ipv6;
};

interface ProtocolPingResult {
    String address; // IP address pinged
    bool up; // true if the address responded to at least 50% of the echo requests
    ProtocolPingReport report;
};

interface ProtocolPingReport {
    unsigned short transmitted; // number of echo requests sent
    unsigned short received; // number of echo replies received
    ProtocolPingStats stats;
};

interface ProtocolPingStats {
    unsigned long quickest; // quickest reply received
    unsigned long average; // average time across all replies from address
    unsigned long slowest; // slowest reply received
    String units; // always "us" to indicate microseconds
};
```

## Object Creation

To create a *networkdiagnostics* object, first load the `brightsign/networkdiagnostics`  module using the `require()` method. Then create an instance of the *networkdiagnostics* class.

```javascript
var NetworkDiagnosticsClass = require("@brightsign/networkdiagnostics");
var networkDiag = new NetworkDiagnosticsClass();
```

## NetworkDiagnostics

Use this interface to retrieve diagnostic information.

:::hint{type="danger"}
The testInternetConnectivity() method generates a large amount of network traffic (e.g. DNS lookups) that may degrade the performance of a player, create network congestion, or be perceived as abusive by the network's upstream DNS provider. This method is intended for one-time use to validate network connectivity or to diagnose a suspected problem.
:::

**testInternetConnectivity()**

```javascript
Promise<InterfaceTestResult> testInternetConnectivity()
```

Performs various tests on the Internet connection (via any available network interface) to determine whether it appears to be working correctly. This method returns an `InterfaceTestResult` interface when diagnostics are complete.

**testNetworkInterface()**

```javascript
Promise<InterfaceTestResult> testNetworkInterface(String interface_name)
```

Performs tests on the specified network interface to determine whether it appears to be working correctly. Interface name values are the same as those used with the [roNetworkConfiguration](docId\:U6ZceYQddlz9xdAKtTmJs) object. This method returns an `InterfaceTestResult` interface when diagnostics are complete.

**ping()**

```javascript
Promise<PingResult> ping(String host_name, PingConfig config)
```

Pings a device with the specified `host_name` to determine if there are connection issues.

**traceroute()**

```javascript
Promise<InterfaceTestResult> traceroute(String host_name, TraceRouteConfig config)
```

**For BrightSign internal use. Behavior subject to change without notice.&#x20;**

Performs a standard traceroute diagnostic on the specified `host_name`.

## InterfaceTestResult

This interface contains diagnostic results:

- `diagnosis` <font color="#6554c0">String</font>:  A single-line diagnosis of the first problem identified with the network interface or Internet connection
- `ok`<font color="#6554c0"> bool</font>:  Whether the network interface or Internet connection passed diagnostic tests
- `log` <font color="#6554c0">Log</font>:  A Log object containing diagnostic information related to the network interface or Internet connection

## Log

This interface contains a list of diagnostic logs. Each log contains the following attributes:

- `name` <font color="#6554c0">String</font>: A description of the diagnostic 
- `pass` <font color="#6554c0">bool</font>: Whether the diagnostic was successful
- `result` <font color="#6554c0">String</font>: A description of the diagnostic result
- `info` <font color="#6554c0">StringList</font>: A string list containing diagnostic data

## PingConfig

This interface is not recommended unless you are using BrightSign OS v8.3.45 and later.

- `count` <font color="#6554c0">unsigned short</font>: The default value is 10.
- `interval` <font color="#6554c0">unsigned long</font>:  The interval value in milliseconds. The default is 100.
- `timeout`  <font color="#6554c0">unsigned long</font>: The timeout value in seconds. The default is 10000.
- `packetsize` <font color="#6554c0">unsigned long</font>: The packet size in bytes. The default is 56.
- `ipv4` <font color="#6554c0">bool</font>:  Enable pinging IPv4 addresses. The default is `true`.
- `ipv6` <font color="#6554c0">bool</font>:  Enable pinging IPv6 addresses. The default is `true.`
- `allAddresses`<font color="#6554c0"> bool:</font>  If `true` then ping all addresses returned from the DNS query. If `false`, then each will be pinged in turn until one responds. The default is `false`.

## PingResult

This interface is not recommended unless you are using BrightSign OS v8.3.45 and later.

- `hostname` <font color="#6554c0">String</font>: The host name or literal address pinged.
- `results` <font color="#6554c0">PingResults</font>:

## PingResults

This interface is not recommended unless you are using BrightSign OS v8.3.45 and later.

- `up` <font color="#6554c0">bool:</font> This value is `true` if at least one address responded to at least 50% of the echo requests.
- `ipv4` <font color="#6554c0">Array&lt;ProtocolPingResult&gt;:</font>
- `ipv6` <font color="#6554c0">Array&lt;ProtocolPingResult&gt;:</font>

## ProtocolPingResult

This interface is not recommended unless you are using BrightSign OS v8.3.45 and later.

- `address` <font color="#6554c0">string</font>: The IP address pinged
- `up` <font color="#6554c0">bool</font>: If `true`, the address responded to at least 50% of the echo requests
- `report` <font color="#6554c0">ProtocolPingReport:</font>

## ProtocolPingReport

This interface is not recommended unless you are using BrightSign OS v8.3.45 and later.

- `transmitted` <font color="#6554c0">unsigned short</font>: The number of echo requests sent
- `received` <font color="#6554c0">unsigned short</font>: The number of echo replies received
- `stats` <font color="#6554c0">ProtocolPingStats:</font>

## ProtocolPingStats

This interface is not recommended unless you are using BrightSign OS v8.3.45 and later.

- `quickest` <font color="#6554c0">unsigned long</font>: The quickest reply received
- `average` <font color="#6554c0">unsigned long</font>: The average time across all replies from address
- `slowest` <font color="#6554c0">unsigned long</font>: The slowest reply received
- `units` <font color="#6554c0">string</font>: The value is always "us", to indicate microseconds

## Example

The following script creates a *networkdiagnostics&#xA0;*&#x69;nstance and logs Internet diagnostic data to the console:

```javascript
var NetworkDiagnosticsClass = require("@brightsign/networkdiagnostics");
var nd = new NetworkDiagnosticsClass();
nd.testInternetConnectivity().then(
        function(data) {
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });
```


[title] openvpn
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *openvpn* object can be used to connect players and servers through a VPN, without making them accessible to everyone.

**openvpn IDL**

```javascript
interface OpenVpnConfig {
    attribute String archiveFile;
    attribute String? obfuscatedSecret;
};

interface OpenVpn {
    Promise<void> installAndRun(OpenVpnConfig config);
    Promise<void> uninstall();
};
```

## Object Creation

```javascript
var openvpn = require('@brightsign/openvpn');
var ovpn = new openvpn();
```

## OpenVpn

**installAndRun()**

```javascript
Promise<void> installAndRun(params: OpenVpnParams)
```

Install the configuration and run OpenVPN.

**uninstall()**

```javascript
Promise<void> uninstall()
```

Stop and uninstall the configuration

## OpenVpnConfig

- `archiveFile` <font color="#6554c0">string</font>: Path to the configuration zip
- `obfuscatedSecret `<font color="#6554c0">string</font>: Encrypted passphrase for protected certificates

## Example

This example sends logs to the SD card, but */storage/flash* can also be used. Each method has a limitation: If you use an SD card location, you cannot remove the card while the OpenVPN client is active or you will get an error log and the card can be corrupted, while */storage/flash* may not be available depending on the player that you are using.

```javascript
var openvpn = require('@brightsign/openvpn');
var ovpn = new openvpn();

var params = {
   archiveFile: '/storage/sd/openvpn.zip'
};
ovpn.installAndRun(params)
.then(function() {
   console.log('success');
})
.catch(function(err){
   console.log('err: ' + JSON.stringify(err));
});
ovpn.uninstall()
.then(function() {
   console.log('success');
})
.catch(function(err){
   console.log('err: ' + JSON.stringify(err));
});
```


[title] audio
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *audio* object is a JavaScript object for use with *roNodeJs* that allows the playback of audio by replicating functionality from the HTML5 audio element.

**audio IDL**

```text
interface Audio {
  // error state
  readonly attribute MediaError error;
 
  // network state
           attribute String src;
  readonly attribute String currentSrc;
  readonly attribute unsigned short networkState;
  const unsigned short NETWORK_EMPTY = 0;
  const unsigned short NETWORK_IDLE = 1;
  const unsigned short NETWORK_LOADING = 2;
  const unsigned short NETWORK_NO_SOURCE = 3;
 
  void load();
  String canPlayType(String type);
 
  // ready state
  readonly attribute unsigned short readyState;
  const unsigned short HAVE_NOTHING = 0;
  const unsigned short HAVE_METADATA = 1;
  const unsigned short HAVE_CURRENT_DATA = 2;
  const unsigned short HAVE_FUTURE_DATA = 3;
  const unsigned short HAVE_ENOUGH_DATA = 4;
 
  readonly attribute boolean seeking;
 
  // playback state
           attribute double currentTime;
  readonly attribute double duration;
  readonly attribute boolean paused;
           attribute double defaultPlaybackRate;
           attribute double playbackRate;
  readonly attribute boolean ended;
           attribute boolean autoplay;
           attribute boolean loop;
  void play();
  void pause();
 
  void setSyncParams(String domain, String sync_id, String iso_timestamp);
 
  // controls
           attribute double volume;
           attribute boolean muted;
 
  // BrightSign extensions
           attribute String pcmaudio;
           attribute String compaudio;
 
           attribute int x-bs-stream-timeout;
           attribute String x-bs-audio-mode;
 
  // Present but unimplemented
           attribute String preload;
  readonly attribute TimeRanges buffered;
  readonly attribute double initialTime;
  readonly attribute Date startOffsetTime;
           attribute boolean controls;
  readonly attribute TimeRanges played;
  readonly attribute TimeRanges seekable;
 
  readonly attribute TextTrack[] tracks;
  MutableTextTrack addTrack(String kind, optional String label, optional String language);
 
};
```

## Object Creation

To create an *audio* object, first load the *brightsign/audio* module using the require() method. Then create an instance of the audio class using the following example:

```javascript
var audio_class = require("@brightsign/audio");
var audio_player = new audio_class();
```

## Audio

Use this interface to create *audio* objects.

### Event

`seeked:` This event is fired when media loops back to the start.

### Methods

### load() 

```javascript
void load()
```

Triggers processing of the `src`. `load` starts up playback to the point of being ready to play the first frame. If `autoplay` is set, then it also starts playback. `readyState` and `networkState` are altered, and multiple events fire as playback starts.

### canPlayType() 

```javascript
 String canPlayType(String type)
```

Returns whether the passed MIME type can be displayed on the BrightSign player.

### play() 

```javascript
void play()
```

Starts or resumes playback.

### pause() 

```javascript
void pause()
```

Pauses playback.

### setSyncParams()

```javascript
 void setSyncParams(String domain, String sync_id, String iso_timestamp)
```

This BrightSign extension is documented on [this page](docId\:DQNX2ot2TDKXYNmRGLNCP).

## Audio Parameters

- `src` <font color="#6B21A8">string</font>: Contains the URL of a media resource to use in the element. Only file URLs are supported currently, including relative URLs to the current script and a file:/// URI with an absolute filesystem path on the player. The URL returned when reading this value back is always absolute with file: protocol on the front.
- `currentSrc` <font color="#6B21A8">string</font>: Contains the URL of the media resource in use by the element.
- `networkState` <font color="#6B21A8">unsigned short</font>: An enum that indicates the current state of the fetching of media. This attribute moves through the states as `src` is selected and playback begins, but because support is currently for files only, it is not as dynamic as when used with HTTP. Possible values are:
  - `NETWORK_EMPTY = 0,`
  - `NETWORK_IDLE,`
  - `NETWORK_LOADING,`
  - `NETWORK_NO_SOURCE` 
- `readyState` <font color="#6B21A8">unsigned short</font>: Indicates the readiness state of media. This attribute moves through the states as `src` is selected and playback begins. Possible values are:
  - `HAVE_NOTHING = 0,`
  - `HAVE_METADATA,`
  - `HAVE_CURRENT_DATA,`
  - `HAVE_FUTURE_DATA,`
  - `HAVE_ENOUGH_DATA`
- `seeking` <font color="#6B21A8">boolean</font>:  Indicates if the media is seeking to a new position.
- `currentTime` <font color="#6B21A8">double</font>: Specifies the current playback time in seconds as a floating point. Currently seeking is not supported, and setting this attribute has no effect. If playback is completed, this returns the same value as duration.
- `duration` <font color="#6B21A8">double</font>: Specifies the current duration of the media in seconds as a floating point.
- `paused` <font color="#6B21A8">boolean</font>: Reflects whether the media playback is currently paused.
- `defaultPlaybackRate` <font color="#6B21A8">double</font>: This cannot be set to anything other than 1.0, and always returns 1.0 (only normal speed playback is supported).
- `playbackRate` <font color="#6B21A8">double</font>: This cannot be set to anything other than 1.0, and always returns 1.0 (only normal speed playback is supported).
- `ended`  <font color="#6B21A8">boolean</font>: Reflects where the media playback has reached the end of the media.
- `autoplay` <font color="#6B21A8">boolean</font>: Indicates whether playback should automatically begin when media is available to play without interruption.
- `loop` <font color="#6B21A8">boolean</font>: Sets whether the playback should loop or not. The value is used when load is called. Setting it once playback has started will have no effect.
- `volume` <font color="#6B21A8">double</font>: Controls the volume of playback
- `muted` <font color="#6B21A8">boolean</font>: Controls the muting and unmuting of the audio
- `pcmaudio` <font color="#6B21A8">string</font>: Route decoded PCM audio to the outputs in the string. Outputs available are `analog`, `earc`, or a USB output (for example, `usb:A.0`). Multiple outputs can be specified by using a semi-colon delimeter (for example, `earc; analog`)
- `compaudio` <font color="#6B21A8">string</font>: Routes compressed audio direct to eARC without decoding. Can be set to `earc` only.
- `x-bs-stream-timeout` <font color="#6B21A8">int</font>: Controls timeouts when streaming.
- `x-bs-audio-mode` <font color="#6B21A8">string</font>: Controls the downmix of audio to mono. Possible values are `MonoLeftMixdown`, `MonoRightMixdown`, and the default which is `Stereo`. Using this, two audio players can output to a single stereo output, one to the left channel, and the other to the right channel.

## Unimplemented Methods and Properties

- `preload`
- `buffered`
- `initialTime`
- `startOffsetTime`
- `controls`
- `played`
- `seekable`
- `tracks`

## Examples

```javascript
const audio_class = require("@brightsign/audio");
let audio_player = new audio_class();
audio_player.src = "/storage/sd/file.mp4"
audio_player.volume = .5;
audio_player.load();
audio_player.play();
```

```javascript
let setupAudio = (audio, setupObj) => {
   for (let [key, val] of Object.entries(setupObj)) {
      audio[key] = val;
   }
}

let interval = setInterval(()=>{}, 10000);
const audio_class = require("@brightsign/audio");
let audio = new audio_class();
let settings = {
   src: '/storage/sd/file.mp4',
   autoplay: true,
   loop: false,
   volume: .5,
   pcmaudio: "analog"
};
setupAudio(audio, settings);
audio.load();
audio.addEventListener("ended", () => {
   audio.src = '';
   audio = null;
   clearInterval(interval);
   process.exit(0);
});
```


[title] deviceinfo
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *deviceinfo* object lets you identify device hardware, firmware, and features.

**deviceinfo IDL**

```text
interface DeviceInfo {
    attribute String model;
    attribute String osVersion;
    attribute String bootVersion;
    attribute String serialNumber;
    attribute String family;
    
    int osVersionCompare(String version);
    int bootVersionCompare(String bootVersion);
    bool osVersionIsAtLeast(String version);
    bool bootVersionIsAtLeast(String bootVersion);
    bool hasFeature(String feature);
    Promise <String> getLoadStatistics(String item);
    Promise <TemperatureLocation> getTemperature();
    Promise <UsbTopologyInterface> getUsbTopology();
};

dictionary TemperatureLocation {
    float celsius;
};

interface UsbTopologyInterface {
    attribute String vid;
    attribute String pid;
    attribute String raw;
    attribute String fid;
    [optional] attribute String category;
    [optional] attribute String ident;
    attribute Array<UsbTopologyInterface> children;
};

```

## Object Creation

To create a *deviceinfo* object, load the `@brightsign/deviceinfo` module using the `require()` method. 

```javascript
diClass = require("@brightsign/deviceinfo");
di = new diClass(); 
```

## DeviceInfo

### getLoadStatistics()

```javascript
Promise <String> getLoadStatistics(String item)
```

Provides current performance information related to the Linux kernel. The `item` can be any of the following:

- `loadavg`: Provides information about system performance. The first three columns measure CPU and I/O utilization over the past 1, 5, and 10 minutes, respectively. The fourth column displays the number of currently running processes and the total number of processes. The last column displays the ID of the most recently used process.
- `meminfo`: Displays physical and swap memory usage
- `slabinfo`: Provides information about memory usage at the slab level
- `stat`: Provides overall statistics about the system (for example, the number of page faults since the system booted)
- `vmstat`: Displays detailed virtual memory statistics from the kernel
- `zoneinfo`: Provides overall statistics about the system, broken down by system Node
- `interrupts`: Displays which interrupts are in use and how many of each type there have been
- `version`: Provides the kernel version

### getTemperature()

```javascript
<TemperatureLocation> getTemperature()
```

Returns:

- `key` <font color="#704ae0">string</font>:  A dynamic string location key
- `value` <font color="#704ae0">float</font>: The device temperature as a floating point value

### getUsbTopology()

```javascript
<UsbTopologyInterface> getUsbTopology()
```

Gets the USB topology of the player.

These attributes return information about the BrightSign player:

- `model` <font color="#704ae0">string</font>: Returns the model name for the BrightSign device running the script, as a string (for example, "HD1020" or "XD230").
- `osVersion` <font color="#704ae0">string</font>: Returns the OS version number for the BrightSign device running the script.
- `bootVersion` <font color="#704ae0">string</font>: Returns the version number of the BrightSign boot firmware, also known as "safe mode", as a string (for example, "1.0.4").
- `serialNumber` <font color="#704ae0">string</font>: Returns the device serial number which, if not an empty string, is unique to the unit running the script.
- `family` <font color="#704ae0">string</font>: Returns a single string that indicates the family to which the device belongs. A device family is a set of models that are all capable of running the same firmware.

### osVersionCompare()

```javascript
int osVersionCompare(String version)
```

This function returns an integer greater than zero if the current OS version is greater than the parameter, 0 if it is exactly equal, or less than zero if lesser. For example:

```javascript
if (di.osVersionCompare("8.2") > 0) { console.log("Firmware version is greater than 8.2") }
```

or:

```javascript
if (di.osVersionCompare("8.4") < 0) { console.log("Firmware version is less than 8.4") }
```

### bootVersionCompare()

```javascript
int bootVersionCompare(String bootVersion)
```

This function returns an integer greater than zero if the current boot loader version is greater than the parameter, 0 if it is exactly equal, or less than zero if lesser (see the examples for `osVersionCompare()`). 

### osVersionIsAtLeast()

```javascript
bool osVersionIsAtLeast(String version)
```

Returns `True` if the BrightSign OS version on the device is greater than or equal to the version number represented by the passed string (for example, "4.0.13").

### bootVersionIsAtLeast()

```javascript
bool bootVersionIsAtLeast(String bootVersion)
```

Returns `True` if the BrightSign boot OS version on the device is greater than or equal to the version number represented by the passed string (for example, "4.4.22").

### GetBoardName()&#x20;

Provides the internal code name for the BrightSign player board. This is rarely useful and the exact response may change.

### hasFeature()

```javascript
bool hasFeature(String feature)
```

Returns `True` if the player feature in the passed string (which is passed as a case-insensitive string parameter) is present on the current device and firmware. The possible features that can be queried from the script are listed below:

:::hint{type="danger"}
If you pass a parameter other than one of those listed below, it may return False even if the feature is available on the hardware and firmware.
:::

- `"5v serial"`: A 5V serial port
- `"audio1"`: The first audio output
- `"audio2"`: A second audio output
- `"audio3"`: A third audio output
- `"brightscript1"`: BrightScript Version 1
- `"brightscript2"`: BrightScript Version 2
- `"component video"`: A component video output
- `"ethernet"`: An Ethernet interface
- `"gpio connector"`: A DA15 or Pheonix-style GPIO port 
- `"hdmi"`: An HDM&#x49;**®** output
- `"hdmi input"`: An HDMI input
- `"hevc_decode"`: An H.265 video decoder
- `"media_decryption"`: The ability to decrypt AES-encrypted media, including video, image, and audio files.
- `"nand storage"`: NAND storage for the boot loader and firmware
- `"networking"`: Any form of networking capability. A False return may indicate that no network is currently available.
- `"reset button"`: A reset button
- `"registry"`: On-board persistent storage
- `"rtc"`: A real-time clock (RTC)
- `"sd"`: SD- or SDHC-compatible storage
- `"sdhc"`: SDHC-compatible storage only
- `"serial port 0"`: The first serial port
- `"serial port 1"`: A second serial port
- `"serial port 2"`: A third serial port
- `"svc button"`: A service ("SVC") button. Passing the legacy term `"gpio12 button"` will yield the same result.
- `"usb"`: One or more USB interfaces
- `"vga"`: A VGA output
- `"video_encoder"`: A video encoder/transcoder

## TemperatureLocation

- `celsius` <font color="#704ae0">float</font>: Returns the temperature of the device in celsius, as a floating point number.

## UsbTopologyInterface

These attributes return the USB topology of the player, which can be used to determine whether certain USB devices are connected to certain ports. 

- `vid` <font color="#704ae0">string</font>: Four character strings encoding the Vendor ID and Product ID in hexadecimal.  Leading zeros are present and alpha characters are lower case (for example, vid = "0b95").
- `pid` <font color="#704ae0">string</font>: Four character strings encoding the Vendor ID and Product ID in hexadecimal.  Leading zeros are present and alpha characters are lower case (for example, pid = "0b95").
- `raw` <font color="#704ae0">string</font>: This is an internal (Linux) USB device node ID.
- `fid` <font color="#704ae0">string</font>: Ports that have USB devices connected to them will include a `fid` (friendly ID) value, which can be used to determine which physical port the USB device is connected to on the player. See [roDeviceInfo](docId\:uTKDmpos1ulxaoYLx1nS6) for more information. 
- `category` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: This optional string describes the device type (for example, "HUB", "SERIAL", "NET", "HID", "AUDIO", or "OTHER").
- `ident` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: This is an additional identifier. For devices of category "NET", the `ident` is the system network interface name (for example, "usb0").
- `children` <font color="#704ae0">Array&lt;&lt;UsbTopologyInterface&gt;</font> <font color="#01a0af">optional</font>: Children are present for devices of category "HUB". Child devices have the same structure, so nested hubs will produce nested child data.

## Example

This example returns the USB topology for the device:

```javascript
diClass = require("@brightsign/deviceinfo");
di = new diClass();
 
usbTopology = await di.getUsbTopology();
 
parseTopology = function(usbT) {
  for(i in usbT) {
    let device = usbT[i];
    if (device.category === "HUB")
        parseTopology(device.children);   
    if (device.category === "NET")
        console.log("Found " + device.fid + " interface " + device.ident);
  }
};
 
parseTopology(usbTopology);
```

To replace BSDeviceInfo with the *deviceinfo* object:

```javascript
if (typeof(BSDeviceInfo) === typeof undefined) 
{
  global.BSDeviceInfo = class BSDeviceInfo {
    constructor() {
      let fs = require('fs');
      let DeviceInfoClass = require('@brightsign/deviceinfo');
      let deviceInfo = new DeviceInfoClass();

      // Map properties and getters
      this.model = deviceInfo.model;
      this.version = deviceInfo.osVersion;
      this.bootVersion = deviceInfo.bootVersion;
      this.deviceUniqueId = deviceInfo.serialNumber;
      this.family = deviceInfo.family;
      Object.defineProperty(this, 'deviceUptime', {
          get: Object.getOwnPropertyDescriptor(deviceInfo, 'deviceUptime').get,
          enumerable: true,
      });
      // And methods
      this.VersionCompare = deviceInfo.osVersionCompare;
      this.BootVersionCompare = deviceInfo.bootVersionCompare;
      this.FirmwareIsAtLeast = deviceInfo.osVersionIsAtLeast;
      this.BootFirmwareIsAtLeast = deviceInfo.bootVersionIsAtLeast;
      this.HasFeature = deviceInfo.hasFeature;
      this.GetLoadStatistics = function(s) {
        let stats = new Set([ 'zoneinfo', 'loadavg', 'meminfo', 'stat', 'vmstat', 'interrupts', 'version', 'boardid' ]);
        var result  = 'n/a';
        if (stats.has(s)) {
          result = fs.readFileSync('/proc/' + s).toString();
        }
        return result;
      };
      // GetTemperature and GetUsbTopology are not present in the BSDeviceInfo class
    };
  };
}
```


[title] JavaScript Event Handling
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

## AddEventListener

`addEventListener()` is a common BrightSign method that is used to listen for an event.

### Syntax:

```javascript
target.addEventListener(type, listener);
```

- `type` <font color="#6B21A8">string</font>: Specifies the type of event to listen for
- `listener` <font color="#6B21A8">function</font>: The object to be notified when the event (of the specified `type`) happens 

## RemoveEventListener

`removeEventListener()`is a common BrightSign method that is used to remove an event listener.

### Syntax:

```javascript
target.removeEventListener(type, listener);
```

- `type` <font color="#6B21A8">string</font>: Specifies the type of event to listen for
- `listener` <font color="#6B21A8">function</font>: The object to be notified when the event (of the specified `type`) happens 

## Example

```javascript
function GPIOcontrolDown(msg){

    console.log(JSON.stringify(msg)); 
    console.log(" GPIO : " + msg.detail)
}

// to add an event listener for the "controldown" GPIO event

control_port.addEventListener("controldown", GPIOcontrolDown);

// to remove the "controldown" GPIO event listener

control_port.removeEventListener("controldown", GPIOcontrolDown);
```


[title] B-Deploy Device Endpoints (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/

These endpoints allow users to automatically provision BrightSign players over the internet. This endpoint handles everything regarding *individual* players if you add your serial number to BrightSign’s cloud storage with an associated player name, provisioning package name, and the URL where the provisioning package is hosted. The URL is optional - it can be left blank if using a setup package.

Base URL for these endpoints:  ***https\://provision.bsn.cloud/rest-device/v2/device/***

***

# GET 

Retrieves a collection of provision records which belong to your network in B-Deploy

**URL Parameters**

- `query[NetworkName]` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The BSN.Cloud/BSN.com network name
- `sort[serial]` <font color="#704ae0">byte</font> <font color="#01a0af">optional</font>: A flag which defines whether the returned list should be sorted by player serial
- `page[pageNum]` <font color="#704ae0">number</font> <font color="#01a0af">optional</font>: An index of a page in the paged list to retrieve
- `page[pageSize]` <font color="#704ae0">number</font> <font color="#01a0af">optional</font>: The maximum number of provision records on a page in the paged list

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request** **Example**

- `query[NetworkName]` is set to `JaneDoeNetwork`
- `sort[serial]` is set to `1`
- `page[pageNum]` is set to `1`
- `page[pageSize]` is set to `20`

```text
GET /rest-device/v2/device/?query%5BNetworkName%5D=JaneDoeNetwork&sort%5Bserial%5D=1&page%5BpageNum%5D=1&page%5BpageSize%5D=20 HTTP/1.1
Host: provision.bsn.cloud
Connection: Keep-Alive
Authorization: {{Bearer Token}}
Accept: application/json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a paged list of [Provision Record Entity  (v2)](docId\:OS9Y0aZ6JykvQYbB9vujv)&#x20;

**Response Example**

```json
{
   "error": null,
   "result":    {
      "total": 1,
      "matched": 1,
      "players":       [
                  {
            "_id": "1a2b3c4d5e6f7a8b9c0d1e2f",
            "client": "baconnected",
            "NetworkName": "JaneDoeNetwork",
            "username": "JaneDoe@brightsign.biz",
            "serial": "123456789012",
            "name": "My Player",
            "model": "XC4055",
            "desc": "Brand New Player",
            "setupName": "My Setup Package",
            "createdAt": "2024-08-25T13:38:00.042Z",
            "updatedAt": "2024-08-25T13:38:00.042Z",
            "__v": 0
         }
      ],
      "priv": "user"
   }
}
```

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method.

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

# GET  /?\_id=\{string}

Retrieves a provision record from B-Deploy which has the specified ID.

**Query String Parameter**

- `_id` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The unique identifier of the provision record to retrieve. If this parameter is not included in the URL, the GET request will return all provision records associated with the account

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request** **Example**

- `_id` is set to `1a2b3c4d5e6f7a8b9c0d1e2f`

```none
GET /rest-device/v2/device/?_id=1a2b3c4d5e6f7a8b9c0d1e2f HTTP/1.1
Host: provision.bsn.cloud
Connection: Keep-Alive
Authorization: {{Bearer Token}}
Accept: application/json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#0F766E">200</font>: Returns the specified [Provision Record Entity  (v2)](docId\:OS9Y0aZ6JykvQYbB9vujv)&#x20;

**Response Example**

```json
{
   "error": null,
   "result":    {
      "_id": "1a2b3c4d5e6f7a8b9c0d1e2f",
      "client": "baconnected",
      "NetworkName": "JaneDoeNetwork",
      "username": "JaneDoe@brightsign.biz",
      "serial": "ABCD00000001",
      "name": "ProvisionTest",
      "model": "XC4055",
      "desc": "Brand New Player",
      "setupName": "My Setup Package",
      "createdAt": "2024-08-25T13:38:00.042Z",
      "updatedAt": "2024-08-25T13:38:00.042Z",
      "__v": 0
   }
}
```

**Failure Response**

<font color="#B91C1C">400</font>: The request is malformed and therefore invalid

<font color="#B91C1C">401</font>: The access token is invalid or not specified

<font color="#B91C1C">403</font>: The supplied access token, though valid, doesn't provide access to this method.

<font color="#B91C1C">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#B91C1C">5XX</font>: Any 500 code is an internal server error

# GET  /?serial=\{string}

Retrieves a provision record from B-Deploy created for a player having the specified serial.

**Query String Parameter**

- `serial` <font color="#704ae0">string </font><font color="#01a0af">required</font>: The serial of a player which is specified by a provision record. If this parameter is not included in the URL, the GET request will return all provision records associated with the account

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request** **Example**

- `serial` is set to `ABCD00000001`

```none
GET /rest-device/v2/device/?serial=ABCD00000001 HTTP/1.1
Host: provision.bsn.cloud
Connection: Keep-Alive
Authorization: {{Bearer Token}}
Accept: application/json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#0F766E">200</font>: Returns the specified [Provision Record Entity  (v2)](docId\:OS9Y0aZ6JykvQYbB9vujv)&#x20;

**Response Example**

```json
{
   "error": null,
   "result":    {
      "total": 1,
      "matched": 1,
      "players":       [
                  {
            "_id": "1a2b3c4d5e6f7a8b9c0d1e2f",
            "client": "baconnected",
            "NetworkName": "JaneDoeNetwork",
            "username": "JaneDoe@brightsign.biz",
            "serial": "ABCD00000001",
            "name": "ProvisionTest",
            "model": "XC4055",
            "desc": "Brand New Player",
            "setupName": "My Setup Package",
            "createdAt": "2024-08-25T13:38:00.042Z",
            "updatedAt": "2024-08-25T13:38:00.042Z",
            "__v": 0
         }
      ],
      "priv": "user"
   }
}
```

**Failure Response**

<font color="#B91C1C">400</font>: The request is malformed and therefore invalid

<font color="#B91C1C">401</font>: The access token is invalid or not specified

<font color="#B91C1C">403</font>: The supplied access token, though valid, doesn't provide access to this method.

<font color="#B91C1C">5XX</font>: Any 500 code is an internal server error

# POST 

Creates a provision record for a specific player and refers to either a setup package stored in B-Deploy or provided by an external service.

**Request Body**

- `username` <font color="#704ae0">string </font><font color="#01a0af">required</font>: The login of the person who owns the record. Note that the person may or may not be registered in BSN.Cloud.
- `serial` <font color="#704ae0">string </font><font color="#01a0af">required</font>: The serial number of the player represented by the provision record
- `name` <font color="#704ae0">string </font><font color="#01a0af">optional</font>: The name that the target player will get as a result of provisioning. When specified, it overrides the values specified in the referenced setup package.
- `NetworkName` <font color="#704ae0">string </font><font color="#01a0af">required</font>: The name of the network to which the specified player should be provisioned
- `model` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The model of the player which has the specified serial
- `desc` <font color="#704ae0">string </font><font color="#01a0af">optional</font>:  The description that the target player will get in result of provisioning. When specified, it overrides the values specified in the referenced setup package.
- `setupId` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The unique identifier of the setup package stored in B-Deploy and managed using the PSS API documented in [B-Deploy Setup Endpoints (v2)](docId\:XgMcFQZr1PdBve-TQeQxB)&#x20;
- `setupName` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The descriptive name of a setup package stored in B-Deploy and managed using the PSS API documented in [B-Deploy Setup Endpoints (v2)](docId\:XgMcFQZr1PdBve-TQeQxB)&#x20;
- `url` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The URL from which the player will download its presentation as part of the final provisioning step
- `userdata` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: Allows you to allows you to provide additional attributes to a custom setup package

**Request** **Example**

```text
POST /rest-device/v2/device HTTP/1.1
Host: provision.bsn.cloud
Content-Type: application/json
Authorization: {{Bearer Token}}
Accept: application/json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 252
```

This is an example request body with a `setupId` and `setupName`:

```json
{
  "username": "JaneDoe@brightsign.biz",
  "serial": "ABCD00000001",
  "name": "ProvisionTest",
  "NetworkName": "Test",
  "model": "XC4055",
  "desc": "Jane's player",
  "setupId": "f2e1d0c9b8a7f6e5d4c3b2a1",
  "setupName": "My Setup Package",
  "userdata": ""
}
```

This is an example request body with a `url`:

```json
{
  "username": "JaneDoe@brightsign.biz",
  "serial": "ABCD00000001",
  "name": null,
  "NetworkName": "Test",
  "model": "XC4055",
  "desc": "Jane's player",
  "userdata": "key=value",
  "url": "https://provisiondemo.brightsignnetwork.com/autorun.zip"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">201</font>: Returns the unique identifier of a provision record created in B-Deploy and added to your network

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

# PUT  /?\_id=\{string}

Modifies a provision record of a specified player in B-Deploy

**Request Body**

- `_id` <font color="#704ae0">string</font><font color="#01a0af"> required</font>: The unique identifier (a 24 digits-long hexadecimal number) of the device object
- `username` <font color="#704ae0">string </font><font color="#01a0af">required</font>: The login of the person who owns the record. Note that the person may or may not be registered in BSN.Cloud.
- `serial` <font color="#704ae0">string </font><font color="#01a0af">required</font>: The serial number of the player represented by the provision record&#x20;
- `name` <font color="#704ae0">string </font><font color="#01a0af">optional</font>: The name that the target player will get as a result of provisioning. When specified, it overrides the values specified in the referenced setup package.
- `NetworkName` <font color="#704ae0">string </font><font color="#01a0af">required</font>: The name of the network to which the specified player should be provisioned
- `model` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The model of the player which has the specified `serial`
- `desc` <font color="#704ae0">string </font><font color="#01a0af">optional</font>: The description that the target player will get as a result of provisioning. When specified, it overrides the values specified in the referenced setup package.
- `setupId` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The unique identifier of the setup package stored in B-Deploy and managed using the PSS API documented on [this page](docId\:XgMcFQZr1PdBve-TQeQxB).&#x20;
- `setupName` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The descriptive name of a setup package stored in B-Deploy and managed using the PSS API documented on [this page](docId\:XgMcFQZr1PdBve-TQeQxB).
- `url` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: Refers to the setup package or handler provided by external services, like partner applications.
- `userdata` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: An optional property which allows you to provide additional attributes to a custom setup package

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request** **Example**

This method requires an `url` property value with an absolute URL value format or a pair of `setupId` and `setupName` property values.

```text
PUT /rest-device/v2/device/ HTTP/1.1
Host: provision.bsn.cloud
Content-Type: application/json
Authorization: {{Bearer Token}}
Accept: application/json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 283
```

This is the `url` example request body:

```json
{
  "_id": "1a2b3c4d5e6f7a8b9c0d1e2f",
  "username": "JaneDoe@brightsign.biz",
  "serial": "ABCD00000001",
  "name": "ProvisionTest",
  "NetworkName": "Test",
  "model": "XC4055",
  "desc": "Jane's player",
  "url": "https://www.janeplayers.com/setups/autorun.zip",
  "userdata": "key=value"
}
```

This is the `setupId` and `setupName` example request body:

```json
{
  "_id": "1a2b3c4d5e6f7a8b9c0d1e2f",
  "username": "JaneDoe@brightsign.biz",
  "serial": "ABCD00000001",
  "name": "ProvisionTest",
  "NetworkName": "Test",
  "model": "XC4055",
  "desc": "Jane's player",
  "setupId": "f2e1d0c9b8a7f6e5d4c3b2a1",
  "setupName": "My Setup Package",
  "userdata": ""
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: The existing provision record properties have been updated.

**Failure Response**

<font color="#9a0808">400</font>: Either the request or request body is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

# DELETE  /?\_id=\{string}

Removes a provision record having the specified ID in B-Deploy

**Query String Parameter**

- `_id` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The player database record identifier

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request** **Example**

- `_id` is set to `1a2b3c4d5e6f7a8b9c0d1e2f`

```text
DELETE /rest-device/v2/device/?_id=1a2b3c4d5e6f7a8b9c0d1e2f HTTP/1.1
Host: provision.bsn.cloud
Content-Type: application/json
Authorization: {{Bearer Token}}
Accept: application/json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: The specified provision record has been removed

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#B91C1C">404</font>: A provision record with the specified ID does not exist

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error



# DELETE  /?serial=\{string}

Removes a provision record related to a player having the specified serial number in B-Deploy

**Query String Parameter**

- `serial` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The player serial

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request** **Example**

- `serial` is set to `ABCD00000001`

```text
DELETE /rest-device/v2/device/?serial=ABCD00000001 HTTP/1.1
Host: provision.bsn.cloud
Content-Type: application/json
Authorization: {{Bearer Token}}
Accept: application/json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: The specified provision record has been removed

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#B91C1C">404</font>: A provision record with the specified serial number does not exist

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error



# DELETE  /ids/\{array}

Removes a collection of provision records having the specified identifiers in B-Deploy

**Segment**

`array` <font color="#704ae0">string[]</font>

An array of provision record identifiers

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request** **Example**

- `array` is set to ` ["1a2b3c4d5e6f7a8b9c0d1e2f"]`

```text
DELETE /rest-device/v2/device/ids/["1a2b3c4d5e6f7a8b9c0d1e2f"] HTTP/1.1
Host: provision.bsn.cloud
Connection: Keep-Alive
Authorization: {{Bearer Token}}
Accept: application/json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: The request is executed successfully and the indication of which records have been removed is in the response payload.&#x20;

**Response Example**

```json
{
   "error": null,
   "result":    {
      "deletedCount": 1,
      "deletedIds": ["1a2b3c4d5e6f7a8b9c0d1e2f"],
      "failedIds": [],
      "message": "All players were deleted successfully"
   }
}
```

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] compositor
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *compositor* object allows you to perform actions related to the video compositor.

**compositor IDL**

```text
interface Compositor {
    void pause(int timeout_ms);
    void resume();
    int getCrc();
};
```

## Object Creation

To create a *compositor* object, first load the `brightsign/compositor` module using the `require()` method. Then create an instance of the *screenshot* class.

```javascript
var CompositorClass = require("@brightsign/compositor");
var compositor = new CompositorClass();
```

## Compositor

### pause()

```javascript
void pause(int timeout_ms) 
```

Suspends graphics compositor updates for the specified number of milliseconds (or until the `resume()` method is called), up to a maximum interval of 10 seconds. While the graphics compositor is paused, no visual elements will be updated (except for [HWZ Video](docId\:e6uJleH69Q0JmMv8kyTrp), [scrolling tickers](docId\:GQeNKTmmFazEjdlZHttIZ), and off-screen Chromium textures). Use this method to combine intensive graphics and layout operations into a single v-sync update.

### resume()

```javascript
void resume()
```

Resumes the graphics compositor if it has been paused with the `pause()` method.

### getCrc()

```javascript
int getCrc()
```

Returns the CRC of the Y and Cb signals as a single integer. This method allows the script to compare two moments in the graphics output: If the return values differ, then the output is not identical.

[title] hostconfiguration
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *hostconfiguration* object allows you to retrieve information about network interfaces and Internet connectivity.

**hostconfiguration IDL**

```javascript
interface NetworkHost {
    HostConfig defaultConfig();
    Promise<HostConfig> getConfig();
    Promise<void> applyConfig(HostConfigWritable config);
};

interface HostConfig {
    [optional] attribute String proxy;
    [optional] attribute Array<String> proxyBypassList;
    [optional] attribute Array<String> timeServerList;
    [optional] attribute String timeServerInterval;
    [optional] attribute String hostName;
	[optional] attribute bool loginPassword;
    [optional] attribute bool forwardingEnabled;
    [optional] attribute bool masqueradingEnabled;
	[optional] attribute Array<NatRule> natList;
	[optional] attribute Array<String> sshAuthorizedKeys;
};

interface HostConfigWritable : HostConfig {
    [optional] attribute String[or bool] loginPassword;
    [optional] attribute String[or bool] obfuscatedLoginPassword;
};

interface NatRule {
    attribute NatRuleMatch match;
    attribute NatRuleReplacement replace;
};

interface NatRuleMatch {
    attribute String protocol;
    [optional] attribute String sourceAddressRange;
    attribute String destinationAddressRange;
    attribute unsigned short destinationPort;
};

interface NatRuleReplacement {
    attribute String destinationAddress;
    attribute unsigned short destinationPort;
};
```

## Object Creation

To create a *hostconfiguration* object, first load the `brightsign/hostconfiguration`  module using the `require()` method. Then create an instance of the *hostconfiguration*  class.

```javascript
var HostConfigurationClass = require("@brightsign/hostconfiguration");
var hc = new HostConfigurationClass();
```

## NetworkHost

Use this interface to retrieve and modify host configuration.

### getConfig()

```javascript
Promise<HostConfig> getConfig() 
```

Returns a `HostConfig` interface containing current host-configuration information:

- `proxy` <font color="#704ae0">String</font>: The proxy server used for HTTP, HTTPS, and FTP requests.&#x20;
- `proxyBypassList` <font color="#704ae0">String</font>: A list of hosts exempted from the proxy setting
- `timeServerList` <font color="#704ae0">String</font>: A list of time servers. See [roNetworkConfiguration.SetTimeServer()](docId\:U6ZceYQddlz9xdAKtTmJs) for more information.
- `timeServerInterval` <font color="#704ae0">String</font>: how often the player communicates with the time server and adjust its clock. A value of 0 specifies the default interval (12 hours).&#x20;
- `hostName` <font color="#704ae0">String</font>: The device host name
- `loginPassword` <font color="#704ae0">bool</font>: Whether a login password has been set for the SSH connection.
- `forwardingEnabled ` <font color="#704ae0">bool</font>: Enables or disables IP forwarding. If`false`, no IP forwarding takes place.&#x20;
- `masqueradingEnabled ` <font color="#704ae0">bool</font>: Enables or disables address translation with IP forwarding. If `forwarding_enabled` is `true`, `masquerading_enabled` must be specified as `true` or `false`. 
  - If `forwarding_enabled` is `true` and `masquerading_enabled` is `false`, IP datagrams are forwarded between all interfaces and no address translation is done. 
  - If `forwarding_enabled` is `true` and `masquerading_enabled` is `true`, IP datagrams are forwarded between all interfaces but SNAT is applied to any datagrams which are sent out of an "upstream" interface. For this purpose, an "upstream" interface is any one on which a default route is set. Note that there can be more than one such interface. Datagrams which are destined for an interface that has no default route are forwarded without NAT. 
- `natList `<font color="#704ae0">Array &lt;NatRule&gt;</font>:
- `sshAuthorizedKeys` <font color="#704ae0">Array&lt;String&gt;</font>: An array of authorized public key strings. The same property can be passed to the `applyConfig()` method to set the authorized public keys. Available as of BOS 10.0.11.

### applyConfig()

```javascript
Promise<void> applyConfig(HostConfigWritable config)
```

Applies host-configuration settings to the player. This method accepts a `HostConfigWritable` interface.

The `config` parameter should contain the complete desired configuration. Any previous configuration is overwritten. If you wish to change one item while keeping the rest of the configuration the same, then call `getConfig` and modify the returned object (see the example in the Examples section).

## HostConfig

This interface contains host configuration parameters:

- `proxy` <font color="#704ae0">String</font>:  The name or address of the proxy server used for HTTP and FTP requests. The proxy string should be formatted as "http\://user\:password\@hostname\:port". The hostname can contain up to four "\*" characters; each "\*" character can be used to replace one octet from the current IP address. For example, if the IP address is currently 192.168.1.2, and the proxy is set to "proxy-\*-\*", then the player will attempt to use a proxy named "proxy-192-168".
- `proxyBypassList` <font color="#704ae0">Array</font><font color="#704ae0">&lt;String&gt;</font>: A list of hostnames exempted from the proxy setting. The player will attempt to reach the specified hosts directly rather than using the proxy specified in the `proxy` attribute. For example, the hostname "example.com" would exempt "example.com", "example.com:80", and "www\.example.com" from the proxy setting.
- `timeServerList` <font color="#704ae0">Array</font><font color="#704ae0">&lt;String&gt;</font>: An array containing zero or one time servers to be used by the player. An empty array disables automatic setting of the player's clock. A single entry indicates the time server and protocol that should be used as a URL. Supported protocols are HTTP, HTTPS and NTP. For backward-compatibility the use of just a host name is supported and indicates that NTP should be used. Note that when using HTTPS, host and peer verification are disabled since the player clock may not be correct. The following are valid time server addresses:
  - http\://time.brightsignnetwork.com/
  - https\://time.brightsignnetwork.com/
  - ntp\://time.brightsignnetwork.com/
  - time.brightsignnetwork.com
- `timeServerInterval` <font color="#704ae0">String</font>: A value specifying how often (in seconds) the player should communicate with the time server to adjust its clock. The default interval is 12 hours. The minimum interval allowed is 120 seconds.
- `hostName` <font color="#704ae0">String</font>: The player host name. If no host name has been explicitly set, then a host name is automatically generated based on the device serial number. Passing an empty string to this method resets the device host name to its automatically generated value.
- `loginPassword` <font color="#704ae0">bool</font>: A value of `true` means that the password exists, `false` means that there is no password.
- `forwardingEnabled`  <font color="#704ae0">bool</font>: Enables or disables IP forwarding. IP forwarding is disabled (`false`) by default.
- `masqueradingEnabled` <font color="#704ae0">bool</font>: Enables or disables source address translation with IP forwarding. If `forwardingEnabled` is true, `masqueradingEnabled` must be specified as true or false:
  - If `masqueradingEnabled` is false, IP datagrams are forwarded between all interfaces and no address translation is done. 
  - If `masqueradingEnabled` is true, IP datagrams are forwarded between all interfaces, but [SNAT](https://ipwithease.com/snat-vs-dnat/) is applied to any datagrams which are sent out of an "upstream" interface (any interface or interfaces on which a default route is set). Datagrams destined for an interface that has no default route are forwarded without [NAT](https://ipwithease.com/snat-vs-dnat/). 
- `natList` <font color="#704ae0">Array&lt;NatRule&gt;</font>: A list of [DNAT](https://ipwithease.com/snat-vs-dnat/) rules which lets users change the destination address and port of a packet.

## HostConfigWritable

This interface contains password settings for SSH. When writing settings using the `applyConfig()` method, some members of the `HostConfig` interface have special behavior.

- `loginPassword` <font color="#704ae0">String</font> or <font color="#704ae0">bool</font>:&#x20;
  - If a string is supplied, sets a plain-text login password for the SSH connection (note that SSH must also be enabled separately in the registry for this to be useful).
  - If boolean `True` is supplied, the existing password (if any) is left unchanged.
  - If boolean `False` is supplied, any existing password is removed.
- `obfuscatedLoginPassword` <font color="#704ae0">String</font> or <font color="#704ae0">bool</font>:&#x20;
  - As above, except that the password should previously have been obfuscated using a shared secret. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.&#x20;

This behavior ensures that code such as `getConfig().then((c) => { applyConfig(c); })` preserves any existing password, even though the password itself is not returned by `getConfig()`.

## NatRuleMatch

The rules in this interface are compared to destinations in the TCP or UDP packets that enter the player. If the packet fields match the properties established in `NatRuleMatch`, the destination IP and port will be overwritten with the desired values in the `NatRulesReplacement` interface.

- `protocol` <font color="#704ae0">String</font>: Filter for "udp" or "tcp" (the entry must be lower case).
- `sourceAddressRange` <font color="#704ae0">String</font> <font color="#01a0af">optional</font>: Filter for this range of source IP addresses (in [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#:~\:text=CIDR%20introduced%20a%20new%20method,db8%3A%3A%2F32%20for%20IPv6.) format). Traffic from all source IP addresses will be included if this optional attribute is not specified. 
- `destinationAddressRange` <font color="#704ae0">String</font>: The range of destination IP addresses (in [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#:~\:text=CIDR%20introduced%20a%20new%20method,db8%3A%3A%2F32%20for%20IPv6.) format) to be overwritten.
- `destinationPort` <font color="#704ae0">unsigned short</font>: The destination port to be overwritten.

## NatRuleReplacement

The address and port properties specified in `NatRuleReplacement` are written to the packet to replace selected IP address and port properties. 

- `destinationAddress` <font color="#704ae0">String</font>: The IP address that will replace the previous IP address in the destination.
- `destinationPort` <font color="#704ae0">unsigned short</font>: The port that will replace the previous port in the destination.

## Examples

The following script uses the `applyConfig()` method to set the hostname, time server, and time-server refresh interval:

```javascript
var HostConfigurationClass = require("@brightsign/hostconfiguration");
var hc = new HostConfigurationClass();

var configData = {};
configData.hostName = "myplayer";
configData.proxy = "";
configData.proxyBypassList = [];
configData.timeServerInterval = 1200;
configData.timeServerList = ["time.brightsignnetwork.com"];

console.log("***Configuring Host***")
hc.applyConfig(configData).then(
        function() {
            console.log("Success");
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        }); 
```

To change one item while keeping the rest of the configuration the same, call `getConfig` and modify the returned object:

```javascript
  var HostConfiguration = require('@brightsign/hostconfiguration');
  var hostConfiguration = new HostConfiguration;
  hostConfiguration.getConfig()
  .then(function(config) {
    config.hostName = "host-brightsign";
    hostConfiguration.applyConfig(config);
  })
  .then(function() {
    console.log("Success");
  })
  .catch(function(error) {
    console.log(`${JSON.stringify(error)}`);
  });
```


[title] Cloud APIs
[path] /

BrightSign cloud APIs can be categorized as follows:

- **Basic Authorization APIs** control access to all of the BSN.Cloud or BrightSignNetwork.com resources in your network.
- **B-Deploy (Provisioning) APIs** provide tools for managing automated deployment packages.
- **BSN.Cloud and .com Service APIs** expose the functionality of our BrightAuthor and BrightSign Author content management systems and let you monitor and manage BrightSign players.

Note that the diagrams below describe BSN.Cloud servers and APIs, but BrightSignNetwork.com servers and APIs work in the same way.

## Basic Authorization APIs

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/92W-fLmSY_lKgLqyFLu5c_screenshot-2026-08-04-at-120003-pm.png" size="70" isUploading="false" width="3369" height="1287" darkWidth="3369" darkHeight="1287" showCaption="false"}

An [OAuth](docId:0QHiBo6rAs8zwYJybEH0R) (bearer) token gives users authorization to communicate with APIs and send requests to the B-Deploy or Remote DWS APIs.

- Use this API to get a Person OAuth2 Access/Refresh token, which returns list of networks. Then, as an authenticated user, you can send a User OAuth2 Access/Refresh token to the correct network. This allows you to access the network within the scope of what you are allowed to do. 
- This API returns either a valid token that gives you access to any version of the BSN.Cloud APIs, or a valid token that gives you access to any version of the BrightSignNetwork.com APIs.
- The BSN.Cloud and BrightSignNetwork.com base URLs are:
  - ***https\://api.bsn.cloud/*&#xA0;**
  - ***https\://api.brightsignnetwork.com/***

## B-Deploy (Provisioning) APIs

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/RmeKp6Rxpy3NASXpZqcrS_screenshot-2026-08-04-at-20742-pm.png)

[B-Deploy/Provisioning APIs](docId\:wccw4TQERZPXV7KJq_a3P) are available through BSN.Cloud for automated deployment of players in the field. These APIs deliver the setup to players and allow creation and modification of the setup packages. They consist of Provisioning Server and Provisioning Setup Server APIs:

- The Provisioning Server (PVS) returns an URL when given a serial number for any BSN.Cloud or BSN connected device. The PVS provides only REST APIs.
- The Provisioning Setup Server (PSS) stores and serves setup packages, presentation packages and firmware updates. The PSS provides a UI (in addition to REST APIs), which makes calls to PVS to add and retrieve serial numbers and URLs. 

## BSN.Cloud and .com Service APIs

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/pUOm4vAIkvMrSl_Mw6aQg_serviceapis-copy.png" size="70" width="1850" height="600" position="center" alt="ServiceAPIs copy.png" darkWidth="1850" darkHeight="600" showCaption="false"}

These APIs expose the functionality of our BrightAuthor Classic and BrightSign Author content management systems using a standard set of endpoints, entities, and methods. Developers can use these APIs to build custom content management interfaces with some or all of the features that we have developed for our own content management system. These APIs can also be used for device/fleet management.

[BSN.Cloud APIs](docId\:gOEMCi9nmvGAktTR5qcjs) allow users of our cloud-based infrastructure to interact with networked BrightSign players. Partners can use the BSN.Cloud APIs with or without their own servers. 

[BrightSignNetwork.com APIs](docId\:Xtw-9AuVyFZy6WH_UbH26) use the older BrightSign network to interact with BrightSign players.

[title] Version 3.0 B-Deploy Endpoints
[path] Cloud APIs/B-Deploy/Provisioning APIs/

Version 3.0 of these APIs contains additional support for multiple network interfaces through the [Network](docId\:q84eMT6M9gGAJ8SmUtPQ7) object. For player endpoints, see [B-Deploy Device Endpoints (v2)](docId\:qykjITwSX9S_QLy0KxCrZ). Version 3.0 B-Deploy APIs only contain Setup endpoints.

The two key updates in this version are:

- The order of network interfaces indicating interface priority (cf. interface metric)
- Forward compatible support for new and existing interfaces. The common interfaces are:
- `ppp0` ([BrightSign Cellular Modem](https://www.brightsign.biz/brightsign-players/accessories/))
- `wifi`
- `ethernet`
- `usb ethernet`
- `bridge`

See [this page](docId:7Yk3I2x7TWfjHoyUEmv3a) for more information about network interface priorities.

[title] keyboard
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *keyboard* object allows you to configure the input for a USB keyboard connected to the player.

**keyboard IDL**

```text
interface keypress {
    attribute String type;
    attribute Number keyCode;
    attribute String key;
};

callback KeyboardEventCallback = void (keypress event);

interface Keyboard {
    Promise<bool> isAttached();
    Promise<void> setLayout(String layoutName);
    Promise<void> setNumLock(bool on_off);
    
    void addEventListener(String type, KeyboardEventCallback callback);
    void removeEventListener(String type, KeyboardEventCallback callback);
};
```

## Object Creation

To create a *keyboard* object, first load the `brightsign/keyboard` module using the `require()` method. Then create an instance of the *keyboard* class.

```javascript
var keyboardClass = require("@brightsign/keyboard");
var keyboard = new keyboardClass();
```

## Keypress

This interface contains the following parameters:

- `type` <font color="#704ae0">String</font>: Type is always “keypress”
- `keyCode` <font color="#704ae0">Number</font>: The ASCII keycode as number
- `key` <font color="#704ae0">String</font>: The ASCII character for the keyboard event

## Keyboard

This interface allows for detection and configuration of a USB keyboard.

### isAttached()

```javascript
Promise<bool> isAttached()
```

Returns `true` if a USB keyboard is connected to the player. This method counts a connected device as a keyboard if it reports having the following keys: "A", "Z", "0", "9", ".", and Enter.

### setLayout()

```javascript
Promise<void> setLayout(String layoutName)
```

Specifies the localized layout for the attached USB keyboard. This setting takes effect immediately and persists in the registry after a reboot. See [this table](docId\:VNJf6GnS75_lMizET3b1y) for valid keymap parameters (players are set to "us" by default).

### setNumLock()

```javascript
Promise<void> setNumLock(bool on_off)
```

Sets the numlock state for the attached USB keyboard if passed `true`. Reset the state if passed `false`.

## Example

```javascript
var KeyboardClass = require("@brightsign/keyboard");
var keyboard = new KeyboardClass();
keyboard.isAttached().then(
        function(data) {
            console.log("***Is Attached***");
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });
keyboard.setLayout("gb").then(
        function(data) {
            console.log("***Layout set***");
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        }); 
```


[title] Device Setup Entity  (v3)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 3.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v3)/

The Device Setup entity contains the following required properties:

- `version` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: This value should be "3.0.0"
- `_id` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The id of the device Setup object. This is only required for a “PUT” call (not “POST”).
- `bDeploy` <font color="#704ae0">object</font> <font color="#01a0af">required</font>: A [Ownership Info Entity (v3)](docId\:T4FiE7rScbtPG11t1-GKF)&#x20;
- `setupType` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The player Setup type which is one of "legacyLfn", "localToBsn", "lfn", "sfn", "partnerApplication", "standalone", or "bsn"
- `bsnDeviceRegistrationTokenEntity`  <font color="#704ae0">object</font> <font color="#01a0af">required</font>: A [Token Entity (v3)](docId\:xFtPKROWdWpe6DqhYNwfE).
- `timeZone` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The time zone (for example, "PST"). See [this page](docId\:HWR0ZojGTZxXnUHDLHlf9) for the available time zone options.
- `bsnGroupName` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: If the setup type is BSN, this is required. The name of the BSN.Cloud group to which provisioned devices will be assigned. This value defaults to the "Default" group if the value is not provided.
- `network` <font color="#704ae0">object</font> <font color="#01a0af">required</font>: The [Network Entity (v3)](docId\:q84eMT6M9gGAJ8SmUtPQ7). This will contain default values unless the user specifies parameters.

These optional properties can also be used: 

- `firmwareUpdatesByFamily` <font color="#704ae0">object</font> <font color="#01a0af">optional</font>: The [FirmwareUpdatebyFamily Entity (v3)](docId\:l_o6PCKIcsYHTu7MGQh1N). If a firmware update is required with your setup, this field is required.
- `firmwareUpdateType` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The firmware update type which is one of "different", "newer", "save", and "standard". The default type is “standard”. See `firmwareUpdateDifferentTargetFileName`, `firmwareUpdateNewerTargetFileName`, `firmwareUpdateSaveTargetFileName`, and  `firmwareUpdateStandardTargetFileName` in [FirmwareUpdatebyFamily Entity (v3)](docId\:l_o6PCKIcsYHTu7MGQh1N) for more information about these types and usage examples. If a firmware update is required with your setup, this field is required.
- `enableSerialDebugging` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, serial debugging is enabled.
- `enableSystemLogDebugging` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, system log debugging is enabled.
- `remoteDwsEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, the remote DWS is enabled on the player and can be accessed remotely.
- `dwsEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, the DWS is enabled on local network of the player.
- `dwsPassword` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The DWS password (this can be an empty string). Although this is not required, you should add this password for security purposes. The default password is the player serial number.
- `lwsEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, the LWS is enabled.
- `lwsUserName` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The user name of the LWS server (this can be an empty string)
- `lwsPassword` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The password for the LWS server (this can be an empty string)
- `lwsEnableUpdateNotifications` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, update notifications are enabled on the LWS.
- `bsnCloudEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: The default, true, indicates that BSN.Cloud is enabled.
- `deviceName` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The user-defined device name for devices that are provisioned with the Device Setup package. This can be an empty string.
- `deviceDescription` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The user-defined description give to devices that are provisioned with the Device Setup package. This can be an empty string.
- `unitNamingMethod` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: Either "appendUnitIDToUnitName" or "unitNameOnly", which determines whether or not to append the serial number to the device name.
- `timeBetweenNetConnects` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: How often the autorun checks for content (in seconds). The default is 300 seconds (5 minutes).
- `timeBetweenHeartbeats` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: How often the player reports health to BSN (in seconds). The default is 900 seconds (15 minutes).
- `sfnWebFolderUrl` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: This is only required if the setup type is SFN. The URL address for the web-accessible folder that contains the simple file networking presentation. This can be an empty string.
- `sfnEnableBasicAuthentication` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: If this is true, the password and username are required. False is the default.
  - `sfnUserName` <font color="#704ae0">string</font>: The username for the SFN file server, which is only required if the SFN server is password protected. This string can be empty.
  - `sfnPassword` <font color="#704ae0">string</font>: The password for the SFN server. This string can be empty.
- `playbackLoggingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, playback logging is enabled.
- `eventLoggingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, event logging is enabled.
- `diagnosticLoggingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, diagnostic logging is enabled.
- `stateLoggingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, state logging is enabled.
- `variableLoggingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, variable logging is enabled.
- `uploadLogFilesAtBoot` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, log files will be uploaded at player startup.
- `uploadLogFilesAtSpecificTime` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, log files will be uploaded at a specific time.
  - `uploadLogFilesTime` <font color="#704ae0">int</font>: The time that log files will be uploaded, if any, in minutes. This is required if `uploadLogFilesAtSpecificTime` is enabled.
- `logHandlerUrl` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The custom log handler URL to which the logs are uploaded. This is only enabled for simple file networking (otherwise it will be an empty string).
- `enableRemoteSnapshot` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, remote snapshot is enabled. The following parameters are required if you enable this boolean:
  - `remoteSnapshotInterval` <font color="#704ae0">int</font>: The number of minutes to wait between capturing each snapshot. Zero is the default, but this value should be set if `enableRemoteSnapshot` is true.
  - `remoteSnapshotMaxImages` <font color="#704ae0">int</font>: The maximum number of snapshot images to save. Possible values are 1 to 100.
  - `remoteSnapshotJpegQualityLevel` <font color="#704ae0">int</font>: The JPEG quality level for the remote snapshot, on a scale from 1 to 100
  - `remoteSnapshotScreenOrientation` <font color="#704ae0">string</font>: The screen orientation ("Landscape", "PortraitBottomRight", or "PortraitBottomLeft")
  - `remoteSnapshotHandlerUrl` <font color="#704ae0">string</font>: The URL for the remote snapshot handler
- `idleScreenColor` <font color="#704ae0">object</font> <font color="#01a0af">optional</font>: An object with RGBA properties. The default color is black.
- `networkDiagnosticsEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, network diagnostics are enabled. This must be enabled in order to enable  `testEthernetEnabled`, `testWirelessEnabled`, or `testInternetEnabled`:
  - `testEthernetEnabled` <font color="#704ae0">bool</font>: False is the default. If true, ethernet testing during setup is enabled.
  - `testWirelessEnabled` <font color="#704ae0">bool</font>: False is the default. If true, wireless testing during setup is enabled.
  - `testInternetEnabled` <font color="#704ae0">bool</font>: False is the default. If true, internet testing during setup is enabled.
- `useCustomSplashScreen` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, a custom splash screen will be used.
- `BrightWallName`  <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The name of the BrightWall settings
- `BrightWallScreenNumber` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The BrightWall display number
- `contentDownloadsRestricted` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: False is the default. If true, content downloads are restricted for SFN and BSN. If the value is true, the following fields are required:
  - `contentDownloadRangeStart` <font color="#704ae0">int</font>: The start time when content can be downloaded, from 00:00 to 23:59 (in minutes)
  - `contentDownloadRangeEnd` <font color="#704ae0">int</font>: The end time when content can be downloaded, from 00:00 to 23:59 (in minutes)
- `usbUpdatePassword` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The password for the USB update feature
- `inheritNetworkProperties` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>:  False is the default (it will use the network properties from the device setup file). If true, the setup will use the current network configuration settings of the player.
- `internalCaArtifacts` <font color="#704ae0">internalCaArtifacts[]</font> <font color="#01a0af">optional</font>: A list of certificate objects. Each object has a name and an asset (the certificate file object). This can be an empty object.

### Example

The [FirmwareUpdatebyFamily Entity (v3)](docId\:l_o6PCKIcsYHTu7MGQh1N) entity is not included this example since it is only required for firmware updates.

```json
{
   "version":"3.0.0",
   "_id":"",
   "bDeploy":{
      "username":"anon@brightsign.biz",
      "networkName":"admin",
      "packageName":"test2023"
   },
   "firmwareUpdateType":"standard",
   "setupType":"standalone",
   "bsnDeviceRegistrationTokenEntity":{
      "token":"{{token}}",
      "scope":"cert",
      "validFrom":"2023-01-26T23:21:48.000Z",
      "validTo":"2025-01-25T23:21:48.000Z"
   },
   "enableSerialDebugging":false,
   "enableSystemLogDebugging":false,
   "remoteDwsEnabled":true,
   "dwsEnabled":false,
   "dwsPassword":"",
   "lwsEnabled":true,
   "lwsUserName":"",
   "lwsPassword":"",
   "lwsEnableUpdateNotifications":true,
   "bsnCloudEnabled":true,
   "deviceName":"",
   "deviceDescription":"",
   "unitNamingMethod":"appendUnitIDToUnitName",
   "timeZone":"PST",
   "bsnGroupName":"Default",
   "timeBetweenNetConnects":300,
   "timeBetweenHeartbeats":900,
   "sfnWebFolderUrl":"",
   "sfnUserName":"",
   "sfnPassword":"",
   "sfnEnableBasicAuthentication":false,
   "playbackLoggingEnabled":false,
   "eventLoggingEnabled":false,
   "diagnosticLoggingEnabled":false,
   "stateLoggingEnabled":false,
   "variableLoggingEnabled":false,
   "uploadLogFilesAtBoot":false,
   "uploadLogFilesAtSpecificTime":false,
   "uploadLogFilesTime":0,
   "logHandlerUrl":"",
   "enableRemoteSnapshot":false,
   "remoteSnapshotInterval":15,
   "remoteSnapshotMaxImages":5,
   "remoteSnapshotJpegQualityLevel":50,
   "remoteSnapshotScreenOrientation":"Landscape",
   "remoteSnapshotHandlerUrl":"",
   "idleScreenColor":{
      "r":0,
      "g":0,
      "b":0,
      "a":1
   },
   "networkDiagnosticsEnabled":false,
   "testEthernetEnabled":false,
   "testWirelessEnabled":false,
   "testInternetEnabled":false,
   "useCustomSplashScreen":false,
   "BrightWallName":"",
   "BrightWallScreenNumber":"",
   "contentDownloadsRestricted":false,
   "contentDownloadRangeStart":0,
   "contentDownloadRangeEnd":0,
   "heartbeatsRestricted":false,
   "heartbeatsRangeStart":0,
   "heartbeatsRangeEnd":0,
   "usbUpdatePassword":"",
   "inheritNetworkProperties":false,
   "internalCaArtifacts":[
   ],
   "network":{
      "timeServers":[
         "http://time.brightsignnetwork.com"
      ],
      "hostname":null,
      "dns":null,
      "proxyServer":null,
      "proxyBypass":null,
      "interfaces":[
         {
            "id":"wired_eth0",
            "name":"eth0",
            "type":"Ethernet",
            "proto":"DHCPv4",
            "ip":[
            ],
            "gateway":null,
            "dns":[
            ],
            "rateLimitDuringInitialDownloads":0,
            "rateLimitInsideContentDownloadWindow":0,
            "rateLimitOutsideContentDownloadWindow":null,
            "contentDownloadEnabled":true,
            "textFeedsDownloadEnabled":true,
            "mediaFeedsDownloadEnabled":true,
            "healthReportingEnabled":true,
            "logsUploadEnabled":true,
            "wpaSettings":{
               "enableWPAEnterpriseAuthentication":false,
               "wpaEnterpriseVariant":"WPAEnterpriseEapTls",
               "eapCertificateType":"WPAEapTlsPKCS",
               "eapCertificateFile":null,
               "eapCertificatePassphrase":"",
               "eapPemOrDerKeyFile":null,
               "peapUsername":"",
               "peapPassphrase":"",
               "caCertificateFile":null
            }
         },
         {
            "id":"wireless_wlan0",
            "name":"wlan0",
            "type":"WiFi",
            "proto":"DHCPv4",
            "ip":[
            ],
            "gateway":null,
            "dns":[
            ],
            "rateLimitDuringInitialDownloads":null,
            "rateLimitInsideContentDownloadWindow":null,
            "rateLimitOutsideContentDownloadWindow":null,
            "contentDownloadEnabled":true,
            "textFeedsDownloadEnabled":true,
            "mediaFeedsDownloadEnabled":true,
            "healthReportingEnabled":true,
            "logsUploadEnabled":true,
            "ssid":"dadmom",
            "passphrase":"",
            "security":{
               "authentication":{
                  "mode":"Shared",
                  "passphrase":"{{passphrase}}"
               },
               "encryption":{
                  "mode":"TKIP, CCMP"
               }
            },
            "wpaSettings":{
               "enableWPAEnterpriseAuthentication":false,
               "wpaEnterpriseVariant":"WPAEnterpriseEapTls",
               "eapCertificateType":"WPAEapTlsPKCS",
               "eapCertificateFile":null,
               "eapCertificatePassphrase":"",
               "eapPemOrDerKeyFile":null,
               "peapUsername":"",
               "peapPassphrase":"",
               "caCertificateFile":null
            }
         }
      ]
   }
}

```


[title] storageinfo
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *storageinfo&#xA0;*&#x6F;bject provides information about a storage device connected to the player. To retrieve information about the filesystem on the device, use the *filesystem&#xA0;*&#x6F;bject.

:::hint{type="info"}
See [this page](docId\:qcEvA3OCMVeT4jzT5L6PE) for more information about device storage paths.
:::

**storageinfo IDL**

```javascript
[
    constructor(String path, String type)
] interface StorageInfo {
    Promise<Number> getDeviceSize();
    Promise<StorageDeviceInfo> getDeviceInfo();
    Promise<StorageDeviceHealth> getDeviceHealth();
};
 
interface StorageDeviceInfo {
    attribute String type;
    attribute Number size;
    [type == "SD"] attribute SDDeviceInfo sd;
    [type == "SATA"] attribute SATADeviceInfo sata;
};
 
interface SDDeviceInfo {
    attribute String productName;
    attribute String oemID;
    attribute String auSize;             //@Optional
    attribute String productRev;
    attribute String mfrDate;            //@Optional
    attribute String serial;             //@Optional
    attribute String signalVoltage;
    attribute String uhsMode;
    attribute Number specVersion;
    attribute String speedClass;         //@Optional
    attribute Number mfrID;
};
 
interface StorageDeviceHealth {
    attribute int percentageHealthUsed;
};
 
interface SATADeviceInfo {
    attribute String sataModel;
    attribute String sataVendor;
};
```

## Object Creation 

To create an *storageinfo* object, first load the `brightsign/storageinfo` module using the `require()` method. Then create an instance of the *storageinfo* class with a string value specifying the storage path.

```javascript
var StorageInfoClass = require("@brightsign/storageinfo");
var storageInfo = new StorageInfoClass("/storage/sd");
```

Use the following string values to specify different storage drives:

- `"/storage/usb1"` – The drive for USB storage devices connected to the player
- `"/storage/sd"` – The primary SD or microSD drive on the player.
- `"/storage/sd2"` – The internal microSD drive on players that support this (see [Storage Devices](docId\:mGdEFc6YvkIbeiUxH9J1O))
- `"/storage/ssd"` – The internal SSD on players that support this (see [Storage Devices](docId\:mGdEFc6YvkIbeiUxH9J1O))
- `"/storage/flash"` - The internal flash storage on the player

## StorageInfo

Use this interface to retrieve information about the storage device.

**getDeviceSize()**

```javascript
Promise <Number> getDeviceSize
```

Returns the total size of the storage device (in bytes).

:::hint{type="warning"}
The size returned by this method uses a different tool from the `size` parameter in the `StorageDeviceInfo` interface. The values returned using the two processes will be approximately, but not exactly, the same.
:::

**getDeviceInfo()**

```javascript
Promise <StorageDeviceInfo> getDeviceInfo()
```

Returns a `StorageDeviceInfo`  interface containing manufacturer information about the storage device.

**getDeviceHealth()**

```javascript
Promise<StorageDeviceHealth> getDeviceHealth()
```

Returns a "card wear" indication in the form of a percentage. This value is approximate and is provided to assist in scheduling proactive replacements to avoid in-field failures. Once this value reaches 100, the card is life expired and further attempts to write to the card may fail. This feature is only supported on certain industrial-type cards such as the Micron and Sandisk cards supplied by BrightSign.

## StorageDeviceInfo

This interface contains manufacturer information about the storage device. Any of the below parameters may be absent from the interface depending on the device type and the information returned by the device:

- `type` <font color="#6554c0">string</font>: The type of filesystem used on the specified storage.
- `size` <font color="#6554c0">Number</font>: The total size of the storage device (in bytes)
- `SDDeviceInfo` <font color="#6554c0">sd [type == "SD"]</font>: Returns details about the SD card hardware.
- `SATADeviceInfo` <font color="#6554c0">sata[type == "SATA"]</font> : Returns details about the Serial ATA (SATA) interface.

## SDDeviceInfo

- `productName` <font color="#6554c0">string</font>: The product name, as assigned by the device manufacturer (5 bytes for SD, 6 bytes for MMC)
- `oemID` <font color="#6554c0">string</font>: The two-character card OEM identifier as assigned by the SD Card Association
- `auSize`<font color="#6554c0"> number</font> <font color="#01a0af">optional</font>: The size of the SD AU in bytes
- `productRev` <font color="#6554c0">string</font>: The product revision assigned by the device manufacturer
- `mfrDate` <font color="#6554c0">string </font><font color="#01a0af">optional</font>: The manufacture date reported by the storage device
- `serial` <font color="#6554c0">string</font> <font color="#01a0af">optional</font>: The serial number of the storage device
- `signalVoltage` <font color="#6554c0">string</font>: The signal voltage reported by the SD card
- `uhsMode` <font color="#6554c0">string</font>: The UHS mode (i.e. BUS speed) reported by the SD card
- `specVersion` <font color="#6554c0">Number</font>: The version of SD spec to which the card conforms
- `speedClass` <font color="#6554c0">string</font> <font color="#01a0af">optional</font>: The speed class (if any) declared by the SD card
- `mfrID` <font color="#6554c0">Number</font>: The card manufacturer ID as assigned by the SD Card Association

## StorageDeviceHealth

- `percentageHealthUsed` <font color="#6554c0">int</font>: Returns an integer that indicates the "wear percentage" of disk health used, on Micron and SanDisk storage cards that support this feature.

## SATADeviceInfo

- `sataModel` <font color="#6554c0">String</font>: The SATA model reported by the device
- `sataVendor` <font color="#6554c0">String</font>: The SATA vendor reported by the device

## Example

```javascript
var storageClass = require("@brightsign/storageinfo");
var storage = new storageClass("/storage/usb1");


storage.getDeviceSize().then(
        function(data) {
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });

storage.getDeviceInfo().then(
        function(data) {
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });
```


[title] Setup Package Entity (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v2)/

- `_id` <font color="#704ae0">string</font><font color="#01a0af"> read-only</font>: A unique identifier of a given Setup package&#x20;
- `version` <font color="#704ae0">semver</font> <font color="#01a0af">read-only</font>:<font color="#01a0af"> </font>A semantic version which defines the format of this Setup package entity, "2.0.0" by default
- `bDeploy` <font color="#704ae0">OwnershipInfo</font> <font color="#01a0af">read-only</font>: An [Ownership Info Entity  (v2)](docId:4bWEdvEQFCxy47VVPOfle) which defines the creator of this Setup package
- `firmwareUpdatesByFamily`<font color="#704ae0"> FirmwareUpdateCollection</font> <font color="#01a0af">read-write</font>: A [Firmware Update Collection Entity (v2)](docId\:nCRLIRJQpV-x4f6VjGgRd) which defines the BOS version of each player family
- `firmwareUpdateType` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: One of "standard", "different", "newer", "save" enumeration values which determine the kind of target BOS version.
- `setupType` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: Either "standalone", "bsn", "lfn", "sfn", or "partnerApplication"
- `bsnDeviceRegistrationTokenEntity`:
  - `token`: <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The token granted for authentication purposes
  - `scope`: <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The scope granted by the token. For example, a successful user authentication response will contain both "Full" and "Self"  values. 
  - `validFrom` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The token will be valid from this date and time. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
  - `validTo` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The date and time that the token expires. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `enableSerialDebugging` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>:  A flag specifying whether serial debugging should be enabled for all players assigned to the Group instance
- `enableSystemLogDebugging` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: A flag specifying whether system log debugging should be enabled for players assigned to the Group instance
- `remoteDwsEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: A flag which defines wherever the Remote Diagnostic Web Server should be enabled
- `dwsEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: A flag which defines wherever the Local Diagnostic Web Server should be enabled
- `dwsPassword` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The password associated with the Local Diagnostic Web Server
- `dwsPasswordPreviousSavedTimeStamp` <font color="#704ae0">long</font> <font color="#01a0af">read-write</font>: A UNIX timestamp which defines when the local DWS password was last saved<font color="hsl(var(--ab-gray-900))"> </font>
- `lwsEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: A flag which defines wherever the Local Web Server should be enabled
- `lwsConfig` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: A local web server operation mode which can be either "content" for LFN setup type and "status" for the other setup types. The difference is if the LWS server should be used for content publish.
- `lwsUserName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The Local Web Server username (for example, "admin")
- `lwsPassword` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The Local Web Server password&#x20;
- `lwsEnableUpdateNotifications` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not enable update notifications is enabled&#x20;
- `bsnCloudEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: A flag that indicates whether a player should connect and register in BSN.Cloud
- `deviceName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The player name. The maximum length of this string is 128 characters.
- `deviceDescription` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: A customer-defined description of the player. The description does not need to be unique within the scope of the account.&#x20;
- `unitNamingMethod` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The player-naming method:&#x20;
  - `appendNameAndSerial` indicates that clients should append the player serial number to the player name.
  - `unitNameOnly` indicates that nothing should be appended to the player name.
- `timeZone` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The time zone a player should operate in, which is one of the values in [Supported Time Zones](docId\:HWR0ZojGTZxXnUHDLHlf9)&#x20;
- `bsnGroupName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the group instance to which the player is assigned
- `timeBetweenNetConnects` <font color="#704ae0">ushort</font> <font color="#01a0af">read-write</font>: An interval in seconds of player settings and schedule synchronization with a BSN or SFN server
- `timeBetweenHeartbeats` <font color="#704ae0">ushort</font> <font color="#01a0af">read-write</font>: An interval in seconds of player heartbeat reporting to a BSN or SFN server
- `sfnWebFolderUrl` <font color="#704ae0">URL</font> <font color="#01a0af">read-write</font>: The base URL of the target SFN folder which contains sync spec and related media content
- `sfnUserName` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The username the player should provide to authenticate on an SFN server using the basic authentication method
- `sfnPassword` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The password the player should provide to authenticate on an SFN server using the basic authentication method
- `sfnEnableBasicAuthentication` <font color="#704ae0">bool </font><font color="#01a0af">read-write</font>: Whether basic authentication is required by the SFN server
- `playbackLoggingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not playback logging is enabled on the associated player.
- `eventLoggingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not event logging is enabled on the associated player.
- `diagnosticLoggingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not diagnostic logging is enabled on the associated player
- `stateLoggingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not state logging is enabled on the associated player.
- `variableLoggingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not variable logging is enabled on the associated player.
- `uploadLogFilesAtBoot` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether autorun logs will be uploaded when the player boots.
- `uploadLogFilesAtSpecificTime` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether autorun logs should be uploaded at a specific time of the day.
- `uploadLogFilesTime` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: The time in minutes when the player should upload autorun logs to the server if the `uploadLogFilesAtSpecificTime` flag is set.
- `logHandlerUrl` <font color="#704ae0">URL </font><font color="#01a0af">read-write</font>: The optional address of a custom endpoint which handles the uploaded autorun logs
- `enableRemoteSnapshot` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>:  Whether a player should capture and upload screenshots to the server.&#x20;
- `remoteSnapshotInterval` <font color="#704ae0">int </font><font color="#01a0af">read-write</font>: The number of minutes to wait between capturing each snapshot.&#x20;
- `remoteSnapshotMaxImages` <font color="#704ae0">int </font><font color="#01a0af">read-write</font>: The maximum number of snapshot images to keep in the player storage. Possible values are 1 to 100.
- `remoteSnapshotJpegQualityLevel`<font color="#704ae0"> int </font><font color="#01a0af">read-write</font>: The JPEG quality level for the  snapshot images, on a scale from 1 to 100
- `remoteSnapshotScreenOrientation` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The image orientation, which is one of "Landscape", "PortraitBottomRight", or "PortraitBottomLeft"
- `remoteSnapshotHandlerUrl` <font color="#704ae0">URL </font><font color="#01a0af">read-write</font>: The optional address of a custom endpoint which handles the uploaded snapshot images
- `idleScreenColor` <font color="#704ae0">object</font> <font color="#01a0af">optional</font>: An object with RGBA properties. The default color is black.
  - `r` <font color="#704ae0">byte</font> <font color="#01a0af">read-write</font>: The value of the red color channel in byte code&#x20;
  - `g` <font color="#704ae0">byte</font> <font color="#01a0af">read-write</font>: The value of the green color channel in byte code&#x20;
  - `b` <font color="#704ae0">byte</font> <font color="#01a0af">read-write</font>: The value of the blue color channel in byte code&#x20;
  - `a` <font color="#704ae0">byte</font> <font color="#01a0af">read-write</font>: The value of the alpha channel in byte code&#x20;
- `networkDiagnosticsEnabled` <font color="#704ae0">bool </font><font color="#01a0af">read-write</font>: Whether a player should perform network diagnostics during setup and display the results on the screen.
- `testEthernetEnabled` <font color="#704ae0">bool </font><font color="#01a0af">read-write</font>: Whether a player should perform Ethernet connection diagnostics during setup and display the results on the screen.
- `testWirelessEnabled` <font color="#704ae0">bool </font><font color="#01a0af">read-write</font>: Whether a player should perform Wi-Fi connection during setup and display the results on the screen.
- `testInternetEnabled` <font color="#704ae0">bool </font><font color="#01a0af">read-write</font>: Whether a player should check whether the BSN server is accessible during setup and display the results on the screen.
- `useCustomSplashScreen` <font color="#704ae0">bool </font><font color="#01a0af">read-write</font>: Whether a player should display a custom splash screen during setup&#x20;
- `BrightWallName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The optional name of the BrightWall instance to which the player should be assigned
- `BrightWallScreenNumber` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The optional number of the BrightWall screen to which the player should be assigned
- `contentDownloadsRestricted` <font color="#704ae0">bool </font><font color="#01a0af">read-write</font>: A flag which defines whether a player should download media content only within the specified time window&#x20;
- `contentDownloadRangeStart` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A time of the day in minutes when the player may start the media content download
- `contentDownloadRangeEnd` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A time of the day in minutes when the player should stop the media content download
- `heartbeatsRestricted` <font color="#704ae0">bool </font><font color="#01a0af">read-write</font>: Whether a player should report heartbeats to the BSN.Cloud server
- `heartbeatsRangeStart` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A time of the day in minutes when the player may start the heartbeat reporting period
- `heartbeatsRangeEnd` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A time of the day in minutes when the player should finish the heartbeat reporting period
- `usbUpdatePassword` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The password for the USB update feature
- `inheritNetworkProperties` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether a player should keep the existing network settings during registration
- `internalCaArtifacts` <font color="#704ae0">internalCaArtifacts[]</font> <font color="#01a0af">optional</font>: A list of certificate objects. Each object has a name and an asset (the certificate file object). This can be an empty object.


[title] filesysteminfo
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *filesysteminfo* object provides information about the file system of a storage device connected to the player. To retrieve information about the storage device itself, use the *storageinfo* object.

**filesysteminfo IDL**

```text
[
    constructor(String path, String type);
] interface FilesystemInfo {
    Promise<bool> isReadOnly();
    Promise<String> getFilesystemType();
    Promise<FilesystemStats> getStatistics();
};

interface FilesystemStats {
    attribute Number blockSize;
    attribute Number sizeBytes;
    attribute Number bytesFree;
    attribute Number filesUsed;
    attribute Number filesFree;
    attribute bool isReadOnly;
};
```

## Object Creation

To create a *filesysteminfo* object, first load the `brightsign/filesysteminfo` module using the `require()` method. Then create an instance of the *filesysteminfo* class with a string value specifying the storage path.

```javascript
var FileSystemInfoClass = require("@brightsign/filesysteminfo");
var fileSystemInfo = new FileSystemInfoClass("/storage/sd");
```

Use the following string values to specify different storage drives:

- `"/storage/usb1"` – The drive for USB storage devices connected to the player
- `"/storage/sd"` – The primary SD or microSD drive on the player.
- `"/storage/sd2"` – The internal microSD drive on players that support this (see [Storage Devices](docId\:mGdEFc6YvkIbeiUxH9J1O))
- `"/storage/ssd"` – The internal SSD on players that support this (see [Storage Devices](docId\:mGdEFc6YvkIbeiUxH9J1O))

## FilesystemInfo

Use this interface to retrieve information about the file system.

### isReadOnly()

```javascript
Promise<bool> isReadOnly()
```

Returns a Boolean value indicating whether the filesystem is read-only. 

### getFilesystemType()

```javascript
Promise <DOMString> getFilesystemType()
```

Returns the filesystem type or whether it is encrypted (“+ecryptfs”). The following are potential values:

- "exfat"
- "ext3"
- "ext4"
- "fat12"
- "fat16"
- "fat32"
- "hfs"
- "hfsplus"
- "ntfs"
- “+ecryptfs” (as of BOS version 9.0.145.1)

### getStatistics()

```javascript
Promise<FilesystemStats> getStatistics()
```

Returns a `FilesystemStats` interface containing information about the filesystem. This method can take a significant amount of time to return its promise.

## FilesystemStats

This interface contains information about the filesystem:

- `blockSize` <font color="#704ae0">Number</font>: The size of a native block
- `sizeBytes` <font color="#704ae0">Number</font>: The amount of total space
- `bytesFree` <font color="#704ae0">Number</font>: The amount of free space
- `filesUsed` <font color="#704ae0">Number</font>: The number of used inodes
- `filesFree` <font color="#704ae0">Number</font>: The number of free inodes
- `isReadOnly` <font color="#704ae0">bool</font>: A flag indicating whether the filesystem is read-only.

## Example

```javascript
var FileSystemInfoClass = require("@brightsign/filesysteminfo");
var fileSystemInfo = new FileSystemInfoClass("/storage/sd");

fileSystemInfo.getFilesystemType().then(
        function(data) {
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });

fileSystemInfo.getStatistics().then(
        function(data) {
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });
```


[title] videoinput
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *videoinput&#xA0;*&#x6F;bject allows you to retrieve information about the HDM&#x49;*®* input and configure EDID settings for it.

**videoinput IDL**

```javascript
callback VideoInputEventCallback = void (VideoInputEvent event);
 
interface VideoInputConfiguration {
    VideoInputConfig defaultConfig();
    Promise<VideoInputConfig> getConfig();
    Promise<Status> applyConfig(VideoInputConfig config);
    Promise<HdmiInputStatus> getStatus();
    void addEventListener(String type, VideoOutputEventCallback callback);
    void removeEventListener(String type, VideoOutputEventCallback callback);
};
 
interface VideoInputConfig {
    attribute bool enableAc3;
    attribute bool enableEac3;
    attribute bool enableTrueHdMlp;
    attribute bool enableDts;
    attribute bool enableDtsHd;
    attribute int maxSampleRate;
    attribute int maxChannelCount;
    attribute String lockAudioTo;
    attribute bool disableHdcpRepeater;
    attribute bool disableYuvColor;
};
 
interface Status {
    attribute bool rebootRequired;
};
 
interface HdmiInputStatus {
    attribute bool devicePresent;
    attribute int  width;
    attribute int  height;
    attribute bool interlaced;
    attribute float frameRate;
    attribute float pixelClock;
    attribute String colorSpace;
    attribute String audioType;
    attribute int audioSamplingRate;
};
```

## Object Creation

To create a *videoinput* object, first load the `brightsign/videoinputmodule` using the `require()` method. Then create an instance of the *videoinput* class.

```javascript
var VideoInputClass = require("@brightsign/videoinput");
var vi = new VideoInputClass();
```

## VideoInputConfiguration

Use this interface to retrieve and modify video input data.

### Events

A `VideoInputEvent` is raised when the hotplug status of the HDM&#x49;*®* input changes. It has one type property:

- `type`: The event type is `hdmiinputchange`

### Methods

**defaultConfig()**

```javascript
VideoInputConfig defaultConfig() 
```

Immediately returns a VideoInputConfig interface containing default EDID-reporting values for the HDMI input.

**getConfig()**

```javascript
Promise <VideoInputConfig> getConfig() 
```

Returns a VideoInputConfig interface containing the current EDID-reporting configuration for the HDMI input.

**applyConfig()**

```javascript
Promise <Status> applyConfig(VideoInputConfig config) 
```

Configures EDID reporting for the HDMI input. By default, the input EDID includes video modes from the display attached to the HDMI output, some video modes supported by the player, and support for PCM audio up to 48kHz; it does not report proprietary media codecs that can be decoded by the device connected to the HDMI output, so you can use this method to announce such support if available at the endpoint. This method returns a promise containing a Status interface that indicates whether a reboot is required for the specified EDID-reporting settings to take effect.

**getStatus()**

```javascript
Promise <HdmiInputStatus> getStatus() 
```

Returns the current status of the HDMI input.

**close()**

```javascript
Promise <void> close() 
```

This method shuts down the instance, preventing it from further consuming resources. If it is not called, garbage collection determines when the instance will be destroyed.

## VideoInputConfig

This interface contains configuration data related to the video input.

- `enableAc3` <font color="#6554c0">bool</font>: A flag specifying whether AC-3 is supported
- `enableEac3` <font color="#6554c0">bool</font>: A flag specifying whether E-AC-3 is supported
- `enableTrueHdMlp` <font color="#6554c0">bool</font>: A flag specifying whether TrueHD MLP is supported
- `enableDts` <font color="#6554c0">bool</font>: A flag specifying whether DTS is supported
- `enableDtsHd` <font color="#6554c0">bool</font>: A flag specifying whether DTS-HD is supported
- `maxSampleRate` <font color="#6554c0">int</font>: The maximum supported PCM audio sampling rate in Hz (e.g. the default sampling rate is 48000)
- `maxChannelCount` <font color="#6554c0">int</font>: The number of PCM channels that are advertised over EDID. The default value is 2, which allows for stereo mixdown. Increasing this value to 6 allows the source to send multichannel PCM. If AC-3 or E-AC-3 is enabled on the player, multichannel audio is supported regardless of the m `axChannelCount`  setting. 
- `maxHdcpVersion` <font color="#6554c0">int</font>: The maximum supported version of HDCP advertised by the HDMI input. The default value is 2, which indicates support for HDCP 2.2. It can also be set to 1, which limits advertised support to HDCP 1.4.
- `lockAudioTo` <font color="#6554c0">string</font>: Whether the audio sample rate clock is locked to the video clock ("`video`") or audio clock ("`audio`") of the incoming HDMI signal. The determination can also be left to the system software ("`auto`").
- `disableHdcpRepeater` <font color="#6554c0">bool</font>:  Disables the HDCP repeater functionality. If set to `true`, the source device attached to the HDMI input will see the device as not being HDCP capable and will downgrade the video it sends, or not send it at all.
- `disableYuvColor` <font color="#6554c0">bool</font>: Alters the EDID that the player sends to devices attached to the HDMI input. If set to `true`, it will advertise that it only supports RGB video modes and not YUV modes.

## Status

This interface is returned by the `applyConfig()` method.

- `rebootRequired` <font color="#6554c0">bool</font>: A flag indicating whether or not a reboot is required for the change in EDID settings to take effect.

## HDMIInputStatus

This interface contains information about the video source connected to the HDMI input: 

- `devicePresent` <font color="#6554c0">bool</font>: Whether an HDMI input source is present (`true`) or not (`false`)
- `width` <font color="#6554c0">int</font>: The width of the source video
- `height` <font color="#6554c0">int</font>: The height of the source video
- `interlaced` <font color="#6554c0">bool</font>: A flag indicating whether the video source is interlaced
- `frameRate` <font color="#6554c0">float</font>: The framerate of the source video
- `pixelClock` <font color="#6554c0">float</font>: The pixel-clock rate of the source video (in MHz)
- `colorSpace` <font color="#6554c0">string</font>:  The color space of the source video, which can be one of the following: "`RGB`", "`YCbCr420`", "`YCbCr422`", "`YCbCr444`"
- `audioType` <font color="#6554c0">string</font>: The audio encoding of the source video, which can be either "`PCM`" or "`Compressed`"
- `audioSamplingRate` <font color="#6554c0">int</font>: The audio sampling rate of the source video (in Hz)

## Example

```javascript
var VideoInputClass = require("@brightsign/videoinput");
var vi = new VideoInputClass();


var inputConfig = {};
inputConfig.enableAc3 = true;

vi.applyConfig(inputConfig).then(
        function(data) {
            if (data.rebootRequired === true) {
                system.reboot();
            } else {
                console.log("Reboot not required.")
            }
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });

vi.getConfig().then(
        function(data) {
            console.log("***Current Config***");
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });


```


[title] videomodeconfiguration
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *videomodeconfiguration&#xA0;*&#x6F;bject allows you to configure the video resolution and retrieve video output settings. 

**videomodeconfiguration IDL**

```javascript
interface VideoModeConfiguration {
    Promise<ModeList> getAvailableModes();
    Promise<Mode> getBestMode(String connector);
    Promise<Mode> getActiveMode();
    Promise<Mode> getConfiguredMode();
    Promise<SetModeResult> setMode(Mode mode);
	Promise<SetModeResult> setCustomModeline(String modeline)
	Promise<ScreenConfigList> getScreenModes();
    Promise<SetModeResult> setScreenModes(ScreenConfigList configs);
};

interface Mode {
    attribute String modeName;
    attribute String colorSpace;
    attribute String colorDepth;
    attribute int frequency;
    attribute bool dropFrame;
    attribute int width;
    attribute int height;
    attribute int graphicsPlaneHeight;
    attribute int graphicsPlaneWidth;
    attribute bool preferred;
    attribute bool interlaced;
    attribute int overscan;
};

interface SetModeResult {
    attribute bool restartRequired;
};

interface ScreenConfig {
    attribute String outputName;
    attribute String videoMode;
    attribute int screenX;
    attribute int screenY;
    attribute String transform;
    attribute bool enabled;
};
```

## Object Creation

To create *vidoemodeconfiguration* object, first load the `brightsign/videomodeconfiguration` module using the `require()` method. Then create an instance of the *videomodeconfiguration* class.

```javascript
var VideoModeConfigurationClass = require("@brightsign/videomodeconfiguration");
var videoConfig = new VideoModeConfigurationClass();
```

## VideoModeConfiguration

Use this interface to retrieve and modify the video-mode settings.

**getAvailableModes()**

```javascript
Promise<ModeList> getAvailableModes() 
```

Returns a list containing all video modes supported by the player. Each supported video mode is listed as a `Mode` instance.

**getBestMode()**

```javascript
Promise<Mode> getBestMode(String connector)
```

Returns the largest supported [video mode](docId\:QpML112mBhEK7LBDGUxnv), as reported by the display via EDID. The video connector can be specified as "hdmi" or "vga" (these values are case sensitive). If the display does not return a resolution value over EDID, this method returns a blank string. If no display is connected, this method returns "Cannot read edid information".

**getActiveMode()**

```javascript
Promise<Mode> getActiveMode() 
```

Returns a `Mode` interface containing information about the current active video mode.

**getConfiguredMode()**

```javascript
Promise<Mode> getConfiguredMode() 
```

Returns a `Mode` interface containing information about the video mode that has been configured with the `setMode()` method. If the video mode has not been configured with `setMode()` (or if it has been set to "auto"), this method will return null.

**setMode()**

```javascript
Promise<SetModeResult> setMode(Mode mode)
```

Sets the video output mode using a passed `Mode` interface. This method returns a promise containing a `SetModeResult` interface that indicates whether a reboot is required for the specified video settings to take effect.&#x20;

**setCustomModeline()**

```javascript
Promise<SetModeResult> setCustomModeline(String modeline)
```

Sets the custom videomode with the supplied modeline (see [Apply a Custom Resolution](docId:58VplQM4sGH_VgqVs4Frs)). The custom videomode can then be selected using setMode.

**getScreenModes()&#xA0;**

```javascript
Promise<ScreenConfigList> getScreenModes()
```

Returns an array which describes each available output on your player hardware and how those outputs are configured. This method has been implemented as of BOS 9.0.15.

The ScreenConfig interface contains the returned settings from getScreenModes():

- `outputName` <font color="#6554c0">string</font>: HDMI-1, 2, 3, or 4 
- `videoMode` <font color="#6554c0">string</font>: The videomode can be either:
  - A known BrightSign format videomode (for example, *1920x1080x60p)*
  - A full modeline as described on [this page](docId:58VplQM4sGH_VgqVs4Frs)&#x20;
- *auto&#xA0;*&#x77;hich differs slightly from previous platforms. *auto* isn’t recommended when using multiple outputs because the canvas positions are fixed and so if a screen uses an unexpected resolution, it won’t be positioned correctly in the canvas.
- `screenX` <font color="#6554c0">int</font>: The position of the screen on the canvas. The origin (0,0) is the top left corner, and each screen can be positioned relative to it. This allows gaps to be left on the canvas between screens for bezel compensation.
- `screenY` <font color="#6554c0">int</font>: The position of the screen on the canvas. The origin (0,0) is the top left corner, and each screen can be positioned relative to it. This allows gaps to be left on the canvas between screens for bezel compensation.
- `transform` <font color="#6554c0">string:</font> One of normal, 90, 180 or 270 rotations. Each screen can be rotated independently and when a screen is rotated, all content including video will be rotated.&#x20;
- `enabled` <font color="#6554c0">bool</font>: Whether the screen is enabled for output

**setScreenModes()**

```javascript
Promise<SetModeResult> setScreenModes(ScreenConfigList configs)
```

Takes the same format as argument that `getScreenModes()` returns. By default a single screen is enabled. The player uses full resolution graphics if any of the videomodes configured using SetScreenModes use the `:fullres` modifier. See [this page](docId\:QQ734nQz0hCwNI0uNSdMP) to understand how the x/y display coordinates work with output resolution.

This method has been implemented as of BOS 9.0 and later.

## Mode

This interface contains the settings of a video-mode configuration.

:::hint{type="info"}
In 4K modes, the graphics plane may be smaller than the video plane and output. In these cases, the graphics plane is upscaled to match the video plane/output.
:::

- `modeName` <font color="#6554c0">string</font>: A description of the [video mode](docId:58VplQM4sGH_VgqVs4Frs) (as well as any additional [video mode parameters](docId\:QQ734nQz0hCwNI0uNSdMP)). The video mode can also be set to  ["Auto"](docId\:QQ734nQz0hCwNI0uNSdMP), “gfxmemlarge”, or "custom" which will use the mode configured using setCustomModeline.
- `colorSpace `<font color="#6554c0">string</font>: The color space of the video signal ("rgb", "yuv420", or "yuv422")
- `colorDepth` <font color="#6554c0">string</font>: The color depth of the video signal ("8bit", "10bit", or "12bit")
- `frequency` <font color="#6554c0">int</font>: The frame rate of the video output
- `dropFrame` <font color="#6554c0">bool</font>: Whether the video timecode uses drop frames 
- `width` <font color="#6554c0">int</font>: The width of the video output
- `height` <font color="#6554c0">int</font>: The height of the video output
- `graphicsPlaneHeight` <font color="#6554c0">int</font>: The width of the graphics plane 
- `graphicsPlaneWidth` <font color="#6554c0">int</font>: The height of the graphics plane
- `preferred` <font color="#6554c0">bool</font>: Whether the video mode is the *preferred* mode, which instructs the player to only use the video mode if the display EDID indicates that it is supported. Otherwise, the output will default to ["Auto" video](docId\:QQ734nQz0hCwNI0uNSdMP) mode. If no EDID is detected at bootup, the player will output the preferred video mode. If an HDM&#x49;**®** hotplug event occurs afterward, then the player will perform the preferred video-mode check again.&#x20;
  - `preferred`*&#xA0;*&#x6D;ode ignores video profile settings (i.e. color space and bit depth).
- `interlaced `<font color="#6554c0">bool</font>: Whether the video output is interlaced
- `overscan` <font color="#6554c0">int:</font> Whether the video output is using an overscan setting or not

## SetModeResult

This interface is returned by the setMode() method.

- `restartRequired` <font color="#6554c0">bool</font>: A flag indicating whether or not a reboot is required for the change in video settings to take effect.

## ScreenConfig

- `outputName` <font color="#6554c0">string</font>
- `videoMode` <font color="#6554c0">string</font>
- `screenX` <font color="#6554c0">int</font>
- `screenY` <font color="#6554c0">int</font>
- `transform` <font color="#6554c0">string</font>
- `enabled`  <font color="#6554c0">bool</font>

## Example

This script retrieves the largest supported video mode (as reported by the display EDID over HDMI) and sets the video output to this mode. It then reboots the player if required.

```javascript
var VideoModeConfigurationClass = require("@brightsign/videomodeconfiguration");
var videoConfig = new VideoModeConfigurationClass();
var SystemClass = require("@brightsign/system");
var system = new SystemClass();

var bestRes = "";

videoConfig.getBestMode("hdmi").then(
        function(data) {
            bestRes = data;
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });

var configData = {};
configData.modeName = bestRes;

videoConfig.setMode(configData).then(
        function(data) {
            if (data.restartRequired === true) {
                system.reboot();
            } else {
                console.log("Reboot not required.")
            }
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });
```


[title] configurednetworks
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *configurednetworks* object provides an array of persistent configuration names, even if they are not active at present. The configurations may be accessed using *@brightsign/networkconfiguration* objects.

**configurednetworks IDL**

```text
interface ConfiguredNetworks {
    Promise<Array<String>> getConfigurationNames();
};
```

## Object Creation

To create a *configurednetworks* object, load the *@brightsign/configurednetworks* module using the `require()` method:

```javascript
var configurednetworksClass = require("@brightsign/configurednetworks");
var configurednetworks = new configurednetworksClass();
```

## ConfiguredNetworks

### getConfigurationNames()

```javascript
Promise<Array<String>> getConfigurationNames()
```

This method returns an array of persistent configuration names, even if they are not active at present.

[title] videooutput
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *videooutput&#xA0;*&#x6F;bject allows you to configure and retrieve non-persistent settings related to a video output (the video mode itself is configured with the [videomodeconfiguration](docId\:uupZxkYFlBSOLyh8oLcES)*&#xA0;&#x20;*&#x6F;bject).

**videooutput IDL**

```javascript
interface VideoOutputEvent {
    attribute String type;
};
 
callback VideoOutputEventCallback = void (VideoOutputEvent event);
 
[
    constructor(String interfaceName)
] interface VideoOutputConfiguration {
    attribute String type;
    Promise<Size> getVideoResolution();
    Promise<Size> getGraphicsResolution();
    Promise<Size> getOutputResolution();
    Promise<void> adjustGraphicsColor(ColorProperties);
    Promise<EdidIdentity> getEdidIdentity();
    Promise<String> getEdid();
    Promise<void> setMultiScreenBezel(int xPercentage, int yPercentage);
    Promise<void> setBackgroundColor(int color);
    Promise<void> setPowerSaveMode(bool enable);
    Promise<bool> getPowerSaveMode();
    Promise<void> set3dMode(int mode);
    Promise<bool> isAttached();
    [type == "hdmi"] Promise<OutputStatus> getOutputStatus();
    [type == "hdmi"] Promise<void> disableAudio(bool disable);
    [type == "hdmi"] Promise<TxHdcpStatus> getTxHdcpStatus();
    [type == "hdmi"] Promise<void> forceHdcpOn(bool);
    Promise<void> setSyncDomain(String domain)
    Promise<void> setMpcdi(String filename);
    void addEventListener(String type, VideoOutputEventCallback callback);
    void removeEventListener(String type, VideoOutputEventCallback callback);
};

interface EdidIdentity {
    attribute String manufacturer;
    attribute int product;
    attribute int serialNumber;
    attribute int weekOfManufacture;
    attribute int yearOfManufacture;
    attribute String monitorName;
    attribute String textString;
    attribute String serialNumberString;
    attribute bool bt2020RgbSupport;
    attribute bool bt2020YccSupport;
    attribute bool sdrEotfSupport;
    attribute bool hdrEotfSupport;
    attribute bool hdrSt2084Support;
};
 
interface OutputStatus {
    attribute bool outputPresent;
    attribute bool outputPowered;
    attribute bool unstable;
    attribute String audioFormat;
    attribute int audioSampleRate;
    attribute int audioBitsPerSample;
    attribute int audioChannelCount;
    attribute String eotf;
};
 
interface Size {
    attribute int width;
    attribute int height;
};
 
interface ColorProperties {
    attribute int constrast;
    attribute int saturation;
    attribute int hue;
    attribute int brightness;
};
```

## Object Creation

To create a *videooutput* object, first load the `brightsign/videooutput` module using the `require()` method. Then create an instance of the *videooutput* class with a string value specifying the video output to configure (currently accepted values are "`HDMI-1`", "`HDMI-2`", "`HDMI-3`", "`HDMI-4`" and "`vga`").

```javascript
var VideoOutputClass = require("@brightsign/videooutput");
var videoOutputHDMI = new VideoOutputClass("HDMI-1");
```

## VideoOutputConfiguration

Use this interface to perform operations on the video output.

### Events

A `VideoOutputEvent` is raised when the hotplug status of the HDM&#x49;*®* output changes. It has one type property:

- `type`: The event type is `hotplugevent`

### Methods

**getVideoResolution()**

```javascript
Promise<Size> getVideoResolution() 
```

Returns the current resolution of the video plane.

**getGraphicsResolution()**

```javascript
Promise<Size> getGraphicsResolution() 
```

Returns the current resolution of the graphics plane.

**getOutputResolution()**

```javascript
Promise<Size> getOutputResolution() 
```

Returns the current video-output resolution.

:::hint{type="info"}
In most cases, the values returned by the getVideoResolution(), getGraphicsResolution(), and getOutputResolution () methods will be identical. The "GraphicsResolution" and "VideoResolution" values will differ when a 4K video mode is selected and full-resolution graphics is not enabled: The graphics plane remains at HD (1920x1080), while the video plane expands to 4K (e.g. to 3840x2160). The "OutputResolution" value will differ from the other two values when the video output is upscaled: For example, when upscaling from HD to 4K, the "GraphicsResolution" and "VideoResolution" values will remain at 1920x1080, while the "OutputResolution" values will indicate 3840x2160.
:::

**adjustGraphicsColor()**

```javascript
Promise<> adjustGraphicsColor(ColorProperties) 
```

Adjusts the video and graphics output of the player using the options in the passed `ColorProperties` instance.

**getEdidIdentity()**

```javascript
Promise<EdidIdentity> getEdidIdentity()
```

Returns EDID information from a compatible monitor/television as an EdidIdentity interface.

**getEdid()**

```javascript
Promise<String> getEdid()
```

Returns EDID information from a compatible monitor/television as a hex-encoded string

**setMultiScreenBezel()**

```javascript
Promise<> setMultiScreenBezel(int xPercentage, int yPercentage)
```

Adjusts the size of the bezel used in calculations for multiscreen displays, allowing for users to compensate for the width of their screen bezels. The calculations for the percentages are as follows:

`xPercentage = (width_of_bezel_between_active_screens / width_of_active_screen) * 100`

`yPercentage = (height_of_bezel_between_active_screens / height_of_active_screen) * 100`

The bezel measurement is therefore the total of the top and bottom bezels in the y case, or the left and right bezels in the x case. When this value is set correctly, images spread across multiple screens take account of the bezel widths, leading to better alignment of images.

**setBackgroundColor()**

```javascript
Promise<> setBackgroundColor(int color)
```

Specifies the background color using an `#rrggbb` hex value (8 bits for each color).

**setPowerSaveMode()**

```javascript
Promise<> setPowerSaveMode(bool enable)
```

Disables HDMI output and the syncs for VGA output if passed `true`. The absence of a signal will cause some monitors to go into standby mode.

**getPowerSaveMode()**

```javascript
Promise<bool> getPowerSaveMode()
```

Returns `True` if power save mode is enabled on the video output.

**set3dMode()**

```javascript
Promise<> set3dMode(int mode)
```

Sets the 3D video output mode, which is specified by passing one the following parameters:

- 0: Standard mono video (default)
- 1: Side-by-side stereo video
- 2: Top-and-bottom stereo video

**isAttached()**

```javascript
Promise<bool> isAttached()
```

Returns `true` if the HDMI/VGA video connector is attached to an output device (i.e. the display EDID can be read successfully). This method will always return `false` if `setPowerSaveMode(true)` has been called on the output.

**getOutputStatus()**

```javascript
[type == "hdmi"] Promise<OutputStatus> getOutputStatus()
```

Returns `OutputStatus` which describes the current state of the video output and is defined below.

**disableAudio()**

```javascript
[type == "hdmi"] Promise<void> disableAudio(bool disable)
```

Disables audio output. If passed `True`, the video will continue to output.

**getTxHdcpStatus()**

```javascript
[type == "hdmi"] Promise<TxHdcpStatus> getTxHdcpStatus()
```

Returns the current HDCP authentication state of the video output.

**forceHdcpOn()**

```javascript
[type == "hdmi"] Promise<void> forceHdcpOn(bool)
```

Can be used to force HDCP authentication on the video output. Even without HDCP forced on, there can still be HDCP on the output if an HDMI input has requested authentication.

**setSyncDomain()&#x20;**

```javascript
Promise<void> setSyncDomain(String domain)
```

Passing any string will enable Genlock synchronization. To disable Genlock on the domain, pass an empty string to this method. Genlock synchronization will lock the vertical sync of the video output to the system clock reference. PTP is then used to synchronize the system clock of multiple players (for example, in a video wall).

**setMpcdi()**

```javascript
Promise<void> setMpcdi(String filename)
```

Users that construct an MPCDI file as per the version1a 2D media profile should pass videoOutputHDMI.setMpcdi("SD:/filename.mpcdi") to the player to decode the file and apply the warp and blend to the output as per the requirements set in filename.mpcdi (replace "filename" with the name of your actual file). Passing an empty string will turn off the warp and blend, and the image will return to the normal format.

Series 4 players implement all levels of the MPCDI 2D media profile (version 1a).

**close()**

```javascript
Promise<void> close()
```

This method shuts down the instance, preventing it from further consuming resources. If it is not called, garbage collection determines when the instance will be destroyed.

## EdidIdentity

This interface contains EDID information about an attached display:

- `manufacturer` <font color="#6554c0">string</font>
- `product` <font color="#6554c0">int</font>
- `serialNumber` <font color="#6554c0">int</font>
- `weekOfManufacture` <font color="#6554c0">int</font>
- `yearOfManufacture` <font color="#6554c0">int</font>
- `monitorName` <font color="#6554c0">string</font>
- `textString` <font color="#6554c0">string</font>
- `serialNumberString` <font color="#6554c0">string</font>
- `bt2020RgbSupport` <font color="#6554c0">bool</font>
- `bt2020YccSupport` <font color="#6554c0">bool</font>
- `sdrEotfSupport` <font color="#6554c0">bool</font>
- `hdrEotfSupport` <font color="#6554c0">bool</font>
- `hdrSt2084Support` <font color="#6554c0">bool</font>

## OutputStatus

This interface contains information about an attached HDMI display device.

:::hint{type="info"}
The `outputPresent` and `outputPowered` entries will always be `false` if `setPowerSaveMode(true)` has been called on the output.
:::



- `outputPresent`<font color="#6554c0"> bool</font>: A flag indicating whether the HDMI output is connected to a display device or not. This is based on the HDMI HPD line state. This value should always be `true` when there is a device connected, however it is dependent on the connected display adhering to this spec.
- `outputPowered` <font color="#6554c0">bool</font>: A flag indicating whether the display device is on (i.e. RX powered). This is based on the TMDS differential termination status.&#x20;
- `unstable` <font color="#6554c0">bool</font>: A flag indicating whether the display signal is unstable or stable
- `audioFormat` <font color="#6554c0">string</font>: The format of the audio output. A "PCM" value indicates that the player is sending decoded output.
- `audioSampleRate` <font color="#6554c0">int</font>: The audio sample rate (in hertz)
- `audioBitsPerSample` <font color="#6554c0">int</font>:  The number of bits per audio sample
- `audioChannelCount` <font color="#6554c0">int</font>: The number of audio channels in the output
- `eotf` <font color="#6554c0">string</font>: The current electro-optical transfer function (EOTF) used by the display. The following are possible values:
  - "HDR (GAMMA)"
  - "SDR (GAMMA)"
  - "SMPTE 2084 (PQ)"
  - "Future (BBC/NHK)"
  - "unspecified"

## Size

This interface represents a video resolution.

- `width` <font color="#6554c0">int</font>:  The height of the screen/plane
- `height` <font color="#6554c0">int</font>:  The width of the screen/plane

## ColorProperties

This interface is passed to the `adjustGraphicsColor()` method. Each of the following parameters has a default value of 0 and can accept a range of values between -1000 and 1000.

- `contrast` <font color="#6554c0">int</font>
- `saturation` <font color="#6554c0">int</font>
- `hue` <font color="#6554c0">int</font>
- `brightness` <font color="#6554c0">int</font>

## TxHdcpStatus

This interface is returned by the `getTxHdcpStatus()` method.

- `state` <font color="#6554c0">string</font>: The HDCP status of the HDMI output, which can be one of the following values:
  - "`not-required`": HDCP is not required by the player. HDCP is required by the player if the video has been decoded locally and needs protection or if the script has called the `forceHdcpOn()` method. Note that, even if this parameter indicates `not-required`, HDCP might still be active in passthrough mode if an upstream HDMI source (i.e. a device connected to the HDMI input port on the player) has requested it.
  - "`authenticated`": HDCP has been enabled and successfully negotiated.
  - "`authentication-in-progress`": HDCP has been enabled but authentication is incomplete.
  - "`authentication-failed`": HDCP has been requested but could not be negotiated.

## Example

```javascript
var VideoOutputClass = require("@brightsign/videooutput");
var videoOutputHDMI = new VideoOutputClass("hdmi");

videoOutputHDMI.getOutputStatus().then(
        function(data) {
            console.log("\nPrint the HDMI output status");
            console.log(JSON.stringify(data));
        })
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        })
```


[title] devicestatus
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

This object provides information about the device hardware, firmware, and features.

**devicestatus IDL**

```text
interface devicestatus {
    Promise<BVNinformationList> getBVNPipelines();
    Promise<BVNinformationList> getBVNComponents();
    Promise<Powerinformation> getPowerStatus();
    Promise<ExtensionsinformationList> getExtensions();
    Promise<POEinformation> getPOEStatus();
};

interface Powerinformation {
    attribute String source;
    attribute String switch_mode;
    attribute String battery;
    attribute int soc_percent;
};

interface BVNinformation {
    attribute String name;
    attribute int index;
    attribute BVNRegisterList registers;
    attribute BVNPipelineList items;                //@Optional
};

interface BVNRegister {
    attribute String name;
    attribute int offset;
};

interface BVNPipeline {
    attribute String name;
};

interface Extensionsinformation {
    attribute String name;
    attribute int size;            //@Optional
    attribute String id;
    attribute String version       //SEMVER
};

interface POEpowerinformation {
    attribute float value;
    attribute String units;
};

interface POEinformation {
    attribute String status;
    attribute POEpowerinformation power;     //@Optional
};                                                                                                  
```

## Object Creation

To create a *devicestatus* object, load the *@brightsign/status* module using the  `require()` method. 

```javascript
var DeviceStatusClass = require("@brightsign/devicestatus");
var devicestatus = new DeviceStatusClass();
```

## devicestatus

### getPowerStatus()

```javascript
Promise<Powerinformation> getPowerStatus()
```

Returns the device battery status as "charging", "discharging", "complete", "absent", or "fault".

### getExtensions()

```javascript
Promise<ExtensionsinformationList> getExtensions()
```

Returns a promise which yields an object containing an `extensions` array with each element containing at least a `name` field. Other fields may also be present, but should not be relied on.

### getPOEStatus()

```javascript
Promise<POEinformation> getPOEStatus()
```

Returns information about whether PoE (Power over Ethernet) network is supported, available, and/or active on a device.

## Powerinformation

- `source` <font color="#704ae0">string</font>:  Possible values are "battery", "Ethernet", or "AC"
- `switch_mode` <font color="#704ae0">string</font>: Returns "soft" or "hard"
- `battery` <font color="#704ae0">string</font>: Possible values are "charging", "discharging", "complete", "absent", or "fault"
- `soc_percent` <font color="#704ae0">int</font>: The state of charge of the battery in percent from 0 (empty) to 100 (full)

## Extensionsinformation

- `name` <font color="#704ae0">string</font>: The name of the extension
- `size` <font color="#704ae0">int</font>: Some extensions return a size and others do not. Players that have AC3 or E-AC3 licenses installed will report those as extensions but no size will be included.
- `id` <font color="#704ae0">string</font>: The extension id
- `version` <font color="#704ae0">string</font>: The extension version

## POEpowerinformation

- `value` <font color="#704ae0">float</font>: Returns the "Power value"
- `units` <font color="#704ae0">string</font>: returns the "Power value" units ("W")

## POEinformation

- `status` <font color="#704ae0">string</font>: The status string can be "active", "standby", or "inactive"
- `power` <font color="#704ae0">POEpowerinformation</font>: See `POEpowerinformation` above for details.

## Example

To get the power status of a device:

```javascript
var DeviceStatusClass = require("@brightsign/devicestatus");
var devicestatus = new DeviceStatusClass();

devicestatus.getPowerStatus().then(
        function(data){
                console.log(JSON.stringify(data));
        })
    .catch(
        function(data){
                console.log("Error: " + data);
        })
```


[title] system
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *system&#xA0;*&#x6F;bject provides functions related to the system software.

**system IDL**

```javascript
interface System {
    void reboot();
    void factoryReset();
    void rebootWithCrashReport();
    Promise<void> setImageSizeThreshold(Size size);
    Promise<bool> resetSshHostKeys();
};

interface Size {
    attribute int width;
    attribute int height;
};
```

## Object Creation

To create a *system* object, first load the `brightsign/system` module using the `require()` method. Then create an instance of the *system* class.

```javascript
var systemClass = require("@brightsign/system");
var system = new systemClass();
```

## System

Use this interface to call system-software methods.

**reboot()**

```javascript
 void reboot()
```

Instructs the player to perform a soft reboot.

**factoryReset()**

```javascript
 void factoryReset()
```

Instructs the player to perform a factory reset.

**rebootWithCrashReport()**

```javascript
 void rebootWithCrashReport()
```

Instructs the player to perform a reboot with a crash report.

**suspend()**

```javascript
 void suspend()
```

Puts the player into low power mode, if it is supported on the platform. The player will turn off peripherals and most of the core functionality to save power. It can be woken up with RST, SVC button, or other platform-dependent wake up sources(RTC, Wake-On-Lan etc.). Available as of BOS 9.0.168.

**setImageSizeThreshold()**

```javascript
Promise<void> setImageSizeThreshold(Size size)
```

Changes the maximum allowed resolution for images. This method accepts a *Size&#x20;*&#x69;nterface specifying the new allowed resolution.

The default image resolution limit is 2048x1280x32bpp (or 4096x2160x32bpp for XTx44, XTx43, XDx34, XDx33, 4Kx42 players). Displaying images larger than the default value may deplete the graphics memory and cause a crash, so we recommend testing a script that uses this method thoroughly before deploying it in a production environment.

:::hint{type="success"}
Without altering the default maximum resolution, you can increase the maximum width of images by sacrificing height (e.g. using a 4096x640x32bpp image on non-4K-capable players is allowed). You can also increase the maximum width/height by reducing the bpp value (e.g. using a 4096x1280x16bpp on non-4K-capable players is allowed).
:::

**resetSshHostKeys()**

Erases all the SSH server host keys and resolves the promise with true if a reboot is required for the server to start using the new keys or false if not. If the method fails then the promise is rejected. Available as of BOS 9.1.75.2 and BOS 9.0.2.14 and higher.

## Size

This interface describes the dimensions of an image.

- `width` <font color="#6554c0">int</font>: The width of the image
- `height` <font color="#6554c0">int</font>: The height of the image

## Example

```javascript
var systemClass = require("@brightsign/system");
var system = new systemClass();

imageSize = {};
imageSize.width = 4224;
imageSize.height = 2376;

system.setImageSizeThreshold(imageSize).then(
        console.log("Image threshold configured."))
    .catch(
        function(data) {
            console.log(JSON.stringify(data));
        });

```


[title] BSCECTransmitter
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

For more information about available methods, refer to the [roCecInterface](docId\:ezdh3By8IIBWQKy04obzU) entry. Note that you can only use this JavaScript class to send CEC messages. Use [BSCECReceiver](docId:1wzSjlvArrwoppr9c-dYE) to receive CEC messages.

When possible, JavaScript APIs should be used instead of BrightScript-Javascript Objects. The JavaScript API equivalent to this object is [cec](docId\:sgfokqfxwmjxxOfS13HtK).

## Methods

- `boolean SendRawMessage(in ArrayBuffer data)`
- `boolean SendRawMessage(in ArrayBufferView data)`
- `boolean SendRawMessage(in DOMString data)`
- `void Close()`: Shuts down the instance, preventing it from further consuming resources. If this method is not called, garbage collection determines when the instance will be destroyed.

## Example

The following JavaScript example shows how to send a set of CEC messages:

```javascript
function cecDisplayOn()
    {
        console.log("### cecDisplayOn ###");
        var cec_control = new BSCECTransmitter();
        var buffer = new Uint8Array(2);
        buffer[ 0 ] = 0x40;
        buffer[ 1 ] = 0x0D;
        cec_control.SendRawMessage(buffer);
    }

function cecDisplayOff()
    {
        console.log("### cecDisplayOff ###");
        var cec_control = new BSCECTransmitter();
        var buffer = new Uint8Array(2);
        buffer[ 0 ] = 0x40;
        buffer[ 1 ] = 0x36;
        cec_control.SendRawMessage(buffer);
    }
```


[title] assetfetcher
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *assetfetcher* object allows for downloading files to an asset pool (which is represented in JavaScript as an [assetpool](docId\:NY8nhRk1-740WPRYL_p8d) instance).

**assetfetcher IDL**

```text
interface AssetPoolFetcher {
    AssetPoolFetcher(AssetPool pool);
    Promise<void> start(AssetList list, AssetPoolFetcherParams assetPoolParams[optional]);
    Promise<void> cancel();
};

interface FileEvent {
    attribute String type;
    attribute String fileName;
    attribute int index;
    attribute int responseCode;
    attribute String error;
};

interface ProgressEvent {
    attribute String type;
    attribute String fileName;
    attribute int index;
    attribute int total;
    attribute long currentFileTransferred;
    [optional] attribute long currentFileTotal;
};

interface AssetPoolFetcherParams {
    attribute Authentication auth;
    attribute bool enableUnsafeAuthentication;
    attribute bool enableUnsafeProxyAuthentication;
    attribute bool enableEncodings;
    attribute bool enablePeerVerification;
    attribute bool enableHostVerification;
    attribute String certificatesFile;
    attribute HeaderList headers;
    attribute String proxy;
    attribute Array<String> proxyBypassList;
    attribute unsigned int progressInterval;
    attribute unsigned int fileRetryCount;
    attribute String relativeLinkPrefix;
    attribute String interfaceName;
    attribute MinTransferRate minimumTransferRate;
    attribute double maximumTransferRate;
    attribute bool onlyRequestCache;
};

interface Authentication {
    attribute String username;
    attribute String password;
};

interface Header {
    attribute String value;
};

interface MinTransferRate {
    attribute int bytesPerSecond;
    attribute int periodInSeconds;
};
```

## Object Creation

To create an *assetpoolfetcher* object, you will first need to create an *assetpool* instance. Then, load the `brightsign/assetpoolfetcher` module using the `require()` method, and create an instance of the *assetpoolfetcher* class using the *assetpool* instance.

```javascript
const AssetPoolClass = require("@brightsign/assetpool");
let assetPool = new AssetPoolClass("SD:/pool");
 
const AssetPoolFetcherClass = require("@brightsign/assetpoolfetcher");
let assetPoolFetcher = new AssetPoolFetcherClass(assetPool);
```

## AssetPoolFetcher

This interface allows you start or stop the asset fetcher.

### start()

```javascript
Promise<void> start(AssetList list, AssetPoolFetcherParams assetPoolParams[optional])
```

Begins fetching the files specified in the passed [assetpool](docId\:NY8nhRk1-740WPRYL_p8d) AssetList interface. The fetching process is configured with the passed *AssetPoolFetcherParams* interface. The `start()` promise returns when the asset-fetching process is complete. Alternatively, the promise will be rejected if the *assetpoolfetcher* instance has already been started. This method may cause assets to be pruned.

### cancel()

```javascript
Promise<void> cancel()
```

Cancels the asset-fetching process. The promise will not be resolved until cancellation is complete.

## FileEvent

This interface contains information about a file-transfer attempt.

- `type` <font color="#6B21A8">string</font>: Contains `fileevent` to indicate the type of the event.
- `fileName` <font color="#6B21A8">string</font>: The name of the asset being downloaded.
- `index` <font color="#6B21A8">int</font>: The zero-based index of the file in the [assetpool](docId\:NY8nhRk1-740WPRYL_p8d) AssetList interface.
- `responseCode` <font color="#6B21A8">int</font>: The protocol response code associated with the event. The following codes indicate success:
  - 200: Successful HTTP transfer
  - 226: Successful FTP transfer
  - 0: Successful local file transfer

:::hint{type="info"}
There are also numerous error codes in case of failure; see [this page](docId\:MTa3K5RAQthAwk4u3Ue3h) for a non-exhaustive list.
:::

- `error` <font color="#6B21A8">string</font>: A textual error message which may be more descriptive than the responseCode for local errors.

## ProgressEvent

This interface contains information about the asset-fetching process.

- `type` <font color="#6B21A8">string</font>:  Contains `progressevent` to indicate the type of the event.
- `fileName` <font color="#6B21A8">string</font>: The name of the file currently being downloaded
- `index` <font color="#6B21A8">int</font>: The zero-based index of the current file in the [assetpool](docId\:NY8nhRk1-740WPRYL_p8d) AssetList interface
- `total` <font color="#6B21A8">int</font>: The total number of files in the *AssetList* object
- `currentFileTransferred` <font color="#6B21A8">long</font>: The number of bytes that have been downloaded so far for the current asset.
- `currentFileTotal` <font color="#6B21A8">long</font> <font color="#01a0af">optional</font>: If the size of the asset in bytes was known prior to the download starting then it is provided in this property. If the size was not known then this property may not be present.

## AssetPoolFetcherParams

This interface contains configuration parameters for the asset-fetcher process.

- `auth` <font color="#6B21A8">Authentication</font>: An *Authentication* interface specifying the credentials to use when downloading the asset
- `enableUnsafeAuthentication`  <font color="#6B21A8">bool</font>: A flag enabling basic HTTP authentication. HTTP authentication uses an insecure protocol, which might allow others to easily determine the password. The *assetpoolfetcher* object will still prefer the stronger digest HTTP if it is supported by the server. If this parameter is `false` (which is the default setting), it will refuse to provide passwords via basic HTTP authentication, and any requests requiring this authentication will fail.
- `enableUnsafeProxyAuthentication` <font color="#6B21A8">bool</font>: A flag enabling basic HTTP authentication against proxies. HTTP authentication uses an insecure protocol, which might allow others to easily determine the password. If this parameter is `false`, it will refuse to provide the proxy password via basic HTTP authentication, and any requests requiring this authentication type will fail. Unlike `enableUnsafeAuthentication`, this parameter is set to `true` by default. 
- `enableEncodings` <font color="#6B21A8">bool</font>: A flag enabling HTTP compression, which communicates to the server that the system can accept any encoding that the *assetpoolfetcher* instance is capable of decoding by itself (this behavior is enabled by default). Supported encodings currently include "deflate" and "gzip", which allow for transparent compression of responses. Clients of the *assetpoolfetcher* instance see only the decoded data and are unaware of the encoding being used.
- `enablePeerVerification` <font color="#6B21A8">bool</font>: A flag that enables checking of TLS/SSL certificates. This parameter is set to `true` by default. Disabling peer verficiation allows you to bypass an expired certificate check.
- `enableHostVerification` <font color="#6B21A8">bool</font>: A flag that enables checking of the TLS/SSL certificate for the correct hostname. This parameter is set to `true` by default. Disabling host verification allows you to accept a certificate being sent for the wrong hostname.

:::hint{type="danger"}
Peer verification and host verification are important security checks that prevent "man-in-the-middle" attacks. These features should only be disabled after careful consideration of the security implications.
:::

- `certificatesFile` <font color="#6B21A8">string</font>: The filename of an alternative set of CA certificates for the connection. This method is useful if the connection certificates are signed by a CA that is not on the the default trusted list (for example, if your organization uses a private CA hierarchy that is not signed by a well known root CA). This file replaces the default list, so the passed certificate file must contain all acceptable CA certificates required for the connection.
- `headers` <font color="#6B21A8">HeaderList</font>: A list of headers that will be passed to HTTP requests made by the *assetpoolfetcher* instance.
- `proxy` <font color="#6B21A8">string</font>: The name or address of the proxy server that will be used by the *assetpoolfetcher* instance. The proxy string should be formatted as "http\://user\:password\@hostname\:port". It can contain up to four "\*" characters; each "\*" character can be used to replace one octet from the player's current IP address. For example, if the IP address is currently 192.168.1.2, and the proxy is set to "proxy-\*-\*", then the player will attempt to use a proxy named "proxy-192-168". If present, this setting overrides the player global proxy setting.
- `proxyBypassList` <font color="#6B21A8">Array</font><font color="#6B21A8">&lt;String&gt;</font>: A list of hosts to exempt from the proxy setting. The list should consist of one or more hostnames (IP addresses cannot be used). The *assetpoolfetcher* instance will attempt to reach the specified hosts directly rather than using the proxy that has been specified with the `proxy` parameter. For example, the hostname "example.com" would exempt "example.com", "example.com:80", and "www\.example.com" from the proxy setting. If present, this setting overrides the global proxy bypass setting.
- `progressInterval` <font color="#6B21A8">unsigned int</font>: The interval (in seconds) between progress events when an individual file is being downloaded. Setting the interval to `null` disables all progress events. Setting the interval to `0` specifies that events should be generated as often as possible, though this will slow down the transfer process. If the interval is set to 0 or any positive integer, events will always be generated at the start and end of the file download irrespective of elapsed time. The default interval is 300 seconds.
- `fileRetryCount` <font color="#6B21A8">unsigned int</font>: The maximum number of times each file download will be retried before moving on to the next file download. The default retry count is five.
- `relativeLinkPrefix` <font color="#6B21A8">string</font>: A prefix that will be prepended to links that lack a protocol in the *AssetList* object. Normally, this method is used to make `file:///` URIs drive agnostic, but it can also be used to reduce the size of the sync spec if all files are stored in the same place. Links that have a protocol are not affected by this method.
- `interfaceName` <font color="#6B21A8">string</font>: A string specifying which network interface the *assetpoolfetcher* instance should try to use for network access, for example "eth0" for Ethernet or "wlan0" for WiFi. The default behavior (indicated by a null value) is to send requests using the most appropriate network interface, which may depend on the routing metric configured via the *networkconfiguration* object. If multiple interfaces are on the same layer 2 network, this method may not work as expected due to the Linux weak-host model.
- `minimumTransferRate` <font color="#6B21A8">MinTransferRate</font>: A *MinTransferRate* interface specifying the average minimum transfer rate for file downloads. If a file transfer falls below this rate, it will be terminated.
- `maximumTransferRate` <font color="#6B21A8">long</font>: The maximum transfer rate for file downloads. The source data rate isn't under the direct control of the BrightSign player, but download rates should average below the specified value over time. 
- `onlyRequestCache` <font color="#6B21A8">bool</font>: A flag indicating that the player should disconnect shortly after beginning the asset download. If the player is set to use a suitably configured proxy (either globally or via the *AssetPoolFetcherParams* interface), then the proxy will continue to download the files, making them readily available for asset-fetching calls in the future. If this parameter is `true`, the `fileevent` will return response code 202 ("Accepted") to indicate success. Other errors will be reported as usual. The `progressevent` for the final all-files-complete event will always be -2 ("EVENT\_ALL\_FAILED") because the download does not complete.

## Authentication

This interface contains authentication information for downloading files.

- `username` <font color="#6B21A8">string</font>: The user name for authentication
- `password` <font color="#6B21A8">string</font>: The password for authentication

## Header

This interface contains a list of headers to pass to a file download URL. Each entry in the list contains the following parameters:

- `value` <font color="#6B21A8">string</font>: The header value

## MinTransferRate

The values in this interface are used to calculate the minimum transfer rate.

- `bytesPerSecond` <font color="#6B21A8">int</font>: The transfer rate below which, when it is averaged over the `periodInSeconds`, the file transfer will be terminated
- `periodInSeconds` <font color="#6B21A8">int</font>: The time frame over which the `bytesPerSecond `measurement is averaged

:::hint{type="info"}
If the transfer is over the Internet, you may not want to set the `periodInSseconds` to a small number in case network problems cause temporary drops in performance. For large file transfers and a small `bytesPerSecond` limit, averaging fifteen minutes or more may be appropriate.
:::


[title] Firmware Reference Entity (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v2)/

This entity contains an array of the following properties by player family (Cobra, Raptor, Impala, Pantera, Tiger, Pagani, Malibu, and Sebring). These fields are only required if you need to do a firmware update.

For examples of how to update the OS for a particular player family, see the section at the bottom of the page.

## Properties

- `firmwareUpdateSource` <font color="#704ae0">string</font>: The enum source from which to get the firmware update. Possible values are “Production”, “Beta”, “MinimumCompatible”, “SpecificUrl”, “None”, or “Existing”. If you use “Production”, “Beta”, or “MinimumCompatible”, no additional values need to be defined.
- `firmwareUpdateStandardTargetFileName` <font color="#704ae0">string</font>: The name of the .bsfw firmware file that is targeted for updates. The update contained in the file is applied and if successful the file is deleted from the storage medium containing it. If the delete succeeds then the system reboots. If it fails then the player behaves as if the file had been named `*_save.bsfw` - see below. The delete always fails if the card uses an NTFS or HFS+ filesystem.
- `firmwareUpdateDifferentTargetFileName` <font color="#704ae0">string</font>: The name of a .bsfw firmware file. In run mode the update contained in this file is applied only if the version it contains does not match the version that is currently running. The file is not deleted but the infinite loop is avoided because on subsequent boots the version number will be the same so the update file will be ignored. In rescue mode the update is always applied.
- `firmwareUpdateNewerTargetFileName` <font color="#704ae0">string</font>: The name of a .bsfw firmware file. In run mode the update contained in the file is applied only if the version it contains is strictly newer than the version that is currently running. The file is not deleted but the infinite loop is avoided because on subsequent boots the version number will be the same so the update file will be ignored. In rescue mode, the update is always applied because the version of run mode cannot be checked and the infinite loop won't occur because the player will reboot into run mode.
- `firmwareUpdateSaveTargetFileName` <font color="#704ae0">string</font>: The name of a .bsfw firmware file. The update contained in the file is applied but the file is not deleted, because if the player rebooted at this point it would just apply the update against the player and will not automatically reboot when applying updates named like this until the storage device containing the update has been removed. This makes this filename useful if you wish to update many units from a USB key.
- `firmwareUpdateVersion` <font color="#704ae0">string</font>: This can be an empty string or the version number of the firmware you want to update to
- `firmwareUpdateSourceUrl` <font color="#704ae0">string</font>: Required if the source is “SpecificUrl”. This can be a source URL for the firmware update.

:::hint{type="info"}
If you want to source a BrightSign URL for any of the following parameters, you can find them in the publicly available manifest file ([https://bsncloud.s3.amazonaws.com/public/FirmwareManifest.json](https://bsncloud.s3.amazonaws.com/public/FirmwareManifest.json)):
:::

- `productionReleaseURL` <font color="#704ae0">string</font>: The URL to the .bsfw file that the player will pull the setup files from for use in production
- `betaReleaseURL` <font color="#704ae0">string</font>: The URL to the .bsfw file for the beta release version in production
- `compatibleReleaseURL` <font color="#704ae0">string</font>: The URL to the .bsfw file for the minimum compatible release version in production

## Examples

These examples all use the Cobra family, but other player families can be substituted. These examples contain the minimum required parameters for each firmware source and update type.

### Updating to the OS Production Version

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.59-update.bsfw"
  }
}
```

### Updating to the Minimum Compatible Version

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.59-update.bsfw"
  }
}
```

### Updating to the OS Beta Version

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.59-update.bsfw"
  }
}
```

### Updating using a Specific URL

```json
"firmwareUpdateType": "standard",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateStandardTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

### Updating to a Different OS

These examples update the OS if it is different from the one already on the player:

```json
// Different OS update - Production version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Different OS update - Beta version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Different OS update - Minimum compatible version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Different OS update - Specific URL version
"firmwareUpdateType": "different",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

### Updating to a Newer OS

These examples update the OS version if that version is higher/newer than the one on the player:

```json
// Newer OS update - Production version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Newer OS update - Beta version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Newer OS update - Minimum compatible version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Newer OS update - Specific URL version
"firmwareUpdateType": "newer",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

### Updating and Saving the .bsfw File

These examples update the OS to a new version without deleting the .bsfw file from the SD card after the update is done, and does not reboot the player after the update is applied (to avoid a reboot loop):

```json
// Save OS update - Production version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"production",
    "firmwareUpdateSaveTargetFileName":"cobra-update.bsfw",
    "productionReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Save OS update - Beta version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"beta",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "betaReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Save OS update - Minimum compatible version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"compatible",
    "firmwareUpdateNewerTargetFileName":"cobra-update.bsfw",
    "compatibleReleaseURL":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```

```json
// Save OS update - Specific URL version
"firmwareUpdateType": "save",
"firmwareUpdatesByFamily":{
  "Cobra":{
    "firmwareUpdateSource":"specificUrl",
    "firmwareUpdateDifferentTargetFileName":"cobra-update.bsfw",
    "firmwareUpdateSourceUrl":"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.34-update.bsfw"
  }
}
```


[title] Firmware Update Collection Entity (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v2)/

- `Cobra` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to HS5, HD5, LS5, XD5, XT5, HS6, XD6, XS6 players
- `Raptor` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to XC5 players
- `Sebring` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to AU5 players
- `Pagani` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to LS4, HD4, and HS4  players
- `Malibu` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to XD4 and XT4 players
- `Impala` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to XD3 and XT3 players
- `Pantera` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to HD3, HS3, HO3, and LS3 players
- `Panther` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to LS2, HD2, and HD0 players
- `Lynx` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to XD2 players
- `Tiger` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to 4K2 players
- `Cheetah` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to XD0 players
- `Monaco` <font color="#704ae0">FirmwareReference</font> <font color="#01a0af">read-write</font>: An optional reference to the BOS version to be applied to HD0 players


[title] B-Deploy Setup Entities  (v3)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 3.0 B-Deploy Endpoints/

See the following pages for more information on the B-Deploy Setup Entities:

- [Device Setup Entity  (v3)](docId\:rHtIqLjdTc_jZorvPnV8_)&#x20;
- [Firmware Reference Entity (v3)](docId\:pnrPPGHTjA52Hf8L-2ZH7)&#x20;
- [Firmware Update Collection Entity (v3)](docId\:KkEHbr5FgUrGS9tERs1Wv)&#x20;
- [FirmwareUpdatebyFamily Entity (v3)](docId\:l_o6PCKIcsYHTu7MGQh1N)&#x20;
- [Interfaces Entity (v3)](docId\:UPh1UInwnzlfMGifaxthv)&#x20;
- [Network Entity (v3)](docId\:q84eMT6M9gGAJ8SmUtPQ7)&#x20;
- [Ownership Info Entity (v3)](docId\:T4FiE7rScbtPG11t1-GKF)&#x20;
- [Setup Package Entity (v3)](docId:18LDPlUdHk1ixcCpJW6bX)&#x20;
- [Setup Package Info Entity (v3)](docId\:q92IhZrQrweLn-YhGXk-E)&#x20;
- [Token Entity (v3)](docId\:xFtPKROWdWpe6DqhYNwfE)&#x20;

[title] cec
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *cec* object lets you send messages over CEC (Consumer Electronics Control).

**cec IDL**

```text
interface ReceiveEvent {
    attribute String type;
    attribute Array<byte> data;
};

callback ReceiveEventCallback = void (ReceiveEvent event);

interface Cec {
    Promise<void> send(Array<byte> data);
    void addEventListener(String type, ReceiveEventCallback callback);
    void removeEventListener(String type, ReceiveEventCallback callback);
};
```

## Object Creation

To create a *cec* object, load the *@brightsign/cec* module using the `require()` method. 

```javascript
const CecClass = require('@brightsign/cec');
const cec = new CecClass();
```

Set the specific HDMI port for players with more than one output as follows:

```javascript
const CecClass = require("@brightsign/cec");
const cec = new CecClass("HDMI-2"); //Modify this to be 'HDMI-1', 'HDMI-2', 'HDMI-3', and 'HDMI-4' as needed
```

## Cec

### Event

- `ReceiveEvent`:  The CEC reception path is implemented as a receive event. The receive message has two generic fields:
  - `type`:  The event type "receive"
  - `data`:  Array CEC frame

### Method

### send()

```javascript
    Promise<void> send(Array<byte> data)
```

Sends messages over *cec.*

- `data`<font color="#6B21A8"> Array&lt;byte&gt;</font>: The CEC frame

### port\_name ()

```javascript
    Promise<void>
```

The parameters for this optional argument are:

- `default`: The default output for the platform, normally `HDMI-1`
- `HDMI-X`: X is a number from 1 up to the number of HDM&#x49;**®** outputs on the platform
- `eARC`: The default for the AU335 

:::hint{type="info"}
As of BrightSignOS 8.2.55, the CEC implementation for AU series 5 products will reply to these messages with the correct data, without involving the script:

- CEC\_MSG\_GET\_CEC\_VERSION
- CEC\_MSG\_ABORT
- CEC\_MSG\_GIVE\_DEVICE\_POWER\_STATUS
- CEC\_MSG\_GIVE\_OSD\_NAME
- CEC\_MSG\_GIVE\_DEVICE\_VENDOR\_ID
- CEC\_MSG\_GIVE\_FEATURES
- CEC\_MSG\_GIVE\_PHYSICAL\_ADDR
- CEC\_MSG\_USER\_CONTROL\_PRESSED
- CEC\_MSG\_USER\_CONTROL\_RELEASED
- CEC\_MSG\_REPORT\_PHYSICAL\_ADDR
:::

## Example

See this [BrightScript example in GitHub](https://github.com/brightsign/dev-cookbook/tree/main/examples/cec-interface/javascript).&#x20;

See [BSCECTransmitter](docId\:mA-PNB9N4I6NIn_IXnr0R) for an example that turns a display on and off.


[title] audiooutput
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

This object allows individual control of audio outputs on the player.

**audiooutput IDL**

```text
    constructor(String output_name)
] interface AudioOutput {
            attribute float volumeLinear;
            attribute float volumeDb;
            attribute long delay;   
            attribute float treble; 
            attribute float bass;   
            attribute boolean mute;
   readonly boolean plugState; // On platforms with CONFIG_AUDIO_PLUG_DETECT
   readonly attribute string name;
};
```

## Object Creation

To create an *audiooutput* object, use the `require()` method.

You must also enter an `AudioOutputClass` (in the example below, "analog" is used). The `AudioOutputClass` parameter can take the following strings:

- `“none”`
- `"hdmi”` or `"hdmi-1"`, `"hdmi-2"`, `"hdmi-3"`, or `"hdmi-4`" for Series 5 players with multiple outputs
- `“usb”`
- `“spdif”`
- `"analog"` 
- `“analog:N”`
- `"earc"` (AU335 only)
- Support for multiple USB outputs using the USB port naming terminology. See [roDeviceInfo-getusbtopology](docId\:uTKDmpos1ulxaoYLx1nS6)

```javascript
var AudioOutputClass = require("@brightsign/audiooutput");
var audiooutput = new AudioOutputClass("analog");
```

## AudioOutput

Use this interface to create *audiooutput* objects.

- `volumeLinear` <font color="#6B21A8">float</font>: Sets the linear volume of the specified output as a percentage represented by a floating point number between 0 and 1 (1.0 is 100%).
- `volumeDb` <font color="#6B21A8">float</font>: Sets the volume in decibels of the specified output as a percentage represented by a floating point number where 0.0 is 100%
- `delay` <font color="#6B21A8">long</font>: On Series 3 and 4 players, delays the audio for a specific audio output by lagging decoded samples before they reach that output. Delays are in milliseconds.
- `treble` <font color="#6B21A8">float</font>: On Series 3 and 4 players, sets the treble of the specified output in decibels. The treble floating point numbers can range from -10 to 10, with 0 indicating no modification to the audio signal. 
- `bass` <font color="#6B21A8">float</font>: On Series 3 and 4 players, sets the bass of the specified output in decibels. The bass floating point numbers can range from -10 to 10, with 0 indicating no modification to the audio signal. 
- `mute` <font color="#6B21A8">boolean</font>: Mutes the specified output if True. This method is set to False by default.
- `name` <font color="#6B21A8">string</font>: The name of the output.
- `plugState` <font color="#6B21A8">boolean</font>: Has a value of `true` if the corresponding output has a plug in it, `false` if it does not, or `undefined` if the plug state cannot be determined on the current hardware or OS version. This is supported by BOS 9.0.163 onwards.


[title] Device Setup Entity  (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v2)/

The Device Setup entity contains the following properties:

- `createdAt` <font color="#704ae0">string </font>: A UTC timestamp indicating when the player Setup was created. The date/time is formatted as `yyyy-mm-ddThh:mm:ss.sssZ`
- `updatedAt` <font color="#704ae0">string </font><font color="#01a0af">optional</font>: A UTC timestamp indicating when the player Setup was last modified. The date/time is formatted as `yyyy-mm-ddThh:mm:ss.sssZ`
- `bDeploy` <font color="#704ae0">bDeploy[ ] </font><font color="#01a0af">required</font>: A [Ownership Info Entity  (v2)](docId:4bWEdvEQFCxy47VVPOfle)&#x20;
- `bsnDeviceRegistrationTokenEntity` <font color="#704ae0">tokenEntity[ ] </font><font color="#01a0af">required</font>: A registration token that is used to register the player with a BSN.Cloud network (see [Token Entity (v2)](docId\:zdEKpsPiP0NbHT48yJ19L)). See [this page](docId:0QHiBo6rAs8zwYJybEH0R) for information about how to get a user access token.
- `bsnGroupName` <font color="#704ae0">string </font><font color="#01a0af">required</font>: The name of the BSN.Cloud group to which provisioned players will be assigned. This value defaults to the "Default" group if undefined.
- `setupType` <font color="#704ae0">string </font><font color="#01a0af">required</font>: The player Setup type: "bsn", "lfn", "sfn", "standalone", or “partnerApplication”
- `version` <font color="#704ae0">string </font><font color="#01a0af">required</font>: The B-Deploy cloud version. This value should currently be "2.0.0"
- `deviceName` <font color="#704ae0">string </font><font color="#01a0af">optional</font>: The name given to players that are provisioned with the player Setup package
- `deviceDescription` <font color="#704ae0">string </font><font color="#01a0af">optional</font>: The description give to players that are provisioned with the player Setup package
- `url` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The Partner Application URL specified for a player to use when finding the application to download.
- `remoteDwsEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">required</font>: A flag indicating whether the Remote DWS is enabled or disabled on the player
  -


[title] Provision Record Entity  (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v2)/

The provision record entities contains the following properties:

`entity`:

- `_id` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The unique identifier (a 24 digits-long hexadecimal number) of the device object
- `serial` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The serial number of the player represented by the device object
- `createdAt` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: A UTC timestamp indicating when the device setup object was created. The date/time is formatted as yyyy-mm-ddThh\:mm\:ss.sssZ
- `updatedAt` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: A UTC timestamp indicating when the device setup object was last modified. The date/time is formatted as yyyy-mm-ddThh\:mm\:ss.sssZ
- `url` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: A value of the Partner Application URL specified for a device to use when finding the application to download.
- `client` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: An identifier of an application used to create a provision record
- `__v` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: A version of a provision record
- `username` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The login of the person who owns the record. Note that the person may or may not be registered in BSN.Cloud.
- `name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name that the target player will get as a result of provisioning. When specified, it overrides the values specified in the referenced setup package.
- `NetworkName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the network to which the specified player should be provisioned
- `model` <font color="#704ae0">string</font> read-write: The model of the player which has the specified serial
- `desc` <font color="#704ae0">string</font> read-write: The description that the target player will get in result of provisioning. When specified, it overrides the values specified in the referenced setup package.
- `setupId` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The unique identifier of the setup package stored in B-Deploy and managed using the PSS API documented in B-Deploy Setup Endpoints (v2).
- `setupName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The descriptive name of a setup package stored in B-Deploy and managed using the PSS API documented in B-Deploy Setup Endpoints (v2).
- `userdata` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: An optional property which allows you to provide additional attributes to a custom setup package


[title] Setup Package Info Entity (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v2)/

The Setup Package info entity contains the following properties:

- `_id` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: A unique identifier of a given Setup package
- `username` <font color="#704ae0">string</font><font color="#01a0af"> read-only</font>: Login of a person which created a given Setup package
- `client` <font color="#704ae0">string</font><font color="#01a0af"> read-only</font>: A client ID of an application used to create a given Setup package
- `packageName` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: A name of a Setup package
- `setupType` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: A player Setup type which defines the content delivery method. One of "Standalone", "LFN", "SFN", "PartnerApplication", "BSN" enumeration values.
- `networkName` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: The name of a BSN.com/BSN.cloud network to which a given Setup package belongs
- `deviceName` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: A user-defined name for a player to be set during registration
- `deviceDescription` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: A user-defined description for a player to be set during registration
- `bsnGroupName` <font color="#704ae0">string </font><font color="#01a0af">rite</font>: The name of a BSN.com/BSN.Cloud group to which to assign players
- `setupJson` <font color="#704ae0">string</font> <font color="#01a0af">rite</font>: A JSON representation of a Device Setup entity
- `version` <font color="#704ae0">string </font><font color="#01a0af">only</font><font color="#704ae0">: </font>A numeric version of a Setup package format
- `createdAt` <font color="#704ae0">string</font><font color="#01a0af"> </font><font color="#01a0af">read-only</font>: A UTC timestamp indicating when the player Setup was created. The date/time is formatted as `yyyy-mm-ddThh:mm:ss.sssZ`
- `updatedAt` <font color="#704ae0">string </font><font color="#01a0af">read-only: </font>A UTC timestamp indicating when the player Setup was last modified. The date/time is formatted as `yyyy-mm-ddThh:mm:ss.sssZ`


[title] messageport
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *messageport* JavaScript object enables passing a JavaScript object as an associative array from JavaScript to BrightScript. This communication channel works whether the script is executing inside an HTML widget created by BrightScript, an HTML widget created from JavaScript, or a Node.js® instance. 

This is the preferred way for JavaScript content to communicate with its parent application.

:::hint{type="warning"}
Note that the `brightsign_js_objects_enabled` flag must be set to `true` in the [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK)  config.
:::

**messageport IDL**

```javascript
interface BsMessage {
    attribute String type;
};

callback MessagePortCallback = void (BsMessage event);

interface MessagePort {
    void PostBSMessage(Object message);
    void addEventListener(String type, MessagePortCallback callback);
    void removeEventListener(String type, MessagePortCallback callback);
};
```

## Object Creation

To create a *messageport* object first load the *@brightsign/messageport* module using the require() method. 

```javascript
var bsMessage = new MESSAGE_PORT();
```

## MessagePort

**PostBsMessage ()**

```javascript
PostBsMessage(Object message)
```

Objects passed to *PostBSMessage()* will be received as events in the parent application:

- for HTML widgets created from BrightScript, the parent *roHtmlWidget* will generate a *roHtmlWidgetEvent* with reason set to "message"
- for HTML widgets created from JavaScript, the parent *@brightsign/htmlwidget* will generate a "message" event
- for Node applications, the parent *roNodeJs* object will generate a [roNodeJsEvent](docId:7NVhxjmwLbciI8dx4a4P3) with reason set to "message"

## Examples

The following script will send a collection of properties to BrightScript:

```javascript
function myFunction()
{
    var bsMessage = new require("@brightsign/messageport");
    bsMessage.PostBSMessage({complete: true, result: "PASS"});
}
```

The message will appear in BrightScript as an roNodeJsEvent. In this case, the GetData().reason equals "message" and GetData().message contains the roAssociativeArray.

```javascript
while not finished
    ev = mp.WaitMessage(30000)
    if type(ev) <> "roHtmlWidgetEvent" then
        print type(ev)
        stop
    end if
    payload = ev.GetData()
    print payload
    print "Reason: "; payload.reason
    if payload.reason = "message" then
        print "Message: "; payload.message
        if payload.message.complete = invalid then
            stop
        else if payload.message.complete = "true" then
            finished = true
            if payload.message.result = "PASS" then
                print "Test passed"
            else
                print "Test failed: "; payload.message.err
                stop
            end if
        end if
    end if
end while
```

The following script will display the contents of the event:

```javascript
var MESSAGE_PORT_CLASS = require("@brightsign/messageport");
var bsMessage = new MESSAGE_PORT_CLASS();
 
bsMessage.addEventListener('bsmessage', function(msg) { console.log(JSON.stringify(msg)); }) 
```

In BrightScript, the roNodeJs.PostJSMessage() method can be used to post a message to JavaScript:

```javascript
nodejs.PostJSMessage({ Param1: "Data1", Param2: "Data2", Param3: "Data3" })
```

:::hint{type="info"}
The *messageport* interface is the preferred way for JavaScript content to communicate with its parent application. The *messageport* is a shared bus, so if you enable it in your application, you can also get messages from the BrightSign OS in that application.

To send/receive messages in BrightAuthor\:connected Node.js applications, see this [example](https://github.com/brightsign/dev-cookbook/blob/c34eea462428dde39cc3d6fcb80bbfb6ff73876c/examples/send-plugin-message/pluginMessageApp.html#L14) in our GitHub repository.  
:::


[title] BrightScript-JavaScript Migration Guide
[path] Player APIs (BrightScript & JavaScript)/

This page describes the mapping between BrightScript and JavaScript APIs. BrightScript functionality is implemented in JavaScript using the [BrightSign JavaScript API](docId\:o2uIyNVKbsyd1qXCvhVCN) and the older [BrightScript-JavaScript objects](docId\:URrXhU7L-V9ea-Zhy0JV3); BrightScript APIs are not ported when standard JavaScript libraries provide equivalent functionality.

If the JavaScript equivalent is "Not available", the functionality is not currently implemented but should be in the future. If the equivalent is "Not applicable", the corresponding BrightScript method would be meaningless in JavaScript or is otherwise unnecessary.

### Global Functions

| **BrightScript API**                        | **JavaScript Equivalent**                                                                                                                                                                                                                                                                              | **Library**               |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------- |
| CreateObject()                              | Not applicable                                                                                                                                                                                                                                                                                         |                           |
| RestartScript()                             | Not applicable                                                                                                                                                                                                                                                                                         |                           |
| RestartApplication()                        | process.exit()                                                                                                                                                                                                                                                                                         | Node.js®                  |
| Sleep()                                     | Not applicable                                                                                                                                                                                                                                                                                         |                           |
| asc()                                       | String.charCodeAt()                                                                                                                                                                                                                                                                                    | JavaScript built-in       |
| chr()                                       | String.fromCharCode()                                                                                                                                                                                                                                                                                  | JavaScript built-in       |
| len()                                       | String.length                                                                                                                                                                                                                                                                                          | JavaScript built-in       |
| str()                                       | Number.toString()                                                                                                                                                                                                                                                                                      | JavaScript built-in       |
| strl()                                      | Number.toString()                                                                                                                                                                                                                                                                                      | JavaScript built-in       |
| val()                                       | Number()                                                                                                                                                                                                                                                                                               | JavaScript built-in       |
| abs()                                       | Math.abs()                                                                                                                                                                                                                                                                                             | JavaScript built-in       |
| atn()                                       | Math.atan()                                                                                                                                                                                                                                                                                            | JavaScript built-in       |
| csng()                                      | Not applicable                                                                                                                                                                                                                                                                                         |                           |
| cdbl()                                      | Not applicable                                                                                                                                                                                                                                                                                         |                           |
| cint()                                      | Not applicable                                                                                                                                                                                                                                                                                         |                           |
| cos()                                       | Math.cos()                                                                                                                                                                                                                                                                                             | JavaScript built-in       |
| exp()                                       | Math.exp()                                                                                                                                                                                                                                                                                             | JavaScript built-in       |
| fix()                                       | Number.toFixed()                                                                                                                                                                                                                                                                                       | JavaScript built-in       |
| int()                                       | Math.trunc()                                                                                                                                                                                                                                                                                           | JavaScript built-in       |
| log()                                       | Math.log()                                                                                                                                                                                                                                                                                             | JavaScript built-in       |
| sgn()                                       | Math.sign()                                                                                                                                                                                                                                                                                            | JavaScript built-in       |
| sgnl()                                      | Math.sign()                                                                                                                                                                                                                                                                                            | JavaScript built-in       |
| sin()                                       | Math.sin()                                                                                                                                                                                                                                                                                             | JavaScript built-in       |
| tan()                                       | Math.tan()                                                                                                                                                                                                                                                                                             | JavaScript built-in       |
| sqr()                                       | Math.sqrt()                                                                                                                                                                                                                                                                                            | JavaScript built-in       |
| Left(target\_string, n)                     | target\_string.substr(0, n)\*                                                                                                                                                                                                                                                                          | JavaScript built-in       |
| Right(target\_string, n)                    | target\_string.substr(target\_string.length - n)\*<br />target\_string.substr(-n)\*                                                                                                                                                                                                                    | JavaScript built-in       |
| StringI()                                   | String.repeat()                                                                                                                                                                                                                                                                                        | JavaScript built-in       |
| Mid(target\_string, start\_position, length | target\_string.substr(start\_position, length)\*                                                                                                                                                                                                                                                       | JavaScript built-in       |
| Instr()                                     | String.indexOf()                                                                                                                                                                                                                                                                                       | JavaScript built-in       |
| GetInterface()                              | Access object interfaces as strings                                                                                                                                                                                                                                                                    |                           |
| Wait()                                      | Not applicable in JavaScript, unless the function is used without reference to ports, and merely to delay execution for a time, in which case, use setTimeout().                                                                                                                                       | JavaScript built-in       |
| ReadAsciiFile()                             | readFileSync()\*\*                                                                                                                                                                                                                                                                                     | Node.js®                  |
| WriteAsciiFile()                            | fs.writeFile()\*\*                                                                                                                                                                                                                                                                                     | Node.js®                  |
| ListDir()                                   | fs.readDir()\*\*                                                                                                                                                                                                                                                                                       | Node.js®                  |
| MatchFiles()                                | fs.readDir()\*\*<br />Additional JavaScript code is needed to complete matching.                                                                                                                                                                                                                       | Node.js®                  |
| LCase()                                     | String.toLowerCase()                                                                                                                                                                                                                                                                                   | JavaScript built-in       |
| UCase()                                     | String.toUpperCase()                                                                                                                                                                                                                                                                                   | JavaScript built-in       |
| DeleteFile()                                | fs.unlink()\*\*                                                                                                                                                                                                                                                                                        | Node.js®                  |
| DeleteDirectory()                           | fs.rmdir()\*\*                                                                                                                                                                                                                                                                                         | Node.js®                  |
| CreateDirectory()                           | fs.mkdir()\*\*                                                                                                                                                                                                                                                                                         | Node.js®                  |
| RebootSystem()                              | system.reboot()                                                                                                                                                                                                                                                                                        | BrightSign JavaScript API |
| ShutdownSystem()                            | Not available                                                                                                                                                                                                                                                                                          |                           |
| UpTime()                                    | OS.uptime()                                                                                                                                                                                                                                                                                            | Node.js®                  |
| FormatDrive()                               | No exact equivalent.                                                                                                                                                                                                                                                                                   |                           |
| EjectDrive()                                | Not available                                                                                                                                                                                                                                                                                          |                           |
| CopyFile()                                  | fs.copyFile()\*\*                                                                                                                                                                                                                                                                                      | Node.js®                  |
| MoveFile()                                  | fs.rename()\*\*                                                                                                                                                                                                                                                                                        | Node.js®                  |
| MapFilenameToNative()                       | Not applicable                                                                                                                                                                                                                                                                                         |                           |
| strtoi()                                    | parseInt()<br />strtoi() parses in base 10, whereas JavaScript supports any base.                                                                                                                                                                                                                      | JavaScript built-in       |
| rnd()                                       | [Math.random()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random)                                                                                                                                                                                          | JavaScript built-in       |
| RunGarbageCollector()                       | Not applicable                                                                                                                                                                                                                                                                                         |                           |
| GetDefaultDrive()                           | Not applicable                                                                                                                                                                                                                                                                                         | Node.js®                  |
| SetDefaultDrive()                           | process.chdir()                                                                                                                                                                                                                                                                                        | Node.js®                  |
| EnableZoneSupport()                         | Not applicable                                                                                                                                                                                                                                                                                         |                           |
| EnableAudioMixer()                          | Not applicable                                                                                                                                                                                                                                                                                         |                           |
| Pi()                                        | Math.PI                                                                                                                                                                                                                                                                                                | JavaScript built-in       |
| ParseJson()                                 | JSON.parse()<br />BrightScript returns Invalid in the case of problematic strings, whereas JavaScript throws an exception.                                                                                                                                                                             | JavaScript built-in       |
| FormatJson()                                | JSON.stringify()  <br />JSON.stringify must be invoked with a custom replacer, for example, [Cyclic\_object\_value](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cyclic_object_value) or [WebReflection/flatted#flatted](https://github.com/WebReflection/flatted#flatted) | JavaScript built-in       |

\* substr takes parameters as (from, length).
   substring takes parameters as (from, to).
   slice takes parameters as (from, to).

\*\* Async operations are always preferable.

### Core Objects

| **BrightScript API**     | **JavaScript Equivalent**                                                                                                                                                                                                                      | **Library**                                                                                                    |
| ------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| roArray                  | Not applicable                                                                                                                                                                                                                                 | [JavaScript built-in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators) |
| roAssociativeArray       | Not applicable                                                                                                                                                                                                                                 | [JavaScript built-in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators) |
| roBoolean                | Not applicable                                                                                                                                                                                                                                 | [JavaScript built-in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators) |
| roByteArray              | Blob()<br />(JavaScript now has [typed arrays](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays) - for example, [Uint8Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array)) |                                                                                                                |
| roDouble                 | Not applicable                                                                                                                                                                                                                                 | [JavaScript built-in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators) |
| roFunction               | Not applicable                                                                                                                                                                                                                                 | [JavaScript built-in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators) |
| roInt, roFloat, roString | Not applicable                                                                                                                                                                                                                                 | [JavaScript built-in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators) |
| roList                   | Use JavaScript built-in function                                                                                                                                                                                                               | [JavaScript built-in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators) |
| roMessagePort            | Not applicable                                                                                                                                                                                                                                 | [JavaScript built-in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators) |
| roRegex                  | RegExp()                                                                                                                                                                                                                                       | [JavaScript built-in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators) |
| roXMLElement             | DOMParser()                                                                                                                                                                                                                                    | [JavaScript built-in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators) |
| roXMLList                | DOMParser()                                                                                                                                                                                                                                    | [JavaScript built-in](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators) |

### Presentation Objects&#x20;

| **BrightScript API**                | **JavaScript Equivalent**                                                            | **Library**                                                 |
| ----------------------------------- | ------------------------------------------------------------------------------------ | ----------------------------------------------------------- |
| roAudioEventMx                      | Not available                                                                        |                                                             |
| roAudioOutput                       | [audiooutput](docId\:lXzJ2B4sOLXTNXKXXkOb5)                                          |                                                             |
| roAudioPlayer                       | Use html audio tag                                                                   |                                                             |
| roCanvasWidget                      | Not applicable                                                                       |                                                             |
| roClockWidget                       | Not applicable                                                                       |                                                             |
| roHdmiInputChanged                  | videoinput.VideoInputConfiguration.hdmiinputchanged                                  | [BrightSign JavaScript API](docId\:XDORXW7WvzcNnu2-5UpuY)   |
| roHdmiOutputChanged                 | videooutput.VideoOutputConfiguration.hotplugevent                                    | [BrightSign JavaScript API](docId\:XDORXW7WvzcNnu2-5UpuY)   |
| roHTMLWidget                        | [htmlwidget](docId\:pMpuH3A0VR8OhjoPsJwo7)                                           |                                                             |
| roImageBuffer                       | Not applicable                                                                       |                                                             |
| roImagePlayer                       | [`<img> tag in HTML`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img) |                                                             |
| roImageWidget                       | [`<img> tag in HTML`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img) |                                                             |
| roRectangle                         | Not applicable                                                                       |                                                             |
| roStreamQueue                       | Not available                                                                        |                                                             |
| roTextField                         | Not applicable                                                                       |                                                             |
| roTextWidget                        | Not applicable                                                                       |                                                             |
| roTouchEvent                        | TouchEvent()                                                                         | Web API                                                     |
| roTouchScreen                       | Not available                                                                        |                                                             |
| SetResolution()                     | Browser performs mapping                                                             |                                                             |
| AddRectangle()                      | Map CSS cursor properties to hardware cursor                                         |                                                             |
| AddCircleRegion()                   | Map CSS cursor properties to hardware cursor                                         |                                                             |
| ClearRegions()                      | Not applicable                                                                       |                                                             |
| GetDeviceName()                     | Not applicable                                                                       |                                                             |
| SetCursorPosition()                 | Simulate mouse cursor events in JavaScript                                           |                                                             |
| SetCursorBitmap()                   | Map CSS cursor properties to hardware cursor                                         |                                                             |
| EnableCursor()                      | Map CSS cursor properties to hardware cursor                                         |                                                             |
| EnableRollover()                    | Not applicable                                                                       |                                                             |
| EnableRegion()                      | Map CSS cursor properties to hardware cursor                                         |                                                             |
| SetRollOverOrigin()                 | Map CSS cursor properties to hardware cursor                                         |                                                             |
| IsMousePresent()                    | pointer.isMousePresent()                                                             | [BrightSign JavaScript API](docId\:wydFi-OEWp1UOFQJVyHhU)   |
| SetMouseRotation()                  | Not applicable                                                                       |                                                             |
| EnableSerialTouchscreen()           | Not available                                                                        |                                                             |
| SetSerialTouchscreenConfiguration() | Not available                                                                        |                                                             |
| GetDiagnosticInfo()                 | pointerCalibration.getDiagnosticInfoHTML()                                           | [BrightSign JavaScript API](docId\:wydFi-OEWp1UOFQJVyHhU)   |
| StartCalibration()                  | pointerCalibration.startCalibration()                                                | [BrightSign JavaScript API](docId\:wydFi-OEWp1UOFQJVyHhU)   |
| GetCalibrationStatus()              | pointerCalibration.getCalibrationStatus()                                            | [BrightSign JavaScript API](docId\:wydFi-OEWp1UOFQJVyHhU)   |
| ClearStoredCalibration()            | pointerCalibration.clearStoredCalibration()                                          | [BrightSign JavaScript API](docId\:wydFi-OEWp1UOFQJVyHhU)   |
| StartEventLogging()                 | pointerCalibration.startEventLogging()                                               | [BrightSign JavaScript API](docId\:wydFi-OEWp1UOFQJVyHhU)   |
| StopEventLogging()                  | pointerCalibration.stopEventLogging()                                                | [BrightSign JavaScript API](docId\:wydFi-OEWp1UOFQJVyHhU)   |
| ClearEventLogs()                    | Not applicable (no information on the log)                                           |                                                             |
| SetCalibrationRanges()              | pointerCalibration.setCalibrationRanges()                                            | [BrightSign JavaScript API](docId\:wydFi-OEWp1UOFQJVyHhU)   |
| roVIdeoInput                        | MediaDevices.getUserMedia()                                                          | Web API                                                     |
| roVideoMode                         | [videomodeconfiguration](docId\:uupZxkYFlBSOLyh8oLcES)                               |                                                             |
| SetMode()                           | videomodeconfiguration.setMode()                                                     | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| SetModeForNextBoot()                | Not applicable (use @brightsign/videomodeconfiguration SetMode())                    |                                                             |
| GetModeForNextBoot()                | Not applicable (use @brightsign/videomodeconfiguration getActiveMode())              |                                                             |
| GetBestMode()                       | videomodeconfiguration.getBestMode()                                                 | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetMode()                           | videomodeconfiguration.getActiveMode()                                               | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetActiveMode()                     | videomodeconfiguration.getActiveMode()                                               | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetAvailableModes()                 | videomodeconfiguration.getAvailableModes()                                           | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetConfiguredMode()                 | videomodeconfiguration.getConfiguredMode()                                           | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetFPS                              | videomodeconfiguration.getActiveMode()                                               | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| SetDecoderMode()                    | decoderconfiguration.applyConfig()                                                   | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetDecoderModes()                   | decoderconfiguration.getConfig()                                                     | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| Set3DMode()                         | videooutput.set3dMode()                                                              |                                                             |
| Screenshot()                        | screenshot.syncCapture()/asyncCapture()                                              | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetResX()                           | videomodeconfiguration.Mode.graphicsPlaneWidth                                       | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetRexY()                           | videomodeconfiguration.Mode.graphicsPlaneHeight                                      | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetVideoResX()                      | videomodeconfiguration.Mode.width                                                    | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetVideoResY()                      | videomodeconfiguration.Mode.height                                                   | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetOutputResX()                     | videooutput.Size.width                                                               | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetOutputResY()                     | videooutput.Size.height                                                              | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetSafeX()                          | BSVideoMode.safeX                                                                    | BS-JavaScript objects                                       |
| GetSafeY()                          | BSVideoMode.safeY                                                                    | BS-JavaScript objects                                       |
| SafeWidth()                         | BSVideoMode.safeWidth                                                                | BS-JavaScript objects                                       |
| SafeHeight()                        | BSVideoMOde.safeHeight                                                               | BS-JavaScript objects                                       |
| SetGraphicsZOrder                   | Not applicable                                                                       |                                                             |
| PauseGraphics()                     | compositor.pause()                                                                   | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| ResumeGraphics()                    | compositor.resume()                                                                  | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| SetImageSizeThreshold()             | system.setImageSizeThreshold()                                                       | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| AdjustGraphicsColor()               | videooutput.adjustGraphicColor()                                                     |                                                             |
| ConfigureHdmiInput()                | videoinput.ApplyConfig()                                                             | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| SetHdmiMetadata()                   | Not available and possibly not applicable                                            |                                                             |
| GetHdmiOutputStatus()               | videooutput.getOutputStatus()                                                        | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetHdmiInputStatus()                | videoinput.getStatus()                                                               | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetCompositorCrc()                  | compositor.getCrc()                                                                  | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| GetTxHdcpStatus()                   | videooutput.getTxHdcpStatus()                                                        | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| ForceHdcpOn()                       | videooutput.forceHdcpOn()                                                            | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| DisableHdcpRepeater()               | videooutput.DisableHdcpRepeater()                                                    |                                                             |
| SetBackgroundColor()                | videooutput.setBackgroundColor()                                                     | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| SetPowerSaveMode()                  | videooutput.SetPowerSaveMode()                                                       | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| IsAttached()                        | videooutput.isAttached()                                                             | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| HdmiAudioDisable()                  | videooutput.disableAudio()                                                           | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| SetMultiscreenBezel()               | videooutput.setMultiscreenBezel()                                                    | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| SaveEdids()                         | videooutput.getEdid() returns EDID information as a hex-encoded string.              |                                                             |
| GetEdidIdentity()                   | videooutput.getEdidIdentity()                                                        | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| SetMpcdi()                          | videooutput.setMpcdi()                                                               |                                                             |
| SetSyncDomain()                     | videooutput.setSyncDomain()                                                          | [BrightSign JavaScript API](docId\:QQ734nQz0hCwNI0uNSdMP)   |
| roVideoPlayer                       | Use \<video> elements with [BrightSign properties](docId\:e6uJleH69Q0JmMv8kyTrp)     |                                                             |

### File Objects

Use the Node.js File API.

### Hashing and Storage Objects

| **BrightScript API** | **JavaScript Equivalent**                                                                       | **Library**                                                   |
| -------------------- | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------- |
| roBlockCipher        | Node.js Crypto API                                                                              |                                                               |
| roBrightPackage      | Node.js Zlib API                                                                                |                                                               |
| roDiskErrorEvent     | Not available                                                                                   |                                                               |
| roDiskMonitor        | Not available                                                                                   |                                                               |
| roHashGenerator      | Node.js Crypto API                                                                              |                                                               |
| roPassKey            | Node.js Crypto API                                                                              |                                                               |
| roRegistry           | [registry](docId\:tXWoOMbD2-u12dfegX7gA)                                                        |                                                               |
| GetSectionList()     | registry.read()                                                                                 | [BrightSign JavaScript API](docId\:YTpSfntswYFMXx8PCqJLf)     |
| Delete()             | registry.write()                                                                                | [BrightSign JavaScript API](docId\:YTpSfntswYFMXx8PCqJLf)     |
| Flush()              | Not applicable; registry writes are flushed implicitly                                          |                                                               |
| roRegistrySection    | [registry](docId\:tXWoOMbD2-u12dfegX7gA)                                                        |                                                               |
| Read()               | registry.read()                                                                                 | [BrightSign JavaScript API](docId\:FfM73tjd_BThW4-P-0JVG)     |
| Write()              | registry.write()                                                                                | [BrightSign JavaScript API](docId\:FfM73tjd_BThW4-P-0JVG)     |
| Exists()             | Not applicable (Use read followed by a truthy check on the registry key)                        |                                                               |
| GetKeyList()         | Not applicable (Use read followed by Object.keys())                                             |                                                               |
| roSqliteDatabase     | Use IndexedDB                                                                                   |                                                               |
| roSqliteStatement    | Use IndexedDB                                                                                   |                                                               |
| roStorageAttached    | node.js fs.watch()                                                                              |                                                               |
| roStorageDetached    | node.js fs.watch()                                                                              |                                                               |
| roStorageHotplug     | node.js fs.watch()                                                                              |                                                               |
| roStorageInfo        | [filesysteminfo](docId\:QulnL7zrhwc5FGokcGAi7) and [storageinfo](docId\:RoZ3o77EuxtyZvj_dSPin)  |                                                               |
| GetBytesPerBlock()   | filesysteminfo.getStatistics()                                                                  | [BrightSign JavaScript API ](docId\:BczooenmOIfNRbeny6ZKI)    |
| GetSizeInMegabytes() | filesysteminfo.getStatistics()                                                                  | [BrightSign JavaScript API](docId\:BczooenmOIfNRbeny6ZKI)     |
| GetUsedInMegabytes() | node.js fs.stat()                                                                               |                                                               |
| GetFreeInMegabytes() | filesysteminfo.getStatistics()                                                                  | [BrightSign JavaScript API](docId\:BczooenmOIfNRbeny6ZKI)     |
| GetFileSystemType()  | filesysteminfo.getFileSystemType()                                                              | [BrightScript JavaScript API](docId\:BczooenmOIfNRbeny6ZKI)   |
| GetStorageCardInfo() | storageinfo.getStorageCardInfo()                                                                | [BrightScript JavaScript API](docId\:BczooenmOIfNRbeny6ZKI)   |
| roVirtualMemory      | Not available                                                                                   |                                                               |

### Content Management Objects

| **BrightScript API** | **JavaScript Equivalent**                        | **Library**                                                 |
| -------------------- | ------------------------------------------------ | ----------------------------------------------------------- |
| roAssetCollection    | Not available                                    |                                                             |
| roAssetFetcher       | [assetpoolfetcher](docId\:hg03EuSH_xKKpfoFWdgCz) | [BrightSign JavaScript API](docId:1aQOGvXANa1wfJWf8tHmd)    |
| roAssetPool          | [assetpool](docId\:NY8nhRk1-740WPRYL_p8d)        | [BrightSign JavaScript API](docId\:dz9ZC0Ke6JLQnIbuNuq0n)   |
| roAssetPoolFiles     | [assetpoolfiles](docId\:NhoCAmfrJ0AvAHJ-Vearr)   |                                                             |
| roAssetRealizer      | [assetrealizer](docId\:xnl0us14GWG7EUIz2XSDm)    | [BrightSign JavaScript API](docId\:yoV_QcUTleNArbM-FZMfv)   |
| roSyncSpec           | Not applicable                                   |                                                             |

### Networking Objects

| **BrightScript API**                                          | **JavaScript Equivalent**                                                      | **Library**                                                   |
| ------------------------------------------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------- |
| roDatagramReceiver                                            | Node.js Dgram API                                                              |                                                               |
| roDatagramSender                                              | Node.js Dgram API                                                              |                                                               |
| roDatagramSocket                                              | Node.js Dgram API                                                              |                                                               |
| roHttpServer                                                  | Node.js                                                                        |                                                               |
| roKeyStore                                                    | [keystore](docId:6Alp0AIXrZlHV4cBkebvz)                                        | [BrightScript JavaScript API](docId\:GhSZNW9eS8TEMURQXq-DU)   |
| roMediaServer                                                 | node-media-server                                                              |                                                               |
| roMediaStreamer                                               | Not available                                                                  |                                                               |
| roMimeStream                                                  | Not applicable                                                                 |                                                               |
| roNetworkAdvertisement                                        | Not applicable (use node.js)                                                   |                                                               |
| roNetworkConfiguration                                        | [networkconfiguration](docId:6MS7rdjWWhP21clMeDRwv)                            |                                                               |
| Apply()                                                       | networkconfiguration.applyConfig()                                             | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetupDWS()                                                    | dwsconfiguration                                                               | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| EnableLEDs()                                                  | networkconfiguration.enableLeds()                                              | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetClientIdentifier()                                         | networkconfiguration.NetworkInterfaceConfig.clientIdentifier                   | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| GetClientIdentifier()                                         | networkconfiguration.NetworkInterfaceConfig.clientIdentifier                   | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetLoginPassword()                                            | hostconfiguration.HostConfigWritable.loginPassword                             | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetObfuscatedLoginPassword()                                  | hostconfiguration.HostConfigWritable.ObfuscatedLoginPassword                   | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetInboundShaperRate()                                        | networkconfiguration.NetworkInterfaceConfig.inboundShaperRate                  | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetMTU()                                                      | networkconfiguration.NetworkInterfaceConfig.mtu                                | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetRoutingMetric()                                            | networkconfiguration.NetworkInterfaceConfig.metric                             | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetDHCP()                                                     | networkconfiguration.NetworkInterfaceConfig.ipAddressList                      | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetEnabledProtocols()                                         | networkconfiguration.NetworkInterfaceConfig.enabledProtocolList                | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetIP4Address()                                               | networkconfiguration.NetworkInterfaceConfig.ipAddressList                      | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetIP4Netmask()                                               | networkconfiguration.NetworkInterfaceConfig.ipAddressList                      | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetIP4Broadcast()                                             | networkconfiguration.NetworkInterfaceConfig.ipAddressList                      | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetIP4Gateway()                                               | networkconfiguration.NetworkInterfaceConfig.ipAddressList                      | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetVlanIds()                                                  | networkconfiguration.NetworkInterfaceConfig.vlanIdList                         | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetWiFiESSID()/.GetWiFiESSID()                                | networkconfiguration.WiFiInterfaceConfig.essId                                 | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetWiFiPassphrase()                                           | networkconfiguration.WiFiInterfaceConfig.passphrase                            | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetWiFiPassphraseAndObfuscate()                               | networkconfiguration.WiFiInterfaceConfig.obfuscatedPassphrase                  | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetWiFiAccessPointMode()                                      | networkconfiguration.WiFiInterfaceConfig.accessPointMode                       | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetAccessPointFrequencyMHz()                                  | networkconfiguration.WiFiInterfaceConfig.accessPointFrequency                  | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetWiFiIdentity()                                             | networkconfiguration.WiFiInterfaceConfig.identity                              | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetWiFiEapTlsOptions()                                        | networkconfiguration.WiFiInterfaceConfig.eapTlsOptions                         | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetWiFiCACertificates()                                       | networkconfiguration.WiFiInterfaceConfig.caCertificates                        | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetWiFiClientCertificate()                                    | networkconfiguration.WiFiInterfaceConfig.clientCertificate                     | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetWiFiPrivateKey()                                           | networkconfiguration.WiFiInterfaceConfig.privateKey                            | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetWiFiSecurityMode()                                         | networkconfiguration.WiFiInterfaceConfig.securityMode                          | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| ConfigureDHCPServer()                                         | networkconfiguration.NetworkInterfaceConfig.dhcpServerConfig                   | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetForwardingPolicy()                                         | Not available                                                                  |                                                               |
| SetDNSServers()/.AddDNSServer()                               | networkconfiguration.NetworkInterfaceConfig.dnsServerList                      | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetTimeServer()                                               | hostconfiguration.HostConfig.timeServerList                                    | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetTimeServerIntervalSeconds()/ GetTimeServerIntervalSecons() | hostconfiguration.HostConfig.timeServerInterval                                | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetHostName()/.GetHostName()                                  | hostconfiguration.HostConfig.hostName                                          | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetProxy()/.GetProxy()                                        | hostconfiguration.HostConfig.proxy                                             | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| SetProxyBypass()/.GetProxyBypass()                            | hostconfiguration.HostConfig.proxyBypassList                                   | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| GetRecoveryUrl()                                              | Not available                                                                  |                                                               |
| ResetInterfaceSettings()                                      | networkconfiguration.applyConfig()                                             | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| ResetHostSettings()                                           | hostconfiguration.applyConfig()                                                | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| GetCurrentConfig()                                            | networkconfiguration.getConfig()/hostconfiguration.getConfig()                 | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| TestInterface()                                               | networkdiagnostics.testNetworkInterface()                                      | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| TestInternetConnectivity()                                    | networkdiagnostics.testInternetConnectivity()                                  | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| GetNeighborInformation()                                      | networkconfiguration.getNeighborInformation()                                  | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| ScanWiFi()                                                    | networkconfiguration.scan()                                                    | [BrightScript JavaScript API](docId\:U6ZceYQddlz9xdAKtTmJs)   |
| roNetworkHotplug                                              | [networkhotplug](docId\:NEizLJQNwCice75OcWKoL)                                 |                                                               |
| roNetworkAttached                                             | [networkhotplug](docId\:NEizLJQNwCice75OcWKoL)                                 |                                                               |
| roNetworkDetached                                             | [networkhotplug](docId\:NEizLJQNwCice75OcWKoL)                                 |                                                               |
| roNetworkDiscovery                                            | Not applicable (node.js can be used instead)                                   |                                                               |
| roNetworkStatistics                                           | Not applicable (See node module net-stat)                                      |                                                               |
| roPtp                                                         | [hostconfiguration](docId\:P1DkloQhLM9wxsSwmPeeK) (see OS 8.0.94 release note) |                                                               |
| roRssArticle/roRssParser                                      | Not applicable                                                                 |                                                               |
| roRtspStream                                                  | Use \<video> elements                                                          |                                                               |
| roSnmpAgent                                                   | net-snmp                                                                       | npm\*\*\*                                                     |
| roStream                                                      | Not applicable                                                                 |                                                               |
| roSyncManager                                                 | [BSSyncManager](docId\:DQNX2ot2TDKXYNmRGLNCP)                                  | BS-JavaScript objects                                         |
| roTCPServer/roTCPStream                                       | net.socket                                                                     | Node.js®                                                      |
| roUPnP                                                        | Not applicable                                                                 |                                                               |
| roUrlTransfer                                                 | http                                                                           | Node.js®                                                      |

\*\*\* npm is a registered trademark of npm, Inc.

### Input/Output Objects

| **BrightScript API**         | **JavaScript Equivalent**                       | **Library**                                                  |
| ---------------------------- | ----------------------------------------------- | ------------------------------------------------------------ |
| roBtManager                  | [BSBtManager](docId\:Cf7q7xSA9dRtCq3bTXV-A)     | BS-JavaScript objects                                        |
| roBtClientManager/roBtClient | [BSBtManager](docId\:Cf7q7xSA9dRtCq3bTXV-A)     |                                                              |
| roCecInterface               | [cec](docId\:sgfokqfxwmjxxOfS13HtK)             |                                                              |
| roChannelManager             | obsolete                                        |                                                              |
| roControlPort                | [controlport](docId\:N8yoCsdAGOgqCP1OyuoLw)     | BS-JavaScript objects                                        |
| roGpioControlPort            | [controlport](docId\:N8yoCsdAGOgqCP1OyuoLw)     | BS-JavaScript objects                                        |
| roIRReceiver                 | [BSIRReceiver](docId\:W5oQmfTxhlg8lwisWtg7r)    | BS-JavaScript objects                                        |
| roIRTransmitter              | [BSIRTransmitter](docId\:OG4yl3PeFza5nKGKbgBLv) | BS-JavaScript objects                                        |
| roIRRemote                   | BSIRRemote                                      |                                                              |
| roKeyboard                   | [keyboard](docId\:mNJv4RN7rm_2FSlSjTqgc)        | [BrightScript-JavaScript API](docId\:VNJf6GnS75_lMizET3b1y)  |
| roSequenceManager            | Not applicable                                  |                                                              |
| roSerialPort                 | [BSSerialPort](docId\:ZMQun8ZM06AoSriD6EsfB)    | BS-JavaScript objects                                        |

### System Objects

| **BrightScript API**  | **JavaScript Equivalent**                    | **Library** |
| --------------------- | -------------------------------------------- | ----------- |
| roDeviceCustomization | Not available                                |             |
| roDeviceInfo          | [BSDeviceInfo](docId\:s5S40P5KDiRwX7euJzSBa) |             |
| roResourceManager     | Not applicable                               |             |
| roSystemLog           | Not available                                |             |

### Date and Time Objects

| **BrightScript API** | **JavaScript Equivalent**                   | **Library**                                                 |
| -------------------- | ------------------------------------------- | ----------------------------------------------------------- |
| roDateTime           | Date                                        | JavaScript built-in                                         |
| roSystemTime         | [systemtime](docId\:pwLrn-rjiHDHgwl2TBwC0)  | [BrightScript JavaScript API](docId\:HWR0ZojGTZxXnUHDLHlf9) |
| roTimer              | .setTimeout()/.setInterval()                | Web API                                                     |
| roTimeSpan           | Date                                        | JavaScript built-in                                         |


[title] registry
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *registry* object allows you to read from and write to the player registry (i.e. the persistent memory). The registry consists of named registry sections, and each registry section contains entries (key/value pairs).

**registry IDL**

```javascript
interface Registry {
    Promise<String> read(String sectionName, String key);
    Promise<RegistrySection> read(String sectionName);
    Promise<RegistryObject> read();

    Promise<void> write(String sectionName, String key, String value);
    Promise<void> write(String sectionName, RegistrySection section);
    Promise<void> write(RegistryObject);

    Promise<void> flush();
};
```

## Object Creation

To create a *registry* object, first load the `brightsign/registry` module using the `require()` method. Then create an instance of the *registry* class.

```javascript
var registryClass = require("@brightsign/registry");
var registry = new registryClass();
```

## Registry

Use this interface for registry read/write operations. 

:::hint{type="info"}
All section and key names are canonicalized to lowercase. 
:::

**read()**

```javascript
Promise<String> read(String sectionName, String key)
```

Returns the string registry value associated with the specified key. You must also specify the registry section where the key is stored.

```javascript
Promise<RegistrySection> read(String sectionName)
```

Returns the specified registry section in the following format: `RegistrySection.{entry_key}.`

```javascript
Promise<RegistryObject> read()
```

Returns all registry sections in the following format: `RegistryObject.{section_name}.{entry_key}.`

**write()**

```javascript
Promise<void> write(String sectionName, String key, String value)
```

Writes a single registry entry to the specified registry section.

```javascript
Promise<void> write(String sectionName, RegistrySection section)
```

Writes the specified registry section to the registry. If the registry section does not exist, it will be created; otherwise, the entries will be added or updated in the existing registry section (preexisting registry entries that are not specified in the write operation will be unaffected).

```javascript
Promise<void> write(RegistryObject)
```

Writes the specified registry sections/entries to the registry. Registry sections and entries that do not exist will be created, and existing entries will be updated (preexisting registry sections/entries that are not specified in the write operation will be unaffected).

:::hint{type="info"}
The single-entry `write()` method will not perform well when used to write multiple entries successively. For optimal performance, use the single-section `write()` method to write multiple entries to a single section and the full-registry method to write to multiple sections.
:::

:::hint{type="info"}
Sixty seconds at most after a write to the registry, or before an orderly reboot, the newly written data will be automatically be written out to persistent storage. If for some reason, a set of registry changes must be written immediately, then the `flush()` method should be called after the last one.
:::

:::hint{type="danger"}
While it is possible to read the entire registry, modfiy the return value, and write it back into the registry, this is not a recommended practice: It may cause race conditions among different parts of the system that are attempting to write to the registry at the same time.
:::

flush()

```javascript
Promise<void> flush()
```

Flushes the contents of the registry immediately to persistent storage.

:::hint{type="success"}
To delete a registry entry or section, assign it a `null` value.
:::

## Example

```javascript
var registryClass = require("@brightsign/registry");
var registry = new registryClass();
 
//Reads the entire registry to the log.
registry.read().then(function(registry) {
    console.log(JSON.stringify(registry));
});
 
//Reads the contents of the "networking" registry to the log.
registry.read("networking").then(
	function(registry){console.log(JSON.stringify(registry));});
 
//Writes multiple entries to multiple sections.
registry.write({networking:{ssh:"22", http_server:"8080"}, autorun:{devicesetupcomplete:"1"}} ).then(
	function(){console.log("Write Successful");});
 
//Updates a single section.
registry.write("networking", {ssh:"22", http_server:"8080"}).then(
	function(){console.log("Write Successful");});
 
//Deletes a registry section and entry, and creates a new section.
registry.write({networking:{ssh:"22", http_server:null}, autorun:null, section1:{test:"val"}} ).then(
	function(){console.log("Write Successful");});
```


[title] B-Deploy Setup Endpoints (v3)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 3.0 B-Deploy Endpoints/

These endpoints allow users to automatically provision BrightSign players over the internet. This endpoint handles everything regarding *individual* players. Add your serial number to BrightSign’s cloud storage with an associated player name, provisioning package name, and the URL where the provisioning package is hosted. The URL is optional - it can be left blank if using a Setup package.

Version 3.0 of these APIs contains additional support for multiple network interfaces through the [Network](docId\:q84eMT6M9gGAJ8SmUtPQ7) object.

Base URL for these endpoints: ***https\://provision.bsn.cloud/rest-setup/v3/setup/***

***\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_***

## GET  /

Returns a list of setup records in the exact format they are stored in the B-deploy database. The main setup values are stored in each array object in the “setupJson” parameter.

If you want to get information about a specific B-Deploy setup, see [GET /:\_id/](docId\:Aqq49Ls5EyGe5OU_GEWpU)&#x20;

**Query String Parameter**

- `NetworkName` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>The user-defined name of the BSN.Cloud network
- `username` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>The name of the user who created the Setup package
- `packageName` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>The user-defined name of the Setup package.

**Request Example**

- `username` is set to `JaneDoe@brightsign.biz`
- `NetworkName` is set to `JaneDoeNetwork`
- `packageName` is set to `My Setup Package`

```none
GET /rest-setup/v3/setup/?username=JaneDoe%40brightsign.biz&NetworkName=JaneDoeNetwork&packageName=My%20Setup%20Package HTTP/1.1
Host: provision.bsn.cloud
Authorization: {{Bearer Token}}
Accept: application/json
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a list of [Setup Package Info Entity (v3)](docId\:q92IhZrQrweLn-YhGXk-E)&#x20;

**Success Response** **Example**

```json
{
  "error": null,
  "result": [
    {
      "_id": "1a2b3c4d5e6f7a8b9c0d1e2f",
      "username": "JaneDoe@brightsign.biz",
      "client": "bacon",
      "packageName": "My Setup Package",
      "setupType": "bsn",
      "networkName": "JaneDoeNetwork",
      "deviceName": "My Player",
      "deviceDescription": "",
      "bsnGroupName": "Default",
      "setupJson": "{\"version\":\"3.0.0\",\"_id\":\"1a2b3c4d5e6f7a8b9c0d1e2f\",\"bDeploy\":{\"username\":\"JaneDoe@brightsign.biz\",\"networkName\":\"JaneDoeNetwork\",\"client\":\"bacon\",\"packageName\":\"NewTimezone\"},\"firmwareUpdatesByFamily\":{\"Impala\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"impala-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"impala-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"impala-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"impala-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/impala-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/impala-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/impala-8.0.146-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.0.146\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524434,\"productionReleaseSHA1\":\"4dcf3e2dae41d05e49f3bc6a8ed49925d1cbb75a\",\"betaReleaseSHA1\":\"4dcf3e2dae41d05e49f3bc6a8ed49925d1cbb75a\",\"compatibleReleaseSHA1\":\"789cf557fbb0a5f70ecc103e5d071186b57eb38f\",\"productionReleaseFileLength\":144788480,\"betaReleaseFileLength\":144788480,\"compatibleReleaseFileLength\":137811964,\"existingFWContentID\":\"\"},\"Pantera\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"pantera-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"pantera-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"pantera-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"pantera-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pantera-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pantera-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pantera-8.0.146-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.0.146\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524434,\"productionReleaseSHA1\":\"ee9ef5265c5ff85c77e4a87f264f8cf1112225ed\",\"betaReleaseSHA1\":\"ee9ef5265c5ff85c77e4a87f264f8cf1112225ed\",\"compatibleReleaseSHA1\":\"58196ad8707b6e62185f1aba6d124ed1adfa7f67\",\"productionReleaseFileLength\":144337538,\"betaReleaseFileLength\":144337538,\"compatibleReleaseFileLength\":137509058,\"existingFWContentID\":\"\"},\"Tiger\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"tiger-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"tiger-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"tiger-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"tiger-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/tiger-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/tiger-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/tiger-8.0.146-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.0.146\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524434,\"productionReleaseSHA1\":\"45df4348e6ce1039fa54f8a3fa3bf0e6e95dacca\",\"betaReleaseSHA1\":\"45df4348e6ce1039fa54f8a3fa3bf0e6e95dacca\",\"compatibleReleaseSHA1\":\"f02173d13f800d8d264d761226f783baa27b44b2\",\"productionReleaseFileLength\":156481838,\"betaReleaseFileLength\":156481838,\"compatibleReleaseFileLength\":147734484,\"existingFWContentID\":\"\"},\"Pagani\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"pagani-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"pagani-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"pagani-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"pagani-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pagani-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pagani-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/pagani-8.0.146-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.0.146\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524434,\"productionReleaseSHA1\":\"8dd2ede70c9095392fb30e031b9376922af98528\",\"betaReleaseSHA1\":\"8dd2ede70c9095392fb30e031b9376922af98528\",\"compatibleReleaseSHA1\":\"9af7416c055f9fe45d3b492ad00a7cb8b0e5f7ff\",\"productionReleaseFileLength\":190350854,\"betaReleaseFileLength\":190350854,\"compatibleReleaseFileLength\":167649562,\"existingFWContentID\":\"\"},\"Malibu\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"malibu-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"malibu-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"malibu-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"malibu-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/malibu-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/malibu-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/malibu-8.0.146-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.0.146\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524434,\"productionReleaseSHA1\":\"5358940fe1aa6742aa8a9e0f82c1920991476867\",\"betaReleaseSHA1\":\"5358940fe1aa6742aa8a9e0f82c1920991476867\",\"compatibleReleaseSHA1\":\"b897e81655879cc0cf7a73fad79aa615cb17da31\",\"productionReleaseFileLength\":191643784,\"betaReleaseFileLength\":191643784,\"compatibleReleaseFileLength\":178140054,\"existingFWContentID\":\"\"},\"Sebring\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"sebring-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"sebring-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"sebring-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"sebring-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/sebring-8.5.47-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/sebring-8.5.47-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/sebring-8.2.17.3-update.bsfw\",\"productionVersion\":\"8.5.47\",\"betaVersion\":\"8.5.47\",\"compatibleVersion\":\"8.2.17.3\",\"productionVersionNumber\":525615,\"betaVersionNumber\":525615,\"compatibleVersionNumber\":524817,\"productionReleaseSHA1\":\"8c14e14c01251e6dae32bba286b3bf79ec34cffa\",\"betaReleaseSHA1\":\"8c14e14c01251e6dae32bba286b3bf79ec34cffa\",\"compatibleReleaseSHA1\":\"399b5dd4203a8283f8e357a41e0168c33eb2418a\",\"productionReleaseFileLength\":81108806,\"betaReleaseFileLength\":81108806,\"compatibleReleaseFileLength\":74604516,\"existingFWContentID\":\"\"},\"Raptor\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"raptor-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"raptor-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"raptor-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"raptor-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/raptor-9.0.145.1-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/raptor-9.0.145.1-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/raptor-9.0.22.3-update.bsfw\",\"productionVersion\":\"9.0.145.1\",\"betaVersion\":\"9.0.145.1\",\"compatibleVersion\":\"9.0.22.3\",\"productionVersionNumber\":589969,\"betaVersionNumber\":589969,\"compatibleVersionNumber\":589846,\"productionReleaseSHA1\":\"06ffdc99949dddf1645ad738ce4508597f0e8db0\",\"betaReleaseSHA1\":\"06ffdc99949dddf1645ad738ce4508597f0e8db0\",\"compatibleReleaseSHA1\":\"245ef90811a7bcd2e1ca862b451c4d8abfaa5526\",\"productionReleaseFileLength\":443631114,\"betaReleaseFileLength\":443631114,\"compatibleReleaseFileLength\":343723720,\"existingFWContentID\":\"\"},\"Cobra\":{\"firmwareUpdateSource\":null,\"firmwareUpdateSourceFilePath\":\"\",\"firmwareUpdateSourceUrl\":\"\",\"firmwareUpdateStandardTargetFileName\":\"cobra-update.bsfw\",\"firmwareUpdateDifferentTargetFileName\":\"cobra-update_different.bsfw\",\"firmwareUpdateNewerTargetFileName\":\"cobra-update_newer.bsfw\",\"firmwareUpdateSaveTargetFileName\":\"cobra-update_save.bsfw\",\"firmwareUpdateVersion\":\"\",\"productionReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.145.1-update.bsfw\",\"betaReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.145.1-update.bsfw\",\"compatibleReleaseURL\":\"https://bsncloud.s3.amazonaws.com/public/cobra-9.0.75-update.bsfw\",\"productionVersion\":\"9.0.145.1\",\"betaVersion\":\"9.0.145.1\",\"compatibleVersion\":\"9.0.75\",\"productionVersionNumber\":589969,\"betaVersionNumber\":589969,\"compatibleVersionNumber\":589899,\"productionReleaseSHA1\":\"7d53871f30852a7851b5fa4a88f4640b4d18aa40\",\"betaReleaseSHA1\":\"7d53871f30852a7851b5fa4a88f4640b4d18aa40\",\"compatibleReleaseSHA1\":\"a213680fa5d8fb9437bee43888c37b9fd932f62d\",\"productionReleaseFileLength\":361576318,\"betaReleaseFileLength\":361576318,\"compatibleReleaseFileLength\":259763696,\"existingFWContentID\":\"\"}},\"firmwareUpdateType\":\"standard\",\"setupType\":\"bsn\",\"bsnDeviceRegistrationTokenEntity\":{\"token\":\"QBzIU4fdYEvWZ8R7EdwK3ISDRH72sDUi6K7FEl2cmNA5pZBxBNDn12qgWF78zGGMMOBoDTp898SsdTCSZy469ZKxwBoXxtarHTl71F3Y6ImfGXkyHnsxIwNCZYfctXoD\",\"scope\":\"cert\",\"validFrom\":\"2024-05-08T18:42:18.000Z\",\"validTo\":\"2026-05-08T18:42:18.000Z\"},\"enableSerialDebugging\":false,\"enableSystemLogDebugging\":false,\"remoteDwsEnabled\":true,\"dwsEnabled\":true,\"dwsPassword\":\"\",\"dwsPasswordPreviousSavedTimeStamp\":1714573782270,\"lwsEnabled\":true,\"lwsConfig\":\"status\",\"lwsUserName\":\"\",\"lwsPassword\":\"\",\"lwsEnableUpdateNotifications\":true,\"bsnCloudEnabled\":true,\"deviceName\":\"Series 5\",\"deviceDescription\":\"\",\"unitNamingMethod\":\"appendUnitIDToUnitName\",\"timeZone\":\"EST\",\"bsnGroupName\":\"Default\",\"timeBetweenNetConnects\":300,\"sfnWebFolderUrl\":\"\",\"sfnUserName\":\"\",\"sfnPassword\":\"\",\"sfnEnableBasicAuthentication\":false,\"playbackLoggingEnabled\":false,\"eventLoggingEnabled\":false,\"diagnosticLoggingEnabled\":false,\"stateLoggingEnabled\":false,\"variableLoggingEnabled\":false,\"uploadLogFilesAtBoot\":false,\"uploadLogFilesAtSpecificTime\":false,\"uploadLogFilesTime\":0,\"logHandlerUrl\":\"\",\"enableRemoteSnapshot\":false,\"remoteSnapshotInterval\":15,\"remoteSnapshotMaxImages\":5,\"remoteSnapshotJpegQualityLevel\":50,\"remoteSnapshotScreenOrientation\":\"Landscape\",\"remoteSnapshotHandlerUrl\":\"\",\"idleScreenColor\":{\"r\":112,\"g\":40,\"b\":150,\"a\":1},\"networkDiagnosticsEnabled\":false,\"testEthernetEnabled\":false,\"testWirelessEnabled\":false,\"testInternetEnabled\":false,\"useCustomSplashScreen\":false,\"BrightWallName\":\"\",\"BrightWallScreenNumber\":\"\",\"contentDownloadsRestricted\":false,\"contentDownloadRangeStart\":0,\"contentDownloadRangeEnd\":0,\"usbUpdatePassword\":\"\",\"inheritNetworkProperties\":true,\"internalCaArtifacts\":[],\"network\":{\"timeServers\":[\"http://time.brightsignnetwork.com\"],\"hostname\":null,\"dns\":null,\"proxyServer\":null,\"proxyBypass\":null,\"interfaces\":[{\"id\":\"wired_eth0\",\"name\":\"eth0\",\"type\":\"Ethernet\",\"proto\":\"DHCPv4\",\"ip\":[],\"gateway\":null,\"dns\":[],\"rateLimitDuringInitialDownloads\":0,\"rateLimitInsideContentDownloadWindow\":0,\"rateLimitOutsideContentDownloadWindow\":null,\"contentDownloadEnabled\":true,\"textFeedsDownloadEnabled\":true,\"mediaFeedsDownloadEnabled\":true,\"healthReportingEnabled\":true,\"logsUploadEnabled\":true,\"wpaSettings\":{\"enableWPAEnterpriseAuthentication\":false,\"wpaEnterpriseVariant\":\"WPAEnterpriseEapTls\",\"eapCertificateType\":\"WPAEapTlsPKCS\",\"eapCertificateFile\":null,\"eapCertificatePassphrase\":\"\",\"eapPemOrDerKeyFile\":null,\"peapUsername\":\"\",\"peapPassphrase\":\"\",\"caCertificateFile\":null}}]}}",
      "version": "3.0.0",
      "createdAt": "2025-03-28T22:22:36.900Z",
      "updatedAt": "2025-05-08T18:42:18.692Z",
      "__v": 0
    }
  ]
}
```

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid (for example, `NetworkName` is not specified)

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method. The access token used to call this /v3/setup API must belong to the same network.

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET  /:\_id/ 

Retrieves one Setup package having the specified ID from the B-Deploy server. 

**Route Parameter**

- `_id` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>The primary identifier of the Setup package you want to retrieve. This "id" is returned in the response to */rest-setup/v3/setup/POST*.

**Example Request**

```none
GET /rest-setup/v3/setup/1a2b3c4d5e6f7a8b9c0d1e2f/ HTTP/1.1
Host: provision.bsn.cloud
Authorization: {{Bearer Token}}
Accept: application/json
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an empty array of device setup errors and the [Device Setup Entity (v3)](docId\:rHtIqLjdTc_jZorvPnV8_).

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method. The access token used to call this /v3/setup API must belong to the same network.

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST  /

Creates a Setup package on the B-Deploy server

**Request Body**

- The [Device Setup Entity (v3)](docId\:rHtIqLjdTc_jZorvPnV8_)

**Example Request**

```none
POST /rest-setup/v3/setup HTTP/1.1
Host: provision.bsn.cloud
Authorization: {{Bearer Token}}
Content-Type: application/json
Content-Length: 10427
Accept: application/json
```

This is the example request body:

:::ExpandableHeading
Expand

```json
{
  "version": "3.0.0",
  "bDeploy": {
    "username": "JaneDoe@gmail.com",
    "networkName": "JaneDoeNetwork",
    "packageName": "FullSetup2"
    },
  "setupType": "bsn",
  "bsnDeviceRegistrationTokenEntity": {
    "token": {{token}},
    "scope": "certs",
    "validFrom": "2024-09-28T19:47:09.577Z",
    "validTo": "2026-09-28T19:47:09.577Z"
    },
  "firmwareUpdateType": "standard",
  "enableSerialDebugging": true,
  "enableSystemLogDebugging": true,
  "dwsEnabled": true,
  "dwsPassword": "",
  "lwsEnabled": true,
  "lwsConfig": "status",
  "lwsUserName": "",
  "lwsPassword": "",
  "lwsEnableUpdateNotifications": true,
  "deviceName": "",
  "deviceDescription": "",
  "unitNamingMethod": "appendUnitIDToUnitName",
  "timeZone": "PST",
  "bsnGroupName": "Default",
  "timeBetweenNetConnects": 300,
  "timeBetweenHeartbeats": 900,
  "sfnWebFolderUrl": "",
  "sfnUserName": "",
  "sfnPassword": "",
  "sfnEnableBasicAuthentication": false,
  "playbackLoggingEnabled": false,
  "eventLoggingEnabled": false,
  "diagnosticLoggingEnabled": false,
  "stateLoggingEnabled": false,
  "variableLoggingEnabled": false,
  "uploadLogFilesAtBoot": false,
  "uploadLogFilesAtSpecificTime": false,
  "uploadLogFilesTime": 0,
  "logHandlerUrl": "",
  "enableRemoteSnapshot": false,
  "remoteSnapshotInterval": 69,
  "remoteSnapshotMaxImages": 69,
  "remoteSnapshotJpegQualityLevel": 100,
  "remoteSnapshotScreenOrientation": "Landscape",
  "remoteSnapshotHandlerUrl": "",
  "useWireless": false,
  "ssid": "",
  "passphrase": "",
  "timeServer": "http://time.brightsignnetwork.com",
  "idleScreenColor": {
    "r": 0,
    "g": 0,
    "b": 0,
    "a": 1
  },
  "contentDataTypeEnabledWired": true,
  "textFeedsDataTypeEnabledWired": true,
  "healthDataTypeEnabledWired": true,
  "mediaFeedsDataTypeEnabledWired": true,
  "logUploadsXfersEnabledWired": true,
  "contentDataTypeEnabledWireless": true,
  "textFeedsDataTypeEnabledWireless": true,
  "healthDataTypeEnabledWireless": true,
  "mediaFeedsDataTypeEnabledWireless": true,
  "logUploadsXfersEnabledWireless": true,
  "rateLimitModeOutsideWindow": "default",
  "rateLimitRateOutsideWindow": 0,
  "rateLimitModeInWindow": "unlimited",
  "rateLimitRateInWindow": 0,
  "rateLimitModeInitialDownloads": "unlimited",
  "rateLimitRateInitialDownloads": 0,
  "networkConnectionPriority": "wired",
  "networkDiagnosticsEnabled": false,
  "testEthernetEnabled": false,
  "testWirelessEnabled": false,
  "testInternetEnabled": false,
  "useCustomSplashScreen": false,
  "BrightWallName": "",
  "BrightWallScreenNumber": "",
  "specifyHostname": false,
  "hostname": "",
  "useProxy": false,
  "proxyAddress": "",
  "proxyPort": 0,
  "networkHosts": [],
  "contentDownloadsRestricted": false,
  "contentDownloadRangeStart": 0,
  "contentDownloadRangeEnd": 0,
  "heartbeatsRestricted": false,
  "heartbeatsRangeStart": 0,
  "heartbeatsRangeEnd": 0,
  "useDHCP": true,
  "staticIPAddress": "",
  "subnetMask": "",
  "gateway": "",
  "dns1": "",
  "dns2": "",
  "dns3": "",
  "useDHCP_2": true,
  "staticIPAddress_2": "",
  "subnetMask_2": "",
  "gateway_2": "",
  "dns1_2": "",
  "dns2_2": "",
  "dns3_2": "",
  "rateLimitModeOutsideWindow_2": "default",
  "rateLimitRateOutsideWindow_2": 0,
  "rateLimitModeInWindow_2": "unlimited",
  "rateLimitRateInWindow_2": 0,
  "rateLimitModeInitialDownloads_2": "unlimited",
  "rateLimitRateInitialDownloads_2": 0,
  "usbUpdatePassword": "",
  "remoteDwsEnabled": true
}
```
:::

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: The ID of the newly created Setup package

**Response**

```json
{
  "error": null,
  "result": "1a2b3c4d5e6f7a8b9c0d1e2f"
}
```

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT  /

Modifies an existing Setup package on the B-Deploy server

**Request Body**

- `DeviceSetup` <font color="#704ae0">object: </font>A [Device Setup Entity (v3)](docId\:rHtIqLjdTc_jZorvPnV8_)

**Example Request**

```none
PUT /rest-setup/v3/setup HTTP/1.1
Host: provision.bsn.cloud
Authorization: {{Bearer Token}}
Content-Type: application/json
Content-Length: 5058
Accept: application/json
```

This is the example request body:

:::ExpandableHeading
Expand

```json
{
  "version": "3.0.0",
  "bDeploy": {
    "username": "JaneDoe@gmail.com",
    "networkName": "JaneDoeNetwork",
    "packageName": "FullSetup2"
    },
  "setupType": "bsn",
  "bsnDeviceRegistrationTokenEntity": {
    "token": {{token}},
    "scope": "certs",
    "validFrom": "2024-09-28T19:47:09.577Z",
    "validTo": "2026-09-28T19:47:09.577Z"
    },
  "firmwareUpdateType": "standard",
  "enableSerialDebugging": true,
  "enableSystemLogDebugging": true,
  "dwsEnabled": true,
  "dwsPassword": "",
  "lwsEnabled": true,
  "lwsConfig": "status",
  "lwsUserName": "",
  "lwsPassword": "",
  "lwsEnableUpdateNotifications": true,
  "deviceName": "",
  "deviceDescription": "",
  "unitNamingMethod": "appendUnitIDToUnitName",
  "timeZone": "PST",
  "bsnGroupName": "Default",
  "timeBetweenNetConnects": 300,
  "timeBetweenHeartbeats": 900,
  "sfnWebFolderUrl": "",
  "sfnUserName": "",
  "sfnPassword": "",
  "sfnEnableBasicAuthentication": false,
  "playbackLoggingEnabled": false,
  "eventLoggingEnabled": false,
  "diagnosticLoggingEnabled": false,
  "stateLoggingEnabled": false,
  "variableLoggingEnabled": false,
  "uploadLogFilesAtBoot": false,
  "uploadLogFilesAtSpecificTime": false,
  "uploadLogFilesTime": 0,
  "logHandlerUrl": "",
  "enableRemoteSnapshot": false,
  "remoteSnapshotInterval": 69,
  "remoteSnapshotMaxImages": 69,
  "remoteSnapshotJpegQualityLevel": 100,
  "remoteSnapshotScreenOrientation": "Landscape",
  "remoteSnapshotHandlerUrl": "",
  "useWireless": false,
  "ssid": "",
  "passphrase": "",
  "timeServer": "http://time.brightsignnetwork.com",
  "idleScreenColor": {
    "r": 0,
    "g": 0,
    "b": 0,
    "a": 1
  },
  "contentDataTypeEnabledWired": true,
  "textFeedsDataTypeEnabledWired": true,
  "healthDataTypeEnabledWired": true,
  "mediaFeedsDataTypeEnabledWired": true,
  "logUploadsXfersEnabledWired": true,
  "contentDataTypeEnabledWireless": true,
  "textFeedsDataTypeEnabledWireless": true,
  "healthDataTypeEnabledWireless": true,
  "mediaFeedsDataTypeEnabledWireless": true,
  "logUploadsXfersEnabledWireless": true,
  "rateLimitModeOutsideWindow": "default",
  "rateLimitRateOutsideWindow": 0,
  "rateLimitModeInWindow": "unlimited",
  "rateLimitRateInWindow": 0,
  "rateLimitModeInitialDownloads": "unlimited",
  "rateLimitRateInitialDownloads": 0,
  "networkConnectionPriority": "wired",
  "networkDiagnosticsEnabled": false,
  "testEthernetEnabled": false,
  "testWirelessEnabled": false,
  "testInternetEnabled": false,
  "useCustomSplashScreen": false,
  "BrightWallName": "",
  "BrightWallScreenNumber": "",
  "specifyHostname": false,
  "hostname": "",
  "useProxy": false,
  "proxyAddress": "",
  "proxyPort": 0,
  "networkHosts": [],
  "contentDownloadsRestricted": false,
  "contentDownloadRangeStart": 0,
  "contentDownloadRangeEnd": 0,
  "heartbeatsRestricted": false,
  "heartbeatsRangeStart": 0,
  "heartbeatsRangeEnd": 0,
  "useDHCP": true,
  "staticIPAddress": "",
  "subnetMask": "",
  "gateway": "",
  "dns1": "",
  "dns2": "",
  "dns3": "",
  "useDHCP_2": true,
  "staticIPAddress_2": "",
  "subnetMask_2": "",
  "gateway_2": "",
  "dns1_2": "",
  "dns2_2": "",
  "dns3_2": "",
  "rateLimitModeOutsideWindow_2": "default",
  "rateLimitRateOutsideWindow_2": 0,
  "rateLimitModeInWindow_2": "unlimited",
  "rateLimitRateInWindow_2": 0,
  "rateLimitModeInitialDownloads_2": "unlimited",
  "rateLimitRateInitialDownloads_2": 0,
  "usbUpdatePassword": "",
  "remoteDwsEnabled": true
}
```
:::

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: The existing Setup package has been successfully modified

**Failure Response**

<font color="#9a0808">400</font>: Either the request or request body is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE  /:\_id/

Deletes an existing Setup package having the specified ID from the B-Deploy server

**Query String Parameter**

- `_id` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>The unique identifier of the device setup to delete

**Request Example**

- `_id` is set to `1a2b3c4d5e6f7a8b9c0d1e2f`

```none
DELETE /rest-setup/v3/setup/?_id=1a2b3c4d5e6f7a8b9c0d1e2f HTTP/1.1
Host: provision.bsn.cloud
Authorization: {{Bearer Token}}
Content-Type: application/json
Accept: application/json
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: The specified Setup package has been successfully deleted

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error


[title] serialport
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *@brightsign/serialport&#xA0;*&#x6F;bject, exposed by the BrightSign OS on the player, allows integration with the player serial port to transmit and receive serial data. This is a serial port binding with support for the third-party Node [SerialPort](https://serialport.io/) package. See [About SerialPort | Node SerialPort](https://serialport.io/docs/9.x.x/) for more information.

The *@brightsign/serialport* binding is used to initialize the *serialport* object’s underlying communication module through the `binding` property.

## Example

See [bs-node-serialport: master](https://github.com/brightsign/bs-node-serialport/tree/master) for a reference implementation.

[title] tvcontroller
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *tvcontroller&#xA0;*&#x6F;bject provides a communication interface between televisions and BrightSign built-in products. This object is available as of BOS 9.0.16&#x38;**.**

Multiple instances of *tvcontroller* can access the television from multiple domains (user node application, user HTML application, etc.), or you can use multiple instances of the JavaScript object. They all access the same television hardware and they all get notified with an event when the television sends a message.

**tvcontroller IDL**

```javascript
@brightsign/tvcontroller                                                                                                                                                                                                                                                                              
[Exposed=Window]                                                                                                                                                                                                                                                                                      
interface TvController {                                                                                                                                                                                                                                                                              
  Promise<void> send(Array data);                                                                                                                                                                                                                                                                     
  attribute EventHandler onreceive;                                                                                                                                                                                                                                                                   
};                                                                                                                                                                                                                                                                                                    
                                                                                                                                                                                                                                                                                                      
[Exposed=Window]                                                                                                                                   
interface ReceiveEvent : Event {                                                                                                                   
  readonly attribute Array data;                            
};   
```

## Object Creation

To create a *tvcontroller* object, load the `brightsign/tvcontroller` module using the `require()` method and then create an instance of the *tvcontroller*:

```javascript
let tv_controller_class = require("@brightsign/tvcontroller");
let tv_controller = new tv_controller_class();
```

## TvController

Use this interface to access a television (for example, to send messages)

**send()**

```javascript
Promise<void> send(Array data)
```

**Attribute**

- `onreceive` <font color="#6554c0">EventHandler</font>:

## ReceiveEvent

Use this interface to get notified with an event when the television sends a message

**Attribute**

- `data` <font color="#6554c0">Array</font>: This is a read-only attribute

## Messages

Messages are defined in the Protobuf format. BrightSign firmware includes the JavaScript bindings of the protocol buffer messages in the firmware image. To load the messages, load the following module:

```javascript
let { messages } = require("messages_pb");
```

A single Protobuf file is used for both television to BrightSign Built-In and BrightSign Built-In to television messages, because the same messages are used both for verification and update notifications. When BrightSign updates a field (for example, to set up the volume), the television sends the same message back to BrightSign that the volume is updated. The volume can be updated with the television user interface, via remote control. BrightSign also gets that as an event from the television.

There are some exceptions:

- Brightsign Built-In doesn’t send messages back to the television to confirm acknowledgement of receipt of the request message, it only sends the requested information.
- Both sides can send `PowerSettings` message to each other. To prevent confusion with receiving a command and a acknowledgement, we have `PowerSettings` and `PowerSettingsAck `message types. `PowerSettingsAck` is sent when device gets a `PowerSettings` message and switches to the requested power mode.

This is the Proto file for the communication interface:

```javascript
syntax = "proto3";

package messages;

message WhiteBalance {
    int32 red_gain = 1;   // Red channel gain (e.g., 0 to 100)
    int32 green_gain = 2; // Green channel gain (e.g., 0 to 100)
    int32 blue_gain = 3;  // Blue channel gain (e.g., 0 to 100)
}

// Message to set the TV HDMI input.
message VideoOutputSettings {
    enum VideoOutputSelection {
        HDMI_1 = 0;
        HDMI_2 = 1;
        // Add more as needed
    }
    VideoOutputSelection selected_input = 1;
}

// There may be more PowerStatus modes in the future
enum PowerStatus {
    STANDBY = 0;
    ON = 1;
    FAST_TV_START = 2;
}

// Message to set the power status
message PowerSettings {
    PowerStatus status = 1;
}

// PowerSettingsAck message is an acknowledge to power status 
// change request.
// Sender should wait for Ack after changing PowerSettings
// via PowerSettings message, or via GPIO when waking device
// up
message PowerSettingsAck {
    PowerStatus status = 1;
}

// Whatever this value is set to, the TV must store it on their side.
// And then when the TV goes into standby using an IR command, the TV
// must send that value to the BrightSign player.
//
// PowerSettingsUpdate message is mainly to be used as a trigger 
// to enable/disable "Fast TV Start".
//
message PowerSettingsUpdate {
    PowerStatus status = 1;
}

// Message to set the power lock status
message PowerLockSettings {
    enum PowerLockStatus {
        DISABLED = 0;
        ENABLED = 1;
    }
    PowerLockStatus status = 1;
}

// Message to set or get the USB device connection.
message USBConnectionSettings {
    enum USBConnection {
        CONNECTED_TO_TV = 0;
        CONNECTED_TO_SET_TOP_BOX = 1;
    }
    USBConnection connection = 1;
}

// Message to forward the IR commands received by the TV.
message IRCommandMessage {
    uint32 code = 1;
    string encoding = 2;
}

enum Request {
    DEVICE_INFO = 0;
    VIDEO_OUTPUT_SETTINGS = 1;
    POWER_SETTINGS_ACK = 2;
    USB_CONNECTION_SETTINGS = 3;
    VOLUME = 4;
    GAMMA = 5;
    BRIGHTNESS = 6;
    CONTRAST = 7;
    WHITE_BALANCE = 8;
    IDLE_STANDBY_TIMEOUT_SECONDS = 9;
    POWER_SETTINGS = 10;
    POWER_SETTINGS_UPDATE = 11;
    POWER_LOCK_SETTINGS = 12;
}

message WifiInfo {
    string mac_address = 1; // "XX:XX:XX:XX:XX:XX"
}

message DeviceInfo {
    string mac_address = 1; // "XX:XX:XX:XX:XX:XX"
    string serial_no = 2;
    string os_version = 3; // "X.X.X.X"
    int32 hw_revision = 4; //
    WifiInfo wifi_info = 5;
}

message FirmwareUpdate {
    string file_path = 1; 
}

message FirmwareUpdateComplete {
    enum FirmwareUpdateStatus {
        SUCCESS = 0;
        FAIL = 1;
    }
    FirmwareUpdateStatus status = 1;
    string reason = 2;
}

// Command message that will be sent from the set top box to the TV.
message TvCommand {
    oneof command {
        VideoOutputSettings video_output_settings = 1;
        PowerSettings power_settings = 2;
        PowerSettingsAck power_settings_ack = 3;
        USBConnectionSettings usb_connection_settings = 4;
        IRCommandMessage ir_command = 5;
        int32 volume = 6;
        float gamma = 7;
        int32 brightness = 8;
        int32 contrast = 9;
        WhiteBalance white_balance = 10;
        Request request = 11;
        DeviceInfo device_info = 12;
        int32 idle_standby_timeout_seconds = 13;
        FirmwareUpdate firmware_update = 14;
        FirmwareUpdateComplete firmware_update_complete = 15;
        PowerSettingsUpdate power_settings_update = 16;
        PowerLockSettings power_lock_settings = 17;
    }
}
```

## Usage Examples

### Set the TV Gamma Value

In this one way communication, BrightSign makes the request and the television updates and returns the gamma value.&#x20;

`Send` takes a JavaScript array, but `encode` returns `Uint8Array`.  `Uint8Array` should be converted to `Array` using `Array.from()` before calling `send`.

`decode` also expects a `Uint8Array`, but `receive` event returns `Array`. `Array` should be converted to `Uint8Array` before calling `decode` using `Uint8Array.from()`

```javascript
let tv_controller_class = require("@brightsign/tvcontroller");
let tv_controller = new tv_controller_class();
let { messages } = require("messages_pb");

tv_controller.addEventListener("receive", (event) => {
  // Decode the binary data
  let tv = messages.TvCommand.decode(Uint8Array.from(event.detail));
  switch (tv.command) {
    case 'gamma':
      let gamma = tv.gamma;
      console.log("Gamma value is updated to: " + gamma);
      break;
    default:
      console.log("Unknown command type: " + tv.command);
      break;
  }
});

const tvCommand = { gamma: 2.3 };
// Encode the data
const bytes = messages.TvCommand.encode(tvCommand).finish();
// Send it as an Array
tv_controller.send(Array.from(bytes));
```

### Send BrightSign Device Information

In the following example, the tv\_controller is set up to send a device info, when the television requests it. The application sets up a receive event listener and waits for a request event.&#x20;

Only one request, `DEVICE_INFO`, is currently available (anything else will error). A `DEVICE_INFO` request fills the required fields and sends a message back.

```javascript
let tv_controller_class = require("@brightsign/tvcontroller");
let tv_controller = new tv_controller_class();
let { messages } = require("messages_pb");

tv_controller.addEventListener("receive", (event)=>{
  // Decode the binary data
  let tv = messages.TvCommand.decode(Uint8Array.from(event.detail));
  switch (tv.command) {
    case 'request':
      // We only have DEVICE_INFO request for now
      if (tv.request != messages.Request.DEVICE_INFO) {
        throw new Error("Request is not DEVICE_INFO");
      }

      const tvCommand = {
        deviceInfo: {
          serialNo: "1234567890",
          osVersion: "1.2.3.4",
          hwRevision: 1,
          macAddress: "XX:XX:XX:XX:XX:XX",
          wifiInfo: {
            macAddress: "XX:XX:XX:XX:XX:XX"
          }
        }
      };
      const bytes = messages.TvCommand.encode(tvCommand).finish();
      tv_controller.send(Array.from(bytes));
      break;
    default:
      console.log("Unknown command type: " + tv.command);
      break;
  }
});
```


[title] BSMessagePort
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

This object allows for an associative array to be passed from JavaScript to BrightScript (or vice versa). Only one *BSMessagePort* instance may be created per *roHtmlWidget* instance.

The JavaScript equivalent is [messageport](docId:5lt7hkSSemQlNIAU7kva3).

## Methods

- `PostBSMessage(in Dictionary message)` boolean&#x20;

:::hint{type="info"}
The PostBSMessage() method does not accept nested dictionaries. The same is true for the PostJSMessage() BrightScript method.
:::

## Events

The following event occurs when a message is sent from BrightScript to JavaScript. It will appear as a *MessagePortEvent* event.

- `onbsmessage`

### MessagePortEvent

This event contains a single field:

- `data` any readonly&#x20;

The following script will iterate over all the fields received in the event:

```text
var bsMessage = new BSMessagePort();

bsMessage.onbsmessage = function(msg)
{
    for(name in msg.data)
    {
    	console.log('### ' + name + ': ' + msg.data[name]);
    }
}
```

In BrightScript, the *roHtmlWidget.PostJSMessage()* method can be used to post a message to JavaScript:

- `widget.PostJSMessage({ Param1: "Data1", Param2: "Data2", Param3: "Data3" })`

## Examples

The following script will send a collection of properties to BrightScript:

```text
function myFunction()
{
    var bsMessage = new BSMessagePort();
    bsMessage.PostBSMessage({complete: true, result: "PASS"});
}
```

The message will appear in BrightScript as an *roHtmlWidgetEvent*. In this case, the GetData().reason equals "message" and GetData().message contains the *roAssociativeArray*.

```text
while not finished
    ev = mp.WaitMessage(30000)
    if type(ev) <> "roHtmlWidgetEvent" then
        print type(ev)
        stop
    end if
    payload = ev.GetData()
    print payload
    print "Reason: "; payload.reason
    if payload.reason = "message" then
        print "Message: "; payload.message
        if payload.message.complete = invalid then
            stop
        else if payload.message.complete = "true" then
            finished = true
            if payload.message.result = "PASS" then
                print "Test passed"
            else
                print "Test failed: "; payload.message.err
                stop
            end if
        end if
    end if
end while
```


[title] BSSerialPort
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

For more information about available methods, refer to the [roSerialPort](docId:25Ega25ABzfTXgITvvmmS) entry.

If possible, use @brightsign/serialport with the Node Package [serialport](https://serialport.io/) instead of BSSerialPort. A basic reference implementation can be found in [this GitHub repository](https://github.com/brightsign/bs-node-serialport).

## Object Creation

`BSSerialPort(in unsigned long port);`

## Methods

- `SetBaudRate(in unsigned long baudRate) raises(DOMException)` void&#x20;
- `SetDataBits(in unsigned long dataBits) raises(DOMException)` void&#x20;
- `SetStopBits(in unsigned long stopBits) raises(DOMException)` void&#x20;
- `SetParity(in DOMString parity) raises(DOMException)` void&#x20;
- `SetEcho(in boolean flag)` boolean
- `SetInverted(in boolean flag)` boolean
- `SetFlowControl(in boolean flag)`
- `SetGenerateByteEvent(in boolean flag) raises(DOMException)` void&#x20;
- `SetGenerateLineEvent(in boolean flag) raises(DOMException)` void&#x20;
- `SetLineEnding(in DOMString eol) raises(DOMException)` void
- `SendByte(in unsigned long byte)` boolean
- `SendBytes(in ArrayBuffer data)` boolean
- `SendBytes(in ArrayBufferView data)` boolean
- `SendBytes(in DOMString data)` boolean
- `SendBreak(in long duration_ms)` boolean
- `Flush() raises(DOMException)` void
- `Close()`void:  Shuts down the instance, preventing it from further consuming resources. If this method is not called, garbage collection determines when the instance will be destroyed.

## Events

The following events are available via the *BSSerialPort* object. Each event can receive a SerialPortEvent event.

- `onserialbyte`
- `onserialline`

### SerialPortEvent – Attributes

For the onserialbyte event:

- `sbyte` unsigned long readonly  &#x20;

For the onserialline event:

- `sdata` DOMString readonly

## Example

```text
function serialOut()
{
    console.log("*** serialOut **");

    // '2' is the first externally connected USB  port on Cheetah
    var serial_out = new BSSerialPort(2);

    serial_out.SetBaudRate(115200);
    serial_out.SetDataBits(8);
    serial_out.SetStopBits(1);
    serial_out.SetParity("none");
    serial_out.SetEcho(true);

    serial_out.SetGenerateByteEvent(true);
    serial_out.SetGenerateLineEvent(true);

    serial_out.onserialbyte = function(e){
        console.log('### onserialbyte: ' + e.sbyte);
    }

    serial_out.onserialline = function(e){
        console.log('### onserialline: ' + e.sdata);
    }

    serial_out.SendByte(89);
    serial_out.SendByte(90);
    serial_out.SendByte(91);

    serial_out.SendBytes('Hello World!');
    serial_out.SendBytes(String.fromCharCode(64, 27, 66, 67))
}
```


[title] networkhotplug
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *networkhotplug* object can be used to generate events when a [network interface](docId\:U6ZceYQddlz9xdAKtTmJs) becomes available or unavailable. A *networkhotplugevent* will be generated, indicating the interface and whether it was attached or detached.

:::hint{type="info"}
Reconfiguring a network interface may cause it to detach and attach again.  A DHCP address renewal may cause an event, even if the IP address hasn't changed.
:::

**networkhotplug IDL**

```javascript
interface NetworkHotplugEvent {
    attribute String type;
    attribute bool attached; // 1 -> attached, 0 -> detached
    attribute String interfaceName;
};

callback NetworkHotplugEventCallback = void (NetworkHotplugEvent event);

interface NetworkHotplug {
    void addEventListener(String type, NetworkHotplugEventCallback callback);
    void removeEventListener(String type, NetworkHotplugEventCallback callback);
}; 
```

## Event Creation

To create a *networkhotplug* event, load the *@brightsign/networkhotplug* module using the Node.js® require() method:

```javascript
let networkhotplugClass = require("@brightsign/networkhotplug");
let networkhotplug = new networkhotplugClass();
```

## NetworkHotPlug 

Use this interface to configure a *networkhotplug* event.

- `networkhotplugevent`: This event is raised when the hotplug status changes. Use the `addEventListener()` method to listen for this event, or the `removeEventListener()` method to remove an event listener.

## NetworkHotPlugEvent Properties 

- `type` <font color="#6554c0">string</font>: Add or remove an event listener when this type of event occurs.
- `attached`<font color="#2166ae">:</font> Can be true or false (1 is attached, 0 is detached)
- `interfaceName` <font color="#6554c0">: </font>Returns the interface name (for example, "eth0")

## Example

```javascript
let networkhotplugClass = require("@brightsign/networkhotplug");
let networkhotplug = new networkhotplugClass();

networkhotplug.addEventListener("networkhotplugevent", onNetworkHotplugEvent);    

function onNetworkHotplugEvent(data) {
  if (data.attached)
{     // connected on 'data.interfaceName'   }
}
```


[title] Global BrightScript-JavaScript Functions
[path] Player APIs (BrightScript & JavaScript)/BrightScript-JavaScript Objects/

The following functions are implemented at the global level.

`IsBSLocalFilePresent()`

Determines whether the specified file exists on local storage. This function interfaces with the BrightScript pool and determines if the file exists there; it also searches for files with standard names.

`CloseAllBSClasses()`

:::hint{type="danger"}
This function existed to work around BrightScript / JavaScript object cleanup issues in older Chromium versions (Chromium 45 and 60).

BrightSignOS 9.1.1 and later use Chromium 120 which eliminates the need for this function. This function is therefore deprecated in BrightSignOS 9.1.1 and later.
:::

This function effectively calls `Close()` on all custom objects that have been created and have yet to be garbage collected. Call this function when initializing a new web page to ensure all previous links to hardware interfaces on the player have been removed.

[title] bt
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *bt* object allows you to check if Bluetooth is fitted; set, monitor, or retrieve the current BLE advertisements; scan for Bluetooth devices; and trigger connection to, and disconnection from, another device.

**bt IDL**

```javascript
enum BtCentralEventType {
    'advertising-report',
    'device-found',
    'device-lost'
};

interface BtCentralAdvertisingReportEvent {
    attribute String adapter_path;
    attribute String device_address;
    attribute int rssi;
    attribute Array<byte> data;
};

interface BtCentralDeviceFoundEvent {
    attribute String adapter_path;
    attribute String address;
    attribute String alias;
    [optional] attribute String name;
    [optional] attribute int rssi;
    [optional] attribute int tx_power;
    [optional] attribute Array<String> uuids;
    [optional] attribute Array<byte> advertising_flags;
    [optional] attribute Array<Array<int, Array<byte>>> manufacturer_data;
    [optional] attribute Map<String, Array<byte>> service_data;
};

interface BtCentralDeviceLostEvent {
    attribute String adapter_path;
    attribute String address;
};

typedef (BtCentralAdvertisingReportEvent | BtCentralDeviceFoundEvent | BtCentralDeviceLostEvent) BtCentralEvent;

callback BtCentralEventCallback = void (BtCentralEvent event);

interface BtCentral {
    Promise<Array<Adapter>> getAdapters();
    Promise<void> scan(optional ScanParameters);
    Promise<void> stopScan();

    void addEventListener(BtCentralEventType type, BtCentralEventCallback callback);
    void removeEventListener(BtCentralEventType type, BtCentralEventCallback callback);
};

interface Adapter {
    attribute String name;
    attribute bool powered;
};

interface ScanParameters {
    attribute bool advertisingReports;
};
```

## Object Creation

To create a *bt&#x20;*&#x6F;bject, first load the `brightsign/bt` module using the `require()` method. Then create an instance of the *bt&#x20;*&#x63;lass.

```javascript
var btClass = require("@brightsign/bt");
var bt = new btClass();
```

## BtCentralAdvertisingReportEvent

- `adapter_path` <font color="#704ae0">string</font> <font color="#01a0af">required</font>:  The adapter that the advertising device belongs to
- `device_address` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The identifier for a remote advertising device
- `rssi` <font color="#704ae0">int</font> <font color="#01a0af">required</font>: The signal strength of the device when an advertisement is reported
- `data` <font color="#704ae0">Array&lt;byte&gt;</font> <font color="#01a0af">required</font>: Advertisement data

## BtCentralDeviceFoundEvent

Indicates if a Bluetooth device is found during scanning

- `adapter_path` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The adapter that the advertising device belongs to
- `address` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The unique Bluetooth address of the device
- `alias` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: An alternate name for the remote device
- `name` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The name of the Bluetooth device
- `rssi` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The signal strength of the device
- `tx_power` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The transmitted power level of the device
- `uuids` <font color="#704ae0">Array&lt;String&gt;</font> <font color="#01a0af">optional</font>: UUID strings
- `advertising_flags` <font color="#704ae0">Array&lt;byte&gt;</font> <font color="#01a0af">optional</font>: The flags used for advertising
- `manufacturer_data` <font color="#704ae0">Array&lt;Array&lt;int, Array&lt;byte&gt;&gt;&gt;</font> <font color="#01a0af">optional</font>: The manufacturer specific advertisement data keyed by manufacturer id
- `service_data` <font color="#704ae0">Map&lt;String, Array&lt;byte&gt;&gt;</font> <font color="#01a0af">optional</font>: The service advertisement data keyed by UUID

## BtCentralDeviceLostEvent

This is used to report when a Bluetooth device is lost.

- `adapter_path` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The adapter that the advertising device belongs to
- `address` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The unique Bluetooth address of the device

## BtCentral

Use this interface to perform actions on Bluetooth streaming connections.

**getAdapters()**

:::BlockQuote
Promise\<Array\<Adapter>> getAdapters()
:::

Returns an array of adapter identity strings. The number of elements in the array is the number of Bluetooth adapters fitted.

**scan()**

:::BlockQuote
Promise\<void> scan(optional ScanParameters)
:::

Reports new Bluetooth devices as they are discovered. It is also possible to monitor raw advertising reports.

- `ScanParameters` <font color="#01a0af">optional</font>:

**stopScan()**

:::BlockQuote
Promise\<void> stopScan()
:::

Stops scanning and reporting new Bluetooth devices

**reset()**

:::BlockQuote
Promise\<void> reset()
:::

Will attempt to recover a Bluetooth stack if it becomes unresponsive&#x20;

**addEventListener**

:::BlockQuote
addEventListener(BtCentralEventType type, BtCentralEventCallback callback)
:::

This event is raised when the Bluetooth status changes. Use this method to listen for this event. See [JavaScript Event Handling](docId\:SurGnnHZ666sb1Wh6PbD9) for more information.

**removeEventListener**

:::BlockQuote
removeEventListener(BtCentralEventType type, BtCentralEventCallback callback)
:::

Use this method to remove an event listener. See [JavaScript Event Handling](docId\:SurGnnHZ666sb1Wh6PbD9) for more information.

## Adapter

In BOS versions below 9.1.21 and below 9.0.198, this returns an array of adapter identity strings. The number of elements in the array is the number of Bluetooth adapters fitted.

In BOS versions above 9.1.21 and 9.0.198, this returns an array of adapter objects.

- `name` <font color="#704ae0">string</font>:
- `powered` <font color="#704ae0">bool</font>: Whether or not the adapter is powered on

## ScanParameters

This interface contains information about a scanned Bluetooth streaming device: 

- `advertisingReports` <font color="#704ae0">bool</font>: Whether or not scanning for advertisements is active.


[title] Version 2.0 B-Deploy Endpoints
[path] Cloud APIs/B-Deploy/Provisioning APIs/


[title] BSN.Cloud Main APIs
[path] Cloud APIs/

This section contains the following information:

- [Making Requests](docId\:rVH5esU6dJdkNoKyMc3vk)&#x20;
- [Main API version 2022/06](docId:0QHiBo6rAs8zwYJybEH0R)&#x20;
- [Upload API version 2019/03](docId\:iqDejfajU2CO5mQNApE-n)&#x20;


[title] Ownership Info Entity  (v2)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 2.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v2)/

B-Deploy objects contain the following required properties: 

- `username` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The BSN.Cloud username
- `networkName` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The BSN.Cloud network name
- `packageName` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The client-defined name for the device setup package. This value must be unique among device setup packages that belong to your person entity.
- These optional properties can also be used: 
  - `client` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The name of the client creating the player setup package. This value can be arbitrary and is not related to the BSN.Cloud client identifier or client secret tokens.
  - `url` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: A URL address for a custom application URL. This value will be ignored if `setupType` is NOT set to `partnerApplication`.


[title] serialportlist
[path] Player APIs (BrightScript & JavaScript)/JavaScript APIs/

The *serialportlist* object exposes the available serial ports on a BrightSign player.

**serialportlist IDL**

```javascript
interface SerialPortList {
    Promise<array> getList();
};
```

## Object Creation

To create a *serialportlist* object, first load the `brightsign/serialportlist` module using the `Require()` method. Then create an instance of the *serialportlist* class. 

```javascript
var SerialPortListClass = require("@brightsign/serialportlist");
var serialPortList = new SerialPortListClass();
```

## serialPortList

Use this interface to get a list of the available serial ports (an array of serial port objects).

**getlist()**

```javascript
Promise<array> getList()
```

The following table is an example of what `getList()` might return:

```javascript
[{"fid":"UART:0","path":"/dev/ttyS0"},
  {"fid":"UART:1","path":"/dev/ttyS1"},
  {"fid":"USB:B/2.0","path":"/dev/ttyUSB0","pid":24577,"vid":1027},
  {"fid":"USB:B/4.0","path":"/dev/ttyUSB1","pid":24577,"vid":1027}]
```

- `fid`:  The friendly ID that indicates the physical location on the player of a port
- `vid, pid`:  The vendor and product ID (for USB devices only)&#x20;
- `path`:  The native path suitable for passing to the SerialPort constructor

The [roDeviceInfo GetUSBTopology()](docId\:uTKDmpos1ulxaoYLx1nS6) method contains information about USB devices (though fids used in that method don't contain `USB: prefix`), and details about the interpretation of the fid field. 

This is the standard port enumeration of serial devices:

- Most standard serial devices (including the USB-serial port on the [LS424](docId\:pfX3ZfrOOwIm0gPElVl68)) enumerate on port 0.
- To communicate with the serial port of an OPS display (for example, with the HO523), use port 1. 

## Example

Refer to the [node-serialport](https://serialport.io/docs/guide-usage) documentation for examples.

[title] Interfaces Entity (v3)
[path] Cloud APIs/B-Deploy/Provisioning APIs/Version 3.0 B-Deploy Endpoints/B-Deploy Setup Entities  (v3)/

An array of information about any network interface.

The order of the interface objects indicates the priority (“metric“) of each interface.The first interface object in the array is the highest priority interface and traffic will be sent to that interface if there is an active connection. All other interfaces are considered secondary interfaces. See [this page](docId:7Yk3I2x7TWfjHoyUEmv3a) for more information.

The properties that are displayed will depend on the type of interface. The interfaces entity contains the following required properties:

- `id` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The type of network interface (for example,"wireless\_wlan0" or "wired\_eth0")
- `name` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: A target network interface name (for example, "wlan0", "eth0", "usb0", or "ppp0")
- `type` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The player interface type (one of "Ethernet", "Cellular", "WiFi", "Virtual", or "Other")
- `proto` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: A configuration protocol or given network interface such as "Static" or "DHCPv4"
- `ssid` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The wireless network name, which is required if the interface is WLAN.

These optional properties can also be used:

- `ip`  <font color="#704ae0">string[]</font> <font color="#704ae0">or </font><font color="#704ae0">null</font> <font color="#01a0af">optional</font>: An array of the target IPv4 addresses (in CIDR notation) to apply by the current network interface.
- `gateway` <font color="#704ae0">string or null</font> <font color="#01a0af">optional</font>: An IPv4 address of the player.
- `dns` <font color="#704ae0">string[]</font> <font color="#01a0af">optional</font>: An array of the device DNS addresses
- `rateLimitDuringInitialDownloads` <font color="#704ae0">int or null</font> <font color="#01a0af">optional</font>: The data rate limit for downloading content during initial downloads.
- `rateLimitInsideContentDownloadWindow`<font color="#704ae0"> int or null</font> <font color="#01a0af">optional</font>: The data rate limit during content downloads.
- `rateLimitOutsideContentDownloadWindow` <font color="#704ae0">int or null</font> <font color="#01a0af">optional</font>: The data rate limitation when content is not being downloaded.
- `contentDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: If true, content data can be downloaded using this connection. True is the default.
- `textFeedsDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: If true, text feeds data can be downloaded using this connection. True is the default.
- `mediaFeedsDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: If true, media feed data can be downloaded using this connection. True is the default.
- `healthReportingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: If true, uploading health reporting data is enabled using this connection. True is the default.
- `logsUploadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: If true, uploading log updates is enabled using this connection. True is the default.
- `passphrase` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The wireless network password
- `security` <font color="#704ae0">object</font> <font color="#01a0af">optional</font>: If this is provided, the following fields are required:
- `authentication` <font color="#704ae0">object</font>:
  - `mode` <font color="#704ae0">string</font>: Possible network modes are "Shared", "Open", "EAP" or "Other". The default is “Shared”
  - `passphrase` <font color="#704ae0">string</font>: The encrypted password for the network, if any
- `encryption` <font color="#704ae0">object:</font>
  - `mode` <font color="#704ae0">string</font>: The possible encryption modes are "None", "WEP", "TKIP", "CCMP", "TKIP,CCMP" or "Other". The default is “TKIP,CCMP”.
- `wpaSettings` <font color="#704ae0">object</font> <font color="#01a0af">optional</font>: If this is provided, the following fields are required:
  - `enableWPAEnterpriseAuthentication` <font color="#704ae0">bool</font>: If true, authentication via 802.1x (for wired) or WPA Enterprise Authentication (for wireless) is enabled.
  - `wpaEnterpriseVariant` <font color="#704ae0">string</font>: Either WPAEnterpriseEapTls or WPAEnterprisePeap
  - `eapCertificateType` <font color="#704ae0">string</font>: Either WPAEapTlsPKCS or WPAEapTlsPEMorDER
  - `eapCertificateFile` <font color="#704ae0">object</font>: An artifact object that has a name (which is a string) and an asset (which is a certificate file). This can default to null if it is not applicable.
  - `eapCertificatePassphrase` <font color="#704ae0">string</font>: A passphrase to protect the client certificate. This can default to null if it is not applicable.
  - `eapPemOrDerKeyFile` <font color="#704ae0">object</font>: An artifact object that has a name (which is a string) and an asset (which is a PEM or DER encoded X.509 certificate file).  This can default to null if it is not applicable.
  - `peapUsername` <font color="#704ae0">string</font>: The PEAP username for authentication. This can default to null if it is not applicable.
  - `peapPassphrase` <font color="#704ae0">string</font>: The PEAP password for authentication. This can default to null if it is not applicable.
  - `caCertificateFile` <font color="#704ae0">object</font>: An artifact object that has a name (which is a string) and an asset (which is a PEM/DER CA certificate file). This can default to null if it is not applicable.


[title] Player Network Interface Status Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

The Player Network Interface status entities follow one of the structures below, depending on the type of network interface (see `Type`):

`Player Network Interface Status`:

- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The reported network interface name (typically "eth0", “usb0”, “wlan0”, “ppp0”)
- `Type` <font color="#704ae0">PlayerNetworkInterfaceType</font> <font color="#01a0af">read-only</font>: One of "Ethernet”, “WiFi”, “Virtual”, or “Other”
- `Proto` <font color="#704ae0">NetworkConfigurationProtocol</font> <font color="#01a0af">read-only</font>: Comma-separated \{ "Static", "DHCPv4", "DHCPv6", "NDP" } enumeration values
- `Mac` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The reported media access control (mac) address
- `Ip` <font color="#704ae0">string[]</font> <font color="#01a0af">read-only</font>: The reported internet protocol (IP) address, may contain zero or more IPv4 and IPv6 addresses in CIDR notation
- `Gateway` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The reported IPv4 default gateway address. "Null" means that a default route is absent.
- `Metric` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-only</font>: The priority value assigned to the IP route for this network interface. "Null" means that a default route is absent.

`Player Cellular Interface Status`:

- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The reported network interface name (typically “ppp0”)
- `Type` <font color="#704ae0">PlayerNetworkInterfaceType</font> <font color="#01a0af">r</font><font color="#01a0af">ead-only</font>: "Cellular"
- `Proto` <font color="#704ae0">NetworkConfigurationProtocol</font> <font color="#01a0af">read-only</font>: Comma-separated \{ "Static", "DHCPv4", "DHCPv6", "NDP" } enumeration values
- `Mac` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The reported media access control (mac) address
- `Ip` <font color="#704ae0">string[]</font> <font color="#01a0af">read-only</font>: The reported internet protocol (IP) address, may contain zero or more IPv4 and IPv6 addresses in CIDR notation
- `Gateway` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The reported IPv4 default gateway address. "Null" means that a default route is absent.
- `Metric` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-only</font>: The priority value assigned to the IP route for this network interface. "Null" means that a default route is absent
- `Modem`:
  - `imei` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The unique International Mobile Equipment Identity number
  - `manufacturer` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the manufacturer 
  - `model` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The model identifier
  - `revision` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The model revision identifier
- `Sims:`
  - `status` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The interface status (for example, "OK")
  - `iccid` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The globally unique identifier for the SIM card
  - `connection` :
    - `network` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The reported network name 
    - `signal` <font color="#704ae0">short</font> <font color="#01a0af">read-only</font>: The reported signal strength


[title] Users Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

These endpoints enable management of Users on a network. A User is an instance of a person that is associated with a single network (there can only be one person, but there can be 0 to an infinite number of users on a network).

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Users***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Returns a list of Users on a network

**Required Scope Token**

bsn.api.main.users.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of Users exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of Users that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.
- `pageSize` is set to `1`

```text
GET /2022/06/REST/Users/?marker=RY0JlZW4tWW3hcnMsMTcyMU4&pageSize=1 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [User Entities](docId:2FSBdEMevbu2CZlzCQnEC) on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
   "items": [   {
      "id": 12345,
      "person":       {
         "id": 1234,
         "login": "JohnDoe@look.biz",
         "password": null,
         "firstName": "John",
         "lastName": "Doe",
         "creationDate": "2020-07-09T19:05:20.247Z",
         "lastModifiedDate": "2023-11-29T17:40:54.403Z",
         "activationDate": "2020-07-09T19:05:38.723Z"
      },
      "description": "Network Administrator",
      "creationDate": "2020-07-09T19:09:04.98Z",
      "lastModifiedDate": "2020-08-17T20:49:48.377Z",
      "lastLoginDate": "2024-01-03T17:55:26.17Z",
      "isLockedOut": false,
      "lastLockoutDate": null,
      "roleName": "Administrators",
      "permissions":       [
                  {
            "entityId": 123456,
            "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
            "principal":             {
               "login": "JohnDoe@look.biz",
               "type": "User",
               "id": 12345
            },
            "isFixed": true,
            "isInherited": false,
            "isAllowed": true,
            "creationDate": "2020-08-17T20:49:48.353Z"
         }
      ]
   }],
   "totalItemCount": 2,
   "matchingItemCount": 2,
   "pageSize": 1,
   "nextMarker": "F32RY0JlZW4tWW3hcnMuMTcy00",
   "prevMarker": "F32RY0JlZW4tWW3hcnMuMT78th",
   "isTruncated": false,
   "sortExpression": "[User].[Person].[Login] ASC",
   "filterExpression": ""
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /

Creates a User on a network

**Required Scope Token**

bsn.api.main.users.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [User Entity](docId:2FSBdEMevbu2CZlzCQnEC)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Users/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 468
```

This is the example request body:

```json
{
  "id": 0,
  "person": {
    "id": 0,
    "login": "JohnDoe@host.com",
    "password": null,
    "firstName": "John",
    "lastName": "Doe",
    "creationDate": "0001-01-01T00:00:00",
    "lastModifiedDate": "0001-01-01T00:00:00",
    "activationDate": null
  },
  "description": "Supervisor",
  "creationDate": "0001-01-01T00:00:00",
  "lastLoginDate": null,
  "isLockedOut": false,
  "lastLockoutDate": null,
  "roleName": "Viewers",
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the [User Entity](docId:2FSBdEMevbu2CZlzCQnEC) created and referenced by the Uri (given by the Location header field) in the response. 

**Example**

```json
{
   "id": 12345,
   "person":    {
      "id": 12345,
      "login": "JohnDoe@host.com",
      "password": "7t#Sqg7*",
      "firstName": "John",
      "lastName": "Doe",
      "creationDate": "2024-01-03T19:05:26.5480648Z",
      "lastModifiedDate": "2024-01-03T19:05:26.5480648Z",
      "activationDate": "2024-01-03T19:05:26.5480648Z"
   },
   "description": "Supervisor",
   "creationDate": "2024-01-03T19:05:26.6198305Z",
   "lastModifiedDate": "2024-01-03T19:05:26.9953066Z",
   "lastLoginDate": null,
   "isLockedOut": false,
   "lastLockoutDate": null,
   "roleName": "Viewers",
   "permissions":    [
            {
         "entityId": 30912,
         "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
         "principal":          {
            "login": "JohnDoe@host.com",
            "type": "User",
            "id": 12345
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2024-01-03T19:05:26.9953066Z"
      }
   ]
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{login}/ 

Returns information for a specified User on a network

**Required Scope Token**

bsn.api.main.users.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `login` <font color="#704ae0">string: </font>The login information of the User

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `login` is set to `JaneDoe@brightsign.biz`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /login` or `GET /id` response

```text
GET /2022/06/REST/Users/JaneDoe%40brightsign.biz/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [User Entity](docId:2FSBdEMevbu2CZlzCQnEC)&#x20;

**Example**

This is an example of a successful 200 level response:

```json
{
   "id": 123456,
   "person":    {
      "id": 12345,
      "login": "JaneDoe@brightsign.biz",
      "password": null,
      "firstName": "Jane",
      "lastName": "Doe",
      "creationDate": "2020-07-09T19:05:20.247Z",
      "lastModifiedDate": "2020-08-17T20:49:48.377Z",
      "activationDate": "2020-07-09T19:05:38.723Z"
   },
   "description": "Network Administrator",
   "creationDate": "2020-07-09T19:09:04.98Z",
   "lastModifiedDate": "2023-12-20T21:32:35.093Z",
   "lastLoginDate": "2024-01-03T19:05:23.98Z",
   "isLockedOut": false,
   "lastLockoutDate": null,
   "roleName": "Administrators",
   "permissions":    [
            {
         "entityId": 123456,
         "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
         "principal":          {
            "login": "JaneDoe@brightsign.biz",
            "type": "User",
            "id": 12345
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:48.353Z"
      }
   ]
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{login}/ 

Updates information for a specified User on a network

**Required Scope Token**

bsn.api.main.users.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `login` <font color="#704ae0">string: </font>The User login information

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [User Entity](docId:2FSBdEMevbu2CZlzCQnEC)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `login` is set to `JaneDoe@brightsign.biz`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /login` response.

```text
PUT /2022/06/REST/Users/JaneDoe%40brightsign.biz/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Content-Type: application/json
Content-Length: 1440
```

This is the example request body:

```json
{
   "id": 123456,
   "person":    {
      "id": 12345,
      "login": "JaneDoe@brightsign.biz",
      "password": null,
      "firstName": "Jane",
      "lastName": "Doe",
      "creationDate": "0001-01-01T00:00:00",
      "lastModifiedDate": "0001-01-01T00:00:00",
      "activationDate": "0001-01-01T00:00:00"
   },
   "description": "Network Administrator",
   "creationDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00",
   "lastLoginDate": "0001-01-01T00:00:00",
   "isLockedOut": false,
   "lastLockoutDate": null,
   "roleName": "Administrators",
   "permissions":    [
            {
         "entityId": 123456,
         "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
         "principal":          {
            "login": "JaneDoe@brightsign.biz",
            "type": "User",
            "id": 12345
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "0001-01-01T00:00:00"
      }
   ]
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The User information has been updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{login}/ 

Deletes a specified User on a network

**Required Scope Token**

bsn.api.main.users.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `login` <font color="#704ae0">string: </font>The User login information

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `login` is set to `JohnDoe@host.com`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /login` response.

```text
DELETE /2022/06/REST/Users/JohnDoe%40host.com/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified User information was successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/ 

Returns information for a specified User on a network.

**Required Scope Token**

bsn.api.main.users.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a User

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /login` or `GET /id` response

```text
GET /2022/06/REST/Users/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [User Entity](docId:2FSBdEMevbu2CZlzCQnEC)&#x20;

**Example**

This is an example of a 200 level response:

```json
{
   "id": 12345,
   "person":    {
      "id": 12345,
      "login": "JaneDoe@brightsign.biz",
      "password": null,
      "firstName": "Jane",
      "lastName": "Doe",
      "creationDate": "2020-07-09T19:05:20.247Z",
      "lastModifiedDate": "2023-11-29T17:40:54.403Z",
      "activationDate": "2020-07-09T19:05:38.723Z"
   },
   "description": "Network Administrator",
   "creationDate": "2020-07-09T19:09:04.98Z",
   "lastModifiedDate": "2020-08-17T20:49:48.377Z",
   "lastLoginDate": "2024-01-03T19:05:23.98Z",
   "isLockedOut": false,
   "lastLockoutDate": null,
   "roleName": "Administrators",
   "permissions":    [
            {
         "entityId": 123456,
         "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
         "principal":          {
            "login": "JaneDoe@brightsign.biz",
            "type": "User",
            "id": 12345
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:48.353Z"
      }
   ]
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/ 

Update the given User information

**Required Scope Token**

bsn.api.main.users.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a User

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [User Entity](docId:2FSBdEMevbu2CZlzCQnEC)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /login` response.

```text
PUT /2022/06/REST/Users/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Content-Type: application/json
Content-Length: 1440
```

This is the example request body:

```json
{
   "id": 12345,
   "person":    {
      "id": 12345,
      "login": "JaneDoe@brightsign.biz",
      "password": null,
      "firstName": "Jane",
      "lastName": "Doe",
      "creationDate": "0001-01-01T00:00:00",
      "lastModifiedDate": "0001-01-01T00:00:00",
      "activationDate": "0001-01-01T00:00:00"
   },
   "description": "Network Administrator",
   "creationDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00",
   "lastLoginDate": "0001-01-01T00:00:00",
   "isLockedOut": false,
   "lastLockoutDate": null,
   "roleName": "Administrators",
   "permissions":    [
            {
         "entityId": 123456,
         "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
         "principal":          {
            "login": "JaneDoe@brightsign.biz",
            "type": "User",
            "id": 12345
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "0001-01-01T00:00:00"
      }
   ]
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The User information has been updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/ 

Deletes the specified User on a network

**Required Scope Token**

bsn.api.main.users.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a User

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /login` response.

```text
DELETE /2022/06/REST/Users/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified User information was successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/ 

Returns the operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Users/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

:::ExpandableHeading
Example

```json
{
  "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
  "singularName": "Full Control",
  "pluralName": "User (Full Control)",
  "fullName": "User (Full Control)",
  "targetEntity": "User",
  "appliance": "Instance, Collection",
  "parent": null,
  "descendants": [
    {
      "uid": "1a0c5653-9f2f-4274-f922-f68b17d2d3e7",
      "singularName": "View User",
      "pluralName": "View Users",
      "fullName": "User (Full Control) - View Users",
      "targetEntity": "User",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
        "singularName": "Full Control",
        "pluralName": "User (Full Control)",
        "fullName": "User (Full Control)",
        "targetEntity": "User",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "1a0c5653-9f2f-4274-f922-f68b17d2d3e7",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.147Z"
        },
        {
          "entityId": null,
          "operationUID": "1a0c5653-9f2f-4274-f922-f68b17d2d3e7",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.16Z"
        },
        {
          "entityId": null,
          "operationUID": "1a0c5653-9f2f-4274-f922-f68b17d2d3e7",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.177Z"
        },
        {
          "entityId": null,
          "operationUID": "1a0c5653-9f2f-4274-f922-f68b17d2d3e7",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.197Z"
        },
        {
          "entityId": null,
          "operationUID": "1a0c5653-9f2f-4274-f922-f68b17d2d3e7",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.357Z"
        },
        {
          "entityId": null,
          "operationUID": "1a0c5653-9f2f-4274-f922-f68b17d2d3e7",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.41Z"
        }
      ]
    },
    {
      "uid": "1af1f3e0-db38-2bc4-29fb-f0f937139d89",
      "singularName": "Create User",
      "pluralName": "Create User",
      "fullName": "User (Full Control) - Create User",
      "targetEntity": "User",
      "appliance": "Collection",
      "parent": {
        "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
        "singularName": "Full Control",
        "pluralName": "User (Full Control)",
        "fullName": "User (Full Control)",
        "targetEntity": "User",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "1af1f3e0-db38-2bc4-29fb-f0f937139d89",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.147Z"
        },
        {
          "entityId": null,
          "operationUID": "1af1f3e0-db38-2bc4-29fb-f0f937139d89",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.16Z"
        },
        {
          "entityId": null,
          "operationUID": "1af1f3e0-db38-2bc4-29fb-f0f937139d89",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.177Z"
        },
        {
          "entityId": null,
          "operationUID": "1af1f3e0-db38-2bc4-29fb-f0f937139d89",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.197Z"
        },
        {
          "entityId": null,
          "operationUID": "1af1f3e0-db38-2bc4-29fb-f0f937139d89",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.357Z"
        },
        {
          "entityId": null,
          "operationUID": "1af1f3e0-db38-2bc4-29fb-f0f937139d89",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.41Z"
        }
      ]
    },
    {
      "uid": "d1d32f0f-39fd-435a-bd49-35d76b9abdf2",
      "singularName": "Manage Notifications",
      "pluralName": "Manage Notifications",
      "fullName": "User (Full Control) - Manage Notifications",
      "targetEntity": "User",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
        "singularName": "Full Control",
        "pluralName": "User (Full Control)",
        "fullName": "User (Full Control)",
        "targetEntity": "User",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "d1d32f0f-39fd-435a-bd49-35d76b9abdf2",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.16Z"
        },
        {
          "entityId": null,
          "operationUID": "d1d32f0f-39fd-435a-bd49-35d76b9abdf2",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.36Z"
        },
        {
          "entityId": null,
          "operationUID": "d1d32f0f-39fd-435a-bd49-35d76b9abdf2",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.41Z"
        },
        {
          "entityId": null,
          "operationUID": "d1d32f0f-39fd-435a-bd49-35d76b9abdf2",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.147Z"
        },
        {
          "entityId": null,
          "operationUID": "d1d32f0f-39fd-435a-bd49-35d76b9abdf2",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.177Z"
        },
        {
          "entityId": null,
          "operationUID": "d1d32f0f-39fd-435a-bd49-35d76b9abdf2",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.197Z"
        }
      ]
    },
    {
      "uid": "cd9c31e0-d23c-1844-f9f8-dd49ce80e72a",
      "singularName": "Change Role",
      "pluralName": "Change Role",
      "fullName": "User (Full Control) - Change Role",
      "targetEntity": "User",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
        "singularName": "Full Control",
        "pluralName": "User (Full Control)",
        "fullName": "User (Full Control)",
        "targetEntity": "User",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "cd9c31e0-d23c-1844-f9f8-dd49ce80e72a",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.147Z"
        },
        {
          "entityId": null,
          "operationUID": "cd9c31e0-d23c-1844-f9f8-dd49ce80e72a",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.16Z"
        },
        {
          "entityId": null,
          "operationUID": "cd9c31e0-d23c-1844-f9f8-dd49ce80e72a",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.177Z"
        },
        {
          "entityId": null,
          "operationUID": "cd9c31e0-d23c-1844-f9f8-dd49ce80e72a",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.197Z"
        },
        {
          "entityId": null,
          "operationUID": "cd9c31e0-d23c-1844-f9f8-dd49ce80e72a",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.357Z"
        },
        {
          "entityId": null,
          "operationUID": "cd9c31e0-d23c-1844-f9f8-dd49ce80e72a",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.41Z"
        }
      ]
    },
    {
      "uid": "526a9b95-cce5-422a-99f8-9f02d63af74f",
      "singularName": "Update User",
      "pluralName": "Update User",
      "fullName": "User (Full Control) - Update User",
      "targetEntity": "User",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
        "singularName": "Full Control",
        "pluralName": "User (Full Control)",
        "fullName": "User (Full Control)",
        "targetEntity": "User",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.147Z"
        },
        {
          "entityId": null,
          "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.16Z"
        },
        {
          "entityId": null,
          "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.177Z"
        },
        {
          "entityId": null,
          "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.197Z"
        },
        {
          "entityId": null,
          "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.357Z"
        },
        {
          "entityId": null,
          "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.41Z"
        }
      ]
    },
    {
      "uid": "52f1b86c-46df-8fa4-5d75-f0c8702975e6",
      "singularName": "Edit Permissions",
      "pluralName": "Edit Permissions",
      "fullName": "User (Full Control) - Edit Permissions",
      "targetEntity": "User",
      "appliance": "Collection",
      "parent": {
        "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
        "singularName": "Full Control",
        "pluralName": "User (Full Control)",
        "fullName": "User (Full Control)",
        "targetEntity": "User",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "52f1b86c-46df-8fa4-5d75-f0c8702975e6",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.147Z"
        },
        {
          "entityId": null,
          "operationUID": "52f1b86c-46df-8fa4-5d75-f0c8702975e6",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.16Z"
        },
        {
          "entityId": null,
          "operationUID": "52f1b86c-46df-8fa4-5d75-f0c8702975e6",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.177Z"
        },
        {
          "entityId": null,
          "operationUID": "52f1b86c-46df-8fa4-5d75-f0c8702975e6",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.197Z"
        },
        {
          "entityId": null,
          "operationUID": "52f1b86c-46df-8fa4-5d75-f0c8702975e6",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.357Z"
        },
        {
          "entityId": null,
          "operationUID": "52f1b86c-46df-8fa4-5d75-f0c8702975e6",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.41Z"
        }
      ]
    },
    {
      "uid": "c244506f-4c57-4f66-88e0-ec2f05d06860",
      "singularName": "Revoke Tokens",
      "pluralName": "Revoke Tokens",
      "fullName": "User (Full Control) - Revoke Tokens",
      "targetEntity": "User",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
        "singularName": "Full Control",
        "pluralName": "User (Full Control)",
        "fullName": "User (Full Control)",
        "targetEntity": "User",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "c244506f-4c57-4f66-88e0-ec2f05d06860",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.147Z"
        },
        {
          "entityId": null,
          "operationUID": "c244506f-4c57-4f66-88e0-ec2f05d06860",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.16Z"
        },
        {
          "entityId": null,
          "operationUID": "c244506f-4c57-4f66-88e0-ec2f05d06860",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.177Z"
        },
        {
          "entityId": null,
          "operationUID": "c244506f-4c57-4f66-88e0-ec2f05d06860",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.197Z"
        },
        {
          "entityId": null,
          "operationUID": "c244506f-4c57-4f66-88e0-ec2f05d06860",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.357Z"
        },
        {
          "entityId": null,
          "operationUID": "c244506f-4c57-4f66-88e0-ec2f05d06860",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.41Z"
        }
      ]
    },
    {
      "uid": "51d92ebc-fb22-c4f4-093f-a737cba29ea8",
      "singularName": "Lock User",
      "pluralName": "Lock User",
      "fullName": "User (Full Control) - Lock User",
      "targetEntity": "User",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
        "singularName": "Full Control",
        "pluralName": "User (Full Control)",
        "fullName": "User (Full Control)",
        "targetEntity": "User",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "51d92ebc-fb22-c4f4-093f-a737cba29ea8",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.147Z"
        },
        {
          "entityId": null,
          "operationUID": "51d92ebc-fb22-c4f4-093f-a737cba29ea8",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.16Z"
        },
        {
          "entityId": null,
          "operationUID": "51d92ebc-fb22-c4f4-093f-a737cba29ea8",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.177Z"
        },
        {
          "entityId": null,
          "operationUID": "51d92ebc-fb22-c4f4-093f-a737cba29ea8",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.197Z"
        },
        {
          "entityId": null,
          "operationUID": "51d92ebc-fb22-c4f4-093f-a737cba29ea8",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.357Z"
        },
        {
          "entityId": null,
          "operationUID": "51d92ebc-fb22-c4f4-093f-a737cba29ea8",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.41Z"
        }
      ]
    },
    {
      "uid": "3f15e37b-449b-1b24-fd32-d113af0a798a",
      "singularName": "Unlock User",
      "pluralName": "Unlock User",
      "fullName": "User (Full Control) - Unlock User",
      "targetEntity": "User",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
        "singularName": "Full Control",
        "pluralName": "User (Full Control)",
        "fullName": "User (Full Control)",
        "targetEntity": "User",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "3f15e37b-449b-1b24-fd32-d113af0a798a",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.147Z"
        },
        {
          "entityId": null,
          "operationUID": "3f15e37b-449b-1b24-fd32-d113af0a798a",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.16Z"
        },
        {
          "entityId": null,
          "operationUID": "3f15e37b-449b-1b24-fd32-d113af0a798a",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.177Z"
        },
        {
          "entityId": null,
          "operationUID": "3f15e37b-449b-1b24-fd32-d113af0a798a",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.197Z"
        },
        {
          "entityId": null,
          "operationUID": "3f15e37b-449b-1b24-fd32-d113af0a798a",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.357Z"
        },
        {
          "entityId": null,
          "operationUID": "3f15e37b-449b-1b24-fd32-d113af0a798a",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.41Z"
        }
      ]
    },
    {
      "uid": "38b77fd8-16b6-9774-81e4-63af80fbbbb2",
      "singularName": "Delete User",
      "pluralName": "Delete User",
      "fullName": "User (Full Control) - Delete User",
      "targetEntity": "User",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
        "singularName": "Full Control",
        "pluralName": "User (Full Control)",
        "fullName": "User (Full Control)",
        "targetEntity": "User",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "38b77fd8-16b6-9774-81e4-63af80fbbbb2",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2023-04-21T19:10:01.147Z"
        },
        {
          "entityId": null,
          "operationUID": "38b77fd8-16b6-9774-81e4-63af80fbbbb2",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.16Z"
        },
        {
          "entityId": null,
          "operationUID": "38b77fd8-16b6-9774-81e4-63af80fbbbb2",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.177Z"
        },
        {
          "entityId": null,
          "operationUID": "38b77fd8-16b6-9774-81e4-63af80fbbbb2",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.197Z"
        },
        {
          "entityId": null,
          "operationUID": "38b77fd8-16b6-9774-81e4-63af80fbbbb2",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.357Z"
        },
        {
          "entityId": null,
          "operationUID": "38b77fd8-16b6-9774-81e4-63af80fbbbb2",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2023-04-21T19:10:01.41Z"
        }
      ]
    }
  ],
  "permissions": [
    {
      "entityId": null,
      "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
      "principal": {
        "name": "Administrators",
        "isCustom": false,
        "type": "Role",
        "id": 1
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2023-04-21T19:10:01.147Z"
    },
    {
      "entityId": null,
      "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
      "principal": {
        "name": "General Managers",
        "isCustom": false,
        "type": "Role",
        "id": 2
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2023-04-21T19:10:01.16Z"
    },
    {
      "entityId": null,
      "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
      "principal": {
        "name": "Creators",
        "isCustom": false,
        "type": "Role",
        "id": 3
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2023-04-21T19:10:01.177Z"
    },
    {
      "entityId": null,
      "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
      "principal": {
        "name": "Publishers",
        "isCustom": false,
        "type": "Role",
        "id": 4
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2023-04-21T19:10:01.197Z"
    },
    {
      "entityId": null,
      "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
      "principal": {
        "name": "Network Managers",
        "isCustom": false,
        "type": "Role",
        "id": 5
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2023-04-21T19:10:01.357Z"
    },
    {
      "entityId": null,
      "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
      "principal": {
        "name": "Viewers",
        "isCustom": false,
        "type": "Role",
        "id": 6
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2023-04-21T19:10:01.41Z"
    }
  ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/ 

Includes object permissions for a given User&#x20;

**Required Scope Token**

bsn.api.main.users.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a User

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Users/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
      {
      "entityId": 54321,
      "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
      "principal":       {
         "login": "JaneDoe@brightsign.biz",
         "type": "User",
         "id": 12345
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2020-08-17T20:49:48.353Z"
   }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/ 

Adds permissions for a specified User on a network

**Required Scope Token**

bsn.api.main.users.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a User

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12435`

```text
POST /2022/06/REST/Users/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 245
```

This is the example request body:

```json
[
  {
    "entityId": 54321,
    "operationUID": "c978aa8d-c7ac-410f-aec3-22e136d0ba58",
    "principal": {
      "login": "JaneDoe@brightsign.biZ",
      "type": "User",
      "id": 12345
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified User&#x20;

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/ 

Removes permissions for a specified User on a network

**Required Scope Token**

bsn.api.main.users.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a User

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
DELETE /2022/06/REST/Users/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 245
```

This is the example request body:

```json
[
  {
    "entityId": 54321,
    "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
    "principal": {
      "login": "JaneDoe@brightsign.biZ",
      "type": "User",
      "id": 12345
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified User permissions were successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{login}/Permissions/  

Includes object permissions for a given User&#x20;

**Required Scope Token**

bsn.api.main.users.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `login` <font color="#704ae0">string: </font>The login information of the User

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `login` is set to `JohnDoe@brightsign.biz`

```text
GET /2022/06/REST/Users/JohnDoe%40brightsign.biz/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
      {
      "entityId": 54321,
      "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
      "principal":       {
         "login": "JohnDoe@brightsign.biz",
         "type": "User",
         "id": 12345
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2020-08-17T20:49:48.353Z"
   }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{login}/Permissions/ 

Adds permissions for a specified User on a network

**Required Scope Token**

bsn.api.main.users.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `login` <font color="#704ae0">string: </font>The User login information

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `login` is set to `JohnDoe@brightsign.biz`

```text
POST /2022/06/REST/Users/JohnDoe%40brightsign.biz/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 322
```

This is the example request body:

```json
[
  {
    "entityId": 54321,
    "operationUID": "c978aa8d-c7ac-410f-aec3-22e136d0ba58",
    "principal": {
      "login": "JohnDoe@brightsign.biZ",
      "type": "User",
      "id": 12345
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified User&#x20;

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{login}/Permissions/ 

Removes permissions for a specified User on a network

**Required Scope Token**

bsn.api.main.users.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `login` <font color="#704ae0">string: </font>The User login information

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `login` is set to `JohnDoe@brightsign.biz`

```text
DELETE /2022/06/REST/Users/JohnDoe%40brightsign.biz/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 232
```

This is the example request body:

```json
[
  {
    "entityId": 54321,
    "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
    "principal": {
      "login": "JohnDoe@brightsign.biZ",
      "type": "User",
      "id": 12345
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified User permissions were successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Tokens/\{token}/ 

Validates the user access or refresh token granted to a specified User

**Required Scope Token**

bsn.api.main.users.token.validate

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segments**

- `id` <font color="#704ae0">int: </font>A unique identifier for a User
- `token` <font color="#704ae0">string: </font>A User access or refresh token for a BSN.Cloud network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- `token` is set to `{{UserAccessToken}}`

```text
GET /2022/06/REST/Users/12345/Tokens/{{UserAccessToken}}/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Token Info Entity](docId\:RMBciR76z7OjsYJB_U2pP)&#x20;

**Example**

```json
{
   "token": "{{UserAccessToken}}",
   "scope": "add_device_setup bsn.api.main bsn.api.self bsn.api.upload bsn.ui.main player",
   "validFrom": "2024-01-03T22:57:10Z",
   "validTo": "2024-01-03T23:12:10Z"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Tokens/\{token}/ 

Revokes user access or refresh tokens for the specified User

**Required Scope Token**

bsn.api.main.users.token.revoke

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segments**

- `id` <font color="#704ae0">int: </font>A unique identifier for a User
- `token` <font color="#704ae0">string: </font>The User access or refresh token to use with this endpoint call

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- `token` is set to `{{UserAccessToken}}`

```text
DELETE /2022/06/REST/Users/12345/Tokens/{{UserAccessToken}}/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The user access or refresh token has been successfully revoked from the specified User

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: Either the specified token is invalid, expired, or revoked, or it is issued for another user

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{login}/Tokens/\{token}/ 

Validates the user access or refresh token granted to the specified User

**Required Scope Token**

bsn.api.main.users.token.validate

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segments**

- `login` <font color="#704ae0">string: </font>The login for a User
- `token` <font color="#704ae0">string: </font>A User access or refresh token for a BSN.Cloud network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `login` is set to `JohnDoe@brightsign.biz`
- `token` is set to `{{UserAccessToken}}`

```text
GET /2022/06/REST/Users/JohnDoe%40brightsign.biz/Tokens/{{UserAccessToken}}/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Token Info Entity](docId\:RMBciR76z7OjsYJB_U2pP)&#x20;

**Example**

```json
{
   "token": "{{UserAccessToken}}",
   "scope": "add_device_setup bsn.api.main bsn.api.self bsn.api.upload bsn.ui.main player",
   "validFrom": "2024-01-03T22:57:10Z",
   "validTo": "2024-01-03T23:12:10Z"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{login}/Tokens/\{token}/ 

Revokes the user access or refresh token granted to the specified user

**Required Scope Token**

bsn.api.main.users.token.revoke

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segments**

- `login` <font color="#704ae0">string: </font>The login for a user
- `token` <font color="#704ae0">string: </font>A user access or refresh token for a BSN.cloud network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `login` is set to `JohnDoe@brightsign.biz`
- `token` is set to `{{UserAccessToken}}`

```text
DELETE /2022/06/REST/Users/JohnDoe%40brightsign.biz/Tokens/{{UserAccessToken}}/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The user access or refresh token has been successfully revoked from the specified user

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: Either the specified token is invalid, expired, or revoked, or it is issued for another user

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Player Models Enumeration (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

This is an enumeration data type. All player models are structured as follows:

- `Unknown`&#x20;
- `HD223`&#x20;
- `HD1023`&#x20;
- `HD1423`&#x20;
- `LS423`&#x20;
- `XD233`&#x20;
- `XD1033`&#x20;
- `XD1133`&#x20;
- `XT243`&#x20;
- `XT1043`&#x20;
- `XT1143`&#x20;
- `4K242`&#x20;
- `4K1042`&#x20;
- `4K1142`&#x20;
- `HS123` &#x20;
- `HO523` &#x20;
- `XD234` &#x20;
- `XD1034`&#x20;
- `XT244`&#x20;
- `XT1144`&#x20;
- `HS124`&#x20;
- `HS144`&#x20;
- `LS424`&#x20;
- `HD224`&#x20;
- `HD1024`&#x20;
- `AU325`&#x20;
- `AU335`&#x20;
- `XC2055`&#x20;
- `XC4055`&#x20;
- `XD235`&#x20;
- `XD1035`&#x20;
- `LS425`&#x20;
- `LS445`&#x20;
- `HS125`&#x20;
- `HS145`&#x20;
- `HD225`&#x20;
- `HD1025`&#x20;
- `XT245`&#x20;
- `XT1145`&#x20;
- `XT2145`&#x20;
- `LGUV5N`&#x20;
- `MD435`&#x20;
- `HD226`&#x20;
- `HD1026`&#x20;
- `XD236`&#x20;
- `XD1036`&#x20;
- `XS156`


[title] Feeds/Text Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

Use these endpoints to manage Live Text Feeds on the network.

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Feeds/Text***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Returns a list of Live Text Feeds on a network

**Required Scope Token**

bsn.api.main.feeds.text.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (see [this page](docId:3L0afyD3xoOE-yTvfk2vs) for more information). The default value is null.
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of Text Feeds exceeds the `pageSize`. This parameter is only `required` if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of Text Feeds that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[CreationDate] IS NOT IN THE RANGE '2000-01-01' AND '2022-01-01'`
- `sort` is set to `[FileSize] ASC`

```text
GET /2022/06/REST/Feeds/Text/?marker=ODUzLDcyMjE4MTI%3D&pageSize=1&filter=%5BCreationDate%5D%20IS%20NOT%20IN%20THE%20RANGE%20%272000-01-01%27%20AND%20%272022-01-01%27&sort=%5BFileSize%5D%20ASC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Live Text Feed Entities](docId\:HHGJXStoEDDcZMQByn014) on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
  "items": [
    {
      "id": 1234567,
      "name": "Menu Items",
      "physicalPath": "https://bsncloud.s3.amazonaws.com/ContentCloud/Feeds/3ddd24eaf9b2307852636dc45269f242",
      "fileSize": 1086,
      "fileHash": "SHA1:A578287BFBBD89C1663100042GF2C057C273F43F",
      "creationDate": "2023-03-09T16:30:26.383Z",
      "lastModifiedDate": "2023-03-09T16:50:24.883Z",
      "items": null,
      "presentations": [
        {
         "id": 12345,
         "name": "All Set Presentation",
         "type": "Presentation",
         "link": null
        }
      ],
      "permissions": []
    }
  ],
  "totalItemCount": 2,
  "matchingItemCount": 2,
  "pageSize": 1,
  "nextMarker": "MTA4Niw3MjMwOTY3",
  "prevMarker": "MTA4Niw3MjMwn1rT",
  "isTruncated": false,
  "sortExpression": "[FileSize] ASC",
  "filterExpression": "[CreationDate] IS NOT IN THE RANGE '2000-01-01T00:00:00.000Z' AND '2022-01-01T00:00:00.000Z'"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /

Creates a live text feed on a network

**Required Scope Token**

bsn.api.main.feeds.text.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Live Text Feed Entity](docId\:HHGJXStoEDDcZMQByn014)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Feeds/Text/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 389
```

This is the example request body:

```json
{
  "id": 0,
  "name": "Breakfast Menu",
  "physicalPath": null,
  "fileSize": 0,
  "fileHash": null,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "items": [
    {
      "title": "Hamburger: $9.99",
      "description": "Ground chuck, onion, Worcestershire sauce & seasonings.",
      "validityStartDate": "2023-11-01T00:00:00Z",
      "validityEndDate": "2023-12-01T00:00:00Z"
    }
  ],
  "presentations": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the [Live Text Feed Entity](docId\:HHGJXStoEDDcZMQByn014) created and referenced by the Uri (given by the Location header field) in the response. 

**Example**

```json
{
  "id": 2345678,
  "name": "Price List",
  "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/Feeds/d1df209dfa240a5e5e74657c76f46cf3",
  "fileSize": 159,
  "fileHash": "SHA1:5BE7EDB6A8FBHAA23894114C185CD8AFD9A8E279",
  "creationDate": "2023-10-06T19:43:47.597Z",
  "lastModifiedDate": "2023-10-06T19:43:47.597Z",
  "items": [
    {
      "title": "Hamburger: $9.99",
      "description": "Ground chuck, onion, Worcestershire sauce & seasonings.",
      "validityStartDate": "2023-11-01T00:00:00Z",
      "validityEndDate": "2023-12-01T00:00:00Z"
    }
  ],
  "presentations": [],
  "permissions": []
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Removes Live Text Feeds, specified by a filter, from a network. This allows multiple Live Text Feeds to be deleted at once.

**Required Scope Token**

bsn.api.main.feeds.text.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[Name] IS 'Price List'`

```text
DELETE /2022/06/REST/Feeds/Text/?filter=%5BName%5D%20IS%20%27Price List%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the number of affected live text feeds as an integer value

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/  

Returns the number of live text feeds on the network that match the specified filter criteria. If no filter is included, this call returns the total number of live text feeds on the network. 

**Required Scope Token**

bsn.api.main.feeds.text.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[Name] CONTAINS 'Test'`

```text
GET /2022/06/REST/Feeds/Text/Count/?filter=%20%5BName%5D%20CONTAINS%20%27Test%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The number of live text feeds is returned as an integer value

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/  

Returns the specified Live Text Feeds

**Required Scope Token**

bsn.api.main.feeds.text.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Live Text Feeds

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `234567`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Feeds/Text/234567/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Live Text Feed Entity](docId\:HHGJXStoEDDcZMQByn014)

**Example**

This is a 200 response example:

```json
{
   "id": 234567,
   "name": "Test2",
   "physicalPath": "https://bsncloud.s3.amazonaws.com/JohnDoeTesting/Feeds/f2a442416bd2c6876bf16a19f8d21457",
   "fileSize": 161,
   "fileHash": "SHA1:85F4B1A9F50C55631E8398EA68467B34EFF00E8C",
   "creationDate": "2023-10-24T17:50:40.237Z",
   "lastModifiedDate": "2024-01-03T20:33:35.093Z",
   "items": [],
   "presentations": [],
   "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/  

Modifies the specified Live Text Feeds

**Required Scope Token**

bsn.api.main.feeds.text.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Live Text Feeds

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Live Text Feed Entity](docId\:HHGJXStoEDDcZMQByn014)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Feeds/Text/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Content-Type: application/json
Content-Length: 398
```

This is the example request body:

```json
{
  "id": 0,
  "name": "Breakfast Menu",
  "physicalPath": null,
  "fileSize": 0,
  "fileHash": null,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "items": [
    {
      "title": "Hamburger: $9.99",
      "description": "Ground chuck, onion, Worcestershire sauce & seasonings.",
      "validityStartDate": "2023-11-01T00:00:00Z",
      "validityEndDate": "2023-12-01T00:00:00Z"
    }
  ],
  "presentations": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Live Text Feeds has been updated 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource/Live Text Feed changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/  

Removes the specified Live Text Feeds 

**Required Scope Token**

bsn.api.main.feeds.text.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Live Text Feeds

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Feeds/Text/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Live Text Feed has been deleted 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/  

Returns the specified Live Text Feed

**Required Scope Token**

bsn.api.main.feeds.text.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Text Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `NewsFeed`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Feeds/Text/NewsFeed/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Live Text Feed Entity](docId\:HHGJXStoEDDcZMQByn014)

**Example**

This is a 200 response example:

```json
{
   "id": 12345,
   "name": "NewsFeed",
   "physicalPath": "https://bsncloud.s3.amazonaws.com/JohnDoeTesting/Feeds/f8a442416bd2c6876bf16a19f8d21457",
   "fileSize": 161,
   "fileHash": "SHA1:85F4B1A9F50C45631E8398EA68497B34E0F00E8C",
   "creationDate": "2023-10-24T17:50:40.237Z",
   "lastModifiedDate": "2023-10-24T17:50:40.237Z",
   "items": [],
   "presentations": [],
   "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{name}/  

Modifies the specified Live Text Feed

**Required Scope Token**

bsn.api.main.feeds.text.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Text Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Live Text Feed Entity](docId\:HHGJXStoEDDcZMQByn014)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `NewsFeed`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Feeds/Text/NewsFeed/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Content-Type: application/json
Content-Length: 398
```

This is the example request body:

```json
{
  "id": 0,
  "name": "Breakfast Menu",
  "physicalPath": null,
  "fileSize": 0,
  "fileHash": null,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "items": [
    {
      "title": "Hamburger: $9.99",
      "description": "Ground chuck, onion, Worcestershire sauce & seasonings.",
      "validityStartDate": "2023-11-01T00:00:00Z",
      "validityEndDate": "2023-12-01T00:00:00Z"
    }
  ],
  "presentations": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Live Text Feed has been updated  

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource/live text feed instance changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/  

Removes the specified Live Text Feed

**Required Scope Token**

bsn.api.main.feeds.text.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Text Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `NewsFeed`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Feeds/Text/NewsFeed/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Live Text Feed has been deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/  

Returns operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Feeds/Text/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

:::ExpandableHeading
Example

```json
{
   "uid": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
   "singularName": "Full Control",
   "pluralName": "LiveText Feed (Full Control)",
   "fullName": "LiveText Feed (Full Control)",
   "targetEntity": "LiveTextFeed",
   "appliance": "Instance, Collection",
   "parent": null,
   "descendants":    [
            {
         "uid": "cfbcdcf2-3de5-40c0-843f-d003942910ef",
         "singularName": "View LiveText Feed",
         "pluralName": "View LiveText Feeds",
         "fullName": "LiveText Feed (Full Control) - View LiveText Feeds",
         "targetEntity": "LiveTextFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
            "singularName": "Full Control",
            "pluralName": "LiveText Feed (Full Control)",
            "fullName": "LiveText Feed (Full Control)",
            "targetEntity": "LiveTextFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "cfbcdcf2-3de5-40c0-843f-d003942910ef",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.293Z"
            },
                        {
               "entityId": null,
               "operationUID": "cfbcdcf2-3de5-40c0-843f-d003942910ef",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.75Z"
            },
                        {
               "entityId": null,
               "operationUID": "cfbcdcf2-3de5-40c0-843f-d003942910ef",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.877Z"
            },
                        {
               "entityId": null,
               "operationUID": "cfbcdcf2-3de5-40c0-843f-d003942910ef",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.17Z"
            },
                        {
               "entityId": null,
               "operationUID": "cfbcdcf2-3de5-40c0-843f-d003942910ef",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "cfbcdcf2-3de5-40c0-843f-d003942910ef",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "cfbcdcf2-3de5-40c0-843f-d003942910ef",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.54Z"
            }
         ]
      },
            {
         "uid": "9317fb13-2e9d-4a67-a2b7-075b63dcaf80",
         "singularName": "View Contents",
         "pluralName": "View Contents",
         "fullName": "LiveText Feed (Full Control) - View Contents",
         "targetEntity": "LiveTextFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
            "singularName": "Full Control",
            "pluralName": "LiveText Feed (Full Control)",
            "fullName": "LiveText Feed (Full Control)",
            "targetEntity": "LiveTextFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "9317fb13-2e9d-4a67-a2b7-075b63dcaf80",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.76Z"
            },
                        {
               "entityId": null,
               "operationUID": "9317fb13-2e9d-4a67-a2b7-075b63dcaf80",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.877Z"
            },
                        {
               "entityId": null,
               "operationUID": "9317fb13-2e9d-4a67-a2b7-075b63dcaf80",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.17Z"
            },
                        {
               "entityId": null,
               "operationUID": "9317fb13-2e9d-4a67-a2b7-075b63dcaf80",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "9317fb13-2e9d-4a67-a2b7-075b63dcaf80",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "9317fb13-2e9d-4a67-a2b7-075b63dcaf80",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.28Z"
            },
                        {
               "entityId": null,
               "operationUID": "9317fb13-2e9d-4a67-a2b7-075b63dcaf80",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.54Z"
            }
         ]
      },
            {
         "uid": "3f5bab69-4c56-4c63-8c56-679160296451",
         "singularName": "Create LiveText Feed",
         "pluralName": "Create LiveText Feed",
         "fullName": "LiveText Feed (Full Control) - Create LiveText Feed",
         "targetEntity": "LiveTextFeed",
         "appliance": "Collection",
         "parent":          {
            "uid": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
            "singularName": "Full Control",
            "pluralName": "LiveText Feed (Full Control)",
            "fullName": "LiveText Feed (Full Control)",
            "targetEntity": "LiveTextFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "3f5bab69-4c56-4c63-8c56-679160296451",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.877Z"
            },
                        {
               "entityId": null,
               "operationUID": "3f5bab69-4c56-4c63-8c56-679160296451",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.17Z"
            },
                        {
               "entityId": null,
               "operationUID": "3f5bab69-4c56-4c63-8c56-679160296451",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "3f5bab69-4c56-4c63-8c56-679160296451",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "3f5bab69-4c56-4c63-8c56-679160296451",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.28Z"
            },
                        {
               "entityId": null,
               "operationUID": "3f5bab69-4c56-4c63-8c56-679160296451",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "3f5bab69-4c56-4c63-8c56-679160296451",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.54Z"
            }
         ]
      },
            {
         "uid": "00886ffd-19f7-40dc-837e-e8d06d8a2779",
         "singularName": "Rename LiveText Feed",
         "pluralName": "Rename LiveText Feed",
         "fullName": "LiveText Feed (Full Control) - Rename LiveText Feed",
         "targetEntity": "LiveTextFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
            "singularName": "Full Control",
            "pluralName": "LiveText Feed (Full Control)",
            "fullName": "LiveText Feed (Full Control)",
            "targetEntity": "LiveTextFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "00886ffd-19f7-40dc-837e-e8d06d8a2779",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.877Z"
            },
                        {
               "entityId": null,
               "operationUID": "00886ffd-19f7-40dc-837e-e8d06d8a2779",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.17Z"
            },
                        {
               "entityId": null,
               "operationUID": "00886ffd-19f7-40dc-837e-e8d06d8a2779",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "00886ffd-19f7-40dc-837e-e8d06d8a2779",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "00886ffd-19f7-40dc-837e-e8d06d8a2779",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.28Z"
            },
                        {
               "entityId": null,
               "operationUID": "00886ffd-19f7-40dc-837e-e8d06d8a2779",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "00886ffd-19f7-40dc-837e-e8d06d8a2779",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.54Z"
            }
         ]
      },
            {
         "uid": "376563fa-72b4-471a-9d49-1f4de927dc20",
         "singularName": "Update LiveText Feed",
         "pluralName": "Update LiveText Feed",
         "fullName": "LiveText Feed (Full Control) - Update LiveText Feed",
         "targetEntity": "LiveTextFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
            "singularName": "Full Control",
            "pluralName": "LiveText Feed (Full Control)",
            "fullName": "LiveText Feed (Full Control)",
            "targetEntity": "LiveTextFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.877Z"
            },
                        {
               "entityId": null,
               "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.17Z"
            },
                        {
               "entityId": null,
               "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.28Z"
            },
                        {
               "entityId": null,
               "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.54Z"
            }
         ]
      },
            {
         "uid": "6158bf49-cd2a-499c-8e9c-938953e4c3c6",
         "singularName": "Assign LiveText Feed",
         "pluralName": "Assign LiveText Feed",
         "fullName": "LiveText Feed (Full Control) - Assign LiveText Feed",
         "targetEntity": "LiveTextFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
            "singularName": "Full Control",
            "pluralName": "LiveText Feed (Full Control)",
            "fullName": "LiveText Feed (Full Control)",
            "targetEntity": "LiveTextFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "6158bf49-cd2a-499c-8e9c-938953e4c3c6",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.877Z"
            },
                        {
               "entityId": null,
               "operationUID": "6158bf49-cd2a-499c-8e9c-938953e4c3c6",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.17Z"
            },
                        {
               "entityId": null,
               "operationUID": "6158bf49-cd2a-499c-8e9c-938953e4c3c6",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "6158bf49-cd2a-499c-8e9c-938953e4c3c6",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "6158bf49-cd2a-499c-8e9c-938953e4c3c6",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.28Z"
            },
                        {
               "entityId": null,
               "operationUID": "6158bf49-cd2a-499c-8e9c-938953e4c3c6",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "6158bf49-cd2a-499c-8e9c-938953e4c3c6",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.54Z"
            }
         ]
      },
            {
         "uid": "39cfe670-819e-4d8a-8151-886ae675a6ac",
         "singularName": "Unassign LiveText Feed",
         "pluralName": "Unassign LiveText Feed",
         "fullName": "LiveText Feed (Full Control) - Unassign LiveText Feed",
         "targetEntity": "LiveTextFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
            "singularName": "Full Control",
            "pluralName": "LiveText Feed (Full Control)",
            "fullName": "LiveText Feed (Full Control)",
            "targetEntity": "LiveTextFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "39cfe670-819e-4d8a-8151-886ae675a6ac",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.877Z"
            },
                        {
               "entityId": null,
               "operationUID": "39cfe670-819e-4d8a-8151-886ae675a6ac",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.17Z"
            },
                        {
               "entityId": null,
               "operationUID": "39cfe670-819e-4d8a-8151-886ae675a6ac",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "39cfe670-819e-4d8a-8151-886ae675a6ac",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "39cfe670-819e-4d8a-8151-886ae675a6ac",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.28Z"
            },
                        {
               "entityId": null,
               "operationUID": "39cfe670-819e-4d8a-8151-886ae675a6ac",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "39cfe670-819e-4d8a-8151-886ae675a6ac",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.54Z"
            }
         ]
      },
            {
         "uid": "17feee4d-fc87-443a-aef9-e2aa297768f5",
         "singularName": "Edit Permissions",
         "pluralName": "Edit Permissions",
         "fullName": "LiveText Feed (Full Control) - Edit Permissions",
         "targetEntity": "LiveTextFeed",
         "appliance": "Collection",
         "parent":          {
            "uid": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
            "singularName": "Full Control",
            "pluralName": "LiveText Feed (Full Control)",
            "fullName": "LiveText Feed (Full Control)",
            "targetEntity": "LiveTextFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "17feee4d-fc87-443a-aef9-e2aa297768f5",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.877Z"
            },
                        {
               "entityId": null,
               "operationUID": "17feee4d-fc87-443a-aef9-e2aa297768f5",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.17Z"
            },
                        {
               "entityId": null,
               "operationUID": "17feee4d-fc87-443a-aef9-e2aa297768f5",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "17feee4d-fc87-443a-aef9-e2aa297768f5",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "17feee4d-fc87-443a-aef9-e2aa297768f5",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.28Z"
            },
                        {
               "entityId": null,
               "operationUID": "17feee4d-fc87-443a-aef9-e2aa297768f5",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "17feee4d-fc87-443a-aef9-e2aa297768f5",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.54Z"
            }
         ]
      },
            {
         "uid": "760e3b98-1bad-476c-8989-b238ccd6472c",
         "singularName": "Delete LiveText Feed",
         "pluralName": "Delete LiveText Feed",
         "fullName": "LiveText Feed (Full Control) - Delete LiveText Feed",
         "targetEntity": "LiveTextFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
            "singularName": "Full Control",
            "pluralName": "LiveText Feed (Full Control)",
            "fullName": "LiveText Feed (Full Control)",
            "targetEntity": "LiveTextFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "760e3b98-1bad-476c-8989-b238ccd6472c",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.303Z"
            },
                        {
               "entityId": null,
               "operationUID": "760e3b98-1bad-476c-8989-b238ccd6472c",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.877Z"
            },
                        {
               "entityId": null,
               "operationUID": "760e3b98-1bad-476c-8989-b238ccd6472c",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.17Z"
            },
                        {
               "entityId": null,
               "operationUID": "760e3b98-1bad-476c-8989-b238ccd6472c",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "760e3b98-1bad-476c-8989-b238ccd6472c",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "760e3b98-1bad-476c-8989-b238ccd6472c",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.737Z"
            },
                        {
               "entityId": null,
               "operationUID": "760e3b98-1bad-476c-8989-b238ccd6472c",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.54Z"
            }
         ]
      }
   ],
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
         "principal":          {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:45.877Z"
      },
            {
         "entityId": null,
         "operationUID": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
         "principal":          {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:46.17Z"
      },
            {
         "entityId": null,
         "operationUID": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
         "principal":          {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:46.437Z"
      },
            {
         "entityId": null,
         "operationUID": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
         "principal":          {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:46.737Z"
      },
            {
         "entityId": null,
         "operationUID": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
         "principal":          {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:47.28Z"
      },
            {
         "entityId": null,
         "operationUID": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
         "principal":          {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:47.737Z"
      },
            {
         "entityId": null,
         "operationUID": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
         "principal":          {
            "name": "Custom",
            "isCustom": true,
            "type": "Role",
            "id": 10498
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2023-10-05T22:24:13.54Z"
      }
   ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/  

Includes object permissions for a given Live Text Feed

**Required Scope Token**

bsn.api.main.feeds.text.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Live Text Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `4567890`

```text
GET /2022/06/REST/Feeds/Text/4567890/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 4567890,
    "operationUID": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.05Z"
  },
  {
    "entityId": 4567890,
    "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.057Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/  

Adds permissions to Live Text Feed(s) with the specified id.

**Required Scope Token**

bsn.api.main.feeds.text.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Live Text Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `4567890`

```text
POST /2022/06/REST/Feeds/Text/4567890/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 368
```

This is the example request body:

```json
[
  {
    "entityId": 4567890,
    "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.057Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully granted

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/  

Removes permissions from the specified Live Text Feed

**Required Scope Token**

bsn.api.main.feeds.text.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Live Text Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `4567890`

```text
DELETE /2022/06/REST/Feeds/Text/4567890/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 328
```

This is the example request body:

```json
[
  {
    "entityId": 4567890,
    "operationUID": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.05Z"
  },
  {
    "entityId": 4567890,
    "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.057Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted  

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Permissions/  

Includes object permissions for a given Live Text Feed

**Required Scope Token**

bsn.api.main.feeds.text.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Text Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `NewsFeed`

```text
GET /2022/06/REST/Feeds/Text/NewsFeed/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 4567890,
    "operationUID": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.05Z"
  },
  {
    "entityId": 4567890,
    "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.057Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{name}/Permissions/  

Adds permissions to Live Text Feed(s) with the specified name.

**Required Scope Token**

bsn.api.main.feeds.text.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Text Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `NewsFeed`

```text
POST /2022/06/REST/Feeds/Text/NewsFeed/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 368
```

This is the example request body:

```json
[
  {
    "entityId": 4567890,
    "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.057Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully granted

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>:  The specified representation of the permissions entity is invalid or not supported (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/Permissions/  

Removes permissions from the specified Live Text Feed

**Required Scope Token**

bsn.api.main.feeds.text.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Text Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `NewsFeed`

```text
DELETE /2022/06/REST/Feeds/Text/NewsFeed/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 328
```

This is the example request body:

```json
[
  {
    "entityId": 4567890,
    "operationUID": "5ef4d2e0-3abc-4f3d-aa8f-d1bbddace601",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.05Z"
  },
  {
    "entityId": 4567890,
    "operationUID": "376563fa-72b4-471a-9d49-1f4de927dc20",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.057Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted  

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] User Notification Settings Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All User Notification Settings entities, which allow the current user to manage their notification settings, are structured as follows:

`entity`:

- `NetworkSuspendingNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when BrightSign is suspending their network subscription
- `NetworkSuspendedNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when BrightSign has suspended their network subscription
- `NetworkSubscriptionUpgradedNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when their network subscription has been upgraded
- `NetworkTrialPeriodStartedNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when they have started a network trial subscription period
- `NetworkTrialPeriodExpiringNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when a network trial subscription period is expiring
- `NetworkTrialPeriodExpiredNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when a network trial subscription period has expired
- `DeviceFailureNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when a player fails
- `DevicesFailureNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when multiple players fail
- `DeviceDisconnectedNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when a player is disconnected
- `DevicesDisconnectedNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when multiple players are disconnected
- `SubscriptionCreatedNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when they have created a subscription
- `SubscriptionsCreatedNotificationEnabled` <font color="#704ae0">bool </font><font color="#01a0af">read-write</font>: Whether or not the current user will be notified when they have created multiple subscriptions
- `SubscriptionQueuedNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when their subscription is queued
- `SubscriptionsQueuedNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified when their subscriptions are queued
- `GraceSubscriptionExpiringNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that their subscription grace period is expiring
- `GraceSubscriptionsExpiringNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that the grace period for multiple subscriptions is expiring
- `DemoSubscriptionExpiringNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that the demo subscription is expiring
- `DemoSubscriptionsExpiringNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that the multiple demo subscriptions are expiring
- `SubscriptionExpiringNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that their subscription is expiring
- `SubscriptionsExpiringNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that they have multiple subscriptions expiring
- `SubscriptionExpiredNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that their subscription has expired
- `SubscriptionsExpiredNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that they have multiple subscription expiring
- `SubscriptionSuspendingNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that BrightSign is suspending their subscription&#x20;
- `SubscriptionsSuspendingNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that BrightSign is suspending their subscriptions
- `SubscriptionSuspendedNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that BrightSign has suspended their subscription
- `SubscriptionsSuspendedNotificationEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the current user will be notified that BrightSign has suspended their subscriptions


[title] Network Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Network entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier of the network 
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-</font><font color="#01a0af">write</font>: The internal globally-unique name of a network. The maximum length of this property value is 30 characters.
- `DisplayName` <font color="#704ae0">string</font> <font color="#01a0af">read-write:</font> An optional property which defines the user-defined name of a network. The maximum length of this property value is 255 characters.
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The creation date of the network. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LockoutDate` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-only</font>: The date on which the network was locked out, if applicable. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `IsLockedOut` <font color="#704ae0">bool</font> <font color="#01a0af">read-only</font>: Indicates that a network is suspended by a BrightSign Cloud administrator due to recurring payment issues in BrightSign Author Plus. False is the default value.
- `LastLockoutDate` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-only</font>: The last date on which the network was locked out, if applicable. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Settings` <font color="#704ae0">NetworkSettings</font> <font color="#01a0af">read-write</font>: The network settings entity. See [Network Settings Entity (2022/06)](docId\:uAqtZaNLtnrCJbzF4Vjdw).&#x20;
- `Subscription` <font color="#704ae0">NetworkSubscription</font> <font color="#01a0af">read-</font><font color="#01a0af">only</font>: The network subscription entity. See [Network Subscription Entity (2022/06)](docId:4aEKL8OUwp1jzomQCJ2iD).
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The last date on which the subscription was modified, if available. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.


[title] Primitive/Base Data Types (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/

These data types may be used in the BSN.Cloud Upload endpoints. Among primitive data types, only the string and object data types are nullable. All data types are primitive except for the object data type.

| **Data Type** | **Definition**                                                                                                                                | **Default Value** |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- |
| array         | The ordered sequence of elements of the same data type. This type is always nullable.                                                         | \[ ]              |
| bool          | true or false value                                                                                                                           | False             |
| byte          | 8-bit unsigned integer (0-255)                                                                                                                | 0                 |
| char          | 16-bit unicode character                                                                                                                      | ‘\0’              |
| decimal       | 128-bit decimal values with 28 or 29 digits                                                                                                   | 0.0M              |
| double        | 64-bit double-precision floating point number                                                                                                 | 0.0D              |
| float         | 32-bit floating point number                                                                                                                  | 0.0F              |
| int           | 32-bit integer                                                                                                                                | 0                 |
| long          | 64-bit integer                                                                                                                                | 0L                |
| object        | A base data type that is the parent for all other data types (it can include the value of any other data type). This type is always nullable. | Nothing           |
| sbyte         | 8-bit signed integer                                                                                                                          | 0                 |
| short         | 16-bit signed integer                                                                                                                         | 0                 |
| string        | A sequence of characters. This type is always nullable.                                                                                       |                   |
| uint          | 32-bit unsigned integer                                                                                                                       | 0                 |
| ulong         | 64-bit unsigned integer                                                                                                                       | 0                 |
| ushort        | 16-bit unsigned integer                                                                                                                       | 0                 |


[title] Paged List Entity (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The Paged List entity is structured as follows:

`entity`:

- `Items` <font color="#704ae0">Entity[] </font><font color="#01a0af">read-only</font>: The subset of items contained only within this one page of the complete list of entities
- `TotalItemCount` <font color="#704ae0">int </font><font color="#01a0af">read-only</font>: The number of requested entities contained within the whole network
- `PageSize` <font color="#704ae0">int </font><font color="#01a0af">read-only</font>: The maximum number of objects that can be contained in the response body. 100 is the default and also the maximum. 
- `IsTruncated` <font color="#704ae0">bool </font><font color="#01a0af">read-only</font>: Whether or not there are additional pages in the subset. If this value is True, add `NextMarker` in your URL "marker" parameter to get the next paged subset (you can also include the "PageSize" option if the "marker" parameter is present). 
- `NextMarker` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The marker of the last item in the paged subset. This value is useful if the `IsTruncated` entry in the response body indicates that the number of Device WebPages exceeds the `PageSize`. 
- `SortExpression` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: An expression that has been previously applied to the list of returned items. Note that:
  - If the customer does not supply an expression, the default expression will be calculated.
  - The sort expression specifies the entry used for sorting, and the ascending/descending (ASC/DESC) sorting order. For example, "`[ContentUploadStatus].[StartTime] ASC`" is the default setting for devices (by serial number in ascending order), but the default setting will change depending on what entity type is being returned by the paged list call.
  - The server will parse, validate, and clarify the expression, so the returned expression might be slightly different than the expression provided by the customer.


[title] ContentNegotiationStatus (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The ContentNegotiationStatus entity is structured as follows:

`entity`:

- `SessionToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The Content Upload Session token generated by the server
- `UploadToken` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The Content Upload token generated by the server
- `ContentId` <font color="#704ae0">int </font><font color="#01a0af">read-only</font>: The identifier of the uploaded content in the library
- `FileName` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The name of the file being uploaded
- `FileSize` <font color="#704ae0">long </font><font color="#01a0af">read-only</font>: The size of the file being uploaded in bytes
- `SHA1Hash` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The SHA1 hash of the file being uploaded
- `State` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: One of the [UploadStatus Enumeration (2019/03)](docId\:s0Gj0owfjf9OKNId86stN) values
- `StartTime` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">DateTime&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The timestamp of Content Upload Session start
- `EndTime` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">DateTime&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The timestamp of Content Upload Session end
- `LastActivityTime` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">DateTime&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The timestamp of last activity in scope of Content Upload Session
- `Chunks` <font color="#704ae0">ContentChunkStatus[] </font><font color="#01a0af">read-only</font>: The progress of the Content Upload represented by the array of [ContentChunkStatus (2019/03)](docId\:MxHDQ_5ih5SKYEWwBtWTz) items
- `MatchingFiles` <font color="#704ae0">C</font><font color="#704ae0">ontentInfo[]</font> <font color="#01a0af">read-only</font>: The information about the existing [Content Entity (2022/06)](docId\:fkVdcafrX380751m5hbNr) similar to the file being uploaded






[title] User Permissions
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/General Information/

This page describes user permissions in the Main API.

## BrightSign Network Entities

The following BrightSign Network entities use permissions:

### Person

The root entity representing a single physical person with a specified login (in email format) and password. Person is created once during new customer signup and grants very limited access to BSN.

### Network

An entity representing a company, organization or other group of people with their content and infrastructure.

### Role

The entity of a network, aggregating permissions which are common for the members of some company department. For example:

- **User:** The entity-relation between person and network allowing multiple people to be the member of the same network as well as the same person be the member of any number of networks. It may optionally be a member of one role and inherit its permissions.
- **Operation Permission:** The entity-relation which defines the kind of access the current role has for the current business operation. It applies to all instances of the target entity type but has low priority
- **Object Permission:** The entity-relation which defines the kind of access the current user or role has for the current business operation under the current entity instance. It does not affect other entities of the type but has higher priority than operation permission.

## User Permission Model

In the root of the user permissions model, there are 300+ business operations organized into tree. Each of them describes some case the actor may perform in the system and is classified by target entity type and visibility level. Business operations associated with the same entity type form a single branch headed by the "\{Entity Name} Full Control" business operation. Not all entities may be controlled by object permissions: Some like subscriptions are controlled only by operation permissions and simple entities like BrightWall Configuration are not integrated into user permissions model at all and are accessible to everyone.

By principal type, the permissions are classified as role permissions, associated with either system or custom roles, and user permissions, associated with some person-in-network. The role permissions are fully-functional while user permissions are limited and can define access only to specific entity instances. Otherwise, the permission can also be marked as "Fixed" which makes it not editable or overridable for all users. And, of course, it can either grant or revoke access to a specified business operation.

The priorities of the described permissions types are as follows (from lowest to highest):

1. Role permission for the parent business operation
2. Role permission for the current business operation
3. Role permission for the parent business operation under the parent entity
4. Role permission for the current business operation under the parent entity
5. Role permission for the parent business operation under the current entity
6. Role permission for the current business operation under the current entity
7. User permission for the parent business operation under the parent entity
8. User permission for the current business operation under the parent entity
9. User permission for the parent business operation under the current entity
10. User permission for the current business operation under the current entity.

Note that only the Content entity type has parent entity type of Content Folder. However, folders may be implemented in the same way for Live Text Feeds, Live Media Feeds, Dynamic Playlists, Tagged Playlists, and Presentations.

## Retrieving Operations 

The Main API currently provides the complete set of methods required for retrieval and management of permissions of all types but separately.

:::hint{type="info"}
Although only version 2020/10 of the BSN.Cloud Main API is specified on this page, version 2022/06 is also supported and can be used instead.
:::

To retrieve the business operations tree and all operation permissions:

`GET ~/2020/10/REST/Operations/Root/{*path}`
`GET ~/2020/10/REST/{EntityName}/Operations/`

## Retrieving Object Permissions

The object permissions granted to a given user may be retrieved by general user retrieval methods and specifically:

`GET ~/2020/10/REST/Self/Users/{id:int}/Permissions/`

`GET ~/2020/10/REST/Users/{id|login}/Permissions/`

The operation and object permissions granted to a given role may be retrieved in similar way by general role retrieval methods and specifically:

`GET ~/2020/10/REST/Roles/{id|name}/Permissions/`

`GET ~/2020/10/REST/Self/Users/{id:int}/Role/Permissions/`

All entities called "securable" which support object permissions have their own `[Permission[]] Permissions` collections which are always initialized by all corresponding entity retrieval methods. This group of resources also provides that information:

`~/2020/10/REST/{SecurableEntityName}/{entityId}/Permissions/`

## Business Operation Permissions

Each business operation has a UID which does not change during its lifetime and is intended to be used in checks on the client side. But they may be reassigned to a different parent based on changes in business requirements and new features. For performance reasons, the specified resources and collections contain permissions assigned only on the current level.

Permissions priority levels follow these general rules:

- Network-wide operation permissions are the lowest priority.
- Role-object permissions are the next-highest priority. Depending on the content, they may also be granted on the parent folder and the content itself.
- User-object permissions granted on a parent entity have higher priority than role-object permissions granted on the same parent entity. So first calculate the inheritance on the parent entity, and then on the child entities.

### Permissions Retrieval Order and Priorities

To determine whether the user may perform a specified business operation under the given entity instance, the client application must:

1. Retrieve the business operations tree
2. Determine whether the given user is a member of some role, and if so, retrieve the corresponding role operation permissions.
3. Determine whether the given entity has some parent entity, and if so, retrieve the role object permissions of the parent entity.
4. Map the role object permissions of the parent entity on the role operation permissions
5. Retrieve the user object permissions of the parent entity
6. Map the user object permissions of the parent entity on the role object permissions of the parent entity and role operation permissions
7. Retrieve the role object permissions of the current entity
8. Map the role object permissions of the current entity on the user object permissions of the parent entity and the role object permissions of the parent entity and role operation permissions
9. Retrieve the user object permissions of the current entity
10. Map the user object permissions of the current entity onto the role object permissions of the current entity, and the user object permissions of the parent entity, and the role object permissions of the parent entity and role operation permissions (step 4 + step 6 + step 8)
11. Calculate the permissions inheritance according to the business operations tree
12. Find and check the permission for the specified business operation in the resulting tree.

## Other Information

- The business operations tree only gets updated upon a BSN release.
- All user and role operation permissions may be retrieved in one call.
- Only the content current has a parent entity currently.
- The entity permission collections contain all related user and role object permissions.
- If there are no permissions in a given case, the access may be determined as undefined.


[title] Live Media Feed Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Live Media Feed entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier for the Live Media Feed entity
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the Live Media Feed entity. The maximum length for this string is 50 characters.
- `TTL` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The frequency with which players will query BSN.Cloud servers to determine if there is any new live media to include or exclude in the feed. 
- `PhysicalPath` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The location of the Live Media Feed file in the server directory
- `FileSize` <font color="#704ae0">long</font> <font color="#01a0af">read-only</font>: The size of the Live Media Feed file (in bytes)
- `FileHash` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The hash value of the Live Media Feed file
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the Live Media Feed was created on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the Live Media Feed was last modified on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Content` <font color="#704ae0">LiveMediaFeedContent[]</font> <font color="#01a0af">read-write</font>:
  - `ContentId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: The unique identifier and primary key of the associated content instance. This value can be set by either the client or the server.
  - `FileName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The file name of the Live Media Feed content
  - `Title` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The key (that is, MRSS item title) of the associated media item in the related Live Media Feed
  - `Description` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The value (that is, MRSS item description) of the associated media item in the related Live Media Feed
  - `Disabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the Live Media Feed is disabled
  - `DisplayDuration` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The amount of time the content will be displayed before transitioning to the next entry. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
  - `ValidityStartDate` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The validity start date for the entry (that is, the point at which it will start being included in the Live Media Feed). A null value specifies that the item is valid immediately when added to the Live Media Feed. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
  - `ValidityEndDate` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The validity end date for the associated entry (that is, the point at which it will no longer be included in the Live Media Feed).  A null value specifies that the item will be valid until it is removed from the live media feed manually by a user. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
  - `CustomFields` <font color="#704ae0">Dictionary&lt;string, string&gt;</font> <font color="#01a0af">read-write</font>: An object containing key\:value pairs. Each pair corresponds to a custom field associated with the media item in the MRSS file of the related Live Media Feed.
- `Permissions` <font color="#704ae0">Permission[]</font> <font color="#01a0af">read-write</font>: A list of permission object instances representing permissions rules assigned to the Live Media Feed instance
- `Presentations` <font color="#704ae0">PresentationInfo[]</font> <font color="#01a0af">read-only</font>: An array of [Presentation Info](docId\:rH_TKLzOo3RPBID0mDC9v) entities for each presentation associated with the Live Media Feed instance


[title] DeviceWebPages Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

These endpoints allow users to manage device webpages on the network. 

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/DeviceWebPages***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Returns a list of player webpages

**Required Scope Token**

bsn.api.main.devicewebpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (see [this page](docId:3L0afyD3xoOE-yTvfk2vs) for more information). The default value is null.
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of device webpage instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of player webpage instances that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[Name] CONTAINS 'Page' AND [UploadDate] IS IN THE RANGE '2020-07-01' AND '2023-11-01'`
- `sort` is set to `[Name] DESC`

```text
GET /2022/06/REST/DeviceWebPages/?marker=TWF0dHNJbnRlcm5hbFBhZ2UsOTczMTk1NQ%3D%3D&pageSize=1&filter=%5BName%5D%20CONTAINS%20%27Page%27%20AND%20%5BUploadDate%5D%20IS%20IN%20THE%20RANGE%20%272020-07-01%27%20AND%20%272023-11-01%27&sort=%5BName%5D%20DESC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [WebPage Entity](docId\:O5V0Ui933WvEREInm7lS7) instances on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
   "items": [   {
      "id": 11335061,
      "name": "HTML_Red_Dot_Test-WebPage",
      "uploadDate": "2023-10-17T14:24:21.63Z",
      "lastModifiedDate": "2023-10-17T14:24:21.63Z",
      "indexFile":       {
         "fileName": "village-of-menomonee-falls-events.html",
         "physicalPath": "https://bsncloud.s3.amazonaws.com/ContentCloud/ee9d33406bf95280fd4bfa4a03ec9965",
         "relativePath": "\\",
         "fileSize": 1569,
         "fileHash": "SHA1:2614BFE3EC74FEE729FB6EQ291E6324E0432317E"
      },
      "assets": null,
      "presentations": [      {
         "id": 242058,
         "name": "HTML_Red_Dot_Test",
         "type": "Presentation",
         "link": null
      }],
      "permissions": []
   }],
   "totalItemCount": 9,
   "matchingItemCount": 6,
   "pageSize": 1,
   "nextMarker": "SFRNTF9SZWRfRG90X1Rlc3QtV2ViUGFnZSwxMTM0NTA1MA==",
   "prevMarker": "SFRNTF9SZWRfRG90X1Rlc3QtV2ViUGFnZSwxMTM0NTA134hU",
   "isTruncated": true,
   "sortExpression": "[Name] DESC",
   "filterExpression": "[Name] CONTAINS 'Page' AND [UploadDate] IS IN THE RANGE '2020-07-01T00:00:00.000Z' AND '2023-11-01T00:00:00.000Z'"
}
```

**Failure**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Removes player webpages, specified by a filter, from a network. This allows multiple player webpages to be deleted at once.

**Required Scope Token**

bsn.api.main.devicewebpages.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[UploadDate] IS IN THE RANGE '2020-07-01' AND '2020-08-01'`

```text
DELETE /2022/06/REST/DeviceWebPages/?filter=%5BName%5D%20CONTAINS%20%27Default%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the number of affected player webpages as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid. For example, you cannot delete a device webpage that is in use by a presentation.

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/ 

Returns the number of player webpages on a device

**Required Scope Token**

bsn.api.main.devicewebpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[UploadDate] IS IN THE RANGE '2018-01-01' AND '2023-09-01'`

```text
GET /2022/06/REST/DeviceWebPages/Count/?filter=%5BUploadDate%5D%20IS%20IN%20THE%20RANGE%20%272018-01-01%27%20AND%20%272023-09-01 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The player webpages count is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/ 

Returns the specified player webpage

**Required Scope Token**

bsn.api.main.devicewebpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `646879`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/DeviceWebPages/646879/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 20 Dec 2023 21:30:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [WebPage Entity](docId\:O5V0Ui933WvEREInm7lS7)&#x20;

**Example**

This is an example of a 200 level response:

```json
{
   "id": 646879,
   "name": "Default_PresentationWebPage",
   "uploadDate": "2020-07-27T16:23:35Z",
   "lastModifiedDate": "2023-12-20T21:30:35.093Z",
   "indexFile":    {
      "fileName": "_deviceWebPage.html",
      "physicalPath": "https://bsncloud.s3.amazonaws.com/Testing/5ced8fc8c47741c190a19c41f56c85d3",
      "relativePath": "\\",
      "fileSize": 116305,
      "fileHash": "SHA1:F84HF1B0D0361BDC4C2072EBE8C21B16P0HA0031"
   },
   "assets": [],
   "presentations":    [
            {
         "id": 15762,
         "name": "CC_Testing",
         "type": "Presentation",
         "link": null
      }
   ],
   "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/ 

Deletes the specified player webpage 

**Required Scope Token**

bsn.api.main.devicewebpages.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player webpage to delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `646879`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/DeviceWebPages/646879/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2023 21:30:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified player webpage(s) were deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid. For example, you cannot delete a device webpage that is in use by a presentation.

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/ 

Returns the specified player webpage

**Required Scope Token**

bsn.api.main.devicewebpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the player webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Default_PresentationWebPage`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/DeviceWebPages/Default_PresentationWebPage/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 20 Dec 2023 21:30:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [WebPage Entity](docId\:O5V0Ui933WvEREInm7lS7)&#x20;

**Example**

This is an example of a 200 level response:

```json
{
   "id": 646879,
   "name": "Default_PresentationWebPage",
   "uploadDate": "2020-07-27T16:23:35Z",
   "lastModifiedDate": "2023-12-20T21:30:35.093Z",
   "indexFile":    {
      "fileName": "_deviceWebPage.html",
      "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/5ced8fc8c47741c190a19c41f56c85d3",
      "relativePath": "\\",
      "fileSize": 116305,
      "fileHash": "SHA1:F841N1A0D4351BDC4C2072EBC8C21B1550DA0061"
   },
   "assets": [],
   "presentations":    [
            {
         "id": 15762,
         "name": "CC_Testing",
         "type": "Presentation",
         "link": null
      }
   ],
   "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/ 

Deletes the specified player webpage 

**Required Scope Token**

bsn.api.main.devicewebpages.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the player webpage to delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Default_PresentationWebPage`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/DeviceWebPages/Default_PresentationWebPage/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2023 21:30:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified player webpage(s) were deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid. For example, you cannot delete a device webpage that is in use by a presentation.

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/ 

Returns operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/DeviceWebPages/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

:::ExpandableHeading
Example

```json
{
   "uid": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
   "singularName": "Full Control",
   "pluralName": "Device Web Page (Full Control)",
   "fullName": "Device Web Page (Full Control)",
   "targetEntity": "DeviceWebPage",
   "appliance": "Instance, Collection",
   "parent": null,
   "descendants":    [
            {
         "uid": "b484e2f0-af97-41a2-996f-731816e907af",
         "singularName": "View Device Web Page",
         "pluralName": "View Device Web Pages",
         "fullName": "Device Web Page (Full Control) - View Device Web Pages",
         "targetEntity": "DeviceWebPage",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
            "singularName": "Full Control",
            "pluralName": "Device Web Page (Full Control)",
            "fullName": "Device Web Page (Full Control)",
            "targetEntity": "DeviceWebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "b484e2f0-af97-41a2-996f-731816e907af",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.553Z"
            },
                        {
               "entityId": null,
               "operationUID": "b484e2f0-af97-41a2-996f-731816e907af",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:07.067Z"
            },
                        {
               "entityId": null,
               "operationUID": "b484e2f0-af97-41a2-996f-731816e907af",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.08Z"
            },
                        {
               "entityId": null,
               "operationUID": "b484e2f0-af97-41a2-996f-731816e907af",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.34Z"
            },
                        {
               "entityId": null,
               "operationUID": "b484e2f0-af97-41a2-996f-731816e907af",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.587Z"
            },
                        {
               "entityId": null,
               "operationUID": "b484e2f0-af97-41a2-996f-731816e907af",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.907Z"
            }
         ]
      },
            {
         "uid": "fecc26f4-31aa-4a7a-a206-afabf885d1e6",
         "singularName": "Upload Device Web Page",
         "pluralName": "Upload Device Web Page",
         "fullName": "Device Web Page (Full Control) - Upload Device Web Page",
         "targetEntity": "DeviceWebPage",
         "appliance": "Collection",
         "parent":          {
            "uid": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
            "singularName": "Full Control",
            "pluralName": "Device Web Page (Full Control)",
            "fullName": "Device Web Page (Full Control)",
            "targetEntity": "DeviceWebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "fecc26f4-31aa-4a7a-a206-afabf885d1e6",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.08Z"
            },
                        {
               "entityId": null,
               "operationUID": "fecc26f4-31aa-4a7a-a206-afabf885d1e6",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.34Z"
            },
                        {
               "entityId": null,
               "operationUID": "fecc26f4-31aa-4a7a-a206-afabf885d1e6",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.587Z"
            },
                        {
               "entityId": null,
               "operationUID": "fecc26f4-31aa-4a7a-a206-afabf885d1e6",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.907Z"
            },
                        {
               "entityId": null,
               "operationUID": "fecc26f4-31aa-4a7a-a206-afabf885d1e6",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "fecc26f4-31aa-4a7a-a206-afabf885d1e6",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.053Z"
            }
         ]
      },
            {
         "uid": "5c6ef943-d660-4907-aa56-e91903ff1772",
         "singularName": "Update Device Web Page",
         "pluralName": "Update Device Web Page",
         "fullName": "Device Web Page (Full Control) - Update Device Web Page",
         "targetEntity": "DeviceWebPage",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
            "singularName": "Full Control",
            "pluralName": "Device Web Page (Full Control)",
            "fullName": "Device Web Page (Full Control)",
            "targetEntity": "DeviceWebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.08Z"
            },
                        {
               "entityId": null,
               "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.34Z"
            },
                        {
               "entityId": null,
               "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.587Z"
            },
                        {
               "entityId": null,
               "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.907Z"
            },
                        {
               "entityId": null,
               "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.053Z"
            }
         ]
      },
            {
         "uid": "ba132cfb-475f-44ab-bfe5-eeadb23af065",
         "singularName": "Assign Device Web Page",
         "pluralName": "Assign Device Web Page",
         "fullName": "Device Web Page (Full Control) - Assign Device Web Page",
         "targetEntity": "DeviceWebPage",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
            "singularName": "Full Control",
            "pluralName": "Device Web Page (Full Control)",
            "fullName": "Device Web Page (Full Control)",
            "targetEntity": "DeviceWebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "ba132cfb-475f-44ab-bfe5-eeadb23af065",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.08Z"
            },
                        {
               "entityId": null,
               "operationUID": "ba132cfb-475f-44ab-bfe5-eeadb23af065",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.34Z"
            },
                        {
               "entityId": null,
               "operationUID": "ba132cfb-475f-44ab-bfe5-eeadb23af065",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.587Z"
            },
                        {
               "entityId": null,
               "operationUID": "ba132cfb-475f-44ab-bfe5-eeadb23af065",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.907Z"
            },
                        {
               "entityId": null,
               "operationUID": "ba132cfb-475f-44ab-bfe5-eeadb23af065",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "ba132cfb-475f-44ab-bfe5-eeadb23af065",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.053Z"
            }
         ]
      },
            {
         "uid": "e0a3a34b-74d9-46ac-a2f5-d03674cb9ac3",
         "singularName": "Unassign Device Web Page",
         "pluralName": "Unassign Device Web Page",
         "fullName": "Device Web Page (Full Control) - Unassign Device Web Page",
         "targetEntity": "DeviceWebPage",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
            "singularName": "Full Control",
            "pluralName": "Device Web Page (Full Control)",
            "fullName": "Device Web Page (Full Control)",
            "targetEntity": "DeviceWebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "e0a3a34b-74d9-46ac-a2f5-d03674cb9ac3",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.08Z"
            },
                        {
               "entityId": null,
               "operationUID": "e0a3a34b-74d9-46ac-a2f5-d03674cb9ac3",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.34Z"
            },
                        {
               "entityId": null,
               "operationUID": "e0a3a34b-74d9-46ac-a2f5-d03674cb9ac3",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.587Z"
            },
                        {
               "entityId": null,
               "operationUID": "e0a3a34b-74d9-46ac-a2f5-d03674cb9ac3",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.907Z"
            },
                        {
               "entityId": null,
               "operationUID": "e0a3a34b-74d9-46ac-a2f5-d03674cb9ac3",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "e0a3a34b-74d9-46ac-a2f5-d03674cb9ac3",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.053Z"
            }
         ]
      },
            {
         "uid": "136c2201-f5f9-4f16-be52-35db9b1444d0",
         "singularName": "Edit Permissions",
         "pluralName": "Edit Permissions",
         "fullName": "Device Web Page (Full Control) - Edit Permissions",
         "targetEntity": "DeviceWebPage",
         "appliance": "Collection",
         "parent":          {
            "uid": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
            "singularName": "Full Control",
            "pluralName": "Device Web Page (Full Control)",
            "fullName": "Device Web Page (Full Control)",
            "targetEntity": "DeviceWebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "136c2201-f5f9-4f16-be52-35db9b1444d0",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.08Z"
            },
                        {
               "entityId": null,
               "operationUID": "136c2201-f5f9-4f16-be52-35db9b1444d0",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.34Z"
            },
                        {
               "entityId": null,
               "operationUID": "136c2201-f5f9-4f16-be52-35db9b1444d0",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.587Z"
            },
                        {
               "entityId": null,
               "operationUID": "136c2201-f5f9-4f16-be52-35db9b1444d0",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.907Z"
            },
                        {
               "entityId": null,
               "operationUID": "136c2201-f5f9-4f16-be52-35db9b1444d0",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "136c2201-f5f9-4f16-be52-35db9b1444d0",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.053Z"
            }
         ]
      },
            {
         "uid": "220b7755-3d09-4934-b583-69beb2d4976a",
         "singularName": "Delete Device Web Page",
         "pluralName": "Delete Device Web Page",
         "fullName": "Device Web Page (Full Control) - Delete Device Web Page",
         "targetEntity": "DeviceWebPage",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
            "singularName": "Full Control",
            "pluralName": "Device Web Page (Full Control)",
            "fullName": "Device Web Page (Full Control)",
            "targetEntity": "DeviceWebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "220b7755-3d09-4934-b583-69beb2d4976a",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.567Z"
            },
                        {
               "entityId": null,
               "operationUID": "220b7755-3d09-4934-b583-69beb2d4976a",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.08Z"
            },
                        {
               "entityId": null,
               "operationUID": "220b7755-3d09-4934-b583-69beb2d4976a",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.34Z"
            },
                        {
               "entityId": null,
               "operationUID": "220b7755-3d09-4934-b583-69beb2d4976a",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.587Z"
            },
                        {
               "entityId": null,
               "operationUID": "220b7755-3d09-4934-b583-69beb2d4976a",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.907Z"
            },
                        {
               "entityId": null,
               "operationUID": "220b7755-3d09-4934-b583-69beb2d4976a",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.053Z"
            }
         ]
      }
   ],
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
         "principal":          {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:05.08Z"
      },
            {
         "entityId": null,
         "operationUID": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
         "principal":          {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:05.34Z"
      },
            {
         "entityId": null,
         "operationUID": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
         "principal":          {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:05.587Z"
      },
            {
         "entityId": null,
         "operationUID": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
         "principal":          {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:05.907Z"
      },
            {
         "entityId": null,
         "operationUID": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
         "principal":          {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:06.54Z"
      },
            {
         "entityId": null,
         "operationUID": "74c0bd18-cb38-4a7a-b78d-127ffd5716d0",
         "principal":          {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:07.053Z"
      }
   ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/ 

Includes object permissions for a given player webpage instance.

**Required Scope Token**

bsn.api.main.devicewebpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `646879`

```text
GET /2022/06/REST/DeviceWebPages/646879/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 546701,
    "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
    "principal": {
      "login": "JaneDoe@brightsign.biZ",
      "type": "User",
      "id": 102359
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-11T18:46:30.1Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/ 

Adds permissions for a player webpage

**Required Scope Token**

bsn.api.main.devicewebpages.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `646879`

```text
POST /2022/06/REST/DeviceWebPages/646879/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 316
```

This is the example request body:

```json
[
  {
    "entityId": 546701,
    "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 0
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-11T18:46:30.1Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully granted

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/ 

Removes permissions from a player webpage

**Required Scope Token**

bsn.api.main.devicewebpages.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `646879`

```text
DELETE /2022/06/REST/DeviceWebPages/646879/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 316
```

This is the example request body:

```json
[
  {
    "entityId": 546701,
    "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 0
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-11T18:46:30.1Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted from the player webpage

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Permissions/ 

Includes object permissions for a given player webpage instance.

**Required Scope Token**

bsn.api.main.devicewebpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the player webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Default_PresentationWebPage`

```text
GET /2022/06/REST/DeviceWebPages/Default_PresentationWebPage/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 546701,
    "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
    "principal": {
      "login": "JaneDoe@brightsign.biZ",
      "type": "User",
      "id": 102359
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-11T18:46:30.1Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{name}/Permissions/ 

Adds permissions for a player webpage

**Required Scope Token**

bsn.api.main.devicewebpages.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the player webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Default_PresentationWebPage`

```text
POST /2022/06/REST/DeviceWebPages/Default_PresentationWebPage/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 316
```

This is the example request body:

```json
[
  {
    "entityId": 546701,
    "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 0
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-11T18:46:30.1Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully granted

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/Permissions/ 

Removes permissions from a player webpage

**Required Scope Token**

bsn.api.main.devicewebpages.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the player webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Default_PresentationWebPage`

```text
DELETE /2022/06/REST/DeviceWebPages/Default_PresentationWebPage/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 316
```

This is the example request body:

```json
[
  {
    "entityId": 546701,
    "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 0
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-11T18:46:30.1Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted from the player webpage

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Regular Groups Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Regular Groups entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the regular group instance. This value is generated by the server when the group is created
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The group name. The maximum length of this string is 50 characters.
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: Indicates when the group was created on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: Indicates when the group was last modified on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Autorun` <font color="#704ae0">DeviceAutorunInfo</font> <font color="#01a0af">read-only</font>:
  - `Version` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The current BrightSign Author autorun version assigned to the group
  - `IsCustom` <font color="#704ae0">bool</font> <font color="#01a0af">read-only</font>: Whether the autorun is a standard BrightSign Author file (`false`) or a custom-built file (`true`)
- `HDX23Firmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on the HD223/HD1023
- `HDX23FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the HD223/HD1023 minimum firmware version
- `LSX23Firmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on the LS423
- `LSX23FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the LS423 minimum firmware version
- `HSX23Firmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on the HS123
- `HSX23FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the HS123 minimum firmware version
- `HOX23Firmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on the HO523
- `HOX23FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the HO523 minimum firmware version
- `XDX33Firmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on the XD233/XD1033
- `XDX33FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the XD233/XD1033 minimum firmware version
- `XTX43Firmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on the XT242/XT1042/XT1142
- `XTX43FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write:</font> A unique identifier for the XT242/XT1042/XT1142 minimum firmware version
- `XDX34_XTX44Firmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on the XD234/XD1034&#x20;
- `XDX34_XTX44FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the XD234/XD1034 minimum firmware version
- `HDX4_HSX4_LSX4Firmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on the HD224/HD1024/LS424 and HSX4
- `HDX4_HSX4_LSX4FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the HD224/HD1024/LS424 and HSX4 minimum firmware version
- `AUX5Firmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on the AU335
- `AUX5FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the AU335 minimum firmware version
- `FKX42Firmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on the 4K242, 4K1042 and 4K1142
- `FKX42FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the 4K242, 4K1042 and 4K1142 minimum firmware version
- `XCX55Firmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on the XC5
- `XCX55FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the XC5 minimum firmware version
- `XTx45_XDx35_HDx25_LS4x5_HS1x5Firmware` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on HD5, HS5, LS5, XD5, and XT5 players
- `XTx45_XDx35_HDx25_LS4x5_HS1x5FirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the minimum firmware version of HD5, HS5, LS5, XD5, and XT5 players
- `LGUV5NFirmware` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on LGUV5N players
- `LGUV5NFirmwareId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the minimum firmware version of LGUV5N players
- `HDX26_XDX36_XS156Firmware`<font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The minimum version of device firmware required to play presentations on HD6, XD6, XS6 players
- `HDX26_XDX36_XS156FirmwareId`<font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: A unique identifier for the minimum firmware version of HD6, XD6, XS6 players
- `EnableSerialDebugging` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether serial debugging should be enabled for all players assigned to the Group instance
- `EnableSystemLogDebugging` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether system log debugging should be enabled for players assigned to the Group instance
- `EnableStorageSpaceLimit` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether player storage devices will be divided into different segments. This allows the user to allot maximum sizes to different segments to ensure that a certain type of data does not take up too much space on the storage device. The "limit" values below will only apply to the player storage if this value is true.
- `StorageSpaceLimitUnits` <font color="#704ae0">StorageSpaceLimitUnit</font> <font color="#01a0af">read-write</font>: Whether the following "limit" values are measured in percentages (`"Percentage"`) or megabytes (`"Megabyte"`)
- `PublishedDataSizeLimit` <font color="#704ae0">ushort</font> <font color="#01a0af">read-write</font>: The maximum size allotted to all presentation and content files that are written to the storage device during the publish process. This includes audio, video, images, text, and HTML content files.
- `DynamicDataSizeLimit` <font color="#704ae0">ushort</font> <font color="#01a0af">read-write</font>: The maximum size of all dynamic content, including Dynamic Playlists and MRSS feeds. When this segment runs out of space, dynamic content files will be deleted to create space, starting with the oldest files first.
- `HtmlDataSizeLimit` <font color="#704ae0">ushort</font> <font color="#01a0af">read-write</font>: The maximum size of the HTML application cache
- `HtmlLocalStorageSizeLimit` <font color="#704ae0">ushort</font> <font color="#01a0af">read-write</font>: The maximum size of all JavaScript variables and data
- `WebDatabaseSizeLimit` <font color="#704ae0">ushort</font> <font color="#01a0af">read-write</font>: The maximum amount of storage allocated to the IndexedDB web database application
- `DevicesCount` <font color="#704ae0">ushort</font> <font color="#01a0af">read-only</font>: The number of players assigned to the group instance
- `DevicesHealthStatus` <font color="#704ae0">Dictionary&lt;DeviceHealthStatus, uint&gt;</font> <font color="#01a0af">read-only</font>: Returns "Ok", "Warning", or "Error" depending on the player health
- `Devices` <font color="#704ae0">DeviceInfo[]</font> <font color="#01a0af">read-only</font>: Supported representations include:
  - `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier for the player
  - `Serial` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The player serial number
- `Schedule` <font color="#704ae0">ScheduledPresentation[]</font> <font color="#01a0af">read-only</font>: The scheduled presentation entity. See [Scheduled Presentation Entity](docId\:DRSRSrFhJ2cz61wdoL7QM)
- `Permissions` <font color="#704ae0">Permission[]</font> <font color="#01a0af">read-write</font>: A list of the permissions rules assigned to the group&#x20;




[title] ContentUpdateArguments (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The ContentUpdateArguments entity is structured as follows:

`entity`:

- `SessionToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#01a0af"> </font><font color="#01a0af">read-write</font>: The Content Upload Session Token generated by the server
- `UploadToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0">&gt; </font><font color="#01a0af">read-write</font>: The Content Upload Token generated by the server
- `ContentId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: The identifier for existing content in the library
- `FileName` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The name of the file being uploaded
- `VirtualPath` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The target virtual path in the library for the content being uploaded
- `MediaType` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The media type of the content being uploaded. See [ContentMediaType Enumeration (2019/03)](docId\:xLXfOwGMbqoNlTeF0dw90).   &#x20;
- `FileSize` <font color="#704ae0">long</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The size of the file being uploaded in bytes
- `FileLastModifiedDate` <font color="#704ae0">DateTime </font><font color="#01a0af">read-write</font>: The timestamp of last modification of original file in local storage. See [DateTime](docId:8oxgPxYJltIKaU9ho1nr2) for more information about this data type. 
- `SHA1Hash` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The SHA1 hash of the file being uploaded
- `FileThumb` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">byte[]&gt;</font> <font color="#01a0af">read-write</font>: A BASE64-encoded thumbnail for the content being uploaded.&#x20;
- `Tags` <font color="#704ae0">Nullable</font>\<<font color="#704ae0">Dictionary&lt;string, string&gt;&gt;</font> <font color="#01a0af">read-write</font>: An object where each property and its value represents a tag that must be assigned to the content file being uploaded. Each property value must be formatted as follows: "\<value\_type>\::\<tag\_type>.\<tag\_key>":"".






[title] WebPageUploadArguments (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The WebPageUploadArguments entity is structured as follows:

`entity`:

- `SessionToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#01a0af"> </font><font color="#01a0af">read-write</font>: The WebPage Upload Session Token generated by the server
- `UploadToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0">&gt; </font><font color="#01a0af">read-write</font>: The WebPage Upload Token generated by the server
- `Name` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The name of the entire WebPage being uploaded
- `Assets` <font color="#704ae0">WebPageAssetUploadArguments[] </font><font color="#01a0af">read-write</font>: The details about media assets related to the WebPage being uploaded in the current session
- `FileName` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The name of an index file of the Web Page/Site being uploaded
- `VirtualPath` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The target virtual path in the library for the content being uploaded
- `MediaType` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: One of \{"WebPage", "DeviceWebPage"} enumeration values
- `FileSize` <font color="#704ae0">long</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The size in bytes of an index file of the Web Page/Site being uploaded
- `FileLastModifiedDate` <font color="#704ae0">DateTime </font><font color="#01a0af">read-write</font>: The timestamp of last modification of an original index file in local storage. See [DateTime](docId:8oxgPxYJltIKaU9ho1nr2) for more information about this data type. 
- `SHA1Hash` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The SHA1 hash of the index file being uploaded
- `FileThumb` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">byte[]&gt;</font> <font color="#01a0af">read-write</font>: A BASE64-encoded thumbnail for the Web Page/Site being uploaded.&#x20;




[title] Device Subscriptions Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

These endpoints allow users to manage player subscriptions on a network. 

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Subscriptions***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Returns a list of player subscriptions

**Required Scope Token**

bsn.api.main.subscriptions.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A search [expression](docId:3L0afyD3xoOE-yTvfk2vs) for narrowing the result set
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (see [this page](docId:3L0afyD3xoOE-yTvfk2vs) for more information).
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of player subscription instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of device subscription instances that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[Device] IS NULL AND [Status] IS IN ('Active', 'Suspending')`
- `sort` is set to `[CreationDate] DESC`

```text
GET /2022/06/REST/Subscriptions/?marker=NDI0NTY0LDQyNDU2NA%3D%3D&pageSize=1&filter=%5BDevice%5D%20IS%20NULL%20AND%20%5BStatus%5D%20IS%20IN%20%28%27Active%27%2C%20%27Suspending%27%29&sort=%5BCreationDate%5D%20DESC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Player Subscription](#) entities on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
   "items": [   {
      "id": 424574,
      "device": null,
      "type": "Commercial",
      "activityPeriod": "365.00:00:00",
      "status": "Active",
      "creationDate": "2023-06-02T07:02:52.99Z",
      "lastModifiedDate": "2023-06-02T07:02:52.99Z",
      "activationDate": "2023-06-02T07:02:52.99Z",
      "suspensionDate": null,
      "expirationDate": null
   }],
   "totalItemCount": 20,
   "matchingItemCount": 9,
   "pageSize": 1,
   "nextMarker": "MjAyMy0wNi0wMlQwNzowMjo1Mi45OTBaLDQyNDU3NA==",
   "prevMarker": "MjAyMy0wNi0wMlQwNzowMjo1Mi45OTBaLDQyNDU36H78",
   "isTruncated": true,
   "sortExpression": "[CreationDate] DESC",
   "filterExpression": "[Device] IS NULL AND [Status] IS IN ( 'Active' , 'Suspending' )"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/ 

Retrieves the number of subscription instances on the network matching the specified filter criteria. If no filter is included, this call returns the total number of subscription instances on the network. 

**Required Scope Token**

bsn.api.main.subscriptions.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to`[Id] IS GREATER THAN 0 AND [Status] IS IN ('Active', 'Suspending')`

```text
GET /2022/06/REST/Subscriptions/Count/?pageSize=0&filter=%5BId%5D%20IS%20GREATER%20THAN%200%20AND%20%5BStatus%5D%20IS%20IN%20%28%27Active%27%2C%20%27Suspending%27%29 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The subscription instance count is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/ 

Returns operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Subscriptions/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

**Example**

:::ExpandableHeading
Expand

```json
{
   "uid": "616d956d-9a74-f674-61a9-3ab02f028352",
   "singularName": "Full Control",
   "pluralName": "Device Subscription (Full Control)",
   "fullName": "Device Subscription (Full Control)",
   "targetEntity": "Subscription",
   "appliance": "Instance, Collection",
   "parent": null,
   "descendants":    [
            {
         "uid": "d6416c44-747e-7e24-f549-5a57525e046d",
         "singularName": "View Subscription",
         "pluralName": "View Subscriptions",
         "fullName": "Device Subscription (Full Control) - View Subscriptions",
         "targetEntity": "Subscription",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "616d956d-9a74-f674-61a9-3ab02f028352",
            "singularName": "Full Control",
            "pluralName": "Device Subscription (Full Control)",
            "fullName": "Device Subscription (Full Control)",
            "targetEntity": "Subscription",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "d6416c44-747e-7e24-f549-5a57525e046d",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.767Z"
            },
                        {
               "entityId": null,
               "operationUID": "d6416c44-747e-7e24-f549-5a57525e046d",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:07.503Z"
            },
                        {
               "entityId": null,
               "operationUID": "d6416c44-747e-7e24-f549-5a57525e046d",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "d6416c44-747e-7e24-f549-5a57525e046d",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "d6416c44-747e-7e24-f549-5a57525e046d",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.747Z"
            },
                        {
               "entityId": null,
               "operationUID": "d6416c44-747e-7e24-f549-5a57525e046d",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.19Z"
            }
         ]
      },
            {
         "uid": "398bd8f9-8950-4735-97f8-50bf8c8b5759",
         "singularName": "Export Subscriptions",
         "pluralName": "Export Subscriptions",
         "fullName": "Device Subscription (Full Control) - Export Subscriptions",
         "targetEntity": "Subscription",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "616d956d-9a74-f674-61a9-3ab02f028352",
            "singularName": "Full Control",
            "pluralName": "Device Subscription (Full Control)",
            "fullName": "Device Subscription (Full Control)",
            "targetEntity": "Subscription",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "398bd8f9-8950-4735-97f8-50bf8c8b5759",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:07.517Z"
            },
                        {
               "entityId": null,
               "operationUID": "398bd8f9-8950-4735-97f8-50bf8c8b5759",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "398bd8f9-8950-4735-97f8-50bf8c8b5759",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "398bd8f9-8950-4735-97f8-50bf8c8b5759",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.747Z"
            },
                        {
               "entityId": null,
               "operationUID": "398bd8f9-8950-4735-97f8-50bf8c8b5759",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.19Z"
            },
                        {
               "entityId": null,
               "operationUID": "398bd8f9-8950-4735-97f8-50bf8c8b5759",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.753Z"
            }
         ]
      },
            {
         "uid": "1d8a9fc5-5958-7fe4-959b-447491382e87",
         "singularName": "View Subscription Invoice",
         "pluralName": "View Subscription Invoices",
         "fullName": "Device Subscription (Full Control) - View Subscription Invoices",
         "targetEntity": "SubscriptionInvoice",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "616d956d-9a74-f674-61a9-3ab02f028352",
            "singularName": "Full Control",
            "pluralName": "Device Subscription (Full Control)",
            "fullName": "Device Subscription (Full Control)",
            "targetEntity": "Subscription",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "1d8a9fc5-5958-7fe4-959b-447491382e87",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "1d8a9fc5-5958-7fe4-959b-447491382e87",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "1d8a9fc5-5958-7fe4-959b-447491382e87",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.747Z"
            },
                        {
               "entityId": null,
               "operationUID": "1d8a9fc5-5958-7fe4-959b-447491382e87",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.19Z"
            },
                        {
               "entityId": null,
               "operationUID": "1d8a9fc5-5958-7fe4-959b-447491382e87",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.753Z"
            },
                        {
               "entityId": null,
               "operationUID": "1d8a9fc5-5958-7fe4-959b-447491382e87",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.493Z"
            }
         ]
      },
            {
         "uid": "b2edb137-9e21-b444-5913-d3ef4ec7ef0c",
         "singularName": "View Traffic Invoice",
         "pluralName": "View Traffic Invoices",
         "fullName": "Device Subscription (Full Control) - View Traffic Invoices",
         "targetEntity": "TrafficInvoice",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "616d956d-9a74-f674-61a9-3ab02f028352",
            "singularName": "Full Control",
            "pluralName": "Device Subscription (Full Control)",
            "fullName": "Device Subscription (Full Control)",
            "targetEntity": "Subscription",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "b2edb137-9e21-b444-5913-d3ef4ec7ef0c",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "b2edb137-9e21-b444-5913-d3ef4ec7ef0c",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "b2edb137-9e21-b444-5913-d3ef4ec7ef0c",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.747Z"
            },
                        {
               "entityId": null,
               "operationUID": "b2edb137-9e21-b444-5913-d3ef4ec7ef0c",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.19Z"
            },
                        {
               "entityId": null,
               "operationUID": "b2edb137-9e21-b444-5913-d3ef4ec7ef0c",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.753Z"
            },
                        {
               "entityId": null,
               "operationUID": "b2edb137-9e21-b444-5913-d3ef4ec7ef0c",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.493Z"
            }
         ]
      },
            {
         "uid": "083dc302-4ac3-4e3a-be2d-be0b44c9a4fe",
         "singularName": "Export Subscription Invoice",
         "pluralName": "Export Subscription Invoices",
         "fullName": "Device Subscription (Full Control) - Export Subscription Invoices",
         "targetEntity": "SubscriptionInvoice",
         "appliance": "Collection",
         "parent":          {
            "uid": "616d956d-9a74-f674-61a9-3ab02f028352",
            "singularName": "Full Control",
            "pluralName": "Device Subscription (Full Control)",
            "fullName": "Device Subscription (Full Control)",
            "targetEntity": "Subscription",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "083dc302-4ac3-4e3a-be2d-be0b44c9a4fe",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "083dc302-4ac3-4e3a-be2d-be0b44c9a4fe",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "083dc302-4ac3-4e3a-be2d-be0b44c9a4fe",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.747Z"
            },
                        {
               "entityId": null,
               "operationUID": "083dc302-4ac3-4e3a-be2d-be0b44c9a4fe",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.19Z"
            },
                        {
               "entityId": null,
               "operationUID": "083dc302-4ac3-4e3a-be2d-be0b44c9a4fe",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.753Z"
            },
                        {
               "entityId": null,
               "operationUID": "083dc302-4ac3-4e3a-be2d-be0b44c9a4fe",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.493Z"
            }
         ]
      },
            {
         "uid": "9a99bf40-9791-4114-b90a-2c86d04a5254",
         "singularName": "Export Traffic Invoice",
         "pluralName": "Export Traffic Invoices",
         "fullName": "Device Subscription (Full Control) - Export Traffic Invoices",
         "targetEntity": "TrafficInvoice",
         "appliance": "Collection",
         "parent":          {
            "uid": "616d956d-9a74-f674-61a9-3ab02f028352",
            "singularName": "Full Control",
            "pluralName": "Device Subscription (Full Control)",
            "fullName": "Device Subscription (Full Control)",
            "targetEntity": "Subscription",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "9a99bf40-9791-4114-b90a-2c86d04a5254",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "9a99bf40-9791-4114-b90a-2c86d04a5254",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "9a99bf40-9791-4114-b90a-2c86d04a5254",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.747Z"
            },
                        {
               "entityId": null,
               "operationUID": "9a99bf40-9791-4114-b90a-2c86d04a5254",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.19Z"
            },
                        {
               "entityId": null,
               "operationUID": "9a99bf40-9791-4114-b90a-2c86d04a5254",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.753Z"
            },
                        {
               "entityId": null,
               "operationUID": "9a99bf40-9791-4114-b90a-2c86d04a5254",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.493Z"
            }
         ]
      },
            {
         "uid": "a3f0679f-a23f-4130-bb73-84e1a1f0f9da",
         "singularName": "Update Subscription",
         "pluralName": "Update Subscription",
         "fullName": "Device Subscription (Full Control) - Update Subscription",
         "targetEntity": "Subscription",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "616d956d-9a74-f674-61a9-3ab02f028352",
            "singularName": "Full Control",
            "pluralName": "Device Subscription (Full Control)",
            "fullName": "Device Subscription (Full Control)",
            "targetEntity": "Subscription",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "a3f0679f-a23f-4130-bb73-84e1a1f0f9da",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "a3f0679f-a23f-4130-bb73-84e1a1f0f9da",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.437Z"
            },
                        {
               "entityId": null,
               "operationUID": "a3f0679f-a23f-4130-bb73-84e1a1f0f9da",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.747Z"
            },
                        {
               "entityId": null,
               "operationUID": "a3f0679f-a23f-4130-bb73-84e1a1f0f9da",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.19Z"
            },
                        {
               "entityId": null,
               "operationUID": "a3f0679f-a23f-4130-bb73-84e1a1f0f9da",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.753Z"
            },
                        {
               "entityId": null,
               "operationUID": "a3f0679f-a23f-4130-bb73-84e1a1f0f9da",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.493Z"
            }
         ]
      }
   ],
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "616d956d-9a74-f674-61a9-3ab02f028352",
         "principal":          {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:05.18Z"
      },
            {
         "entityId": null,
         "operationUID": "616d956d-9a74-f674-61a9-3ab02f028352",
         "principal":          {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:05.437Z"
      },
            {
         "entityId": null,
         "operationUID": "616d956d-9a74-f674-61a9-3ab02f028352",
         "principal":          {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:05.747Z"
      },
            {
         "entityId": null,
         "operationUID": "616d956d-9a74-f674-61a9-3ab02f028352",
         "principal":          {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:06.19Z"
      },
            {
         "entityId": null,
         "operationUID": "616d956d-9a74-f674-61a9-3ab02f028352",
         "principal":          {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:06.753Z"
      },
            {
         "entityId": null,
         "operationUID": "616d956d-9a74-f674-61a9-3ab02f028352",
         "principal":          {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:07.493Z"
      }
   ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Content Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Content entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">r</font><font color="#01a0af">ead-only</font>: A unique identifier for the content instance
- `FileName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the content instance. The maximum length of this string is 128 characters.
- `PhysicalPath` <font color="#704ae0">string</font> <font color="#01a0af">r</font><font color="#01a0af">ead-only</font>: The location of the content instance in the server directory
- `VirtualPath` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The location of the content instance in the BSN virtual directory
- `ThumbPath` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The location of the thumbnail for the video/image file in the server directory. This value is a blank string for audio, text, and unknown file types.
- `MediaType` <font color="#704ae0">MediaType</font> <font color="#01a0af">read-only</font>: The content instance media type. One of "Auxiliary", "Stylesheet", "Font", "Text", "Image", "Video", or "Audio"
- `FileSize` <font color="#704ae0">long</font> <font color="#01a0af">read-only</font>: The content instance file size
- `FileHash` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The content instance hash algorithm and the value that results from performing the hash algorithm on the file. The string is formatted as "\{algorithm}:\{value}" (e.g. "SHA1:6DB465879088280AAC52DC22B07ED0AD493A99D4").
- `UploadDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the content instance was uploaded to the network. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the content metadata was last modified on the network (for example, when permissions are edited or the file is moved from one folder to another). This is reported by the customer's file system. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type. 
- `FileLastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the physical content was last modified on the network (for example, if the file was overridden). This is reported by the customer's file system. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ProbeData` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The audio/video probe data. This value is a blank string for image, text, and unknown file types.
- `Metadata` <font color="#704ae0">Dictionary&lt;string, object&gt;</font> <font color="#01a0af">read-only</font>: The array of key/value pairs that specify the metadata assigned to the content instance.
- `DynamicPlaylists` <font color="#704ae0">DynamicPlaylistInfo[]</font> <font color="#01a0af">read-only</font>: An array of DynamicPlaylist object instances representing dynamic playlists that contain the content instance. Supported representations are:
  - `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the dynamic playlist instance
  - `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The dynamic playlist name
- `LiveMediaFeeds` <font color="#704ae0">LiveMediaFeedInfo[]</font> <font color="#01a0af">read-only</font>: An array of LiveMediaFeed object instances representing live media feeds that contain the content instance. Supported representations are:
  - `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the live media feed instance
  - `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The live media feed name
- `TaggedPlaylists` <font color="#704ae0">TaggedPlaylistInfo[]</font> <font color="#01a0af">read-only</font>: An array of TaggedPlaylist object instances representing tagged playlists that contain the content instance. Supported representations are:
  - `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the tagged playlist instance
  - `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The tagged playlist name
- `Presentations` <font color="#704ae0">PresentationInfo[]</font> <font color="#01a0af">read-only</font>: An array of [Presentation Info](docId\:rH_TKLzOo3RPBID0mDC9v)  entities for each presentation that uses the content instance
- `Tags` <font color="#704ae0">Dictionary&lt;string, string&gt;</font> <font color="#01a0af">read-write</font>: An object where each property and its value represents a tag that must be assigned to the content file being uploaded. Each property value must be formatted as follows: "\<value\_type>\::\<tag\_type>.\<tag\_key>":"".
- `Permissions` <font color="#704ae0">Permission[]</font> <font color="#01a0af">read-write</font>: A list of permission object instances representing permissions rules assigned to the content folder


[title] Primitive/Base Data Types (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/

These data types may be used in the BSN.Cloud Main REST API. Among primitive data types, only the string and object data types are nullable. All data types are primitive except for the object data type.

| **Data Type** | **Definition**                                                                                                                                | **Default Value** |
| ------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ----------------- |
| array         | The ordered sequence of elements of the same data type. This type is always nullable.                                                         | \[ ]              |
| bool          | true or false value                                                                                                                           | False             |
| byte          | 8-bit unsigned integer (0-255)                                                                                                                | 0                 |
| char          | 16-bit unicode character                                                                                                                      | ‘\0’              |
| decimal       | 128-bit decimal values with 28 or 29 digits                                                                                                   | 0.0M              |
| double        | 64-bit double-precision floating point number                                                                                                 | 0.0D              |
| float         | 32-bit floating point number                                                                                                                  | 0.0F              |
| int           | 32-bit integer                                                                                                                                | 0                 |
| long          | 64-bit integer                                                                                                                                | 0L                |
| object        | A base data type that is the parent for all other data types (it can include the value of any other data type). This type is always nullable. | Nothing           |
| sbyte         | 8-bit signed integer                                                                                                                          | 0                 |
| short         | 16-bit signed integer                                                                                                                         | 0                 |
| string        | A sequence of characters. This type is always nullable.                                                                                       |                   |
| uint          | 32-bit unsigned integer                                                                                                                       | 0                 |
| ulong         | 64-bit unsigned integer                                                                                                                       | 0                 |
| ushort        | 16-bit unsigned integer                                                                                                                       | 0                 |


[title] ContentUploadStatus (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The ContentUploadStatus entity is structured as follows:

`entity`:

- `SessionToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The Content Upload Session token generated by the server
- `UploadToken` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The Content Upload token generated by the server
- `ContentId` <font color="#704ae0">int </font><font color="#01a0af">read-only</font>: The identifier of the uploaded content in the library
- `FileName` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The name of the file being uploaded
- `FileSize` <font color="#704ae0">long </font><font color="#01a0af">read-only</font>: The size of the file being uploaded in bytes
- `SHA1Hash` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The SHA1 hash of the file being uploaded
- `State` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: One of the [UploadStatus Enumeration (2019/03)](docId\:s0Gj0owfjf9OKNId86stN) values
- `StartTime` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">DateTime&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The timestamp of Content Upload Session start
- `EndTime` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">DateTime&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The timestamp of Content Upload Session end
- `LastActivityTime` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">DateTime&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The timestamp of last activity in scope of Content Upload Session
- `Chunks` <font color="#704ae0">ContentChunkStatus[] </font><font color="#01a0af">read-only</font>: The progress of the Content Upload represented by the array of [ContentChunkStatus (2019/03)](docId\:MxHDQ_5ih5SKYEWwBtWTz) items.








[title] Player Beacon Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

The Player Beacon entity follows one of the structures below, depending on the type of interface (see `Mode`):

`iBeacon`

- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the Player Beacon entity. The maximum length of this string is 255 characters.
- `Mode` <font color="#704ae0">PlayerBeaconMode</font> <font color="#01a0af">read-only</font>: "iBeacon"
- `Major` <font color="#704ae0">ushort</font> <font color="#01a0af">read-write</font>: An integer specifying the 2-byte Major value (0 to 65535)
- `Minor` <font color="#704ae0">ushort</font> <font color="#01a0af">read-write</font>: An integer specifying the 2-byte Minor value (0 to 65535)
- `UUID` <font color="#704ae0">GUID</font> <font color="#01a0af">read-write</font>: A string representation of a UUID, which can be in 16-bit, 32-bit, or 128-bit format. A 16-bit UUID must be exactly four hex digits with no punctuation; a 32-bit UUID must be exactly eight hex digits with no punctuation; and a 128-bit UUID must be punctuated exactly as follows: "cd7b6f81-f738-4cad-aebf-d2a2ea36d996".
- `Power` <font color="#704ae0">short</font> <font color="#01a0af">read-write</font>: An integer value that corresponds to the measurement of the Tx power level (in dBm) at 0 meters. 

`EddystoneUid`

- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the Player Beacon entity. The maximum length of this string is 255 characters.
- `Mode` <font color="#704ae0">PlayerBeaconMode</font> <font color="#01a0af">read-only</font>: "EddystoneUid"
- `NamespaceID` <font color="#704ae0">byte[]</font> <font color="#01a0af">read-write</font>: A BASE64-encoded 10-byte value expressed as 20 hexadecimal digits
- `InstanceID` <font color="#704ae0">byte[]</font> <font color="#01a0af">read-write</font>: A BASE64-encoded 6-byte value expressed as 12 hexadecimal digits
- `Power` <font color="#704ae0">short</font> <font color="#01a0af">read-write</font>: An integer value that corresponds to the measurement of the Tx power level (in dBm) at 0 meters. 

`EddystoneUrl`

- `Name` <font color="#704ae0">string</font><font color="#01a0af"> read-write</font>: The name of the Player Beacon entity. The maximum length of this string is 255 characters.
- `Mode` <font color="#704ae0">PlayerBeaconMode</font> <font color="#01a0af">read-only</font>: "EddystoneUrl"
- `URL` <font color="#704ae0">URL</font> <font color="#01a0af">read-write</font>: The URL to encapsulate in the advertisement packet. 
- `Power` <font color="#704ae0">short</font> <font color="#01a0af">read-write</font>: An integer value that corresponds to the measurement of the Tx power level (in dBm) at 0 meters.


[title] WebPages Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

These endpoints allow users to manage webpages (that is, an HTML file and associated asset files) on a network. 

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/WebPages***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Returns a list of webpages on a network

**Required Scope Token**

bsn.api.main.webpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (e.g. "`[Device].[Serial] ASC`"). The default value is null.
- `marker`  <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of webpage instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of webpage instances that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[UploadDate] IS IN THE RANGE '2020-01-01' AND '2024-01-01'`
- `sort` is set to `[Name] ASC`
- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.
- `pageSize` is set to `1`

```text
GET /2022/06/REST/WebPages/?marker=Y29udHJwxMjU5OTg2Ng%3D%3D&pageSize=1&filter=%5BUploadDate%5D%20IS%20IN%20THE%20RANGE%20%272020-01-01%27%20AND%20%272024-01-01%27&sort=%5BName%5D%20ASC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [WebPage Entity](docId\:O5V0Ui933WvEREInm7lS7) instances on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
   "items": [   {
      "id": 12345,
      "name": "PresentationBsDateTimeWidget",
      "uploadDate": "2023-07-26T19:35:26.087Z",
      "lastModifiedDate": "2023-07-26T19:35:26.087Z",
      "indexFile":       {
         "fileName": "bsDateTimeWidget.html",
         "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoe/3285cf5ee2926a8b47e30b12f51ed169",
         "relativePath": "\\",
         "fileSize": 2084573,
         "fileHash": "SHA1:69780C154749DFE32B04459B7103C07B11E0DA59"
      },
      "assets": null,
      "presentations": [      {
         "id": 123,
         "name": "ClockZone",
         "type": "Presentation",
         "link": null
      }],
      "permissions": []
   }],
   "totalItemCount": 6,
   "matchingItemCount": 6,
   "pageSize": 1,
   "nextMarker": "RGVmYXVsdF9QcmVzZW50YXRpb25Cc0RhdGVUaW1lV2lkZ2V0LDEwMDM3MjU0",
   "prevMarker": "RGVmYXVsdF9QcmVzZW50YXRpb25Cc0RhdGVUaW1lV2lkZ2V0LDEwMDM31gh2",
   "isTruncated": true,
   "sortExpression": "[Name] ASC",
   "filterExpression": "[UploadDate] IS IN THE RANGE '2020-01-01T00:00:00.000Z' AND '2024-01-01T00:00:00.000Z'"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Deletes webpages, specified by a filter, on a network. This allows multiple webpages to be deleted at once.

**Required Scope Token**

bsn.api.main.webpages.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[UploadDate] IS IN THE RANGE '2019-01-01' AND '2020-01-01'`

```text
DELETE /2022/06/REST/WebPages/?filter=%5BUploadDate%5D%20IS%20IN%20THE%20RANGE%20%272019-01-01%27%20AND%20%272020-01-01%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ 

**Success Response**

<font color="#089a4d">200</font>: Returns the number of affected webpages, as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules. For example, you cannot delete a webpage that is in use by a presentation.

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/ 

Returns the number of webpages on a network

**Required Scope Token**

bsn.api.main.webpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[UploadDate] IS IN THE RANGE '2020-01-01' AND '2024-01-01'`

```text
GET /2022/06/REST/WebPages/Count/?filter=%5BUploadDate%5D%20IS%20IN%20THE%20RANGE%20%272020-01-01%27%20AND%20%272024-01-01%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The webpage count is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/ 

Returns the specified webpage

**Required Scope Token**

bsn.api.main.webpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/WebPages/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [WebPage Entity](docId\:O5V0Ui933WvEREInm7lS7) 

**Example**

This is an example of a 200 level response:

```json
{
   "id": 12345,
   "name": "PresentationBsDateTimeWidget",
   "uploadDate": "2023-07-26T19:35:26.087Z",
   "lastModifiedDate": "2023-12-20T21:32:35.093Z",
   "indexFile":    {
      "fileName": "bsDateTimeWidget.html",
      "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoe/3285cf5ee2926a8b47e30b12f51ed169",
      "relativePath": "\\",
      "fileSize": 2084573,
      "fileHash": "SHA1:69782C054749DFE39B94859B7103C07B11E0DA59"
   },
   "assets": [],
   "presentations": [   {
      "id": 123,
      "name": "ClockZone",
      "type": "Presentation",
      "link": null
   }],
   "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/ 

Deletes the specified webpage

**Required Scope Token**

bsn.api.main.webpages.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/WebPages/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified webpage was deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules. For example, you cannot delete a webpage that is in use by a presentation.

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/ 

Returns the specified webpage

**Required Scope Token**

bsn.api.main.webpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>A unique identifier for the webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `PresentationBsDateTimeWidget`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/WebPages/PresentationBsDateTimeWidget/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [WebPage Entity](docId\:O5V0Ui933WvEREInm7lS7) 

**Example**

This is an example of a 200 level response:

```json
{
   "id": 12345,
   "name": "PresentationBsDateTimeWidget",
   "uploadDate": "2023-07-26T19:35:26.087Z",
   "lastModifiedDate": "2023-12-20T21:32:35.093Z",
   "indexFile":    {
      "fileName": "bsDateTimeWidget.html",
      "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoe/3285cf5ee2926a8b47e30b12f51ed169",
      "relativePath": "\\",
      "fileSize": 2084573,
      "fileHash": "SHA1:69782C054749DFE39B94859B7103C07B11E0DA59"
   },
   "assets": [],
   "presentations": [   {
      "id": 123,
      "name": "ClockZone",
      "type": "Presentation",
      "link": null
   }],
   "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/ 

Deletes the specified webpage

**Required Scope Token**

bsn.api.main.webpages.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>A unique identifier for the webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `PresentationBsDateTimeWidget`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/WebPages/PresentationBsDateTimeWidget/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified webpage was deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules. For example, you cannot delete a webpage that is in use by a presentation.

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/ 

Returns the operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/WebPages/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

:::ExpandableHeading
Example

```json
{
   "uid": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
   "singularName": "Full Control",
   "pluralName": "Web Page (Full Control)",
   "fullName": "Web Page (Full Control)",
   "targetEntity": "WebPage",
   "appliance": "Instance, Collection",
   "parent": null,
   "descendants":    [
            {
         "uid": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
         "singularName": "View Web Page",
         "pluralName": "View Web Pages",
         "fullName": "Web Page (Full Control) - View Web Pages",
         "targetEntity": "WebPage",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
            "singularName": "Full Control",
            "pluralName": "Web Page (Full Control)",
            "fullName": "Web Page (Full Control)",
            "targetEntity": "WebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:20.16Z"
            },
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:20.42Z"
            },
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.44Z"
            },
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.66Z"
            },
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.82Z"
            },
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.9Z"
            },
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.293Z"
            },
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:25.703Z"
            },
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "No Setup",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10706
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-07T19:42:05.667Z"
            },
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "Matty Boom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10714
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-09T17:11:57.69Z"
            },
                        {
               "entityId": null,
               "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
               "principal":                {
                  "name": "Live Feed",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10795
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-12-11T22:09:07.977Z"
            }
         ]
      },
            {
         "uid": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
         "singularName": "Upload Web Page",
         "pluralName": "Upload Web Page",
         "fullName": "Web Page (Full Control) - Upload Web Page",
         "targetEntity": "WebPage",
         "appliance": "Collection",
         "parent":          {
            "uid": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
            "singularName": "Full Control",
            "pluralName": "Web Page (Full Control)",
            "fullName": "Web Page (Full Control)",
            "targetEntity": "WebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.44Z"
            },
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.66Z"
            },
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.82Z"
            },
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.16Z"
            },
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.417Z"
            },
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.9Z"
            },
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.293Z"
            },
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:25.703Z"
            },
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "No Setup",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10706
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-07T19:42:05.667Z"
            },
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "Matty Boom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10714
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-09T17:11:57.69Z"
            },
                        {
               "entityId": null,
               "operationUID": "3860874d-bbb3-49cf-8ae5-c580f0480df2",
               "principal":                {
                  "name": "Live Feed",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10795
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-12-11T22:09:07.977Z"
            }
         ]
      },
            {
         "uid": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
         "singularName": "Update Web Page",
         "pluralName": "Update Web Page",
         "fullName": "Web Page (Full Control) - Update Web Page",
         "targetEntity": "WebPage",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
            "singularName": "Full Control",
            "pluralName": "Web Page (Full Control)",
            "fullName": "Web Page (Full Control)",
            "targetEntity": "WebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.44Z"
            },
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.66Z"
            },
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.82Z"
            },
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.16Z"
            },
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.417Z"
            },
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.9Z"
            },
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.293Z"
            },
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:25.703Z"
            },
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "No Setup",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10706
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-07T19:42:05.667Z"
            },
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "Matty Boom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10714
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-09T17:11:57.69Z"
            },
                        {
               "entityId": null,
               "operationUID": "49d22ebc-696f-4db1-9138-66bcbc32dce0",
               "principal":                {
                  "name": "Live Feed",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10795
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-12-11T22:09:07.977Z"
            }
         ]
      },
            {
         "uid": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
         "singularName": "Assign Web Page",
         "pluralName": "Assign Web Page",
         "fullName": "Web Page (Full Control) - Assign Web Page",
         "targetEntity": "WebPage",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
            "singularName": "Full Control",
            "pluralName": "Web Page (Full Control)",
            "fullName": "Web Page (Full Control)",
            "targetEntity": "WebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.44Z"
            },
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.66Z"
            },
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.82Z"
            },
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.16Z"
            },
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.417Z"
            },
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.9Z"
            },
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.293Z"
            },
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:25.703Z"
            },
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "No Setup",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10706
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-07T19:42:05.667Z"
            },
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "Matty Boom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10714
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-09T17:11:57.69Z"
            },
                        {
               "entityId": null,
               "operationUID": "9c44c26a-5519-4c8f-ac4a-1d7b918e2349",
               "principal":                {
                  "name": "Live Feed",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10795
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-12-11T22:09:07.977Z"
            }
         ]
      },
            {
         "uid": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
         "singularName": "Unassign Web Page",
         "pluralName": "Unassign Web Page",
         "fullName": "Web Page (Full Control) - Unassign Web Page",
         "targetEntity": "WebPage",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
            "singularName": "Full Control",
            "pluralName": "Web Page (Full Control)",
            "fullName": "Web Page (Full Control)",
            "targetEntity": "WebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.44Z"
            },
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.66Z"
            },
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.82Z"
            },
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.16Z"
            },
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.417Z"
            },
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.9Z"
            },
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.293Z"
            },
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:25.703Z"
            },
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "No Setup",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10706
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-07T19:42:05.667Z"
            },
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "Matty Boom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10714
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-09T17:11:57.69Z"
            },
                        {
               "entityId": null,
               "operationUID": "54d5cf37-1ff0-45ff-a459-8a5f468a47e1",
               "principal":                {
                  "name": "Live Feed",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10795
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-12-11T22:09:07.977Z"
            }
         ]
      },
            {
         "uid": "e69387ad-1517-4266-a745-2fe982da2f16",
         "singularName": "Edit Permissions",
         "pluralName": "Edit Permissions",
         "fullName": "Web Page (Full Control) - Edit Permissions",
         "targetEntity": "WebPage",
         "appliance": "Collection",
         "parent":          {
            "uid": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
            "singularName": "Full Control",
            "pluralName": "Web Page (Full Control)",
            "fullName": "Web Page (Full Control)",
            "targetEntity": "WebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.44Z"
            },
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.66Z"
            },
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.82Z"
            },
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.16Z"
            },
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.417Z"
            },
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.9Z"
            },
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.293Z"
            },
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:25.703Z"
            },
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "No Setup",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10706
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-07T19:42:05.667Z"
            },
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "Matty Boom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10714
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-09T17:11:57.69Z"
            },
                        {
               "entityId": null,
               "operationUID": "e69387ad-1517-4266-a745-2fe982da2f16",
               "principal":                {
                  "name": "Live Feed",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10795
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-12-11T22:09:07.977Z"
            }
         ]
      },
            {
         "uid": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
         "singularName": "Delete Web Page",
         "pluralName": "Delete Web Page",
         "fullName": "Web Page (Full Control) - Delete Web Page",
         "targetEntity": "WebPage",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
            "singularName": "Full Control",
            "pluralName": "Web Page (Full Control)",
            "fullName": "Web Page (Full Control)",
            "targetEntity": "WebPage",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:20.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.44Z"
            },
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.54Z"
            },
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.66Z"
            },
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.82Z"
            },
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.417Z"
            },
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.9Z"
            },
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.293Z"
            },
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:25.703Z"
            },
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "No Setup",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10706
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-07T19:42:05.667Z"
            },
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "Matty Boom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10714
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-11-09T17:11:57.69Z"
            },
                        {
               "entityId": null,
               "operationUID": "0d0a10ce-022a-4534-81e4-861d14cc2d79",
               "principal":                {
                  "name": "Live Feed",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10795
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-12-11T22:09:07.977Z"
            }
         ]
      }
   ],
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2022-06-21T05:03:19.44Z"
      },
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2022-06-21T05:03:19.54Z"
      },
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2022-06-21T05:03:19.66Z"
      },
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2022-06-21T05:03:19.82Z"
      },
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2022-06-21T05:03:20.16Z"
      },
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2022-06-21T05:03:20.417Z"
      },
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "No Permissions",
            "isCustom": true,
            "type": "Role",
            "id": 10410
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2023-08-29T23:08:25.9Z"
      },
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "Roll 1",
            "isCustom": true,
            "type": "Role",
            "id": 10470
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2023-09-01T14:45:04.293Z"
      },
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "Roll 2",
            "isCustom": true,
            "type": "Role",
            "id": 10471
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2023-09-01T14:45:25.703Z"
      },
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "No Setup",
            "isCustom": true,
            "type": "Role",
            "id": 10706
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2023-11-07T19:42:05.667Z"
      },
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "Matty Boom",
            "isCustom": true,
            "type": "Role",
            "id": 10714
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2023-11-09T17:11:57.69Z"
      },
            {
         "entityId": null,
         "operationUID": "5555a658-fcf0-4a1a-9044-4512d2d4a6fc",
         "principal":          {
            "name": "Live Feed",
            "isCustom": true,
            "type": "Role",
            "id": 10795
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2023-12-11T22:09:07.977Z"
      }
   ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/ 

Includes object permissions for a given webpage instance.

**Required Scope Token**

bsn.api.main.webpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/WebPages/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 12345,
    "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10000
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2024-01-23T19:39:26.157Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/ 

Adds permissions for a webpage on a network

**Required Scope Token**

bsn.api.main.webpages.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
POST /2022/06/REST/WebPages/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 476
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10000
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2024-01-24T16:36:28.663Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified webpage

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules.

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/ 

Removes permissions from a webpage on a network

**Required Scope Token**

bsn.api.main.webpages.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
DELETE /2022/06/REST/WebPages/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 476
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10000
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2024-01-24T16:36:28.663Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules.

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Permissions/ 

Includes object permissions for a given webpage instance.

**Required Scope Token**

bsn.api.main.webpages.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>A unique identifier for the webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `PresentationBsDateTimeWidget`

```text
GET /2022/06/REST/WebPages/PresentationBsDateTimeWidget/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 12345,
    "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10000
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2024-01-23T19:39:26.157Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{name}/Permissions/ 

Adds permissions for a webpage on a network

**Required Scope Token**

bsn.api.main.webpages.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>A unique identifier for the webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `PresentationBsDateTimeWidget`

```text
POST /2022/06/REST/WebPages/PresentationBsDateTimeWidget/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 476
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10000
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2024-01-24T16:36:28.663Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified webpage

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules.

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/Permissions/ 

Removes permissions from a webpage on a network

**Required Scope Token**

bsn.api.main.webpages.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>A unique identifier for the webpage

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `PresentationBsDateTimeWidget`

```text
DELETE /2022/06/REST/WebPages/PresentationBsDateTimeWidget/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 476
```

This is an example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "0a565477-e461-4b86-b74f-3cc0d98c28f6",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10000
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2024-01-24T16:36:28.663Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules.

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Operations Endpoint (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

This resource represents the business operations tree and operations permissions in a given network.

Base URL for this endpoint:  **https\://api.bsn.cloud/2022/06/REST/Operations**

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /Root/\{\*path}/  

Returns a sub-tree of the available business operations along with granted role permissions.

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `path` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>Allows you to request a subset rather than the entire business operations tree. It is populated by operation names based on the complete tree.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `path` is set to `User/UpdateUser`

```text
GET /2022/06/REST/Operations/Root/User%2FUpdateUser HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js) which includes operational permissions

**Example**

```json
{
   "uid": "526a9b95-cce5-422a-99f8-9f02d63af74f",
   "singularName": "Update User",
   "pluralName": "Update User",
   "fullName": "User (Full Control) - Update User",
   "targetEntity": "User",
   "appliance": "Instance, Collection",
   "parent":    {
      "uid": "b41ac545-d505-7014-edde-51bc4c0d21a0",
      "singularName": "Full Control",
      "pluralName": "User (Full Control)",
      "fullName": "User (Full Control)",
      "targetEntity": "User",
      "appliance": "Instance, Collection",
      "parent": null,
      "descendants": null,
      "permissions": null
   },
   "descendants": [],
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
         "principal":          {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
         },
         "isFixed": true,
         "isInherited": true,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:04.973Z"
      },
            {
         "entityId": null,
         "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
         "principal":          {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
         },
         "isFixed": true,
         "isInherited": true,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:05.217Z"
      },
            {
         "entityId": null,
         "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
         "principal":          {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
         },
         "isFixed": true,
         "isInherited": true,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:05.473Z"
      },
            {
         "entityId": null,
         "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
         "principal":          {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
         },
         "isFixed": true,
         "isInherited": true,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:05.783Z"
      },
            {
         "entityId": null,
         "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
         "principal":          {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
         },
         "isFixed": true,
         "isInherited": true,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:06.237Z"
      },
            {
         "entityId": null,
         "operationUID": "526a9b95-cce5-422a-99f8-9f02d63af74f",
         "principal":          {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
         },
         "isFixed": true,
         "isInherited": true,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:06.807Z"
      }
   ]
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Autoruns/Plugins Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

The Autoruns/Plugins endpoints allow users to manage autorun plugins on a network. 

Base URL for this endpoint:  ***https\://api.bsn.cloud/2022/06/REST/Autoruns/Plugins***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Returns a list of autorun plugins on a network

**Required Scope Token**

bsn.api.main.autoruns.plugins.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (see [this page](docId:3L0afyD3xoOE-yTvfk2vs) for more information). The default value is null.
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of autorun plugin instances exceeds the `pageSize`.This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of autorun plugin instances that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[FileInfo].[Type] IS 'Stored' AND [FileInfo].[Size] IS GREATER THAN 0 AND [FileInfo].[Name] IS '*.brs'`
- `sort` is set to `[FileInfo].[CreationDate] ASC`

```text
GET /2022/06/REST/Autoruns/Plugins/?marker=MjAyMy0wOC0zMVQyMDo1Nzo0Mi41MDdaLDE1Mjc3&pageSize=1&filter=%5BFileInfo%5D.%5BType%5D%20IS%20%27Stored%27%20AND%20%5BFileInfo%5D.%5BSize%5D%20IS%20GREATER%20THAN%200%20AND%20%5BFileInfo%5D.%5BName%5D%20IS%20%27*.brs%27&sort=%5BFileInfo%5D.%5BCreationDate%5D%20ASC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Autorun Plugin Entity](docId\:p6QURv3eOh-SC3xNQggeM) instances on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
   "items": [   {
      "id": 15342,
      "name": "liveTextPlugin",
      "fileInfo":       {
         "id": 15342,
         "path": "https://bsncloud.s3.amazonaws.com/bsts/9b6a47d278ad065a03ba680c345f0ea7",
         "type": "Stored",
         "name": "livetextboth.brs",
         "size": 12,
         "hash": "430CE34D020724ED75A196DFC2AD67C77772D169",
         "creationDate": "2023-09-08T15:44:01.717Z",
         "lastModifiedDate": "2023-09-08T15:44:01.717Z"
      },
      "presentations": [   {
         "id": 65425,
         "name": "GreatPresentation",
         "type": "Presentation",
         "link": null
   }],
   "totalItemCount": 4,
   "matchingItemCount": 4,
   "pageSize": 1,
   "nextMarker": "MjAyMy0wOS0wOFQxNTo0NDowMS43MTdaLDE1MzQy",
   "prevMarker": "MjAyMy0wOS0wOFQxNTo0NDowMS43MTdaLDE1Gh78",
   "isTruncated": false,
   "sortExpression": "[FileInfo].[CreationDate] ASC",
   "filterExpression": "[FileInfo].[Type] IS 'Stored' AND [FileInfo].[Size] IS GREATER THAN 0 AND [FileInfo].[Name] IS '*.brs'"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /

Create a new autorun plugin on a network

**Required Scope Token**

bsn.api.main.autoruns.plugins.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Autorun Plugin Entity](docId\:p6QURv3eOh-SC3xNQggeM)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Autoruns/Plugins/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 271
```

This is the example request body:

```json
{
	"id":0,
	"name":"liveTextPlugin",
	"fileInfo": {
		"id":0,
		"name":"livetextboth.brs",
		"type":"New",
		"body":"aGVsbG8gd29ybGQh",
		"transferEncoding":"base64",
		"size":0,
		"hash":"",
		"creationDate": "0001-01-01T00:00:00",
		"lastModifiedDate": "0001-01-01T00:00:00"
	},
	"presentations":null
} 
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the [Autorun Plugin Entity](docId\:p6QURv3eOh-SC3xNQggeM) created and referenced by the Uri (given by the Location header field) in the response. 

**Example**

```json
{
   "id": 15342,
   "name": "liveTextPlugin",
   "fileInfo":    {
      "id": 15342,
      "path": "https://bsncloud.s3.amazonaws.com/bsts/9b7f49d765ad795k06ba600c345f0ea7",
      "type": "Stored",
      "name": "livetextboth.brs",
      "size": 12,
      "hash": "430CE34D020724ED75A196DFC2AD67C77772D169",
      "creationDate": "2023-09-08T15:44:01.7152901Z",
      "lastModifiedDate": "2023-09-08T15:44:01.7152901Z"
   },
   "presentations": null
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules (for example, the name must be unique)

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Removes autorun plugins matching the specified filter expression from a network. This allows multiple autorun plugins to be deleted at once.

**Required Scope Token**

bsn.api.main.autoruns.plugins.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[FileInfo].[Name] IS 'livetextboth.brs'`

```text
DELETE /2022/06/REST/Autoruns/Plugins/?filter=%5BFileInfo%5D.%5BName%5D%20IS%20%27livetextboth.brs%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the number of affected autorun plugins as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/ 

Returns the number of autorun plugins matching the specified filter expression in the network

**Required Scope Token**

bsn.api.main.autoruns.plugins.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[FileInfo].[Type] IS 'Stored' AND [FileInfo].[Size] IS GREATER THAN 0 AND [FileInfo].[Name] IS '*.brs'`

```text
GET /2022/06/REST/Autoruns/Plugins/Count/?filter=%5BFileInfo%5D.%5BType%5D%20IS%20%27Stored%27%20AND%20%5BFileInfo%5D.%5BSize%5D%20IS%20GREATER%20THAN%200%20AND%20%5BFileInfo%5D.%5BName%5D%20IS%20%27*.brs%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The autorun plugin count is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/ 

Returns the specified autorun plugin on a network

**Required Scope Token**

bsn.api.main.autoruns.plugins.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for an autorun plugin instance

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Autoruns/Plugins/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Autorun Plugin Entity](docId\:p6QURv3eOh-SC3xNQggeM)

**Example**

```json
{
  "id": 12345,
  "name": "liveTextPlugin",
  "fileInfo": {
    "id": 15342,
    "path": "https://bsncloud.s3.amazonaws.com/bsts/9b7f47d765ad105k06ba680c345f0ea7",
    "type": "Stored",
    "name": "livetextboth.brs",
    "size": 12,
    "hash": "430CE34D020724ED75A196DFC2AD67C77772D169",
    "creationDate": "2023-09-08T15:44:01.717Z",
    "lastModifiedDate": "2023-09-08T15:44:01.717Z"
  },
  "presentations": [
    {
      "id": 65425,
      "name": "GreatPresentation",
      "type": "Presentation",
      "link": null
    }
  ]
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: An autorun plugin with the specified id does not exist

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT  /\{id}/  

Update a specified autorun plugin on a network

**Required Scope Token**

bsn.api.main.autoruns.plugins.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for an autorun plugin instance

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

The [Autorun Plugin Entity](docId\:p6QURv3eOh-SC3xNQggeM)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is `12345`

```text
PUT /2022/06/REST/Autoruns/Plugins/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 421
```

This is the example request body:

```json
{
   "id": 0,
   "name": "liveTextPlugin",
   "fileInfo":    {
      "id": 1,
      "path": "https://bsncloud.s3.amazonaws.com/bsts/3d1a47da65ed068k76ba641c345f3dd5",
      "type": "Stored",
      "name": "plugin.brs",
      "size": 4,
      "hash": "5BF1FD927DFB8679496A2E6CF00CBE50C1C87145",
      "creationDate": "0001-01-01T00:00:00",
      "lastModifiedDate": "0001-01-01T00:00:00"
   },
   "presentations": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified autorun plugin has been updated on the network 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource/autorun plugin changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/ 

Remove a specified autorun plugin from a network

**Required Scope Token**

bsn.api.main.autoruns.plugins.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for an autorun plugin instance

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
DELETE /2022/06/REST/Autoruns/Plugins/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified autorun plugin has been removed from the network 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Devices Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

This endpoint allows for management and monitoring of players on the network. 

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Devices***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Retrieves a list of players on the network.

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (e.g. "`[Device].[Serial] ASC`"). 
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of player instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>The maximum number of player instances that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[Model] IS 'HD1024'`
- `sort` is set to `[LastModifiedDate] ASC`

```text
GET /2022/06/REST/Devices/?marker=Mj0kwMTU2&pageSize=1&filter=%5BModel%5D%20IS%20%27HD1024%27&sort=%5BLastModifiedDate%5D%20ASC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Player Entity](docId:9PqPrRJAVwfZbka1GYBEA) instances on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

:::ExpandableHeading
Example

```text
{
  "items": [
    {
      "id": 12345,
      "serial": "46C89C101829",
      "model": "HD1024",
      "family": "Pagani",
      "registrationDate": "2020-07-09T19:15:22.773Z",
      "lastModifiedDate": "2021-05-04T18:04:17.97Z",
      "settings": {
        "name": "HDPlayer",
        "description": "Primary Display",
        "concatNameAndSerial": false,
        "setupType": "BSN",
        "lastModifiedDate": "2022-01-05T18:12:22.643Z",
        "group": {
          "id": 123,
          "name": "TestGroup",
          "link": null
        },
        "brightWall": null,
        "timezone": "PST",
        "screen": {
          "idleColor": "FF702896",
          "splashUrl": null
        },
        "synchronization": {
          "status": {
            "period": "00:05:00"
          },
          "settings": {
            "period": "00:00:00"
          },
          "schedule": {
            "period": "06:00:00"
          },
          "content": {
            "start": null,
            "end": null
          }
        },
        "network": {
          "hostname": "BrightSign-46C89C101829",
          "proxyServer": null,
          "proxyBypass": [],
          "timeServers": [
            "http://time.brightsignnetwork.com/"
          ],
          "interfaces": [
            {
              "name": "eth0",
              "type": "Ethernet",
              "enabled": true,
              "proto": "Static",
              "ip": [
                "192.168.0.2/24",
                "EF88:7::2FAB:7657/64"
              ],
              "gateway": "192.168.0.1",
              "dns": [
                "192.168.0.125",
                "74.38.99.135"
              ],
              "rateLimitDuringInitialDownloads": null,
              "rateLimitInsideContentDownloadWindow": null,
              "rateLimitOutsideContentDownloadWindow": null,
              "contentDownloadEnabled": true,
              "textFeedsDownloadEnabled": true,
              "mediaFeedsDownloadEnabled": true,
              "healthReportingEnabled": true,
              "logsUploadEnabled": true
            },
            {
              "name": "eth0.25",
              "type": "Virtual",
              "enabled": false,
              "parent": "eth0",
              "vlanId": 25,
              "proto": "DHCPv4",
              "ip": null,
              "gateway": null,
              "dns": null,
              "rateLimitDuringInitialDownloads": null,
              "rateLimitInsideContentDownloadWindow": null,
              "rateLimitOutsideContentDownloadWindow": null,
              "contentDownloadEnabled": false,
              "textFeedsDownloadEnabled": false,
              "mediaFeedsDownloadEnabled": false,
              "healthReportingEnabled": true,
              "logsUploadEnabled": true
            },
            {
              "name": "wlan0",
              "type": "WiFi",
              "enabled": true,
              "ssid": "hall_devices",
              "security": {
                "authentication": {
                  "mode": "Shared",
                  "passphrase": "A8200E996438DE85103486A44CA96A999B0A6D"
                },
                "encryption": {
                  "mode": "TKIP"
                }
              },
              "proto": "NDP, DHCPv6",
              "ip": null,
              "gateway": null,
              "dns": null,
              "rateLimitDuringInitialDownloads": 10240000,
              "rateLimitInsideContentDownloadWindow": 10240000,
              "rateLimitOutsideContentDownloadWindow": 256000,
              "contentDownloadEnabled": true,
              "textFeedsDownloadEnabled": true,
              "mediaFeedsDownloadEnabled": false,
              "healthReportingEnabled": true,
              "logsUploadEnabled": false
            },
            {
              "name": "ppp0",
              "type": "Cellular",
              "enabled": true,
              "modems": [
                {
                  "model": "BrightSign IK41",
                  "usbDeviceIds": [
                    "1bbb:00b6"
                  ]
                }
              ],
              "sims": [
                {
                  "mcc": "901",
                  "mnc": "28",
                  "connection": {
                    "type": "Default"
                  }
                },
                {
                  "mcc": "204",
                  "mnc": "04",
                  "connection": {
                    "type": "Default"
                  }
                }
              ],
              "rateLimitDuringInitialDownloads": null,
              "rateLimitInsideContentDownloadWindow": null,
              "rateLimitOutsideContentDownloadWindow": null,
              "contentDownloadEnabled": true,
              "textFeedsDownloadEnabled": true,
              "mediaFeedsDownloadEnabled": true,
              "healthReportingEnabled": true,
              "logsUploadEnabled": true
            },
            {
              "name": "usb0",
              "type": "Ethernet",
              "enabled": true,
              "proto": "Static",
              "ip": [
                "132.80.245.191/24"
              ],
              "gateway": null,
              "dns": [
                "132.80.245.142"
              ],
              "rateLimitDuringInitialDownloads": null,
              "rateLimitInsideContentDownloadWindow": null,
              "rateLimitOutsideContentDownloadWindow": null,
              "contentDownloadEnabled": false,
              "textFeedsDownloadEnabled": false,
              "mediaFeedsDownloadEnabled": false,
              "healthReportingEnabled": false,
              "logsUploadEnabled": false
            },
            {
              "name": "eth0.110",
              "type": "Virtual",
              "enabled": true,
              "parent": "eth0",
              "vlanId": 110,
              "proto": "Static",
              "ip": [
                "16.194.230.251/28"
              ],
              "gateway": "16.194.230.241",
              "dns": [
                "192.168.0.125",
                "74.38.99.135"
              ],
              "rateLimitDuringInitialDownloads": null,
              "rateLimitInsideContentDownloadWindow": null,
              "rateLimitOutsideContentDownloadWindow": null,
              "contentDownloadEnabled": true,
              "textFeedsDownloadEnabled": true,
              "mediaFeedsDownloadEnabled": true,
              "healthReportingEnabled": true,
              "logsUploadEnabled": true
            }
          ]
        },
        "beacons": [],
        "location": {
         "placeId": null,
         "gpsLatitude": 37.4152,
         "gpsLongitude": -122.1224,
         "country": "US",
         "countryLongName": "United States",
         "adminAreaLevel1": "CA",
         "adminAreaLevel1LongName": "California",
         "adminAreaLevel2": "Santa Clara County",
         "adminAreaLevel2LongName": "Santa Clara County",
         "locality": "Palo Alto",
         "localityLongName": "Palo Alto",
         "path": "/US/CA/Santa Clara County/Palo Alto/",
         "pathLongName": "/United States/California/Santa Clara County/Palo Alto/"
        },
        "screenshots": null,
        "logging": {
          "enableDiagnosticLog": false,
          "enableEventLog": false,
          "enablePlaybackLog": false,
          "enableStateLog": false,
          "enableVariableLog": false,
          "uploadAtBoot": false,
          "uploadTime": null
        },
        "lws": {
          "username": "",
          "password": "",
          "enableUpdateNotifications": true
        },
        "ldws": {
          "password": "RLSJZ35Sm9b1lB0npVFW4kPYegscBlMF3NFG6wtOaSTXIoC+iR5NGrhJa77ZaWTgpiCzPdDdnwMlQSb4QLqe6nEFx6q/927scO6LlVTtRBVch+RlgzlJ2SXYqAH6TUx66JRFuvCxyHzL0iUNKR/R4E1hdTQpxH3yXIPJ5OBOTlaw8OW6DZNixDGMuvhgmWAW9/TgksUYTlwb1SKqGzQOrDYmmg+A71YMGV6NcKbuN3P0DjQsMrVxlFe9+awQ73LSxqKF5Q52FjUhgSKsYcTtnoJvY/n9HWcREyxOPKF7vsEIfKOeG/qoFBvgZZKOoqaTyD82iBKbOQu9WllBGX+qaaTTQHR1SrZoyS2PDmBlddLhngE4BHiDxmOPhm69bsmiakUcUqgjvgi8sRL/9kUxLXuayeQ6VYzUnHdX7K3nYqbhgJCxVbSURe5wIS/vQ97zi4wt0NpF55FmoAQlZA1JcSk/85w8S4hfpCYlDnqQMI8jXqvNZ5apc7nKsg6NSibGhh4h1cpA7DG6d6MzjBldVKhutni3Bj991cP45RIaGlmWipbC9eKwODrsDPYMK2CDN/JEygmfiUdJJW4Cvgi4s6Z3oyqddiEV+plZtGD69NAau4OMCoHcR1STJdsVOrq++tF+R0/IkC5wDhAUBszXvlSdcKja7Gv7v4kOAZC0CmtA="
        }
      },
      "status": {
        "group": {
          "id": 123,
          "name": "TestGroup",
          "link": null
        },
        "brightWall": null,
        "presentation": {
          "id": 12345,
          "name": "Test2",
          "type": "Presentation",
          "link": null
        },
        "timezone": "PST",
        "synchronization": {
          "settings": {
            "enabled": false
          },
          "schedule": {
            "enabled": false
          },
          "content": {
            "enabled": false
          }
        },
        "script": {
          "type": "Autorun",
          "version": "10.0.100",
          "plugins": null
        },
        "firmware": {
          "version": "8.5.35"
        },
        "storage": [
          {
            "interface": "SD1",
            "system": "ExFAT",
            "access": "Read, Write",
            "stats": {
              "sizeTotal": 31905546240,
              "sizeFree": 31898959872,
              "blockSize": 32768
            }
          }
        ],
        "network": {
          "externalIp": "98.134.53.219",
          "interfaces": [
            {
              "name": "eth0",
              "type": "Ethernet",
              "proto": "Static",
              "mac": "D0:6A:85:DA:FE:71",
              "ip": [
                "192.168.0.1/24",
                "EF88:7::2FAB:7657/64",
                "FE80::C60C:27BF:74E0:2E0F/128"
              ],
              "gateway": "192.168.0.1",
              "metric": 100
            },
            {
              "name": "eth0.25",
              "type": "Virtual",
              "proto": "DHCPv4",
              "mac": "D0:6A:85:DA:FE:71",
              "ip": [
                "176.216.148.166/16",
                "FE80::1623:693:8588:65BB/128"
              ],
              "gateway": "176.216.0.1",
              "metric": 2
            },
            {
              "name": "wlan0",
              "type": "WiFi",
              "proto": "NDP, DHCPv6",
              "mac": "33:5B:FE:4A:E1:BB",
              "ip": [
                "10.10.0.2/16"
              ],
              "gateway": "10.10.0.1",
              "metric": 110
            },
            {
              "name": "ppp0",
              "type": "Cellular",
              "proto": "Static",
              "mac": "FE:98:1A:AA:B4:72",
              "ip": [
                "192.168.255.255/31"
              ],
              "gateway": "192.168.255.254",
              "metric": 120,
              "modem": {
                "imei": "35778404001349",
                "manufacturer": "Vodafone",
                "model": "IK41US_USBC4G_V2_NA",
                "revision": "IK41_00_02.00_09"
              },
              "sims": [
                {
                  "status": "OK",
                  "iccid": "8910412345678907",
                  "connection": {
                    "network": "Vodafone Libertel",
                    "signal": -53
                  }
                }
              ]
            },
            {
              "name": "usb0",
              "type": "Ethernet",
              "proto": "Static",
              "mac": "5A:64:A1:72:EE:12",
              "ip": [
                "132.80.245.191/24"
              ],
              "gateway": null,
              "metric": null
            },
            {
              "name": "eth0.110",
              "type": "Virtual",
              "proto": "Static",
              "mac": "D0:6A:85:DA:FE:71",
              "ip": [
                "16.194.230.251/28",
                "FE80::8C6F:34A9:C88:31D5/128"
              ],
              "gateway": "16.194.230.241",
              "metric": 3
            }
          ]
        },
        "uptime": "08:20:46",
        "currentSettingsTimestamp": "2021-05-04T10:45:06Z",
        "currentScheduleTimestamp": "2021-05-04T10:45:06Z",
        "health": "Error",
        "lastModifiedDate": "2022-02-15T23:53:50.16Z"
      },
      "subscription": {
        "id": 123456,
        "device": {
          "id": 12345,
          "serial": "46C89C101829"
        },
        "type": "Commercial",
        "activityPeriod": "365.00:00:00",
        "status": "Active",
        "creationDate": "2020-08-17T20:49:49.09Z",
        "lastModifiedDate": "2020-08-17T20:49:49.09Z",
        "activationDate": "2020-08-17T20:49:49.09Z",
        "suspensionDate": null,
        "expirationDate": null
      },
      "taggedGroups": [],
      "tags": {
        "string::[Content].<Anon>": "image",
        "number::[Content].<BillingRate>": "30"
      },
      "permissions": []
    }
  ],
  "totalItemCount": 3,
  "matchingItemCount": 2,
  "pageSize": 1,
  "nextMarker": "LDM3MjA2",
  "prevMarker": "LDM32b56",
  "isTruncated": false,
  "sortExpression": "[LastModifiedDate] ASC",
  "filterExpression": "[Model] IS 'HD1024'"
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Removes players, specified by a filter, from a network. This allows multiple players to be deleted at once.

**Required Scope Token**

bsn.api.main.devices.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font>  <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[Model] IS 'HD1024'`

```text
DELETE /2022/06/REST/Devices/?filter=%5BModel%5D%20IS%20%27HD1024%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the number of affected players as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Regions/\{\*locationPath}/ 

Returns a region which contains all the players located in the specified path.

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `locationPath` <font color="#704ae0">string: </font>The parts of the returned player location path (country, province, city, etc.) that are common to all players. 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[Model] IS 'HD1024'`
- `locationPath` is set to `/US/`

```text
GET /2022/06/REST/Devices/Regions/US/?filter=%5BModel%5D%20IS%20%27HD1024%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Player Region Entity](docId\:a9mjHdAU9WTp79Ngksoh2)&#x20;

**Example**

```json
[
  {
    "country": "US",
    "countryLongName": "United States",
    "adminAreaLevel1": "MO",
    "adminAreaLevel1LongName": "Missouri",
    "adminAreaLevel2": "Callaway County",
    "adminAreaLevel2LongName": "Callaway County",
    "locality": "Fulton",
    "localityLongName": "Fulton",
    "minGPSLatitude": 38.8513,
    "maxGPSLatitude": 38.8513,
    "minGPSLongitude": -91.9604,
    "maxGPSLongitude": -91.9604,
    "devicesCount": 1,
    "devicesHealthStatus": [
      "Normal"
    ],
    "locationPath": "/US/MO/Callaway County/Fulton/"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/ 

Retrieves the number of players on the network matching the specified filter criteria. If no filter is included, this call returns the total number of players on the network. 

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[Model] IS 'HD1024'`

```text
GET /2022/06/REST/Devices/Count/?filter=%5BModel%5D%20IS%20%27HD1024%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: The player count is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/ 

Return the information for a specified player

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /serial` response

```text
GET /2022/06/REST/Devices/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 13 Mar 2024 15:51:01 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Player Entity](docId:9PqPrRJAVwfZbka1GYBEA)

:::ExpandableHeading
Example

```json
{
  "id": 12345,
  "serial": "46C89C101839",
  "model": "HD1024",
  "family": "Pagani",
  "registrationDate": "2020-07-09T19:15:22.773Z",
  "lastModifiedDate": "2024-03-13T16:29:11.983Z",
  "settings": {
    "name": "HDPlayer",
    "description": "Primary Display",
    "concatNameAndSerial": false,
    "setupType": "BSN",
    "lastModifiedDate": "2022-01-05T18:12:22.643Z",
    "group": {
      "id": 123,
      "name": "TestGroup",
      "link": null
    },
    "brightWall": null,
    "timezone": "PST",
    "screen": {
      "idleColor": "FF702896",
      "splashUrl": null
    },
    "synchronization": {
      "status": {
        "period": "00:05:00"
      },
      "settings": {
        "period": "00:00:00"
      },
      "schedule": {
        "period": "06:00:00"
      },
      "content": {
        "start": null,
        "end": null
      }
    },
    "network": {
      "hostname": "BrightSign-46C89C101829",
      "proxyServer": null,
      "proxyBypass": [],
      "timeServers": [
        "http://time.brightsignnetwork.com/"
      ],
      "interfaces": [
        {
          "name": "eth0",
          "type": "Ethernet",
          "enabled": true,
          "proto": "Static",
          "ip": [
            "192.168.0.2/24",
            "EF88:7::2FAB:7657/64"
          ],
          "gateway": "192.168.0.1",
          "dns": [
            "192.168.0.125",
            "74.38.99.135"
          ],
          "rateLimitDuringInitialDownloads": null,
          "rateLimitInsideContentDownloadWindow": null,
          "rateLimitOutsideContentDownloadWindow": null,
          "contentDownloadEnabled": true,
          "textFeedsDownloadEnabled": true,
          "mediaFeedsDownloadEnabled": true,
          "healthReportingEnabled": true,
          "logsUploadEnabled": true
        },
        {
          "name": "eth0.25",
          "type": "Virtual",
          "enabled": false,
          "parent": "eth0",
          "vlanId": 25,
          "proto": "DHCPv4",
          "ip": null,
          "gateway": null,
          "dns": null,
          "rateLimitDuringInitialDownloads": null,
          "rateLimitInsideContentDownloadWindow": null,
          "rateLimitOutsideContentDownloadWindow": null,
          "contentDownloadEnabled": false,
          "textFeedsDownloadEnabled": false,
          "mediaFeedsDownloadEnabled": false,
          "healthReportingEnabled": true,
          "logsUploadEnabled": true
        },
        {
          "name": "wlan0",
          "type": "WiFi",
          "enabled": true,
          "ssid": "hall_devices",
          "security": {
            "authentication": {
              "mode": "Shared",
              "passphrase": "A8201E996438DE85103486A44CA96A999B0A6D"
            },
            "encryption": {
              "mode": "TKIP"
            }
          },
          "proto": "NDP, DHCPv6",
          "ip": null,
          "gateway": null,
          "dns": null,
          "rateLimitDuringInitialDownloads": 10240000,
          "rateLimitInsideContentDownloadWindow": 10240000,
          "rateLimitOutsideContentDownloadWindow": 256000,
          "contentDownloadEnabled": true,
          "textFeedsDownloadEnabled": true,
          "mediaFeedsDownloadEnabled": false,
          "healthReportingEnabled": true,
          "logsUploadEnabled": false
        },
        {
          "name": "ppp0",
          "type": "Cellular",
          "enabled": true,
          "modems": [
            {
              "model": "BrightSign IK41",
              "usbDeviceIds": [
                "1bbb:00b6"
              ]
            }
          ],
          "sims": [
            {
              "mcc": "901",
              "mnc": "28",
              "connection": {
                "type": "Default"
              }
            },
            {
              "mcc": "204",
              "mnc": "04",
              "connection": {
                "type": "Default"
              }
            }
          ],
          "rateLimitDuringInitialDownloads": null,
          "rateLimitInsideContentDownloadWindow": null,
          "rateLimitOutsideContentDownloadWindow": null,
          "contentDownloadEnabled": true,
          "textFeedsDownloadEnabled": true,
          "mediaFeedsDownloadEnabled": true,
          "healthReportingEnabled": true,
          "logsUploadEnabled": true
        },
        {
          "name": "usb0",
          "type": "Ethernet",
          "enabled": true,
          "proto": "Static",
          "ip": [
            "132.80.245.191/24"
          ],
          "gateway": null,
          "dns": [
            "132.80.245.142"
          ],
          "rateLimitDuringInitialDownloads": null,
          "rateLimitInsideContentDownloadWindow": null,
          "rateLimitOutsideContentDownloadWindow": null,
          "contentDownloadEnabled": false,
          "textFeedsDownloadEnabled": false,
          "mediaFeedsDownloadEnabled": false,
          "healthReportingEnabled": false,
          "logsUploadEnabled": false
        },
        {
          "name": "eth0.110",
          "type": "Virtual",
          "enabled": true,
          "parent": "eth0",
          "vlanId": 110,
          "proto": "Static",
          "ip": [
            "16.194.230.251/28"
          ],
          "gateway": "16.194.230.241",
          "dns": [
            "192.168.0.125",
            "74.38.99.135"
          ],
          "rateLimitDuringInitialDownloads": null,
          "rateLimitInsideContentDownloadWindow": null,
          "rateLimitOutsideContentDownloadWindow": null,
          "contentDownloadEnabled": true,
          "textFeedsDownloadEnabled": true,
          "mediaFeedsDownloadEnabled": true,
          "healthReportingEnabled": true,
          "logsUploadEnabled": true
        }
      ]
    },
    "beacons": [],
    "location": {
         "placeId": null,
         "gpsLatitude": 37.4152,
         "gpsLongitude": -122.1224,
         "country": "US",
         "countryLongName": "United States",
         "adminAreaLevel1": "CA",
         "adminAreaLevel1LongName": "California",
         "adminAreaLevel2": "Santa Clara County",
         "adminAreaLevel2LongName": "Santa Clara County",
         "locality": "Palo Alto",
         "localityLongName": "Palo Alto",
         "path": "/US/CA/Santa Clara County/Palo Alto/",
         "pathLongName": "/United States/California/Santa Clara County/Palo Alto/"
        },
    "screenshots": {
         "interval": "00:15:00",
         "countLimit": 5,
         "quality": 50,
         "orientation": "Landscape"
      },
    "logging": {
      "enableDiagnosticLog": false,
      "enableEventLog": false,
      "enablePlaybackLog": false,
      "enableStateLog": false,
      "enableVariableLog": false,
      "uploadAtBoot": false,
      "uploadTime": null
    },
    "lws": {
      "username": "",
      "password": "",
      "enableUpdateNotifications": true
    },
    "ldws": {
      "password": "RLSJZ35Sm9b1lB0npVFW4kPYegscBlMF3NFG6wtOaSTXIoC+iR5NGrhJa77ZaWTgpiCzPdDdnwMlQSb4QLqe6nEFx6q/927scO6LlVTtRBVch+RlgzlJ2SXYqAH6TUx66JRFuvCxyHzL0iUNKR/R4E1hdTQpxH3yXIPJ5OBOTlaw8OW6DZNixDGMuvhgmWAW9/TgksUYTlwb1SKqGzQOrDYmmg+A71YMGV6NcKbuN3P0DjQsMrVxlFe9+awQ73LSxqKF5Q52FjUhgSKsYcTtnoJvY/n9HWcREyxOPKF7vsEIfKOeG/qoFBvgZZKOoqaTyD82iBKbOQu9WllBGX+qaaTTQHR1SrZoyS2PDmBlddLhngE4BHiDxmOPhm69bsmiakUcUqgjvgi8sRL/9kUxLXuayeQ6VYzUnHdX7K3nYqbhgJCxVbSURe5wIS/vQ97zi4wt0NpF55FmoAQlZA1JcSk/85w8S4hfpCYlDnqQMI8jXqvNZ5apc7nKsg6NSibGhh4h1cpA7DG6d6MzjBldVKhutni3Bj991cP45RIaGlmWipbC9eKwODrsDPYMK2CDN/JEygmfiUdJJW4Cvgi4s6Z3oyqddiEV+plZtGD69NAau4OMCoHcR1STJdsVOrq++tF+R0/IkC5wDhAUBszXvlSdcKja7Gv7v4kOAZC0CmtA="
    }
  },
  "status": {
    "group": {
      "id": 123,
      "name": "TestGroup",
      "link": null
    },
    "brightWall": null,
    "presentation": {
      "id": 12345,
      "name": "Test2",
      "type": "Presentation",
      "link": null
    },
    "timezone": "PST",
    "synchronization": {
      "settings": {
        "enabled": false
      },
      "schedule": {
        "enabled": false
      },
      "content": {
        "enabled": false
      }
    },
    "script": {
      "type": "Autorun",
      "version": "10.0.100",
      "plugins": null
    },
    "firmware": {
      "version": "8.5.35"
    },
    "storage": [
      {
        "interface": "SD1",
        "system": "ExFAT",
        "access": "Read, Write",
        "stats": {
          "sizeTotal": 31905546240,
          "sizeFree": 31898959872,
          "blockSize": 32768
        }
      }
    ],
    "network": {
      "externalIp": "98.134.53.219",
      "interfaces": [
        {
          "name": "eth0",
          "type": "Ethernet",
          "proto": "Static",
          "mac": "D0:6A:85:DA:FE:71",
          "ip": [
            "192.168.0.1/24",
            "EF88:7::2FAB:7657/64",
            "FE80::C60C:27BF:74E0:2E0F/128"
          ],
          "gateway": "192.168.0.1",
          "metric": 100
        },
        {
          "name": "eth0.25",
          "type": "Virtual",
          "proto": "DHCPv4",
          "mac": "D0:6A:85:DA:FE:71",
          "ip": [
            "176.216.148.166/16",
            "FE80::1623:693:8588:65BB/128"
          ],
          "gateway": "176.216.0.1",
          "metric": 2
        },
        {
          "name": "wlan0",
          "type": "WiFi",
          "proto": "NDP, DHCPv6",
          "mac": "33:5B:FE:4A:E1:BB",
          "ip": [
            "10.10.0.2/16"
          ],
          "gateway": "10.10.0.1",
          "metric": 110
        },
        {
          "name": "ppp0",
          "type": "Cellular",
          "proto": "Static",
          "mac": "FE:98:1A:AA:B4:72",
          "ip": [
            "192.168.255.255/31"
          ],
          "gateway": "192.168.255.254",
          "metric": 120,
          "modem": {
            "imei": "35778404001349",
            "manufacturer": "Vodafone",
            "model": "IK41US_USBC4G_V2_NA",
            "revision": "IK41_00_02.00_09"
          },
          "sims": [
            {
              "status": "OK",
              "iccid": "8910412345678907",
              "connection": {
                "network": "Vodafone Libertel",
                "signal": -53
              }
            }
          ]
        },
        {
          "name": "usb0",
          "type": "Ethernet",
          "proto": "Static",
          "mac": "5A:64:A1:72:EE:12",
          "ip": [
            "132.80.245.191/24"
          ],
          "gateway": null,
          "metric": null
        },
        {
          "name": "eth0.110",
          "type": "Virtual",
          "proto": "Static",
          "mac": "D0:6A:85:DA:FE:71",
          "ip": [
            "16.194.230.251/28",
            "FE80::8C6F:34A9:C88:31D5/128"
          ],
          "gateway": "16.194.230.241",
          "metric": 3
        }
      ]
    },
    "uptime": "08:20:46",
    "currentSettingsTimestamp": "2021-05-04T10:45:06Z",
    "currentScheduleTimestamp": "2021-05-04T10:45:06Z",
    "health": "Error",
    "lastModifiedDate": "2022-02-15T23:53:50.16Z"
  },
  "subscription": {
    "id": 123456,
    "device": {
      "id": 12345,
      "serial": "46C89C101839"
    },
    "type": "Commercial",
    "activityPeriod": "365.00:00:00",
    "status": "Active",
    "creationDate": "2020-08-17T20:49:49.09Z",
    "lastModifiedDate": "2020-08-17T20:49:49.09Z",
    "activationDate": "2020-08-17T20:49:49.09Z",
    "suspensionDate": null,
    "expirationDate": null
  },
  "taggedGroups": [],
  "tags": {
    "string::[Content].<Anon>": "image",
    "number::[Content].<BillingRate>": "30"
  },
  "permissions": []
}
```
:::

**Success Response** 

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist) 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/ 

Update the specified player. Applies only to the player settings.

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Player Entity](docId:9PqPrRJAVwfZbka1GYBEA)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /serial` response.

```text
PUT /2022/06/REST/Devices/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 13 Mar 2024 15:51:01 GMT
Content-Type: application/json
Content-Length: 5947
```

:::ExpandableHeading
Example

```json
{
   "id": 0,
   "serial": "46D89C107131",
   "model": "HD1024",
   "family": "Pagani",
   "registrationDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00",
   "settings":    {
      "name": "OutsidePlayer",
      "description": "Outside of Building A",
      "concatNameAndSerial": false,
      "setupType": "BSN",
      "lastModifiedDate": "2022-01-05T18:12:22.643Z",
      "group":       {
         "id": 123,
         "name": "TestGroup",
         "link": null
      },
      "brightWall": null,
      "timezone": "PST",
      "screen":       {
         "idleColor": "FF702896",
         "splashUrl": null
      },
      "synchronization":       {
         "status": {"period": "00:05:00"},
         "settings": {"period": "00:00:00"},
         "schedule": {"period": "06:00:00"},
         "content":          {
            "start": null,
            "end": null
         }
      },
      "network":       {
         "hostname": "BrightSign-46D89C107131",
         "proxyServer": null,
         "proxyBypass": [],
         "timeServers": ["http://time.brightsignnetwork.com/"],
         "interfaces":          [
                        {
               "enabled": true,
               "proto": "DHCP",
               "ip": null,
               "gateway": null,
               "dns": null,
               "rateLimitDuringInitialDownloads": 0,
               "rateLimitInsideContentDownloadWindow": 0,
               "rateLimitOutsideContentDownloadWindow": null,
               "contentDownloadEnabled": true,
               "textFeedsDownloadEnabled": true,
               "mediaFeedsDownloadEnabled": true,
               "healthReportingEnabled": true,
               "logsUploadEnabled": true,
               "name": "eth0",
               "type": "Ethernet"
            },
                        {
               "enabled": false,
               "ssid": "",
               "security":                {
                  "authentication":                   {
                     "mode": "Shared",
                     "passphrase": ""
                  },
                  "encryption": {"mode": "TKIP, CCMP"}
               },
               "proto": "DHCP",
               "ip": null,
               "gateway": null,
               "dns": null,
               "rateLimitDuringInitialDownloads": 0,
               "rateLimitInsideContentDownloadWindow": 0,
               "rateLimitOutsideContentDownloadWindow": 0,
               "contentDownloadEnabled": false,
               "textFeedsDownloadEnabled": false,
               "mediaFeedsDownloadEnabled": false,
               "healthReportingEnabled": false,
               "logsUploadEnabled": false,
               "name": "wlan0",
               "type": "WiFi"
            }
         ]
      },
      "beacons": [],
      "location": null,
      "screenshots": null,
      "logging":       {
         "enableDiagnosticLog": false,
         "enableEventLog": false,
         "enablePlaybackLog": false,
         "enableStateLog": false,
         "enableVariableLog": false,
         "uploadAtBoot": false,
         "uploadTime": null
      },
      "lws":       {
         "username": "",
         "password": "",
         "enableUpdateNotifications": true
      },
      "ldws": {"password": "RLSJPQSm9z15lB8nwVFWjkPYegscBlMF3NFG6wt3aSTXIoC+iR5NGrhJa77ZaWTgpiCzPdDdnwMlQSb4QLqe6nEFx6q/927scO6LlVTtRBVch+RlgzlJ2SXYqAH6TUx66JRFuvCxyHzL0iUNKR/R4E1hdTQpxH3yXIPJ5OBOTlaw8OW6DZNixDGMuvhgmWAW9/TgksUYTlwb1SKqGzQOrDYmmg+A71YMGV6NcKbuN3P0DjQsMrVxlFe9+awQ73LSxqKF5Q52FjUhgSKsYcTtnoJvY/n9HWcREyxOPKF7vsEIfKOeG/qoFBvgZZKOoqaTyD82iBKbOQu9WllBGX+qaaTTQHR1SrZoyS2PDmBlddLhngE4BHiDxmOPhm69bsmiakUcUqgjvgi8sRL/9kUxLXuayeQ6VYzUnHdX7K3nYqbhgJCxVbSURe5wIS/vQ97zi4wt0NpF55FmoAQlZA1JcSk/85w8S4hfpCYlDnqQMI8jXqvNZ5apc7nKsg6NSibGhh4h1cpA7DG6d6MzjBldVKhutni3Bj991cP45RIaGlmWipbC9eKwODrsDPYMK2CDN/JEygmfiUdJJW4Cvgi4s6Z3oyqddiEV+plZtGD69NAau4OMCoHcR1STJdsVOrq++tF+R0/IkC5wDhAUBszXvlSdcKja7Gv7v4kOAZC0CmtA="}
   },
   "status": null,
   "subscription": null,
   "taggedGroups": [],
   "tags": {},
   "permissions": []
}
```
:::

**Success Response**

<font color="#089a4d">204</font>: The specified player was successfully updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PATCH /\{id}/ 

Replaces certain parameters on the specified player. Applies only to the player settings. See [rfc6902](https://datatracker.ietf.org/doc/html/rfc6902).

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

These properties are entries in an array. Every entry must have all three of these properties:

- `op` <font color="#704ae0">string</font>: The type of operation - in this case it is always "replace"
- `path` <font color="#704ae0">string</font>: A Uri path that references the location within the target document where the update will be performed
- `value` <font color="#704ae0">object</font>: The replacement value(s) for the parameters that must be updated

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is `12345`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /serial` response.

```text
PATCH /2022/06/REST/Devices/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 13 Mar 2024 15:51:01 GMT
Content-Type: application/json-patch+json
Content-Length: 94
```

This is the example request body:

```json
[
  {
    "op": "replace",
    "path": "/settings/description/",
    "value": "Main Screen Player"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The parameters have been successfully replaced.

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/ 

Delete the specified player

**Required Scope Token**

bsn.api.main.devices.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player to delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /serial` response.

```text
DELETE /2022/06/REST/Devices/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
If-Unmodified-Since: Wed, 13 Mar 2024 15:51:01 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The player was successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{serial}/ 

Return the specified player information

**Required Scope**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The player serial number

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ 

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `46D89C101139`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /serial` response

```text
GET /2022/06/REST/Devices/46D89C101139/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 13 Mar 2024 15:51:01 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Player Entity](docId:9PqPrRJAVwfZbka1GYBEA)

:::ExpandableHeading
Example

```json
{
  "id": 12345,
  "serial": "46D89C101139",
  "model": "HD1024",
  "family": "Pagani",
  "registrationDate": "2020-07-09T19:15:22.773Z",
  "lastModifiedDate": "2024-03-13T16:29:11.983Z",
  "settings": {
    "name": "HDPlayer",
    "description": "Primary Display",
    "concatNameAndSerial": false,
    "setupType": "BSN",
    "lastModifiedDate": "2022-01-05T18:12:22.643Z",
    "group": {
      "id": 123,
      "name": "TestGroup",
      "link": null
    },
    "brightWall": null,
    "timezone": "PST",
    "screen": {
      "idleColor": "FF702896",
      "splashUrl": null
    },
    "synchronization": {
      "status": {
        "period": "00:05:00"
      },
      "settings": {
        "period": "00:00:00"
      },
      "schedule": {
        "period": "06:00:00"
      },
      "content": {
        "start": null,
        "end": null
      }
    },
    "network": {
      "hostname": "BrightSign-46D89C101139",
      "proxyServer": null,
      "proxyBypass": [],
      "timeServers": [
        "http://time.brightsignnetwork.com/"
      ],
      "interfaces": [
        {
          "name": "eth0",
          "type": "Ethernet",
          "enabled": true,
          "proto": "Static",
          "ip": [
            "192.168.0.2/24",
            "EF88:7::2FAB:7657/64"
          ],
          "gateway": "192.168.0.1",
          "dns": [
            "192.168.0.125",
            "74.38.99.135"
          ],
          "rateLimitDuringInitialDownloads": null,
          "rateLimitInsideContentDownloadWindow": null,
          "rateLimitOutsideContentDownloadWindow": null,
          "contentDownloadEnabled": true,
          "textFeedsDownloadEnabled": true,
          "mediaFeedsDownloadEnabled": true,
          "healthReportingEnabled": true,
          "logsUploadEnabled": true
        },
        {
          "name": "eth0.25",
          "type": "Virtual",
          "enabled": false,
          "parent": "eth0",
          "vlanId": 25,
          "proto": "DHCPv4",
          "ip": null,
          "gateway": null,
          "dns": null,
          "rateLimitDuringInitialDownloads": null,
          "rateLimitInsideContentDownloadWindow": null,
          "rateLimitOutsideContentDownloadWindow": null,
          "contentDownloadEnabled": false,
          "textFeedsDownloadEnabled": false,
          "mediaFeedsDownloadEnabled": false,
          "healthReportingEnabled": true,
          "logsUploadEnabled": true
        },
        {
          "name": "wlan0",
          "type": "WiFi",
          "enabled": true,
          "ssid": "hall_devices",
          "security": {
            "authentication": {
              "mode": "Shared",
              "passphrase": "A8201E996438DE85103486A44CA96A999B0A6D"
            },
            "encryption": {
              "mode": "TKIP"
            }
          },
          "proto": "NDP, DHCPv6",
          "ip": null,
          "gateway": null,
          "dns": null,
          "rateLimitDuringInitialDownloads": 10240000,
          "rateLimitInsideContentDownloadWindow": 10240000,
          "rateLimitOutsideContentDownloadWindow": 256000,
          "contentDownloadEnabled": true,
          "textFeedsDownloadEnabled": true,
          "mediaFeedsDownloadEnabled": false,
          "healthReportingEnabled": true,
          "logsUploadEnabled": false
        },
        {
          "name": "ppp0",
          "type": "Cellular",
          "enabled": true,
          "modems": [
            {
              "model": "BrightSign IK41",
              "usbDeviceIds": [
                "1bbb:00b6"
              ]
            }
          ],
          "sims": [
            {
              "mcc": "901",
              "mnc": "28",
              "connection": {
                "type": "Default"
              }
            },
            {
              "mcc": "204",
              "mnc": "04",
              "connection": {
                "type": "Default"
              }
            }
          ],
          "rateLimitDuringInitialDownloads": null,
          "rateLimitInsideContentDownloadWindow": null,
          "rateLimitOutsideContentDownloadWindow": null,
          "contentDownloadEnabled": true,
          "textFeedsDownloadEnabled": true,
          "mediaFeedsDownloadEnabled": true,
          "healthReportingEnabled": true,
          "logsUploadEnabled": true
        },
        {
          "name": "usb0",
          "type": "Ethernet",
          "enabled": true,
          "proto": "Static",
          "ip": [
            "132.80.245.191/24"
          ],
          "gateway": null,
          "dns": [
            "132.80.245.142"
          ],
          "rateLimitDuringInitialDownloads": null,
          "rateLimitInsideContentDownloadWindow": null,
          "rateLimitOutsideContentDownloadWindow": null,
          "contentDownloadEnabled": false,
          "textFeedsDownloadEnabled": false,
          "mediaFeedsDownloadEnabled": false,
          "healthReportingEnabled": false,
          "logsUploadEnabled": false
        },
        {
          "name": "eth0.110",
          "type": "Virtual",
          "enabled": true,
          "parent": "eth0",
          "vlanId": 110,
          "proto": "Static",
          "ip": [
            "16.194.230.251/28"
          ],
          "gateway": "16.194.230.241",
          "dns": [
            "192.168.0.125",
            "74.38.99.135"
          ],
          "rateLimitDuringInitialDownloads": null,
          "rateLimitInsideContentDownloadWindow": null,
          "rateLimitOutsideContentDownloadWindow": null,
          "contentDownloadEnabled": true,
          "textFeedsDownloadEnabled": true,
          "mediaFeedsDownloadEnabled": true,
          "healthReportingEnabled": true,
          "logsUploadEnabled": true
        }
      ]
    },
    "beacons": [],
    "location": {
         "placeId": null,
         "gpsLatitude": 37.4152,
         "gpsLongitude": -122.1224,
         "country": "US",
         "countryLongName": "United States",
         "adminAreaLevel1": "CA",
         "adminAreaLevel1LongName": "California",
         "adminAreaLevel2": "Santa Clara County",
         "adminAreaLevel2LongName": "Santa Clara County",
         "locality": "Palo Alto",
         "localityLongName": "Palo Alto",
         "path": "/US/CA/Santa Clara County/Palo Alto/",
         "pathLongName": "/United States/California/Santa Clara County/Palo Alto/"
        },
    "screenshots": {
         "interval": "00:15:00",
         "countLimit": 5,
         "quality": 50,
         "orientation": "Landscape"
      },
    "logging": {
      "enableDiagnosticLog": false,
      "enableEventLog": false,
      "enablePlaybackLog": false,
      "enableStateLog": false,
      "enableVariableLog": false,
      "uploadAtBoot": false,
      "uploadTime": null
    },
    "lws": {
      "username": "",
      "password": "",
      "enableUpdateNotifications": true
    },
    "ldws": {
      "password": "RLSJZ35Sm9b1lB0npVFW4kPYegscBlMF3NFG6wtOaSTXIoC+iR5NGrhJa77ZaWTgpiCzPdDdnwMlQSb4QLqe6nEFx6q/927scO6LlVTtRBVch+RlgzlJ2SXYqAH6TUx66JRFuvCxyHzL0iUNKR/R4E1hdTQpxH3yXIPJ5OBOTlaw8OW6DZNixDGMuvhgmWAW9/TgksUYTlwb1SKqGzQOrDYmmg+A71YMGV6NcKbuN3P0DjQsMrVxlFe9+awQ73LSxqKF5Q52FjUhgSKsYcTtnoJvY/n9HWcREyxOPKF7vsEIfKOeG/qoFBvgZZKOoqaTyD82iBKbOQu9WllBGX+qaaTTQHR1SrZoyS2PDmBlddLhngE4BHiDxmOPhm69bsmiakUcUqgjvgi8sRL/9kUxLXuayeQ6VYzUnHdX7K3nYqbhgJCxVbSURe5wIS/vQ97zi4wt0NpF55FmoAQlZA1JcSk/85w8S4hfpCYlDnqQMI8jXqvNZ5apc7nKsg6NSibGhh4h1cpA7DG6d6MzjBldVKhutni3Bj991cP45RIaGlmWipbC9eKwODrsDPYMK2CDN/JEygmfiUdJJW4Cvgi4s6Z3oyqddiEV+plZtGD69NAau4OMCoHcR1STJdsVOrq++tF+R0/IkC5wDhAUBszXvlSdcKja7Gv7v4kOAZC0CmtA="
    }
  },
  "status": {
    "group": {
      "id": 123,
      "name": "TestGroup",
      "link": null
    },
    "brightWall": null,
    "presentation": {
      "id": 12345,
      "name": "Test2",
      "type": "Presentation",
      "link": null
    },
    "timezone": "PST",
    "synchronization": {
      "settings": {
        "enabled": false
      },
      "schedule": {
        "enabled": false
      },
      "content": {
        "enabled": false
      }
    },
    "script": {
      "type": "Autorun",
      "version": "10.0.100",
      "plugins": null
    },
    "firmware": {
      "version": "8.5.35"
    },
    "storage": [
      {
        "interface": "SD1",
        "system": "ExFAT",
        "access": "Read, Write",
        "stats": {
          "sizeTotal": 31905546240,
          "sizeFree": 31898959872,
          "blockSize": 32768
        }
      }
    ],
    "network": {
      "externalIp": "98.134.53.219",
      "interfaces": [
        {
          "name": "eth0",
          "type": "Ethernet",
          "proto": "Static",
          "mac": "D0:6A:85:DA:FE:71",
          "ip": [
            "192.168.0.1/24",
            "EF88:7::2FAB:7657/64",
            "FE80::C60C:27BF:74E0:2E0F/128"
          ],
          "gateway": "192.168.0.1",
          "metric": 100
        },
        {
          "name": "eth0.25",
          "type": "Virtual",
          "proto": "DHCPv4",
          "mac": "D0:6A:85:DA:FE:71",
          "ip": [
            "176.216.148.166/16",
            "FE80::1623:693:8588:65BB/128"
          ],
          "gateway": "176.216.0.1",
          "metric": 2
        },
        {
          "name": "wlan0",
          "type": "WiFi",
          "proto": "NDP, DHCPv6",
          "mac": "33:5B:FE:4A:E1:BB",
          "ip": [
            "10.10.0.2/16"
          ],
          "gateway": "10.10.0.1",
          "metric": 110
        },
        {
          "name": "ppp0",
          "type": "Cellular",
          "proto": "Static",
          "mac": "FE:98:1A:AA:B4:72",
          "ip": [
            "192.168.255.255/31"
          ],
          "gateway": "192.168.255.254",
          "metric": 120,
          "modem": {
            "imei": "35778404001349",
            "manufacturer": "Vodafone",
            "model": "IK41US_USBC4G_V2_NA",
            "revision": "IK41_00_02.00_09"
          },
          "sims": [
            {
              "status": "OK",
              "iccid": "8910412345678907",
              "connection": {
                "network": "Vodafone Libertel",
                "signal": -53
              }
            }
          ]
        },
        {
          "name": "usb0",
          "type": "Ethernet",
          "proto": "Static",
          "mac": "5A:64:A1:72:EE:12",
          "ip": [
            "132.80.245.191/24"
          ],
          "gateway": null,
          "metric": null
        },
        {
          "name": "eth0.110",
          "type": "Virtual",
          "proto": "Static",
          "mac": "D0:6A:85:DA:FE:71",
          "ip": [
            "16.194.230.251/28",
            "FE80::8C6F:34A9:C88:31D5/128"
          ],
          "gateway": "16.194.230.241",
          "metric": 3
        }
      ]
    },
    "uptime": "08:20:46",
    "currentSettingsTimestamp": "2021-05-04T10:45:06Z",
    "currentScheduleTimestamp": "2021-05-04T10:45:06Z",
    "health": "Error",
    "lastModifiedDate": "2022-02-15T23:53:50.16Z"
  },
  "subscription": {
    "id": 123456,
    "device": {
      "id": 12345,
      "serial": "46D89C101139"
    },
    "type": "Commercial",
    "activityPeriod": "365.00:00:00",
    "status": "Active",
    "creationDate": "2020-08-17T20:49:49.09Z",
    "lastModifiedDate": "2020-08-17T20:49:49.09Z",
    "activationDate": "2020-08-17T20:49:49.09Z",
    "suspensionDate": null,
    "expirationDate": null
  },
  "taggedGroups": [],
  "tags": {
    "string::[Content].<Anon>": "image",
    "number::[Content].<BillingRate>": "30"
  },
  "permissions": []
}
```
:::

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{serial}/ 

Update a specified player. Applies only to the player settings.

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The player serial number 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Player Entity](docId:9PqPrRJAVwfZbka1GYBEA)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `46D89C107131`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /serial` response.

```text
PUT /2022/06/REST/Devices/46D89C107131/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 13 Mar 2024 15:51:01 GMT
Content-Type: application/json
Content-Length: 5947
```

This is the example request body:

```json
{
   "id": 0,
   "serial": "46D89C107131",
   "model": "HD1024",
   "family": "Pagani",
   "registrationDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00",
   "settings":    {
      "name": "OutsidePlayer",
      "description": "Outside of Building A",
      "concatNameAndSerial": false,
      "setupType": "BSN",
      "lastModifiedDate": "2022-01-05T18:12:22.643Z",
      "group":       {
         "id": 123,
         "name": "TestGroup",
         "link": null
      },
      "brightWall": null,
      "timezone": "PST",
      "screen":       {
         "idleColor": "FF702896",
         "splashUrl": null
      },
      "synchronization":       {
         "status": {"period": "00:05:00"},
         "settings": {"period": "00:00:00"},
         "schedule": {"period": "06:00:00"},
         "content":          {
            "start": null,
            "end": null
         }
      },
      "network":       {
         "hostname": "BrightSign-46D89C107131",
         "proxyServer": null,
         "proxyBypass": [],
         "timeServers": ["http://time.brightsignnetwork.com/"],
         "interfaces":          [
                        {
               "enabled": true,
               "proto": "DHCP",
               "ip": null,
               "gateway": null,
               "dns": null,
               "rateLimitDuringInitialDownloads": 0,
               "rateLimitInsideContentDownloadWindow": 0,
               "rateLimitOutsideContentDownloadWindow": null,
               "contentDownloadEnabled": true,
               "textFeedsDownloadEnabled": true,
               "mediaFeedsDownloadEnabled": true,
               "healthReportingEnabled": true,
               "logsUploadEnabled": true,
               "name": "eth0",
               "type": "Ethernet"
            },
                        {
               "enabled": false,
               "ssid": "",
               "security":                {
                  "authentication":                   {
                     "mode": "Shared",
                     "passphrase": ""
                  },
                  "encryption": {"mode": "TKIP, CCMP"}
               },
               "proto": "DHCP",
               "ip": null,
               "gateway": null,
               "dns": null,
               "rateLimitDuringInitialDownloads": 0,
               "rateLimitInsideContentDownloadWindow": 0,
               "rateLimitOutsideContentDownloadWindow": 0,
               "contentDownloadEnabled": false,
               "textFeedsDownloadEnabled": false,
               "mediaFeedsDownloadEnabled": false,
               "healthReportingEnabled": false,
               "logsUploadEnabled": false,
               "name": "wlan0",
               "type": "WiFi"
            }
         ]
      },
      "beacons": [],
      "location": null,
      "screenshots": null,
      "logging":       {
         "enableDiagnosticLog": false,
         "enableEventLog": false,
         "enablePlaybackLog": false,
         "enableStateLog": false,
         "enableVariableLog": false,
         "uploadAtBoot": false,
         "uploadTime": null
      },
      "lws":       {
         "username": "",
         "password": "",
         "enableUpdateNotifications": true
      },
      "ldws": {"password": "RLSJPQSm9z15lB8nwVFWjkPYegscBlMF3NFG6wt3aSTXIoC+iR5NGrhJa77ZaWTgpiCzPdDdnwMlQSb4QLqe6nEFx6q/927scO6LlVTtRBVch+RlgzlJ2SXYqAH6TUx66JRFuvCxyHzL0iUNKR/R4E1hdTQpxH3yXIPJ5OBOTlaw8OW6DZNixDGMuvhgmWAW9/TgksUYTlwb1SKqGzQOrDYmmg+A71YMGV6NcKbuN3P0DjQsMrVxlFe9+awQ73LSxqKF5Q52FjUhgSKsYcTtnoJvY/n9HWcREyxOPKF7vsEIfKOeG/qoFBvgZZKOoqaTyD82iBKbOQu9WllBGX+qaaTTQHR1SrZoyS2PDmBlddLhngE4BHiDxmOPhm69bsmiakUcUqgjvgi8sRL/9kUxLXuayeQ6VYzUnHdX7K3nYqbhgJCxVbSURe5wIS/vQ97zi4wt0NpF55FmoAQlZA1JcSk/85w8S4hfpCYlDnqQMI8jXqvNZ5apc7nKsg6NSibGhh4h1cpA7DG6d6MzjBldVKhutni3Bj991cP45RIaGlmWipbC9eKwODrsDPYMK2CDN/JEygmfiUdJJW4Cvgi4s6Z3oyqddiEV+plZtGD69NAau4OMCoHcR1STJdsVOrq++tF+R0/IkC5wDhAUBszXvlSdcKja7Gv7v4kOAZC0CmtA="}
   },
   "status": null,
   "subscription": null,
   "taggedGroups": [],
   "tags": {},
   "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified player was successfully updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PATCH /\{serial}/ 

Replaces certain parameters on the specified player. Applies only to player settings. See [rfc6902](https://datatracker.ietf.org/doc/html/rfc6902).

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player to delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

These properties are entries in an array. Every entry must have all three of these properties:

- `op` <font color="#704ae0">string</font>:  The type of operation - in this case it is always "replace"
- `path` <font color="#704ae0">string</font>: A Uri path that references the location within the target document where the update will be performed
- `value` <font color="#704ae0">object</font>:  The replacement value(s) for the parameters that must be updated. 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is `46D89C101139`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /serial` response.

```text
PATCH /2022/06/REST/Devices/46D89C101139/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 13 Mar 2024 15:51:01 GMT
Content-Type: application/json-patch+json
Content-Length: 94
```

This is the example request body:

```json
[
  {
    "op": "replace",
    "path": "/settings/description/",
    "value": "Main Screen Player"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The parameters have been successfully replaced.

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{serial}/ 

Delete the specified player

**Required Scope Token**

bsn.api.main.devices.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The player serial number 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `46D89C101139`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /serial` response.

```text
DELETE /2022/06/REST/Devices/46D89C101139/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
If-Unmodified-Since: Wed, 13 Mar 2024 15:51:01 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The player was successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{deviceId}/Beacons/ 

Return the array of all beacons defined for the player that is specified

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `deviceId` <font color="#704ae0">int: </font>A unique identifier for the player instance

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The collection of [Player Beacon Entities](docId\:BsgHv6pw46ZE0xu2T2I8I)

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{serial}/Beacons/ 

Return the array of all beacons defined for the player that is specified

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player instance

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The collection of [Player Beacon Entities](docId\:BsgHv6pw46ZE0xu2T2I8I)

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{deviceId}/Beacons/\{name}/ 

Returns a device beacon of a certain type associated with a specified player and the specified name

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `deviceId` <font color="#704ae0">int: </font>A unique identifier for the player instance
- `name` <font color="#704ae0">string: </font>The name of the player beacon

 \_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Player Beacon Entity](docId\:BsgHv6pw46ZE0xu2T2I8I)

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{deviceId}/Beacons/\{name}/ 

Delete a specified player beacon from a specified player.

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `deviceId` <font color="#704ae0">int: </font>A unique identifier for the player instance
- `name` <font color="#704ae0">string: </font>The name of the player beacon

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified player beacon was successfully deleted from the player

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{serial}/Beacons/\{name}/ 

Returns a player beacon of a certain type associated with a specified player and the specified name

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player
- `name` <font color="#704ae0">string: </font>The name of the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Player Beacon Entity](docId\:BsgHv6pw46ZE0xu2T2I8I)

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{serial}/Beacons/\{name}/ 

Delete a specified player beacon on a specified player.

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player
- `name` <font color="#704ae0">string: </font>The name of the beacon to delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified player beacon was successfully deleted from the player

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Beacons/ 

Create a player beacon

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player instance on which you want to create the beacon

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Player Beacon Entity](docId\:BsgHv6pw46ZE0xu2T2I8I)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the new resource created and referenced by the Uri (given by the Location header field) in the response. The response includes the [Player Beacon Entity](docId\:BsgHv6pw46ZE0xu2T2I8I).

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{serial}/Beacons/ 

Create a player beacon on a specified player.

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player on which you want to create the beacon

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Player Beacon Entity](docId\:BsgHv6pw46ZE0xu2T2I8I)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the new resource created and referenced by the Uri (given by the Location header field) in the response. The response includes the [Player Beacon Entity](docId\:BsgHv6pw46ZE0xu2T2I8I).

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Errors/ 

Returns a list of errors associated with a specified player

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player that is reporting the errors

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of error instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of error instances that can be contained in the response body. 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `1`

```text
GET /2022/06/REST/Devices/12345/Errors/?pageSize=1&marker=a9DH34d23Bh0 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Player Error Entity](docId:4Vwry6LZ2JTfPAC07jFIq)

**Example**

```json
{
   "items":    [
            {
         "timestamp": "2023-03-21T20:36:21.887Z",
         "errorName": "Failed to download sync list",
         "errorEvent": "deviceError",
         "reason": "Connection timed out after 30000 milliseconds",
         "responseCode": -28
      }
   ],
   "totalItemCount": 9,
   "matchingItemCount": 9,
   "pageSize": 1,
   "nextMarker": "9DH34d23Bc1fjkdsa",
   "prevMarker": "9DH34d23Bc1fj786t",
   "isTruncated": false,
   "sortExpression": "[DeviceError].[Timestamp] DESC",
   "filterExpression": null
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{serial}/Errors/ 

Returns a list of errors associated with a specified player

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player that is reporting the errors

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of error instances exceeds the `pageSize`.This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of error instances that can be contained in the response body

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `46D89C101139`
- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `1`

```text
GET /2022/06/REST/Devices/46D89C101139/Errors/?pageSize=1&marker=Vsh54Uh9Mn0s HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Player Error Entity](docId:4Vwry6LZ2JTfPAC07jFIq)

**Example**

```json
{
   "items":    [
            {
         "timestamp": "2023-03-21T20:36:21.887Z",
         "errorName": "Failed to download sync list",
         "errorEvent": "deviceError",
         "reason": "Connection timed out after 30000 milliseconds",
         "responseCode": -28
      }
   ],
   "totalItemCount": 9,
   "matchingItemCount": 9,
   "pageSize": 1,
   "nextMarker": "34DH04d23c00JK",
   "prevMarker": "34DH04d23cfhg9",   
   "isTruncated": false,
   "sortExpression": "[DeviceError].[Timestamp] DESC",
   "filterExpression": null
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Downloads/ 

Returns the downloads associated with a specified player

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the player that has the download instances

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of download instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of download instances that can be contained in the response body

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `3`

```text
GET /2022/06/REST/Devices/12345/Downloads/?pageSize=3&marker=BN548plV2hZW4tWW HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json, application/*
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Player Download Entity](docId:40QXuGrQ94l5RAS_HcMDV)

**Example**

```json
{
   "items":    [
            {
         "timestamp": "2021-05-04T17:44:06.533Z",
         "fileName": "ZoomBG.jpeg",
         "fileHash": "SHA1:311822ED6A306CB3F2775CB3D9FF1A8C96680E92",
         "progress": 42,
         "status": "downloading"
      },
            {
         "timestamp": "2021-05-04T17:44:06.533Z",
         "fileName": "featureMinRevs.json",
         "fileHash": "SHA1:98E4C18E11C4D41D5742756213C103B671B985E9",
         "progress": 100,
         "status": "ok"
      },
            {
         "timestamp": "2021-05-04T17:44:06.533Z",
         "fileName": "autoplugins.brs",
         "fileHash": "SHA1:A0ACB3E76C85E48D326E802428B23F1325667410",
         "progress": 100,
         "status": "ok"
      }
   ],
   "totalItemCount": 7,
   "matchingItemCount": 7,
   "pageSize": 3,
   "nextMarker": "HFfakds789nm06",
   "prevMarker": "HFfakds789/0nm",
   "isTruncated": true,
   "sortExpression": "[DeviceDownload].[Timestamp] DESC",
   "filterExpression": null
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{serial}/Downloads/ 

Returns a list of downloads carried out by a player (specified by serial number).

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player that has the download instances

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of download instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of download instances that can be contained in the response body

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `46D89C101139`
- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `3`

```text
GET /2022/06/REST/Devices/46D89C101139/Downloads/?pageSize=3&marker=W4tWW3hcnMsMTcyMU478ngh HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json, application/*
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Player Download Entity](docId:40QXuGrQ94l5RAS_HcMDV) 

**Example**

```json
{
   "items":    [
            {
         "timestamp": "2021-05-04T17:44:06.533Z",
         "fileName": "ZoomBG.jpeg",
         "fileHash": "SHA1:311822ED6A306CB3F2775CB3D9FF1A8C96680E92",
         "progress": 42,
         "status": "downloading"
      },
            {
         "timestamp": "2021-05-04T17:44:06.533Z",
         "fileName": "featureMinRevs.json",
         "fileHash": "SHA1:98E4C18E11C4D41D5742756213C103B671B985E9",
         "progress": 100,
         "status": "ok"
      },
            {
         "timestamp": "2021-05-04T17:44:06.533Z",
         "fileName": "autoplugins.brs",
         "fileHash": "SHA1:A0ACB3E76C85E48D326E802428B23F1325667410",
         "progress": 100,
         "status": "ok"
      }
   ],
   "totalItemCount": 7,
   "matchingItemCount": 7,
   "pageSize": 3,
   "nextMarker": "fjdkah890vdjk",
   "prevMarker": "fjdkah890546k",
   "isTruncated": true,
   "sortExpression": "[DeviceDownload].[Timestamp] DESC",
   "filterExpression": null
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{deviceid}/ScreenShots/ 

Returns a list of screenshots uploaded by a specified player 

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of screenshot instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of screenshot instances that can be contained in the response body

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `1234567`
- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `1`

```text
GET /2022/06/REST/Devices/1234567/ScreenShots/?marker=SE4ODYzNF230OTv&pageSize=1 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [ScreenShot Entity](docId:-0vlMdzog7WbNYvHxzeBE) .

**Example**

```json
{
   "items":    [
            {
         "id": 12345,
         "device":          {
            "id": 1234567,
            "serial": "CFD02W901738"
         },
         "groupName": "Default",
         "presentationName": "videos-and-images",
         "utcTimestamp": "2023-10-19T15:07:57Z",
         "localTimestamp": "2023-10-19T10:07:57",
         "width": 1920,
         "height": 1080,
         "filePath": "https://bsncloud-dssp.s3.amazonaws.com/DeviceScreenShots/Public/CFD02W901738/2023-10-19T15-07-57.7710000Z.jpg",
         "fileSize": 802681,
         "thumbPath": "https://bsncloud-dssp.s3.amazonaws.com/DeviceScreenShots/Public/CFD02W901738/2023-10-19T15-07-57.7710000Z.thumb.150x150.jpg"
      }
   ],
   "totalItemCount": 4,
   "matchingItemCount": 4,
   "pageSize": 1,
   "nextMarker": "LDE4ODYzNTI0OTU=",
   "prevMarker": "LDE4ODYzNTI0h893",
   "isTruncated": true,
   "sortExpression": "[DeviceScreenShot].[UTCTimestamp] DESC",
   "filterExpression": null
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{serial}/ScreenShots/ 

Returns a list of screenshots uploaded by a specified player 

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The player serial number

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of screenshot instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of screenshot instances that can be contained in the response body

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `CFD02W901738`
- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `1`

```text
GET /2022/06/REST/Devices/CFD02W901738/ScreenShots/?marker=G140faj35k8as&pageSize=1 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [ScreenShot Entity](docId:-0vlMdzog7WbNYvHxzeBE)&#x20;

**Example**

```json
{
   "items":    [
            {
         "id": 12345,
         "device":          {
            "id": 1234567,
            "serial": "CFD02W901738"
         },
         "groupName": "Default",
         "presentationName": "videos-and-images",
         "utcTimestamp": "2023-10-19T15:07:57Z",
         "localTimestamp": "2023-10-19T10:07:57",
         "width": 1920,
         "height": 1080,
         "filePath": "https://bsncloud-dssp.s3.amazonaws.com/DeviceScreenShots/Public/CFD02W901738/2023-10-19T15-07-57.7710000Z.jpg",
         "fileSize": 802681,
         "thumbPath": "https://bsncloud-dssp.s3.amazonaws.com/DeviceScreenShots/Public/CFD02W901738/2023-10-19T15-07-57.7710000Z.thumb.150x150.jpg"
      }
   ],
   "totalItemCount": 4,
   "matchingItemCount": 4,
   "pageSize": 1,
   "nextMarker": "GH0dkf78aok34",
   "prevMarker": "GH0dkf78a5783",
   "isTruncated": true,
   "sortExpression": "[DeviceScreenShot].[UTCTimestamp] DESC",
   "filterExpression": null
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /ScreenShots/ 

Returns a list of screenshots uploaded by a player

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `projection` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>This parameter currently supports only one placeholder (`TOP({int},[Nodes])]`) which limits the number of entities in a group. The possible value for `{int}` is any number from 1 to 100.
- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results
- `grouping` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A grouping expression for the filtered entities. This parameter can be used with the `projection` parameter to retrieve a certain number of screenshots for a large number of devices in one request (for example, 100 screenshots from 100 players).
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (e.g. "\[Device].\[Serial] ASC")
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of screenshot instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of screenshot instances that can be contained in the response body

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `projection` is set to `TOP(3,[Nodes])`
- `filter` is set to `[groupName] IS 'Default'`
- `grouping` is set to `[Serial]`
- `sort` is set to `[Id] ASC`
- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `1`

```text
GET /2022/06/REST/Devices/ScreenShots/?marker=MTgzMDA1MTQ5MiwxODMwMDUxNDky&projection=TOP%283%2C%5BNodes%5D%29&pageSize=1&filter=%5BgroupName%5D%20IS%20%27Default%27&grouping=%5BSerial%5D&sort=%5BId%5D%20ASC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json, application/*
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [ScreenShot Entity](docId:-0vlMdzog7WbNYvHxzeBE)&#x20;

**Example**

```json
{
   "items":    [
            {
         "id": 1829566038,
         "device":          {
            "id": 0123456,
            "serial": "E9E8J5401510"
         },
         "groupName": "Default",
         "presentationName": "videos-and-images",
         "utcTimestamp": "2023-09-22T06:05:43Z",
         "localTimestamp": "2023-09-22T01:05:43",
         "width": 1920,
         "height": 1080,
         "filePath": "https://bsncloud-dssp.s3.amazonaws.com/DeviceScreenShots/Public/D9E8D5001519/2023-09-22T06-05-43.2670000Z.jpg",
         "fileSize": 1169176,
         "thumbPath": "https://bsncloud-dssp.s3.amazonaws.com/DeviceScreenShots/Public/D9E8D5001519/2023-09-22T06-05-43.2670000Z.thumb.150x150.jpg"
      }
   ],
   "totalItemCount": 1256,
   "matchingItemCount": 19,
   "pageSize": 1,
   "nextMarker": "MTgyOTYwODM2NCwxODI5NjA4MzY0",
   "prevMarker": "MTgyOTYwODM2NCwxODI5NjA478gh",
   "isTruncated": true,
   "sortExpression": "[Id] ASC",
   "filterExpression": "[groupName] IS 'Default'"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Tags/ 

Returns an object whose property names match tag keys and whose property values match tag values on a player

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Devices/12345/Tags/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: A collection of key value pairs where the key is tag name, and the value is tag value. See the `Tags` entry in [Player Entity](docId:9PqPrRJAVwfZbka1GYBEA) for more information.

**Example**

```json
{"string::[Device].<Testing2>": "PlayAllDay"}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Tags/ 

Adds tags to a specified player

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- `tags` <font color="#704ae0">DynamicObject</font>: A collection of key value pairs where the key is tag name, and the value is tag value. See the `Tags` entry in [Player Entity](docId:9PqPrRJAVwfZbka1GYBEA) for more information.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
POST /2022/06/REST/Devices/12345/Tags/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 73
```

This is the example request body:

```json
{
	"Number::[Device].<Number>":"1",
	"Boolean::[Device].<Boolean>":true
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The tags were added to the specified player 

**Failure Response**

<font color="#9a0808">400</font>: Either a tag with the specified key was already defined, the request is malformed and therefore invalid, or there is a conflict

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Tags/ 

Remove tags from a specified player

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- `list` <font color="#704ae0">string[]</font>: An array of tag keys to delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
DELETE /2022/06/REST/Devices/12345/Tags/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 64
```

This is the example request body:

```json
[
	"Number::[Device].<Number>",
	"Boolean::[Device].<Boolean>"
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified tag was successfully deleted from the player

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{serial}/Tags/ 

Returns an object whose property names match tag keys and whose property values match tag values on a player

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The player serial number

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `35F89C022150`

```text
GET /2022/06/REST/Devices/35F89C022150/Tags/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: A collection of key value pairs where the key is tag name, and the value is tag value. See the `Tags` entry in the [Player Entity](docId:9PqPrRJAVwfZbka1GYBEA) for more information.

**Example**

```json
{"string::[Device].<Testing2>": "PlayAllDay"}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{serial}/Tags/ 

Adds one or more tags to a specified player

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The player serial number

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- `tags` <font color="#704ae0">DynamicObject: </font>A collection of key value pairs where the key is tag name, and the value is tag value.  See the `Tags` entry in the [Player Entity](docId:9PqPrRJAVwfZbka1GYBEA) for more information.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `35F89C022150`

```text
POST /2022/06/REST/Devices/35F89C022150/Tags/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 73
```

This is the example request body:

```json
{
	"Number::[Device].<Number>":"1",
	"Boolean::[Device].<Boolean>":true
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The tags were added to the specified player

**Failure Response**

<font color="#9a0808">400</font>: Either a tag with the specified key was already defined, the request is malformed and therefore invalid, or there is a conflict

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{serial}/Tags/ 

Removes one or more tags from a specified player

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The player serial number

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- `list` <font color="#704ae0">string[]</font>: An array of tag keys to delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `35F89C022150`

```text
DELETE /2022/06/REST/Devices/35F89C022150/Tags/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 64
```

This is the example request body:

```json
[
	"Number::[Device].<Number>",
	"Boolean::[Device].<Boolean>"
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified tag was successfully deleted from the player

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Models/ 

Returns the list of player models supported by the current Main API version

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Devices/Models/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the complete list of player models that are supported on this Main API version

**Example**

```json
[
   "HD223",
   "HD1023",
   "HD1423",
   "LS423",
   "XD233",
   "XD1033",
   "XD1133",
   "XT243",
   "XT1043",
   "XT1143",
   "4K242",
   "4K1042",
   "4K1142",
   "HS123",
   "HO523",
   "XD234",
   "XD1034",
   "XT244",
   "XT1144",
   "HS124",
   "HS144",
   "LS424",
   "HD224",
   "HD1024",
   "AU325",
   "AU335",
   "XC2055",
   "XC4055",
   "LS425",
   "LS445",
   "HS125",
   "HS145",
   "HD225",
   "HD1025",
   "XD235",
   "XD1035",
   "XT245",
   "XT1145",
   "XT2145"
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Models/\{model}/ 

Returns the list of player models supported by the current Main API version

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `model` <font color="#704ae0">string: </font>The player model

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `model` is `XD1034`

```text
GET /2022/06/REST/Devices/Models/XD1034/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the complete list of player models that are supported on this Main API version

**Example**

```json
"XD1034"
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The provided player model does not exist (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Models/\{model}/Connectors/ 

Returns the list of connectors available on a given player model. 

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `model` <font color="#704ae0">string: </font>The player model

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `model` is set to `XD1034`

```text
GET /2022/06/REST/Devices/Models/XD1034/Connectors/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the list of connectors available on a given player model

**Example**

```json
["HDMI"]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The provided player model does not exist or is incorrect 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Models/\{model}/Connectors/\{connector}/ 

Returns the list of connectors available on a given player model

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `model` <font color="#704ae0">string: </font>The player model
- `connector` <font color="#704ae0">string:</font>The video connector (for example, "HDMI" or "DisplayPort")

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `model` is set to `XD1034`
- `connector` is set to `HDMI`

```text
GET /2022/06/REST/Devices/Models/XD1034/Connectors/HDMI/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the list of connectors available on a given player model

**Example**

```json
"HDMI"
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The provided player model or connector does not exist or is incorrect

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Models/\{model}/Connectors/\{connector}/VideoModes/ 

Returns the [Video Modes](docId\:QpML112mBhEK7LBDGUxnv) supported by the specified connector on the specified player model. 

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `model` <font color="#704ae0">string: </font>The player model
- `connector` <font color="#704ae0">string: </font>The video connector (for example, "HDMI" or "DisplayPort")

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `model` is set to `XD1034`
- `connector` is set to `HDMI`

```text
GET /2022/06/REST/Devices/Models/XD1034/Connectors/HDMI/VideoModes/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The response body is an array of strings listing [Video Modes](docId\:QpML112mBhEK7LBDGUxnv) supported by the specified connector on the specified player model.

**Example**

```json
[
   "4096x2160x23.976p",
   "4096x2160x24p",
   "4096x2160x25p",
   "4096x2160x29.97p",
   "4096x2160x30p",
   "4096x2160x50p",
   "4096x2160x59.94p",
   "4096x2160x60p",
   "3840x2160x60p",
   "3840x2160x59.94p",
   "3840x2160x50p",
   "3840x2160x30p",
   "3840x2160x29.97p",
   "3840x2160x25p",
   "3840x2160x24p",
   "3840x2160x23.976p",
   "3840x1080x60p",
   "3840x1080x50p",
   "3840x1080x30p",
   "3840x1080x25p",
   "3840x600x60p",
   "3440x1440x60p",
   "3440x1440x50p",
   "3440x1440x30p",
   "2560x1600x60p",
   "2560x1440x60p",
   "2560x1440x30p",
   "2560x1080x60p",
   "2560x960x60p",
   "2048x1152x60p",
   "1920x1920x60p",
   "1920x1200x60p",
   "1920x1200x50p",
   "1920x1080x60p",
   "1920x1080x59.94p",
   "1920x1080x50p",
   "1920x1080x30p",
   "1920x1080x29.97p",
   "1920x1080x25p",
   "1920x1080x24p",
   "1920x1080x23.976p",
   "1920x1080x60i",
   "1920x1080x59.94i",
   "1920x1080x50i",
   "1920x540x60p",
   "1680x1050x60p",
   "1600x1200x60p",
   "1600x900x60p",
   "1440x1080x60p",
   "1440x900x75p",
   "1440x900x60p",
   "1400x1050x75p",
   "1400x1050x60p",
   "1366x768x60p",
   "1360x768x60p",
   "1280x1024x75p",
   "1280x1024x60p",
   "1280x960x60p",
   "1280x800x75p",
   "1280x800x60p",
   "1280x768x60p",
   "1280x720x60p",
   "1280x720x59.94p",
   "1280x720x50p",
   "1280x720x25p",
   "1280x720x24p",
   "1280x720x23.976p",
   "1200x1920x60p",
   "1024x768x75p",
   "1024x768x60p",
   "960x960x60p",
   "800x1280x60p",
   "800x600x75p",
   "800x600x60p",
   "720x576x50p",
   "720x576x50i",
   "720x480x60p",
   "720x480x60i",
   "720x480x59.94p",
   "640x480x60p"
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The provided player model or connector does not exist or is incorrect

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/ 

Returns operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Devices/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

:::ExpandableHeading
Example

```json
{
   "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
   "singularName": "Full Control",
   "pluralName": "Device (Full Control)",
   "fullName": "Device (Full Control)",
   "targetEntity": "Device",
   "appliance": "Instance, Collection",
   "parent": null,
   "descendants":    [
            {
         "uid": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
         "singularName": "View Device",
         "pluralName": "View Devices",
         "fullName": "Device (Full Control) - View Devices",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:07.35Z"
            },
                        {
               "entityId": null,
               "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            }
         ]
      },
            {
         "uid": "0595648a-ab46-6bf4-417e-429d90821b49",
         "singularName": "Export Device",
         "pluralName": "Export Devices List",
         "fullName": "Device (Full Control) - Export Devices List",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "0595648a-ab46-6bf4-417e-429d90821b49",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:07.363Z"
            },
                        {
               "entityId": null,
               "operationUID": "0595648a-ab46-6bf4-417e-429d90821b49",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "0595648a-ab46-6bf4-417e-429d90821b49",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "0595648a-ab46-6bf4-417e-429d90821b49",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "0595648a-ab46-6bf4-417e-429d90821b49",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "0595648a-ab46-6bf4-417e-429d90821b49",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            }
         ]
      },
            {
         "uid": "3c97788f-e17a-42d4-b15d-65e53fb84ddc",
         "singularName": "View Device Downloads",
         "pluralName": "View Device Downloads",
         "fullName": "Device (Full Control) - View Device Downloads",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "3c97788f-e17a-42d4-b15d-65e53fb84ddc",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:07.4Z"
            },
                        {
               "entityId": null,
               "operationUID": "3c97788f-e17a-42d4-b15d-65e53fb84ddc",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "3c97788f-e17a-42d4-b15d-65e53fb84ddc",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "3c97788f-e17a-42d4-b15d-65e53fb84ddc",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "3c97788f-e17a-42d4-b15d-65e53fb84ddc",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "3c97788f-e17a-42d4-b15d-65e53fb84ddc",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            }
         ]
      },
            {
         "uid": "45b82bbe-34eb-4eab-8439-370d46cc5528",
         "singularName": "View Device Battery Status",
         "pluralName": "View Device Battery Status",
         "fullName": "Device (Full Control) - View Device Battery Status",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "45b82bbe-34eb-4eab-8439-370d46cc5528",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:07.413Z"
            },
                        {
               "entityId": null,
               "operationUID": "45b82bbe-34eb-4eab-8439-370d46cc5528",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "45b82bbe-34eb-4eab-8439-370d46cc5528",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "45b82bbe-34eb-4eab-8439-370d46cc5528",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "45b82bbe-34eb-4eab-8439-370d46cc5528",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "45b82bbe-34eb-4eab-8439-370d46cc5528",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            }
         ]
      },
            {
         "uid": "0cf93b59-dbd4-4ad1-89b4-4024c08d8ddc",
         "singularName": "View Remote Snapshots",
         "pluralName": "View Remote Snapshots",
         "fullName": "Device (Full Control) - View Remote Snapshots",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "0cf93b59-dbd4-4ad1-89b4-4024c08d8ddc",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:07.44Z"
            },
                        {
               "entityId": null,
               "operationUID": "0cf93b59-dbd4-4ad1-89b4-4024c08d8ddc",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "0cf93b59-dbd4-4ad1-89b4-4024c08d8ddc",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "0cf93b59-dbd4-4ad1-89b4-4024c08d8ddc",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "0cf93b59-dbd4-4ad1-89b4-4024c08d8ddc",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "0cf93b59-dbd4-4ad1-89b4-4024c08d8ddc",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            }
         ]
      },
            {
         "uid": "f396dc0f-f3b6-4d1b-acd4-4063b47e3025",
         "singularName": "View Device Log Reports",
         "pluralName": "View Device Log Reports",
         "fullName": "Device (Full Control) - View Device Log Reports",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "f396dc0f-f3b6-4d1b-acd4-4063b47e3025",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:07.427Z"
            },
                        {
               "entityId": null,
               "operationUID": "f396dc0f-f3b6-4d1b-acd4-4063b47e3025",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "f396dc0f-f3b6-4d1b-acd4-4063b47e3025",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "f396dc0f-f3b6-4d1b-acd4-4063b47e3025",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "f396dc0f-f3b6-4d1b-acd4-4063b47e3025",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "f396dc0f-f3b6-4d1b-acd4-4063b47e3025",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            }
         ]
      },
            {
         "uid": "9e4cc8d8-45fe-4fb4-01fc-170bf90449b2",
         "singularName": "Get Device Log Reports",
         "pluralName": "Get Device Log Reports",
         "fullName": "Device (Full Control) - Get Device Log Reports",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "9e4cc8d8-45fe-4fb4-01fc-170bf90449b2",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:07.453Z"
            },
                        {
               "entityId": null,
               "operationUID": "9e4cc8d8-45fe-4fb4-01fc-170bf90449b2",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "9e4cc8d8-45fe-4fb4-01fc-170bf90449b2",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "9e4cc8d8-45fe-4fb4-01fc-170bf90449b2",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "9e4cc8d8-45fe-4fb4-01fc-170bf90449b2",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "9e4cc8d8-45fe-4fb4-01fc-170bf90449b2",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            }
         ]
      },
            {
         "uid": "6e006934-6070-4a3a-bb7e-5527ef5a5034",
         "singularName": "Setup Device",
         "pluralName": "Setup Devices",
         "fullName": "Device (Full Control) - Setup Devices",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "6e006934-6070-4a3a-bb7e-5527ef5a5034",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "6e006934-6070-4a3a-bb7e-5527ef5a5034",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "6e006934-6070-4a3a-bb7e-5527ef5a5034",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "6e006934-6070-4a3a-bb7e-5527ef5a5034",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "6e006934-6070-4a3a-bb7e-5527ef5a5034",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            },
                        {
               "entityId": null,
               "operationUID": "6e006934-6070-4a3a-bb7e-5527ef5a5034",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.337Z"
            }
         ]
      },
            {
         "uid": "d89437e0-21fa-74b4-c1fe-b66c6270b176",
         "singularName": "Update Device",
         "pluralName": "Update Device",
         "fullName": "Device (Full Control) - Update Device",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "d89437e0-21fa-74b4-c1fe-b66c6270b176",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "d89437e0-21fa-74b4-c1fe-b66c6270b176",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "d89437e0-21fa-74b4-c1fe-b66c6270b176",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "d89437e0-21fa-74b4-c1fe-b66c6270b176",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "d89437e0-21fa-74b4-c1fe-b66c6270b176",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            },
                        {
               "entityId": null,
               "operationUID": "d89437e0-21fa-74b4-c1fe-b66c6270b176",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.337Z"
            }
         ]
      },
            {
         "uid": "c889ca96-5a6e-a904-318b-978d8f4282f6",
         "singularName": "Change Target Group",
         "pluralName": "Change Target Group",
         "fullName": "Device (Full Control) - Change Target Group",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "c889ca96-5a6e-a904-318b-978d8f4282f6",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "c889ca96-5a6e-a904-318b-978d8f4282f6",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "c889ca96-5a6e-a904-318b-978d8f4282f6",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "c889ca96-5a6e-a904-318b-978d8f4282f6",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "c889ca96-5a6e-a904-318b-978d8f4282f6",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            },
                        {
               "entityId": null,
               "operationUID": "c889ca96-5a6e-a904-318b-978d8f4282f6",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.337Z"
            }
         ]
      },
            {
         "uid": "1b213d9c-1fbe-44ed-86ab-f67179f12640",
         "singularName": "Manage Tags",
         "pluralName": "Manage Tags",
         "fullName": "Device (Full Control) - Manage Tags",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "1b213d9c-1fbe-44ed-86ab-f67179f12640",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "1b213d9c-1fbe-44ed-86ab-f67179f12640",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "1b213d9c-1fbe-44ed-86ab-f67179f12640",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "1b213d9c-1fbe-44ed-86ab-f67179f12640",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "1b213d9c-1fbe-44ed-86ab-f67179f12640",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            },
                        {
               "entityId": null,
               "operationUID": "1b213d9c-1fbe-44ed-86ab-f67179f12640",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.337Z"
            }
         ]
      },
            {
         "uid": "b15c6202-171f-40ac-80db-507f1b4f83e2",
         "singularName": "Unit Control",
         "pluralName": "Unit Control",
         "fullName": "Device (Full Control) - Unit Control",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "b15c6202-171f-40ac-80db-507f1b4f83e2",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "b15c6202-171f-40ac-80db-507f1b4f83e2",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "b15c6202-171f-40ac-80db-507f1b4f83e2",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "b15c6202-171f-40ac-80db-507f1b4f83e2",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "b15c6202-171f-40ac-80db-507f1b4f83e2",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            },
                        {
               "entityId": null,
               "operationUID": "b15c6202-171f-40ac-80db-507f1b4f83e2",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.337Z"
            }
         ]
      },
            {
         "uid": "6e41336d-be6b-4549-9acb-afb1cefe5211",
         "singularName": "Add Subscriptions",
         "pluralName": "Add Subscriptions",
         "fullName": "Device (Full Control) - Add Subscriptions",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "6e41336d-be6b-4549-9acb-afb1cefe5211",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "6e41336d-be6b-4549-9acb-afb1cefe5211",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "6e41336d-be6b-4549-9acb-afb1cefe5211",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "6e41336d-be6b-4549-9acb-afb1cefe5211",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "6e41336d-be6b-4549-9acb-afb1cefe5211",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            },
                        {
               "entityId": null,
               "operationUID": "6e41336d-be6b-4549-9acb-afb1cefe5211",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.337Z"
            }
         ]
      },
            {
         "uid": "3ec8d3c9-5ceb-c404-b976-cbc6ce2d95be",
         "singularName": "Edit Permissions",
         "pluralName": "Edit Permissions",
         "fullName": "Device (Full Control) - Edit Permissions",
         "targetEntity": "Device",
         "appliance": "Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "3ec8d3c9-5ceb-c404-b976-cbc6ce2d95be",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "3ec8d3c9-5ceb-c404-b976-cbc6ce2d95be",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "3ec8d3c9-5ceb-c404-b976-cbc6ce2d95be",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "3ec8d3c9-5ceb-c404-b976-cbc6ce2d95be",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "3ec8d3c9-5ceb-c404-b976-cbc6ce2d95be",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            },
                        {
               "entityId": null,
               "operationUID": "3ec8d3c9-5ceb-c404-b976-cbc6ce2d95be",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.337Z"
            }
         ]
      },
            {
         "uid": "da52a016-4e82-ce64-dded-a8dcd0de0ce3",
         "singularName": "Delete Device",
         "pluralName": "Delete Device",
         "fullName": "Device (Full Control) - Delete Device",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "da52a016-4e82-ce64-dded-a8dcd0de0ce3",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "da52a016-4e82-ce64-dded-a8dcd0de0ce3",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "da52a016-4e82-ce64-dded-a8dcd0de0ce3",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "da52a016-4e82-ce64-dded-a8dcd0de0ce3",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "da52a016-4e82-ce64-dded-a8dcd0de0ce3",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            },
                        {
               "entityId": null,
               "operationUID": "da52a016-4e82-ce64-dded-a8dcd0de0ce3",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.337Z"
            }
         ]
      },
            {
         "uid": "9e8c409d-b81f-46ed-bd60-c24ee77ce139",
         "singularName": "Revoke Tokens",
         "pluralName": "Revoke Tokens",
         "fullName": "Device (Full Control) - Revoke Tokens",
         "targetEntity": "Device",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
            "singularName": "Full Control",
            "pluralName": "Device (Full Control)",
            "fullName": "Device (Full Control)",
            "targetEntity": "Device",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "9e8c409d-b81f-46ed-bd60-c24ee77ce139",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.153Z"
            },
                        {
               "entityId": null,
               "operationUID": "9e8c409d-b81f-46ed-bd60-c24ee77ce139",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.41Z"
            },
                        {
               "entityId": null,
               "operationUID": "9e8c409d-b81f-46ed-bd60-c24ee77ce139",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.72Z"
            },
                        {
               "entityId": null,
               "operationUID": "9e8c409d-b81f-46ed-bd60-c24ee77ce139",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.163Z"
            },
                        {
               "entityId": null,
               "operationUID": "9e8c409d-b81f-46ed-bd60-c24ee77ce139",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.73Z"
            },
                        {
               "entityId": null,
               "operationUID": "9e8c409d-b81f-46ed-bd60-c24ee77ce139",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:07.337Z"
            }
         ]
      }
   ],
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
         "principal":          {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:05.153Z"
      },
            {
         "entityId": null,
         "operationUID": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
         "principal":          {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:05.41Z"
      },
            {
         "entityId": null,
         "operationUID": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
         "principal":          {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:05.72Z"
      },
            {
         "entityId": null,
         "operationUID": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
         "principal":          {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:06.163Z"
      },
            {
         "entityId": null,
         "operationUID": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
         "principal":          {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:06.73Z"
      },
            {
         "entityId": null,
         "operationUID": "9bf0a633-52a5-6b94-2d45-16c4c1c8c025",
         "principal":          {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:07.337Z"
      }
   ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/ 

Returns the list of permissions allowing or denying specific business operations to be executed on the specified player

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Devices/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 12345,
    "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 54321
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-06T15:55:35.587Z"
  },
  {
    "entityId": 12345,
    "operationUID": "0cf93b59-dbd4-4ad1-89b4-4024c08d8ddc",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 54321
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-06T15:55:35.553Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/ 

Applies permissions allowing or denying specific business operations to be executed on a specified player

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
POST /2022/06/REST/Devices/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 322
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 54321
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully granted

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/ 

Removes custom permissions granted to execute business operations from a specified player

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
DELETE /2022/06/REST/Devices/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 322
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 54321
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "0001-01-01T00:00:00"
  }
]  
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted from the player

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{serial}/Permissions/ 

Returns the list of permissions allowing or denying specific business operations to be executed on a specified player

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `46D89C001033`

```text
GET /2022/06/REST/Devices/46D89C001033/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 12345,
    "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 54321
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-06T15:55:35.587Z"
  },
  {
    "entityId": 12345,
    "operationUID": "0cf93b59-dbd4-4ad1-89b4-4024c08d8ddc",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 54321
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-06T15:55:35.553Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{serial}/Permissions/ 

Applies permissions allowing or denying specific business operations to be executed on a specified player

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `46D89C001032`

```text
POST /2022/06/REST/Devices/46D89C001032/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 322
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 54321
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully granted

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{serial}/Permissions/ 

Removes custom permissions granted to execute business operations from a specified player

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `46D89C001033`

```text
DELETE /2022/06/REST/Devices/46D89C001033/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 322
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "7d71c53e-ae40-59c4-f972-28e8b4dfabcf",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 54321
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "0001-01-01T00:00:00"
  }
]  
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted from the player

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{serial}/Tokens/\{token}/ 

Validates an OAuth2 device access or refresh token on a specified player

**Required Scope Token**

bsn.api.main.devices.token.validate

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player
- `token` <font color="#704ae0">string: </font>An OAuth2 device access or refresh token issued for the specified player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `47G49C000042`
- `token` is set to `{{Token}}`

```text
GET /2022/06/REST/Device/47G49C000042/Tokens/{{Token}}/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UsersAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Token Info Entity](docId\:RMBciR76z7OjsYJB_U2pP)&#x20;

**Example**

```json
{
   "token": {{Token}},
   "scope": "bdeploy certs bsn.api.device bsn.api.main.groups.regular.retrieve bsn.api.main.groups.regular.schedule.retrieve bsn.api.main.content.retrieve",
   "validFrom": "2023-11-29T17:43:55Z",
   "validTo": "2023-11-29T17:58:55Z"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{serial}/Tokens/\{token}/ 

Revokes an OAuth2 device access or refresh token on a specified player

**Required Scope Token**

bsn.api.main.devices.token.revoke

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player
- `token` <font color="#704ae0">string: </font>An OAuth2 device access or refresh token issued for the specified player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `47G49C000042`
- `token` is set to `{{Token}}`

```text
DELETE /2022/06/REST/Device/47G49C000042/Tokens/{{Token}}/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified token was successfully deleted from the player

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Tokens/\{token}/ 

Validates an OAuth2 device access or refresh token on a specified player

**Required Scope Token**

bsn.api.main.devices.token.validate

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player
- `token` <font color="#704ae0">string: </font>An OAuth2 device access or refresh token issued for the specified player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `123456`
- `token` is set to `{{Token}}`

```text
GET /2022/06/REST/Device/123456/Tokens/{{Token}}/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Token Info Entity](docId\:RMBciR76z7OjsYJB_U2pP)&#x20;

**Example**

```json
{
   "token": {{Token}},
   "scope": "bdeploy certs bsn.api.device bsn.api.main.groups.regular.retrieve bsn.api.main.groups.regular.schedule.retrieve bsn.api.main.content.retrieve",
   "validFrom": "2023-11-29T17:43:55Z",
   "validTo": "2023-11-29T17:58:55Z"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Tokens/\{token}/ 

Revokes an OAuth2 device access or refresh token on a specified player

**Required Scope Token**

bsn.api.main.devices.revoke

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player
- `token` <font color="#704ae0">string: </font>An OAuth2 device access or refresh token issued for the specified player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `123456`
- `token` is set to `{{Token}}`

```text
DELETE /2022/06/REST/Device/123456/Tokens/{{Token}}/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified token was successfully deleted from the player

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist) 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /All/Notes/

Retrieves a list of notes for all players on the network.

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (see [this page](docId:3L0afyD3xoOE-yTvfk2vs) for more information). The default value is null.
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of autorun plugin instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of player instances that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `pageSize` is set to `1`
- `filter` is set to `[Device].[Id] IS '*inaccessible*'`
- `sort` is set to `[LastModifiedDate] DESC`
- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.

```text
GET /2022/06/REST/Devices/All/Notes/?pageSize=1&sort=%5BLastModifiedDate%5D%20DESC&filter=%5BDevice%5D.%5BId%5D%20IS%20%27%2Ainaccessible%2A%27&marker=oxNjo0NydaLDY0Njg2NA%3D HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Player Note](docId\:amShqPc9ioqfHZaJ-sZmI) instances on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

:::ExpandableHeading
Example

```json
{
   "items": [   {
      "device":       {
         "id": 12345,
         "serial": "ABCD12345678"
      },
     "notes": "This player is behind the TV in an inaccessible place",
     "creationDate": "2024-01-10T18:30:11.123Z",
     "lastModifiedDate": "2024-03-15T15:51:01.123Z"
   }],
   "totalItemCount": 1024,
   "matchingItemCount": 1,
   "pageSize": 100,
   "nextMarker": "LDExOTc4M2A=",
   "prevMarker": "LDExOTc489ui",
   "isTruncated": false,
   "sortExpression": "[LastModifiedDate] DESC",
   "filterExpression": "[Device].[Id] IS '*inaccessible*'"
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Notes/

Return the notes for a specified player

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

`id` <font color="#704ae0">int: </font>A unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Devices/12345/Notes/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Mon, 11 Mar 2024 10:00:00 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Player Note](docId\:amShqPc9ioqfHZaJ-sZmI) instance for the specified player.

**Example**

```json
{
   "device":    {
      "id": 12345,
      "serial": "ABCD12345678"
   },
   "notes": "This player is behind the TV in an inaccessible place",
   "creationDate": "2024-01-10T18:30:11.123Z",
   "lastModifiedDate": "2024-03-15T15:51:01.123Z"
}
```

**Success Response** 

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist) 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/Notes/

Updates the notes for the specified player. 

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Player Note](docId\:amShqPc9ioqfHZaJ-sZmI) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
PUT /2022/06/REST/Devices/12345/Notes/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 13 Mar 2024 15:51:01 GMT
Content-Type: application/json
Content-Length: 59
```

This is the example request body:

```json
{
   "device":    {
      "id": 12345,
      "serial": "ABCD12345678"
   },
   "notes": "This player is behind the TV in an inaccessible place",
   "creationDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The notes on the specified player were successfully updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{serial}/Notes/

Return the notes for a specified player

**Required Scope Token**

bsn.api.main.devices.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `ABCD12345678`

```text
GET /2022/06/REST/Devices/ABCD12345678/Notes/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Mon, 11 Mar 2024 10:00:00 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Player Note](docId\:amShqPc9ioqfHZaJ-sZmI) instance for the specified player

**Example**

```json
{
   "device":    {
      "id": 12345,
      "serial": "ABCD12345678"
   },
   "notes": "This player is behind the TV in an inaccessible place",
   "creationDate": "2024-01-10T18:30:11.123Z",
   "lastModifiedDate": "2024-03-15T15:51:01.123Z"
}
```

**Success Response** 

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist) 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{serial}/Notes/

Updates the notes for the specified player

**Required Scope Token**

bsn.api.main.devices.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `serial` <font color="#704ae0">string: </font>The serial number of the player

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Player Note](docId\:amShqPc9ioqfHZaJ-sZmI) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `serial` is set to `ABCD12345678`

```text
PUT /2022/06/REST/Devices/ABCD12345678/Notes/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 13 Mar 2024 15:51:01 GMT
Content-Type: application/json
Content-Length: 59
```

This is the example request body:

```json
{
   "device":    {
      "id": 12345,
      "serial": "ABCD12345678"
   },
   "notes": "This player is behind the TV in an inaccessible place",
   "creationDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The note on the specified player was successfully updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Presentation Info Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Presentation Info entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font>: A unique identifier for the presentation. This value is generated by the server when the presentation is created.
- `Name` <font color="#704ae0">string</font>: The name of the presentation. The maximum length of this string is 100 characters.
- `Link` <font color="#704ae0">Uri</font>: The path to the presentation resource Uri on the server


[title] ScreenShot Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All ScreenShot entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the player screenshot instance
- `Device` <font color="#704ae0">DeviceInfo</font>:&#x20;
  - `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the player instance
  - `Serial` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The serial number of the player
- `GroupName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the BSN.Cloud group to which the player belongs
- `PresentationName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the presentation
- `UTCTimestamp` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A UTC timestamp indicating when the screenshot was taken on the player. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LocalTimestamp` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating the local time (as it is specified in the player settings) when the screenshot was taken on the player. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Width` <font color="#704ae0">short</font> <font color="#01a0af">read-only</font>: The width of the screenshot image (in pixels)
- `Height` <font color="#704ae0">short</font> <font color="#01a0af">read-only</font>: The height of the screenshot image (in pixels)
- `FilePath` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The location of the image file in the server directory
- `FileSize` <font color="#704ae0">int</font><font color="#01a0af"> read-only</font>: The size of the image file in the server directory
- `ThumbPath` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The location of the image thumbnail in the server directory



[title] Tagged Playlists Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Tagged Playlist entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the tagged playlist instance. This value is generated by the server when the tagged playlist is created.
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the tagged playlist. The maximum length of this string is 50 characters.
- `PhysicalPath` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The location of the file in the server directory
- `ContentsVirtualPath` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The virtual directory location of files in the tagged playlist. Tagged playlists can only use files contained in this directory.
- `Rule` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: A set of tagging conditions that determines tagged media to include in the playlist.&#x20;
- `TTL` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The frequency with which players will query BSN.Cloud servers to determine if there is any new tagged media to include/exclude in the tagged playlist (TTL is an acronym for time to live). See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `WaitingForApprove` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: A flag that determines whether recent changes to media tags have been approved for the tagged playlist. By default, changing media tags will not automatically add or remove media from a tagged playlist. A user with the "Update Tagged Playlist" permission (Administrators, Creators, General Managers) will need to set this flag to `false` for changes to go into effect.&#x20;
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the tagged playlist was created on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the tagged playlist was last modified on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Content` <font color="#704ae0">TaggedPlaylistContent[]</font> <font color="#01a0af">read-write</font>: An array of content object instances representing content files in the tagged playlist:
  - `ContentId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: The unique identifier for the tagged playlist content
  - `FileName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The filename of the tagged playlist content&#x20;
  - `DisplayDuration` <font color="#704ae0">Nullable&lt;TimeSpan&gt;</font> <font color="#01a0af">read-write</font>: The amount of time the content will be displayed before transitioning to the next entry (the default is six seconds). See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
  - `ValidityStartDate` <font color="#704ae0">Nullable&lt;DateTime&gt;</font> <font color="#01a0af">read-write</font>: The validity start date for the entry (that is, the point at which it will start being included in the tagged playlist). A null value specifies that the item is valid immediately when added to the tagged playlist. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
  - `ValidityEndDate` <font color="#704ae0">Nullable&lt;DateTime&gt;</font> <font color="#01a0af">read-write</font>: The validity end date for the associated entry (that is, the point at which it will no longer be included in the tagged playlist). A null value specifies that the item will be valid until it is removed from the tagged playlist manually. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
  - `State` <font color="#704ae0">TaggedPlaylistContentState</font> <font color="#01a0af">read-write</font>: The content state enumeration has three possible values: "Approved", "Pending Addition", and "Pending Deletion".
- `Presentations` <font color="#704ae0">PresentationInfo[]</font> <font color="#01a0af">read-only</font>: An array of [Presentation Info](docId\:rH_TKLzOo3RPBID0mDC9v) entities for each presentation associated with the tagged playlist instance
- `Permissions` <font color="#704ae0">Permission[]</font> <font color="#01a0af">read-write</font>: A list of permission object instances representing permissions rules assigned to the tagged playlist






[title] Player Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Player entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>:  A unique identifier for the player instance
- `Serial` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The player serial number 
- `Model` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The model name and suffix (see [Player Models Enumeration (2022/06)](docId\:NCYIreXReLr0uMCgcUJHE))
- `Family` <font color="#704ae0">PlayerFamily</font> <font color="#01a0af">read-only</font>: The model family of the player (see [Player Family Enumeration (2022/06)](docId:67k46yIOdtyk8C0wY2J45))
- `RegistrationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A UTC timestamp indicating when the player instance was registered. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A UTC timestamp indicating when the player instance was last modified. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Settings` <font color="#704ae0">PlayerSettings</font> <font color="#01a0af">read-write</font>: Returns the [Player Settings Entity](docId\:rV0VvrKJYpNM2yEk_DMgd)&#x20;
- `Status` <font color="#704ae0">PlayerFullStatus</font> <font color="#01a0af">read-only</font>: Returns the [Player Full Status Entity](docId:0rhF02gKpwOdpNam7tldH)&#x20;
- `Subscription` <font color="#704ae0">PlayerSubscription</font> <font color="#01a0af">read-only</font>: Returns the [Player Subscription Entity](docId\:HxQKCdYfcSLUUCEOcWOje)
- `TaggedGroups` <font color="#704ae0">TaggedGroupInfo[]</font> <font color="#01a0af">read-only</font>:
- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier for the tagged group
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the tagged group
- `Tags` <font color="#704ae0">Dictionary&lt;string, string&gt;</font> <font color="#01a0af">read-write</font>: An object where each property and its value represents a tag that must be assigned to the content file being uploaded. Each property value must be formatted as follows: "\<value\_type>\::\<tag\_type>.\<tag\_key>":"".
- `Permissions` <font color="#704ae0">Permission[] </font><font color="#01a0af">read-write</font>: The device permissions entity. See the [Permission Entity](docId\:JWfyMC42cdRG5jY2SkYsU).


[title] Player Note Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Player Note entities are structured as follows:

`entity`:

- `Device` <font color="#704ae0">PlayerInfo</font> <font color="#01a0af">read-only</font>: A structure which references a specific player instance
- `Notes` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: An arbitrary text not more than 1kB in size, which represents the player notes
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the current player note was added on a player. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the player note was last modified. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.




[title] ContentInfo (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The ContentInfo entity is structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">r</font><font color="#01a0af">ead-only</font>: The unique identifier of a [Content Entity (2022/06)](docId\:fkVdcafrX380751m5hbNr)
- `FileName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The content name. The maximum length of this string is 128 characters.
- `VirtualPath` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The location of the content in the BrightSign Author Plus Library
- `MediaType` <font color="#704ae0">MediaType</font> <font color="#01a0af">read-only</font>: The content media type, which is one of "Auxiliary", "Stylesheet", "Font", "Text", "Image", "Video", or "Audio"
- `FileSize` <font color="#704ae0">long</font> <font color="#01a0af">read-only</font>: The content file size
- `SHA1Hash` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The content hash algorithm and the value that results from performing the hash algorithm on the file. The string is formatted as "\{algorithm}:\{value}" (e.g. "SHA1:6DB465879088280AAC52DC22B07ED0AD493A99D4").
- `UploadDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the content was uploaded to the network. See [DateTime](docId:8oxgPxYJltIKaU9ho1nr2) for more information about this data type.

[title] Tags Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

This endpoint allows you to retrieve data about tags on the network.

Tag names, as well as all other entity properties, are case-insensitive (but values can only differ by case). The server may return entity properties and tag keys with a different case than specified by the client in the request.

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Tags***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /Keys/ 

Returns all tag names defined on a network that match a specified pattern. 

**Required Scope Token**

bsn.api.main.tags.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `pattern` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>Enter a value in this format `"{DataType}::[[sys].][{ObjectType}].<{TagKey}>"`.  If this value is not entered, this will return all tags for all values. See the definitions below for further guidance:
  - `DataType` is one of the supported data types. These supported data types are boolean, numeric, string, DateTime, TimeSpan, numeric array, and string array, as described on [this page](docId:3L0afyD3xoOE-yTvfk2vs) (but object is not supported). This value is optional.
  - `sys` lets you distinguish system tag (defined by `system`) or custom tag (defined by `customer`). This value is optional.
  - `ObjectType` is either `Content` or `Device`
  - `TagKey` can be skipped, or partially specified with a wildcard character like \* or ?, which will give you all of the tag keys matching this expression.

:::hint{type="info"}
Note that /Tag/Keys/ is unique in the scope of entities in that some of the values can be skipped or partially defined. For example, `[Content].<M?dia>` is a valid entry.
:::

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `pattern` is set to `[Content].*`

```text
GET /2022/06/REST/Tags/Keys/?pattern=%5BContent%5D.* HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns all tag names defined on a network that match the `pattern`

**Example**

```json
[
   "String::[sys].[Content].<ContentType>",
   "DateTime::[sys].[Content].<FileLastModifiedDate>",
   "String::[sys].[Content].<FileName>",
   "Number::[sys].[Content].<FileSize>",
   "Number::[sys].[Content].<Id>",
   "String::[Content].<JaneDoe>",
   "String::[sys].[Content].<PhysicalPath>",
   "String::[sys].[Content].<ThumbPath>",
   "DateTime::[sys].[Content].<UploadDate>",
   "String::[sys].[Content].<VirtualPath>"
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Values/ 

Returns all tag values defined on a network that match a specified pattern

**Required Scope Token**

bsn.api.main.tags.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `pattern` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>Enter a value in this format `"{DataType}::[[sys].][{ObjectType}].<{TagValues}>"`.  If this value is not entered, this will return all tags for all values. See the definitions below for further guidance:
  - `DataType` is one of the supported data types. These supported data types are boolean, numeric, string, DateTime, TimeSpan, numeric array, and string array, as described in [this page](docId:3L0afyD3xoOE-yTvfk2vs) (but object is not supported). This value is optional.
  - `sys` lets you distinguish system tag (defined by `system`) or custom tag (defined by `customer`). This value is optional.
  - `ObjectType` is either `Content` or `Device`
  - `TagValues` can be skipped, or partially specified with a wildcard character like \* or ?, which will give you all of the tag values matching this expression.

:::hint{type="info"}
Note that /Tag/Values/ is unique in the scope of entities in that some of the values can be skipped or partially defined. For example, `[Content].<M?dia>` is a valid entry.
:::

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `pattern` is set to `[sys].[Content].*`

```text
GET /2022/06/REST/Tags/Values/?pattern=%5Bsys%5D.%5BContent%5D.* HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns all tag values defined on a network that match the `pattern`

**Example**

```json
[
   "",
   "Outside",
   "2024-01-01 00:00:00Z",
   12345
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] ContentUploadArguments (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The ContentUploadArguments entity is structured as follows:

`entity`:

- `SessionToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#01a0af"> </font><font color="#01a0af">read-write</font>: The Content Upload Session Token generated by the server
- `UploadToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0">&gt; </font><font color="#01a0af">read-write</font>: The Content Upload Token generated by the server
- `FileName` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The name of the file being uploaded
- `VirtualPath` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The target virtual path in the library for the content being uploaded
- `MediaType` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The media type of the content being uploaded. See [ContentMediaType Enumeration (2019/03)](docId\:xLXfOwGMbqoNlTeF0dw90).   &#x20;
- `FileSize` <font color="#704ae0">long</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The size of the file being uploaded in bytes
- `FileLastModifiedDate` <font color="#704ae0">DateTime </font><font color="#01a0af">read-write</font>: The timestamp of last modification of original file in local storage. See [DateTime](docId:8oxgPxYJltIKaU9ho1nr2) for more information about this data type. 
- `SHA1Hash` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The SHA1 hash of the file being uploaded
- `FileThumb` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">byte[]&gt;</font> <font color="#01a0af">read-write</font>: A BASE64-encoded thumbnail for the content being uploaded.&#x20;
- `Tags` <font color="#704ae0">Nullable</font>\<<font color="#704ae0">Dictionary&lt;string, string&gt;&gt;</font> <font color="#01a0af">read-write</font>: An object where each property and its value represents a tag that must be assigned to the content file being uploaded. Each property value must be formatted as follows: "\<value\_type>\::\<tag\_type>.\<tag\_key>":"".






[title] WebPageAssetUploadArguments (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The WebPageUploadArguments entity is structured as follows:

`entity`:

- `SessionToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#01a0af"> </font><font color="#01a0af">read-write</font>: The WebPage Upload Session Token generated by the server
- `UploadToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0">&gt; </font><font color="#01a0af">read-write</font>: The WebPage Asset Upload Token generated by the server
- `WebPageAssetId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: The identifier of an existing WebPage Asset
- `RelativePath` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The relative path of a WebPage Asset file according to the WebPage file
- `FileName` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The name of the file being uploaded
- `VirtualPath` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The target virtual path in the library for the content being uploaded
- `MediaType` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The media type of the content being uploaded. See [ContentMediaType Enumeration (2019/03)](docId\:xLXfOwGMbqoNlTeF0dw90).   &#x20;
- `FileSize` <font color="#704ae0">long</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The size of the file being uploaded in bytes
- `FileLastModifiedDate` <font color="#704ae0">DateTime </font><font color="#01a0af">read-write</font>: The timestamp of last modification of original file in local storage. See [DateTime](docId:8oxgPxYJltIKaU9ho1nr2) for more information about this data type. 
- `SHA1Hash` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The SHA1 hash of the file being uploaded
- `FileThumb` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">byte[]&gt;</font> <font color="#01a0af">read-write</font>: A BASE64-encoded thumbnail for the content being uploaded.&#x20;
- `Tags` <font color="#704ae0">Nullable</font>\<<font color="#704ae0">Dictionary&lt;string, string&gt;&gt;</font> <font color="#01a0af">read-write</font>: An object where each property and its value represents a tag that must be assigned to the content file being uploaded. Each property value must be formatted as follows: "\<value\_type>\::\<tag\_type>.\<tag\_key>":"".




[title] Content Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

This endpoint allows you to manage Content files (and content tags) on the network. 

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Content***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Returns a list of Content files on a network.

**Required Scope Token**

bsn.api.main.content.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (see [this page](docId:3L0afyD3xoOE-yTvfk2vs) for more information). The default value is null.
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of Content files exceeds the `pageSize`.This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of Content files that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.Cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[MediaType] IS 'Image' AND ([FileName] IS '.jpg' OR [FileName] IS '.jpeg') AND [UploadDate] IS IN THE RANGE '2020-07-01' AND '2020-08-01'`
- `sort` is set to `[LastModifiedDate] DESC`

```text
GET /2022/06/REST/Content/?marker=MjAyMC0wNy0yN1QxNjoxNjo0Ny44MTdaLDY0Njg2NA%3D%3D&pageSize=1&sort=%5BLastModifiedDate%5D%20DESC&filter=%5BMediaType%5D%20IS%20%27Image%27%20AND%20%28%5BFileName%5D%20IS%20%27*.jpg%27%20OR%20%5BFileName%5D%20IS%20%27*.jpeg%27%29%20AND%20%5BUploadDate%5D%20IS%20IN%20THE%20RANGE%20%272020-07-01%27%20AND%20%272020-08-01%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Content](docId\:fkVdcafrX380751m5hbNr) entities (generic data type) on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
  "items": [
    {
      "id": 123456,
      "fileName": "ZoomBG.jpeg",
      "physicalPath": "https://bsncloud.s3.amazonaws.com/bsts/7abaa3f28f5f824d4f0bbd5eec295f13",
      "virtualPath": "\\Users\\Night\\",
      "thumbPath": "https://bsncloud.s3.amazonaws.com/bsts/e6f6eea4387fcae58b40be611c8c3017",
      "mediaType": "Image",
      "fileSize": 6534,
      "fileHash": "SHA1:79060249FC80G02990175BB4BDE4275E6F05F612",
      "uploadDate": "2020-07-27T16:16:47.817Z",
      "lastModifiedDate": "2020-07-27T16:16:47.817Z",
      "fileLastModifiedDate": "2020-07-16T17:34:20.41Z",
      "probeData": "",
      "metadata": {
        "widthPx": 275,
        "heightPx": 183,
        "colorSpace": "sRGB",
        "colorDepthBit": 8,
        "imageFormat": "Jpeg"
      },
      "dynamicPlaylists": [
        {
          "id": 123,
          "name": "My Dynamic Playlist"
        }
      ],
      "liveMediaFeeds": [
        {
          "id": 124,
          "name": "My Live Media Feed"
        }
      ],
      "taggedPlaylists": [
        {
          "id": 125,
          "name": "My Tagged Playlist"
        }
      ],
      "presentations": [
        {
          "id": 126,
          "name": "My Presentation",
          "type": "Presentation",
          "link": null
        }
      ],
      "tags": {
        "string::[Content].<Location>": "Sea Coast",
        "dateTime::[Content].<TimeTaken>": "2023-10-10T19:06:00.000Z"
      },
      "permissions": [
        {
          "entityId": 123456,
          "operationUID": "db3a6287-8d03-51b4-6528-704fac1ab8c9",
          "principal": {
            "login": "JohnDoe@brightsign.biz",
            "type": "User",
            "id": 101026
          },
          "isFixed": false,
          "isInherited": false,
          "isAllowed": false,
          "creationDate": "2023-10-11T22:07:33.507Z"
        },
        {
          "entityId": 123456,
          "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
          "principal": {
            "name": "Custom",
            "isCustom": true,
            "type": "Role",
            "id": 10498
          },
          "isFixed": false,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2023-10-11T22:07:33.473Z"
        }
      ]
    }
  ],
  "totalItemCount": 23,
  "matchingItemCount": 2,
  "pageSize": 1,
  "nextMarker": "Wm9vbUJHMy5qcGVnLDY0Njg2NA==",
  "prevMarker": "Wm9vbUJHMy5qcGVnLDY0Njg267nb",
  "isTruncated": true,
  "sortExpression": "[LastModifiedDate] DESC",
  "filterExpression": "[FileName] CONTAINS '*.jpeg'"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Removes Content files, specified by a filter, from a network. This allows you to simultaneously delete one or more content files of the `Auxiliary`, `Stylesheet`,  `Font`, `Text`, `Image`, `Video`, and/or `Audio` `mediaType`. Folders (virtual paths) cannot be deleted using this method.

**Required Scope Token**

bsn.api.main.content.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[VirtualPath] IS '\\Shared\\Presentations\\Archive\\*' AND [UploadDate] IS BEFORE '2020-01-01'`

```text
DELETE /2022/06/REST/Content/?filter=%5BVirtualPath%5D%20IS%20%27%5C%5CShared%5C%5CPresentations%5C%5CArchive%5C%5C*%27%20AND%20%5BUploadDate%5D%20IS%20BEFORE%20%272020-01-01%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the number of affected Content files as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Root/\{\*virtualPath}/ 

Retrieves a list of Content files in the specified virtual directory folder. This resource maps to the virtual folder in the Content library, accordingly the virtual path is either complete or a partial path to a destination Content folder or file.

**Required Scope Token**

bsn.api.main.content.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `virtualPath` <font color="#704ae0">string: </font>The Content file location in the BSN.Cloud virtual directory

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (e.g. "\[Content].\[FileName] ASC").
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of Content files exceeds the `pageSize`.
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of Content files that can be contained in the response body

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `virtualPath` is set to `Users/JohnDoe@brightsign.biz/`

```text
GET /2022/06/REST/Content/Root/Users/JohnDoe@brightsign.biz/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Content](docId\:fkVdcafrX380751m5hbNr) and [Content Folder](docId:1UOdquOarzRZ7X0sLW2NK) entities on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
   "items":    [
            {
         "id": 123456,
         "name": "My Images",
         "virtualPath": "\\Users\\JohnDoe@brightsign.biz\\",
         "thumbPath": "https://bsncloud.s3.amazonaws.com:443/public/icons/100x100/icon_folder.png",
         "mediaType": "Folder",
         "creationDate": "2020-07-09T19:09:05.103Z",
         "lastModifiedDate": "2020-07-09T19:09:05.103Z",
         "hasSubFolders": false,
         "hasFiles": false,
         "permissions": []
      },
            {
         "id": 1234567,
         "name": "My Incoming",
         "virtualPath": "\\Users\\JohnDoe@brightsign.biz\\",
         "thumbPath": "https://bsncloud.s3.amazonaws.com:443/public/icons/100x100/icon_folder_incoming.png",
         "mediaType": "Folder",
         "creationDate": "2020-07-09T19:09:05.067Z",
         "lastModifiedDate": "2020-07-09T19:09:05.067Z",
         "hasSubFolders": false,
         "hasFiles": false,
         "permissions": []
      },
            {
         "id": 12345678,
         "name": "My Videos",
         "virtualPath": "\\Users\\JohnDoe@brightsign.biz\\",
         "thumbPath": "https://bsncloud.s3.amazonaws.com:443/public/icons/100x100/icon_folder.png",
         "mediaType": "Folder",
         "creationDate": "2020-07-09T19:09:05.143Z",
         "lastModifiedDate": "2020-07-09T19:09:05.143Z",
         "hasSubFolders": false,
         "hasFiles": false,
         "permissions": []
      }
   ],
   "totalItemCount": 3,
   "matchingItemCount": 3,
   "pageSize": 100,
   "nextMarker": "LDYwMjg0Nw==",
   "prevMarker": "LDYwMjg089nh",
   "isTruncated": false,
   "sortExpression": "[Content].[FileName] ASC",
   "filterExpression": "[Type] IN ('Image', 'Video', 'Audio', 'Folder') AND [VirtualPath] = \\Users\\JohnDoe@brightsign.biz\\"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /Root/\{\*virtualPath}/ 

Creates a Content folder in the specified virtual directory folder and returns the URL link to the folder location. This resource maps to the virtual folder in the Content library, accordingly the virtual path is either complete or a partial path to a destination content folder or file.

**Required Scope Token**

bsn.api.main.content.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `virtualPath` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>The Content location in the BSN.Cloud virtual directory

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Content Folder Entity](docId:1UOdquOarzRZ7X0sLW2NK)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `virtualPath` is set to `/Users/JohnDoe@brightsign.biz/`

```text
POST /2022/06/REST/Content/Root/Users/JohnDoe@brightsign.biz/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 95
```

This is the example request body:

```json
{
    "id": 0,
    "name": "Testing",
    "virtualPath": "\\Users\\JohnDoe@brightsign.biz\\",
    "thumbPath": "",
    "mediaType": "Folder",
    "creationDate": "0001-01-01T00:00:00",
    "lastModifiedDate": "0001-01-01T00:00:00",
    "hasSubFolders": false,
    "hasFiles": false,
    "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the new resource created and referenced by the Uri (given by the Location header field) in the response. The response includes the [Content Folder Entity](docId:1UOdquOarzRZ7X0sLW2NK).

**Example**

```json
{
    "id": 123456,
    "name": "Testing",
    "virtualPath": "\\Users\\JohnDoe@brightsign.biz\\",
    "thumbPath": "",
    "mediaType": "Folder",
    "creationDate": "2023-06-07T19:00:08.156Z",
    "lastModifiedDate": "2023-06-07T19:00:08.156Z",
    "hasSubFolders": false,
    "hasFiles": false,
    "permissions": []
}   
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/ 

Retrieves the number of Content files on the network matching the specified filter criteria. If no filter is included, this call returns the total number of Content files on the network. 

**Required Scope Token**

bsn.api.main.content.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[FileName] CONTAINS '*.jpeg'`

```text
GET /2022/06/REST/Content/Count/?filter=%5BFileName%5D%20CONTAINS%20%27*.jpeg%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The Content file count is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/ 

Retrieves the specified Content file 

**Required Scope Token**

bsn.api.main.content.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Content. This value is generated by the server when the Content file is uploaded.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

These parameters should only be used when requesting an image (they depend on the representation type):

- `maxWidth` <font color="#704ae0">uShort</font> <font color="#01a0af">optional: </font>The maximum content width (this should equal 100).
- `maxHeight` <font color="#704ae0">uShort</font> <font color="#01a0af">optional: </font>The maximum content height (this should equal 100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Examples**

This example request returns JSON metadata. The parameters and headers are set as follows (since the header specifies `application/json`, the `maxWidth` and `maxHeight` parameters are not needed):

- `id` is set to `123456`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` response.

```text
GET /2022/06/REST/Content/123456/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Fri, 08 Dec 2023 16:34:43 GMT
Accept-Encoding: gzip,deflate
Accept: application/json, application/vnd.bsn.error+json
```

This example request returns an image file. The parameters and headers are set as follows:

- `id` is set to `123456`
- `maxWidth` is set to `100`
- `maxHeight` is set to `100`

```text
GET /2022/06/REST/Content/123456/?maxWidth=100&maxHeight=100 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept-Encoding: gzip,deflate
Accept: image/png, image/jpeg, image/gif
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>:  Returns either the [Content Entity](docId\:fkVdcafrX380751m5hbNr) or the file associated with the requested content, depending on what is specified in the request.

**Example**

This is an example of a 200 level response:

```json
{
  "id": 123456,
  "fileName": "ZoomBG.jpeg",
  "physicalPath": "https://bsncloud.s3.amazonaws.com/bsts/7abaa3f28f5f824d4f0bbd5eec295f13",
  "virtualPath": "\\Users\\Night\\",
  "thumbPath": "https://bsncloud.s3.amazonaws.com/bsts/e6f6eea4387fcae58b40be611c8c3017",
  "mediaType": "Image",
  "fileSize": 6534,
  "fileHash": "SHA1:79060849FC80F02990175BB4BDE4375E6F05F622",
  "uploadDate": "2020-07-27T16:16:47.817Z",
  "lastModifiedDate": "2023-12-08T16:34:44.093Z",
  "fileLastModifiedDate": "2020-07-27T16:16:47.817Z",
  "probeData": "",
  "metadata": {
    "widthPx": 275,
    "heightPx": 183,
    "colorSpace": "sRGB",
    "colorDepthBit": 8,
    "imageFormat": "Jpeg"
  },
  "dynamicPlaylists": [
    {
      "id": 123,
      "name": "My Dynamic Playlist"
    }
  ],
  "liveMediaFeeds": [
    {
      "id": 124,
      "name": "My Live Media Feed"
    }
  ],
  "taggedPlaylists": [
    {
      "id": 125,
      "name": "My Tagged Playlist"
    }
  ],
  "presentations": [
    {
      "id": 126,
      "name": "My Presentation",
      "type": "Presentation",
      "link": null
    }
  ],
  "tags": {
    "string::[Content].<Location>": "Sea Coast",
    "dateTime::[Content].<TimeTaken>": "2023-10-10T19:06:00.000Z"
  },
  "permissions": [
    {
      "entityId": 123456,
      "operationUID": "db3a6287-8d03-51b4-6528-704fac1ab8c9",
      "principal": {
        "login": "JohnDoe@brightsign.biz",
        "type": "User",
        "id": 101026
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2023-10-11T22:07:33.507Z"
    },
    {
      "entityId": 123456,
      "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
      "principal": {
        "name": "Custom",
        "isCustom": true,
        "type": "Role",
        "id": 10498
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2023-10-11T22:07:33.473Z"
    }
  ]
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/ 

Update the specified Content files. 

**Required Scope Token**

bsn.api.main.content.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Content. This value is generated by the server when the content file is uploaded.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Content Entity](docId\:fkVdcafrX380751m5hbNr)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is `123456`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` response.

```text
PUT /2022/06/REST/Content/123456/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Content-Type: application/json
Content-Length: 861
```

This is the example request body:

```json
{
   "id": 0,
   "fileName": "Display.jpeg",
   "physicalPath": null,
   "virtualPath": "\\Users\\Night\\",
   "thumbPath": null,
   "mediaType": "Image",
   "fileSize": 0,
   "fileHash": null,
   "uploadDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00",
   "fileLastModifiedDate": "0001-01-01T00:00:00",
   "probeData": null,
   "metadata": null,
   "dynamicPlaylists": null,
   "liveMediaFeeds": null,
   "taggedPlaylists": null,
   "presentations": null,
   "tags": {},
   "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified content file has been updated on the network 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PATCH /\{id}/ 

Applies a sequence of changes to a specific Content entity specified by id. See [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902).

**Required Scope Token**

bsn.api.main.content.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Content. This value is generated by the server when the Content file is uploaded.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

These properties are entries in an array. Every entry must have all three of these properties:

- `op` <font color="#704ae0">string</font>: The type of operation - in this case it is always "replace"
- `path` <font color="#704ae0">string</font>: A Uri path that references the location within the target document where the update will be performed
- `value` <font color="#704ae0">object</font>: The replacement value(s) for the parameters that must be updated. This can be an array.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is `12345`

```text
PATCH /2022/06/REST/Content/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json-patch+json
Content-Length: 1068
```

This is the example request body:

```json
[
  {
    "op": "replace",
    "path": "/virtualPath/",
    "value": "\\Shared\\Incoming\\"
  },
  {
    "op": "replace",
    "path": "/tags/",
    "value": {
      "String::[Content].<String>": "HelloWorld",
      "Boolean::[Content].<Boolean>": true,
      "Number::[Content].<Number>": 42,
      "DateTime::[Content].<DateTime>": "2024-01-12T22:00:00.123Z",
      "NumericArray::[Content].<NumericArray>": "1, 2, 3",
      "StringArray::[Content].<StringArray>": "\"A\", \"B\", \"C\""
    }
  },
  {
    "op": "replace",
    "path": "/permissions/",
    "value": [
      {
        "entityId": 12345,
        "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
        "principal": {
          "name": "My Custom Role",
          "isCustom": true,
          "type": "Role",
          "id": 54321
        },
        "isFixed": false,
        "isInherited": false,
        "isAllowed": true,
        "creationDate": "0001-01-01T00:00:00"
      }
    ]
  }
]
```

**Success Response**

<font color="#089a4d">204</font>: The parameters have been successfully replaced.

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/ 

This method allows you to delete files that are of the `Auxiliary`,  `Stylesheet`,  `Font`,  `Text`,  `Image`,  `Video`, and/or `Audio mediaType`, as well as empty and non-empty folders which contain files that are not currently used.

**Required Scope Token**

bsn.api.main.content.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Content to delete. 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `123456`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` response.

```text
DELETE /2022/06/REST/Content/123456/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Content file has been removed

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Tags/ 

Returns tags associated with the specified Content file

**Required Scope Token**

bsn.api.main.content.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Content file. This value is generated by the server when the Content file is uploaded.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `123456`

```text
GET /2022/06/REST/Content/123456/Tags/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a list of properties and their values.

**Example**

```json
{
   "string::[Content].<Anon>": "image",
   "number::[Content].<BillingRate>": "30"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Tags/ 

Adds one or more tags to the specified Content file. The following are valid system-defined values for Content tags: "FileName", "FileSize", "ContentType",  and "UploadDate".  

**Required Scope Token**

bsn.api.main.content.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Content. This value is generated by the server when the content file is uploaded.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- `tags` <font color="#704ae0">DynamicObject: </font>A collection of key value pairs where the key is tag name, and the value is tag value. See the `Tags` entry in [Player Entity](docId:9PqPrRJAVwfZbka1GYBEA) for more information.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `123456`
- A tag is added to set the Billing Rate to 30

```text
POST 2022/06/REST/Content/123456/Tags/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 34
```

This is the example request body:

```json
{
	"[Content].<BillingRate>": 30
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>:  A new tag has been successfully added to the specified Content file

**Failure Response**

<font color="#9a0808">400</font>: Either a tag with the specified key was already defined, the request is malformed and therefore invalid, or there is a conflict

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Tags/ 

Removes one or more tags from the specified Content file 

**Required Scope Token**

bsn.api.main.content.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Content. This value is generated by the server when the Content file is uploaded.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- `list` <font color="#704ae0">List&lt;string&gt;</font>: A list of key/value pairs that specify the tags to delete from the Content file

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `123456`
- The `"string::[Content].<Anon>"` tag will be deleted

```text
DELETE /2022/06/REST/Content/123456/Tags/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 28
```

This is the example request body:

```json
[
   "string::[Content].<Anon>"
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified tags have been removed from the specified Content file 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/ 

Returns the operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Content/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Origin: http://localhost/
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

**Example**

:::ExpandableHeading
Expand

```json
{
   "uid": "39e69897-8d9a-f634-95cf-7419a3e93c23",
   "singularName": "Full Control",
   "pluralName": "Content (Full Control)",
   "fullName": "Content (Full Control)",
   "targetEntity": "Content",
   "appliance": "Instance, Collection",
   "parent": null,
   "descendants":    [
            {
         "uid": "db3a6287-8d03-51b4-6528-704fac1ab8c9",
         "singularName": "View Content",
         "pluralName": "View Content",
         "fullName": "Content (Full Control) - View Content",
         "targetEntity": "Content",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "39e69897-8d9a-f634-95cf-7419a3e93c23",
            "singularName": "Full Control",
            "pluralName": "Content (Full Control)",
            "fullName": "Content (Full Control)",
            "targetEntity": "Content",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "db3a6287-8d03-51b4-6528-704fac1ab8c9",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.14Z"
            },
                        {
               "entityId": null,
               "operationUID": "db3a6287-8d03-51b4-6528-704fac1ab8c9",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.663Z"
            },
                        {
               "entityId": null,
               "operationUID": "db3a6287-8d03-51b4-6528-704fac1ab8c9",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.817Z"
            },
                        {
               "entityId": null,
               "operationUID": "db3a6287-8d03-51b4-6528-704fac1ab8c9",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.077Z"
            },
                        {
               "entityId": null,
               "operationUID": "db3a6287-8d03-51b4-6528-704fac1ab8c9",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.39Z"
            },
                        {
               "entityId": null,
               "operationUID": "db3a6287-8d03-51b4-6528-704fac1ab8c9",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.68Z"
            }
         ]
      },
            {
         "uid": "d61ef4ac-4da7-5f34-d9ba-6fc152313e26",
         "singularName": "Upload Content",
         "pluralName": "Upload Content",
         "fullName": "Content (Full Control) - Upload Content",
         "targetEntity": "Content",
         "appliance": "Collection",
         "parent":          {
            "uid": "39e69897-8d9a-f634-95cf-7419a3e93c23",
            "singularName": "Full Control",
            "pluralName": "Content (Full Control)",
            "fullName": "Content (Full Control)",
            "targetEntity": "Content",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "d61ef4ac-4da7-5f34-d9ba-6fc152313e26",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.69Z"
            },
                        {
               "entityId": null,
               "operationUID": "d61ef4ac-4da7-5f34-d9ba-6fc152313e26",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.817Z"
            },
                        {
               "entityId": null,
               "operationUID": "d61ef4ac-4da7-5f34-d9ba-6fc152313e26",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.077Z"
            },
                        {
               "entityId": null,
               "operationUID": "d61ef4ac-4da7-5f34-d9ba-6fc152313e26",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.39Z"
            },
                        {
               "entityId": null,
               "operationUID": "d61ef4ac-4da7-5f34-d9ba-6fc152313e26",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.127Z"
            },
                        {
               "entityId": null,
               "operationUID": "d61ef4ac-4da7-5f34-d9ba-6fc152313e26",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.65Z"
            }
         ]
      },
            {
         "uid": "5e5354dc-5ef6-4d9e-a832-a8f1014c85ad",
         "singularName": "Update Content",
         "pluralName": "Update Content",
         "fullName": "Content (Full Control) - Update Content",
         "targetEntity": "Content",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "39e69897-8d9a-f634-95cf-7419a3e93c23",
            "singularName": "Full Control",
            "pluralName": "Content (Full Control)",
            "fullName": "Content (Full Control)",
            "targetEntity": "Content",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "5e5354dc-5ef6-4d9e-a832-a8f1014c85ad",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.817Z"
            },
                        {
               "entityId": null,
               "operationUID": "5e5354dc-5ef6-4d9e-a832-a8f1014c85ad",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.077Z"
            },
                        {
               "entityId": null,
               "operationUID": "5e5354dc-5ef6-4d9e-a832-a8f1014c85ad",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.39Z"
            },
                        {
               "entityId": null,
               "operationUID": "5e5354dc-5ef6-4d9e-a832-a8f1014c85ad",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.68Z"
            },
                        {
               "entityId": null,
               "operationUID": "5e5354dc-5ef6-4d9e-a832-a8f1014c85ad",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.127Z"
            },
                        {
               "entityId": null,
               "operationUID": "5e5354dc-5ef6-4d9e-a832-a8f1014c85ad",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.65Z"
            }
         ]
      },
            {
         "uid": "ff7314eb-8094-42c7-8d86-9741d29ce7f1",
         "singularName": "Manage Tags",
         "pluralName": "Manage Tags",
         "fullName": "Content (Full Control) - Manage Tags",
         "targetEntity": "Content",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "39e69897-8d9a-f634-95cf-7419a3e93c23",
            "singularName": "Full Control",
            "pluralName": "Content (Full Control)",
            "fullName": "Content (Full Control)",
            "targetEntity": "Content",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "ff7314eb-8094-42c7-8d86-9741d29ce7f1",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.817Z"
            },
                        {
               "entityId": null,
               "operationUID": "ff7314eb-8094-42c7-8d86-9741d29ce7f1",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.077Z"
            },
                        {
               "entityId": null,
               "operationUID": "ff7314eb-8094-42c7-8d86-9741d29ce7f1",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.39Z"
            },
                        {
               "entityId": null,
               "operationUID": "ff7314eb-8094-42c7-8d86-9741d29ce7f1",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.68Z"
            },
                        {
               "entityId": null,
               "operationUID": "ff7314eb-8094-42c7-8d86-9741d29ce7f1",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.127Z"
            },
                        {
               "entityId": null,
               "operationUID": "ff7314eb-8094-42c7-8d86-9741d29ce7f1",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.65Z"
            }
         ]
      },
            {
         "uid": "8cba3c2c-c3ab-4b50-970d-6d6382a05856",
         "singularName": "Assign Content",
         "pluralName": "Assign Content",
         "fullName": "Content (Full Control) - Assign Content",
         "targetEntity": "Content",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "39e69897-8d9a-f634-95cf-7419a3e93c23",
            "singularName": "Full Control",
            "pluralName": "Content (Full Control)",
            "fullName": "Content (Full Control)",
            "targetEntity": "Content",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "8cba3c2c-c3ab-4b50-970d-6d6382a05856",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.817Z"
            },
                        {
               "entityId": null,
               "operationUID": "8cba3c2c-c3ab-4b50-970d-6d6382a05856",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.077Z"
            },
                        {
               "entityId": null,
               "operationUID": "8cba3c2c-c3ab-4b50-970d-6d6382a05856",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.39Z"
            },
                        {
               "entityId": null,
               "operationUID": "8cba3c2c-c3ab-4b50-970d-6d6382a05856",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.68Z"
            },
                        {
               "entityId": null,
               "operationUID": "8cba3c2c-c3ab-4b50-970d-6d6382a05856",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.127Z"
            },
                        {
               "entityId": null,
               "operationUID": "8cba3c2c-c3ab-4b50-970d-6d6382a05856",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.65Z"
            }
         ]
      },
            {
         "uid": "2080cb7c-813a-4e9f-90c4-2af213d78d88",
         "singularName": "Unassign Content",
         "pluralName": "Unassign Content",
         "fullName": "Content (Full Control) - Unassign Content",
         "targetEntity": "Content",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "39e69897-8d9a-f634-95cf-7419a3e93c23",
            "singularName": "Full Control",
            "pluralName": "Content (Full Control)",
            "fullName": "Content (Full Control)",
            "targetEntity": "Content",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "2080cb7c-813a-4e9f-90c4-2af213d78d88",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.817Z"
            },
                        {
               "entityId": null,
               "operationUID": "2080cb7c-813a-4e9f-90c4-2af213d78d88",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.077Z"
            },
                        {
               "entityId": null,
               "operationUID": "2080cb7c-813a-4e9f-90c4-2af213d78d88",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.39Z"
            },
                        {
               "entityId": null,
               "operationUID": "2080cb7c-813a-4e9f-90c4-2af213d78d88",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.68Z"
            },
                        {
               "entityId": null,
               "operationUID": "2080cb7c-813a-4e9f-90c4-2af213d78d88",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.127Z"
            },
                        {
               "entityId": null,
               "operationUID": "2080cb7c-813a-4e9f-90c4-2af213d78d88",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.65Z"
            }
         ]
      },
            {
         "uid": "9cfe2e6c-bb4f-404e-b94e-54d4d705b299",
         "singularName": "Edit Permissions",
         "pluralName": "Edit Permissions",
         "fullName": "Content (Full Control) - Edit Permissions",
         "targetEntity": "Content",
         "appliance": "Collection",
         "parent":          {
            "uid": "39e69897-8d9a-f634-95cf-7419a3e93c23",
            "singularName": "Full Control",
            "pluralName": "Content (Full Control)",
            "fullName": "Content (Full Control)",
            "targetEntity": "Content",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "9cfe2e6c-bb4f-404e-b94e-54d4d705b299",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.817Z"
            },
                        {
               "entityId": null,
               "operationUID": "9cfe2e6c-bb4f-404e-b94e-54d4d705b299",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.077Z"
            },
                        {
               "entityId": null,
               "operationUID": "9cfe2e6c-bb4f-404e-b94e-54d4d705b299",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.39Z"
            },
                        {
               "entityId": null,
               "operationUID": "9cfe2e6c-bb4f-404e-b94e-54d4d705b299",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.68Z"
            },
                        {
               "entityId": null,
               "operationUID": "9cfe2e6c-bb4f-404e-b94e-54d4d705b299",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.127Z"
            },
                        {
               "entityId": null,
               "operationUID": "9cfe2e6c-bb4f-404e-b94e-54d4d705b299",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.65Z"
            }
         ]
      },
            {
         "uid": "1aab37d3-1540-9c34-b116-62090419488e",
         "singularName": "Delete Content",
         "pluralName": "Delete Content",
         "fullName": "Content (Full Control) - Delete Content",
         "targetEntity": "Content",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "39e69897-8d9a-f634-95cf-7419a3e93c23",
            "singularName": "Full Control",
            "pluralName": "Content (Full Control)",
            "fullName": "Content (Full Control)",
            "targetEntity": "Content",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "1aab37d3-1540-9c34-b116-62090419488e",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.15Z"
            },
                        {
               "entityId": null,
               "operationUID": "1aab37d3-1540-9c34-b116-62090419488e",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.817Z"
            },
                        {
               "entityId": null,
               "operationUID": "1aab37d3-1540-9c34-b116-62090419488e",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.077Z"
            },
                        {
               "entityId": null,
               "operationUID": "1aab37d3-1540-9c34-b116-62090419488e",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.39Z"
            },
                        {
               "entityId": null,
               "operationUID": "1aab37d3-1540-9c34-b116-62090419488e",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.68Z"
            },
                        {
               "entityId": null,
               "operationUID": "1aab37d3-1540-9c34-b116-62090419488e",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.65Z"
            }
         ]
      }
   ],
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
         "principal":          {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:45.817Z"
      },
            {
         "entityId": null,
         "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
         "principal":          {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:46.077Z"
      },
            {
         "entityId": null,
         "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
         "principal":          {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:46.39Z"
      },
            {
         "entityId": null,
         "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
         "principal":          {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:46.68Z"
      },
            {
         "entityId": null,
         "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
         "principal":          {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:47.127Z"
      },
            {
         "entityId": null,
         "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
         "principal":          {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:47.65Z"
      }
   ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/ 

Returns object permissions for the specified Content file

**Required Scope Token**

bsn.api.main.content.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the specified Content. This value is generated by the server when the Content file is uploaded.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `1234567`

```text
GET /2022/06/REST/Content/1234567/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 1234567,
    "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
    "principal": {
      "login": "JohnDoe@brightsign.biz",
      "type": "User",
      "id": 101026
    },
    "isFixed": true,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-09-08T17:15:36.013Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/ 

Adds permissions to the specified Content file

**Required Scope Token**

bsn.api.main.content.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Content. This value is generated by the server when the Content file is uploaded.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
POST /2022/06/REST/Content/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 313
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
    "principal": {
      "login": "JohnDoe@brightsign.biz",
      "type": "User",
      "id": 101026
    },
    "isFixed": true,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  },
  {
    "entityId": 12345,
    "operationUID": "ff7314eb-8094-42c7-8d86-9741d29ce7f1",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified Content

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist) 

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/ 

Removes permissions from the specified Content file

**Required Scope Token**

bsn.api.main.content.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Content file. This value is generated by the server when the Content file is uploaded.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
DELETE /2022/06/REST/Content/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 313
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "39e69897-8d9a-f634-95cf-7419a3e93c23",
    "principal": {
      "login": "JohnDoe@brightsign.biz",
      "type": "User",
      "id": 101026
    },
    "isFixed": true,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  },
  {
    "entityId": 12345,
    "operationUID": "ff7314eb-8094-42c7-8d86-9741d29ce7f1",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions have been removed from the specified Content file 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance to the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] FileInfo Entity and Derived Structures (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

FileInfo is primarily related to the Presentation entity but is used in limited way by other entities as well. See [Mapping Media Type References](docId:-4Cfj_WoodAbYkXTlxXfO) for more information about using this data type.

The FileInfo collection may contain the elements below in JSON representation:

## DynamicPlaylistFile Entity

DynamicPlaylistFlle ('FileInfo.Type' property set to "DynamicPlaylist") is derived from the 'StoredFile' structure, and is used to reference dynamic playlists existing in BSN by ID. See the example below (your values will vary for all but "type"):

```json
{
   "type": "DynamicPlaylist", // [string], structure data type visible only in JSON representation and used by de-serializer to determine expected property set of this object instance
   "name": "My First Dynamic Playlist", // [string]
   "size": 912, // [uint]
   "hash": "SHA1:E7BA1A1668AB68E6A0090A0A950D43A25A316D8E", // [string]
   "creationDate": "2017-01-15T23:46:46.287Z", // [DateTime]
   "lastModifiedDate": "2018-01-11T10:17:17.960Z", // [DateTime]
   "id": 31711, // [int]
   "path": "http://localhost:8081/Content/DynamicPlaylists/My First Dynamic Playlist.xml" // [URI]
}
```

## LiveMediaFeedFile Entity

LiveMediaFeedFile ('FileInfo.Type' property set to "LiveMediaFeed") is derived from the 'StoredFile' structure, and is used to reference live media feeds existing in BSN by ID. See the example below (your values will vary for all but "type"):

```json
{
   "type": "LiveMediaFeed", // [string], structure data type visible only in JSON representation and used by de-serializer to determine expected property set of this object instance
   "name": "My First Live Media Feed", // [string]
   "size": 378, // [uint]
   "hash": "SHA1:4DA06FEE7FDDA07511BC4A876CF79989D034550B", // [string]
   "creationDate": "2017-02-08T00:17:38.130Z", // [DateTime]
   "lastModifiedDate": "2017-06-08T11:32:41.280Z", // [DateTime]
   "id": 47324, // [int]
   "path": "http://localhost:8081/Content/LiveMediaFeeds/My First Live Media Feed.xml" // [URI]
}
```

## LiveTextFeedFile Entity

LiveTextFeedFile ('FileInfo.Type' property set to "LiveTextFeed") is derived from the 'StoredFile' structure, and is used to reference live text feeds existing in BSN by ID. See the example below (your values will vary for all but "type"):

```json
{
   "type": "LiveTextFeed", // [string], structure data type visible only in JSON representation and used by de-serializer to determine expected property set of this object instance
   "name": "My First Live Text Feed", // [string]
   "size": 912, // [uint]
   "hash": "SHA1:2C95B879DD75A398CB37AAA7851F3ACBC5CE7419", // [string]
   "creationDate": "2017-02-08T00:17:57.573Z", // [DateTime]
   "lastModifiedDate": "2018-01-09T23:39:02.123Z", // [DateTime]
   "id": 47325, // [int]
   "path": "http://localhost:8081/Content/Eugene/Feeds/My First Live Text Feed.xml" // [URI]
}
```

## Mapping Media Type References

Given the FileInfo data types hierarchy, this chart describes the mapping between media types and how to reference them in a presentation creation or update request. Note that elements will be upgraded to the highest matching type in the server response. For example, if you reference "Dynamic Playlist" by the "StoredFile" element it will be returned as a "DynamicPlaylistFile".

|                     | (External) | Auxiliary | Stylesheet | Font | Text | Image | Video | Audio | Dynamic Playlist | Tagged Playlist | Live Text Feed | Live Media Feed | Webpage |
| ------------------- | ---------- | --------- | ---------- | ---- | ---- | ----- | ----- | ----- | ---------------- | --------------- | -------------- | --------------- | ------- |
| NewFile             | X          | X         | X          | X    | X    | X     | X     | X     |                  |                 |                |                 |         |
| RemoteFile          | X          | X         | X          | X    | X    | X     | X     | X     | X                | X               | X              | X               | X       |
| StoredFile          |            | X         | X          | X    | X    | X     | X     | X     | X                | X               | X              | X               | X       |
| MediaFile           |            |           |            |      | X    | X     | X     | X     |                  |                 |                |                 |         |
| DynamicPlaylistFile |            |           |            |      |      |       |       |       | X                |                 |                |                 |         |
| TaggedPlaylistFile  |            |           |            |      |      |       |       |       |                  | X               |                |                 |         |
| LiveTextFeedFile    |            |           |            |      |      |       |       |       |                  |                 | X              |                 |         |
| LiveMediaFeedFile   |            |           |            |      |      |       |       |       |                  |                 |                | X               |         |
| WebPageFile         |            |           |            |      |      |       |       |       |                  |                 |                |                 | X       |

## MediaFile Entity

MediaFile('FileInfo.Type' property set to "Media") derived from the 'StoredFile' structure, and is used to reference uploaded files visible in the BSN Content Library by ID. See the example below (your values will vary for all but "type"):

```json
{
   "type": "Media", // [string], structure data type visible only in JSON representation and used by de-serializer to determine expected property set of this object instance
   "name": "Odessa Rain.jpg", // [string]
   "size": 226675, // [uint]
   "hash": "SHA1:4B55491958FC06E904D78BF2C965B47629FC5D16", // [string]
   "creationDate": "2017-05-22T16:20:26.430Z", // [DateTime]
   "lastModifiedDate": "2016-09-20T09:39:42.253Z", // [DateTime]
   "id": 64947, // [int]
   "mediaType": "Image", // one of { "Text", "Image", "Video", "Audio" } enumeration values
   "path": "http://localhost:8081/Content/Images/782e4c7d-f5a1-4b21-bd76-3706fff20063.jpg" // [URI]
}
```

## NewFile Entity

NewFile ('FileInfo.Type' property set to "New") is derived from the abstract 'FileInfo' structure, and is used to upload small files and for complete presentation creation or updates. See the example below (your values will vary for all but "type"):

```json
{
   "type": "New", // [string], structure data type visible only in JSON representation and used by de-serializer to determine expected property set of this object instance
   "name": "hello.txt", // [string]
   "size": 12, // [uint]
   "hash": "", // [string]
   "creationDate": null, // [DateTime]
   "lastModifiedDate": null, // [DateTime]
   "body": "SGVsbG8gV29ybGQh", // [string]
   "transferEncoding": "BASE64" // one of { "None", "BASE64" } enumeration values
}
```

## RemoteFile Entity

RemoteFile ('FileInfo.Type' property set to "Remote") is derived from the abstract 'FileInfo' structure, and is used to reference remote resources or even files uploaded to BSN by URL. See the example below (your values will vary for all but "type"):

```json
{
   "type": "Remote", // [string], structure data type visible only in JSON representation and used by de-serializer to determine expected property set of this object instance
   "name": "autoplugins.brs", // [string]
   "size": 222, // [uint]
   "hash": "SHA1:EC121A89DFEE4E62AA94FAC4B9D80F13EA6B0FD6", // [string]
   "creationDate": null, // [DateTime]
   "lastModifiedDate": null, // [DateTime]
   "path": "https://bsn-staging.s3.amazonaws.com/Content/Autoplugins/autoplugins-EC121A89DFEE4E62AA94FAC4B9D80F13EA6B0FD6.brs" // one of { "None", "BASE64" } enumeration values
}
```

## StoredFile Entity

StoredFile ('FileInfo.Type' property set to "Stored") is derived from the abstract 'FileInfo' structure, and is used to reference any file uploaded to BSN by ID. See the example below (your values will vary for all but "type"):

```json
{
   "type": "Stored", // [string], structure data type visible only in JSON representation and used by de-serializer to determine expected property set of this object instance
   "name": "autoplugins.brs", // [string]
   "size": 222, // [uint]
   "hash": "SHA1:EC121A89DFEE4E62AA94FAC4B9D80F13EA6B0FD6", // [string]
   "creationDate": null, // [DateTime]
   "lastModifiedDate": null, // [DateTime]
   "id": 9804728, // [int]
   "path": "https://bsn-staging.s3.amazonaws.com/Content/Autoplugins/autoplugins-EC121A89DFEE4E62AA94FAC4B9D80F13EA6B0FD6.brs" // [URI]
}
```

## TaggedPlaylistFile Entity

TaggedPlaylistFile ('FileInfo.Type' property set to "TaggedPlaylist") is derived from the 'StoredFile' structure, and is used to reference tagged playlists existing in BSN by ID. See the example below (your values will vary for all but "type"):

```json
{
   "type": "TaggedPlaylist", // [string], structure data type visible only in JSON representation and used by de-serializer to determine expected property set of this object instance
   "name": "My First Tagged Playlist", // [string]
   "size": 0, // [uint]
   "hash": "SHA1:E7BA1A1668AB68E6A0090A0A950D43A25A316D8E", // [string]
   "creationDate": "2017-02-08T00:00:55.273Z", // [DateTime]
   "lastModifiedDate": "2017-02-08T00:00:55.273Z", // [DateTime]
   "id": 47323, // [int]
   "path": "http://localhost:8080/bs/GetFile.ashx?type=TaggedPlaylist&token=7E2DBC0CC21E2449D06CA32836AD86BB" // [URI]
}
```

## WebPageFile Entity

WebPageFile ('FileInfo.Type' property set to "WebPage") is derived from the 'StoredFile' structure, and is used to reference (regular) webpages uploaded to BSN by ID. See the example below (your values will vary for all but "type"):

```json
{
   "type": "WebPage", // [string], structure data type visible only in JSON representation and used by de-serializer to determine expected property set of this object instance
   "name": "My First Web Page", // [string]
   "size": 20224, // [uint]
   "hash": "SHA1:1F224E31B9265062BE58E7D12FE3332E03536D48", // [string]
   "creationDate": "2017-02-19T20:10:11.287Z", // [DateTime]
   "lastModifiedDate": "2016-12-01T23:46:35.793Z", // [DateTime]
   "id": 47487, // [int]
   "path": "http://localhost:8081/Content/WebPages/9184f22b-51da-42e3-9900-c9c5bba03e6e.html" // [URI]
}
```


[title] Custom Data Types (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/

The data types below, which are consistent across all APIs, are used in the BSN.cloud Main API as are the entities in the child pages beneath this page.

## DateTime

Defines a moment in time using a sortable UTC pattern value format, based on [rfc3339](https://datatracker.ietf.org/doc/html/rfc3339). An example would be 2022-02-18T16:57:00.123Z 

## DayOfWeek

Represents the day of the week from Sunday to Saturday. The days are specified as a string list (for example, "Monday, Wednesday, Friday").  

## Nullable\<int>

Data types that are prefixed with "nullable" (for example, nullable\<int>) accept null value. Most data types are not nullable in this API framework, so this data type allows you to accept null for a non-nullable type. By default, nullable types are strings, objects, and arrays.

## TimeSpan

Represents a period of time. Possible values are: 

- 00:00 - 23:59 (hours and minutes)
- 00:00:00 - 23:59:59 (hours, minutes, and seconds. This is the default format)
- 00:00:00.000 - 23:59:59.999 (hours, minutes, seconds, and milliseconds)
- 1.00:00:00 - 99999.23:59:59 (date, hours, minutes, seconds)
- 1.00:00:00.000 - 99999.23:59:59.999 (date, hours, minutes, seconds, and milliseconds)

## Uri

A representation of a resource available on the internet or intranet. This data type is nullable.


[title] WebPageUploadStatus (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The WebPageUploadStatus entity is structured as follows:

`entity`:

- `SessionToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The WebPage Upload Session Token generated by the server
- `UploadToken` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The WebPage Upload Token generated by the server
- `ContentId` <font color="#704ae0">int </font><font color="#01a0af">read-only</font>: The identifier of the uploaded WebPage in the library
- `Name` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The name of the WebPage being uploaded
- `FileName` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The name of an index file of Web Page/Site being uploaded
- `FileSize` <font color="#704ae0">long </font><font color="#01a0af">read-only</font>: The size in bytes of an index file of Web Page/Site being uploaded&#x20;
- `SHA1Hash` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The SHA1 hash of an index file of Web Page/Site being uploaded
- `State` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: One of the [UploadStatus Enumeration (2019/03)](docId\:s0Gj0owfjf9OKNId86stN) values
- `StartTime` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">DateTime&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The timestamp of WebPage Upload Session start
- `EndTime` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">DateTime&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The timestamp of WebPage Upload Session end
- `LastActivityTime` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">DateTime&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The timestamp of the last activity in the scope of the WebPage Upload Session
- `Chunks` <font color="#704ae0">ContentChunkStatus[] </font><font color="#01a0af">read-only</font>: The progress of an index file upload represented by the array of [ContentChunkStatus (2019/03)](docId\:MxHDQ_5ih5SKYEWwBtWTz) items
- `Assets` <font color="#704ae0">ContentUploadStatus[</font>]<font color="#704ae0"> </font><font color="#01a0af">read-only</font>: The status of the WebPage Assets upload represented by the array of [ContentUploadStatus (2019/03)](docId\:f5sqGRaUaymNao-bbjaJe) items








[title] Storage Status Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

The Storage Status entity is as follows:

`Entity`:

- `Interface` <font color="#704ae0">StorageInterface</font>: One of "Internal", "Tmp", "Flash", "SD1", "USB1" enumeration values which represent "/storage/sd2", "/storage/ssd", "/storage/tmp", "/storage/flash", "/storage/sd1", and "/storage/usb1" storage on the player side.
- `System` <font color="#704ae0">FileSystem</font>: One of \{ "exFAT", "ext3", "ext4", "FAT12", "FAT16", "FAT32", "HFS", "HFSplus", "NTFS", "Unknown" } enumeration values
- `Access` <font color="#704ae0">AccessMode</font>: One or more \{ "Read", "Write" } enumeration values
- `Stats` <font color="#704ae0">DynamicObject</font>: The contents of the response depends on factors such as the OS implementation, plugins, services, etc., but in general this reports the diagnostic storage status information (free size, used size, block size, etc.):
  - `sizeTotal` <font color="#704ae0">long</font>
  - `sizeFree` <font color="#704ae0">long</font>
  - `blockSize` <font color="#704ae0">long</font>


[title] Tagged Groups Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Tagged Groups entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font>: A unique identifier for the tagged group instance
- `Name` <font color="#704ae0">string</font>: The name of the tagged group instance. The maximum length of this string is 50 characters.
- `Rule` <font color="#704ae0">string</font>: Defines a tag-based expression, and based on that expression, the system will assign players to this tag. For example, an expression can select for players having a WiFi connection with 10GB of free space on an SD1 disk.
- `IsDynamic` <font color="#704ae0">bool</font>: Whether the tagged group instance is dynamic or static. Dynamic groups get populated by players automatically. Players must be manually assigned to static groups even if a rule exists.
- `Description` <font color="#704ae0">string</font>: The customer-defined description of the tagged group. The maximum length of this string is 256 characters.
- `HasChanges` <font color="#704ae0">bool</font>: Whether the tagged (static) group instance has changes. This indicates if changes occurred on the player side. If so, the list of matches is no longer valid and needs to be manually updated.
- `CreationDate` <font color="#704ae0">DateTime</font>: Indicates when the tagged group was created on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font>: Indicates when the tagged group was last modified on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `DevicesCount` <font color="#704ae0">ushort</font>: The number of players that are members of the tagged group (players can be part of many groups, and groups can contain many players).
- `DevicesHealthStatus` <font color="#704ae0">DeviceHealthStatus[]</font>: Returns one of "Ok", "Warning", or "Error", depending on the player's health
- `Devices` <font color="#704ae0">DeviceInfo[]</font>: Supported representations include:
  - `Id` <font color="#704ae0">int</font>: The unique identifier for the device
  - `Serial` <font color="#704ae0">string</font>: The device serial number
- `Permissions` <font color="#704ae0">Permission[]</font>: A list of permission object instances representing permissions rules assigned to the tagged group instance




[title] Player Network Interface Settings Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

The Player Network Interface settings entities follow one of the structures below, depending on the type of network interface (see `Type`):

`Player Network Interface Settings` (this is the base definition):

- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The target network interface name (typically "eth0", “usb0”, “wlan0”, or “ppp0”)
- `Type` <font color="#704ae0">PlayerNetworkInterfaceType</font> <font color="#01a0af">read-only</font>: One of "Ethernet”, “WiFi”, “Virtual”, “Cellular”, or “Other”

`Player Ethernet Interface Settings`:

- `Enabled` <font color="#704ae0">bool</font> <font color="#01a0af">r</font><font color="#01a0af">ead-write</font>: Whether the player Ethernet settings are enabled
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The target network interface name (typically “eth0”)
- `Type` <font color="#704ae0">PlayerNetworkInterfaceType</font> <font color="#01a0af">read-only</font>: "Ethernet”
- `Proto` <font color="#704ae0">NetworkConfigurationProtocol</font> <font color="#01a0af">read-write</font>: Defines a configuration protocol or given network interface such as "Static" or "DHCPv4"
- `IP` <font color="#704ae0">string[]</font> <font color="#01a0af">read-write</font>: In the “Static” network configuration, this defines the target IPv4 address (in CIDR notation) to apply by the current network interface.
- `Gateway` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: In the “Static” network configuration, this defines the optional IPv4 address of the default gateway to be used by the current network interface. When absent, this interface is link local only.
- `DNS` <font color="#704ae0">string[]</font> r<font color="#01a0af">ead-write</font>: The DNS address(es) of the device
- `RateLimitDuringInitialDownloads` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation during initial downloads. When set to “Null” the rate is unlimited.
- `RateLimitInsideContentDownloadWindow` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation during content downloads. When set to “Null” the rate is unlimited. The "Content" start and end timespans in the [Player Synchronization Settings Entity (2022/06)](docId:9wQlt7eW-kTnaOgp5WTjD) define the inside content download window.
- `RateLimitOutsideContentDownloadWindow` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation when content is not being downloaded. When set to “Null” the rate is unlimited.
- `ContentDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether content data is allowed to be downloaded using this connection
- `TextFeedsDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether text feed data is allowed to be downloaded using this connection
- `MediaFeedsDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether media feed data is allowed to be downloaded using this connection
- `HealthReportingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether uploading health reporting data is enabled using this connection
- `LogsUploadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether uploading log updates is enabled using this connection

`Player Virtual Interface Settings`:

- `Enabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Defines whether the particular virtual network interface is enabled
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The target network interface name (typically "eth0.110")
- `Type` <font color="#704ae0">PlayerNetworkInterfaceType</font> <font color="#01a0af">read-only</font>: "Virtual”
- `Parent`  <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the associated link or parent ethernet interface.
- `VlanId` <font color="#704ae0">ushort</font> <font color="#01a0af">read-write</font>: The identifier of the virtual interface
- `Proto` <font color="#704ae0">NetworkConfigurationProtocol</font> <font color="#01a0af">read-write</font>: Defines a configuration protocol or given network interface such as "Static" or "DHCPv4"
- `IP` <font color="#704ae0">string[]</font> <font color="#01a0af">read-write</font>: In the “Static” network configuration, this defines the target IPv4 address (in CIDR notation) to apply by the current network interface.
- `Gateway` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The IPv4 address of the player. "Null" means that a default route is absent.
- `DNS` <font color="#704ae0">string[]</font> <font color="#01a0af">read-write</font>: The DNS address(es) of the device
- `RateLimitDuringInitialDownloads` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation during initial downloads. When set to “Null” the rate is unlimited.
- `RateLimitInsideContentDownloadWindow` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation during content downloads. When set to “Null” the rate is unlimited. The "Content" start and end timespans in the [Player Synchronization Settings Entity (2022/06)](docId:9wQlt7eW-kTnaOgp5WTjD) define the inside content download window.
- `RateLimitOutsideContentDownloadWindow` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation when content is not being downloaded. When set to “Null” the rate is unlimited.
- `ContentDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether content data is allowed to be downloaded using this connection
- `TextFeedsDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether text feed data is allowed to be downloaded using this connection
- `MediaFeedsDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether media feed data is allowed to be downloaded using this connection
- `HealthReportingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether uploading health reporting data is enabled using this connection
- `LogsUploadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether uploading log updates is enabled using this connection

`Player WiFi Interface Settings`:

- `Enabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether the player WiFi settings are enabled
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The target network interface name (typically "wlan0")
- `Type` <font color="#704ae0">PlayerNetworkInterfaceType</font> <font color="#01a0af">read-only</font>: "WiFi”
- `SSID` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The SSID (seen by users as a wireless network name)
- `Security` <font color="#704ae0">WiFiSecuritySettings</font> <font color="#01a0af">read-write</font>: Defines the authentication and encryption settings to be used:
  - `authentication`:
    - `mode` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: One of "Open", "Shared", "EAP", "Other" enumeration values
    - `passphrase` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: Applies only to "Shared" mode
  - `encryption`:
    - `mode` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: One of "None", "WEP", "TKIP", "AES", "Other" enumeration values
- `Proto` <font color="#704ae0">NetworkConfigurationProtocol</font> <font color="#01a0af">read-write</font>: Defines a configuration protocol or given network interface such as "Static" or "DHCPv4"
- `IP` <font color="#704ae0">string[]</font> <font color="#01a0af">read-write</font>: In the “Static” network configuration, this defines the target IPv4 address (in CIDR notation) to apply by the current network interface.
- `Gateway` <font color="#704ae0">string</font> read-write: The IPv4 address of the player. "Null" means that a default route is absent.
- `DNS` <font color="#704ae0">string[]</font> <font color="#01a0af">read-write</font>: The DNS address(es) of the device
- `RateLimitDuringInitialDownloads` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation during initial downloads. When set to “Null” the rate is unlimited.
- `RateLimitInsideContentDownloadWindow` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation during content downloads. When set to “Null” the rate is unlimited. The "Content" start and end timespans in the [Player Synchronization Settings Entity (2022/06)](docId:9wQlt7eW-kTnaOgp5WTjD) define the inside content download window.
- `RateLimitOutsideContentDownloadWindow` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation when content is not being downloaded. When set to “Null” the rate is unlimited.
- `ContentDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether content data is allowed to be downloaded using this connection
- `TextFeedsDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether text feed data is allowed to be downloaded using this connection
- `MediaFeedsDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether media feed data is allowed to be downloaded using this connection
- `HealthReportingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether uploading health reporting data is enabled using this connection
- `LogsUploadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether uploading log updates is enabled using this connection

`Player Cellular Interface Settings`:

- `Enabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether the player cellular network interface settings are enabled
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The target network interface name (typically “ppp0”)
- `Type` <font color="#704ae0">PlayerNetworkInterfaceType</font> <font color="#01a0af">read-only</font>: "Cellular”
- `Modems` <font color="#704ae0">PlayerCellularModemSettings[]</font> <font color="#01a0af">read-write</font>: A collection of the cellular modems `supported` by this network interface
  - `Model` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The model name of the supported cellular modem
  - `USBDeviceIds` <font color="#704ae0">string[]</font><font color="#01a0af"> read-write</font>: The identifiers of the supported cellular modems
- `SIMS` <font color="#704ae0">PlayerCellularModuleSettings[]</font> <font color="#01a0af">read-write</font>: A collection of the supported SIM cards
  - `MCC` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The mobile country code
  - `MNC` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The mobile network code
  - `Connection` <font color="#704ae0">PlayerCellularConnectionSettings</font> <font color="#01a0af">read-write</font>: The connection options to apply with this SIM card
- `RateLimitDuringInitialDownloads` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation during initial downloads. When set to “Null” the rate is unlimited.
- `RateLimitInsideContentDownloadWindow` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation during content downloads. When set to “Null” the rate is unlimited. The "Content" start and end timespans in the [Player Synchronization Settings Entity (2022/06)](docId:9wQlt7eW-kTnaOgp5WTjD) define the inside content download window.
- `RateLimitOutsideContentDownloadWindow` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The data rate limitation when content is not being downloaded. When set to “Null” the rate is unlimited.
- `ContentDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether content data is allowed to be downloaded using this connection
- `TextFeedsDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether text feed data is allowed to be downloaded using this connection
- `MediaFeedsDownloadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether media feed data is allowed to be downloaded using this connection
- `HealthReportingEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether uploading health reporting data is enabled using this connection
- `LogsUploadEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether uploading log updates is enabled using this connection


[title] Person Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Person entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier for the person
- `Login` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The login email associated with the person
- `Password` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The password associated with the person
- `FirstName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The first name of the person
- `LastName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The last name of the person
- `CreationDate` <font color="#704ae0">DateTime</font><font color="#01a0af"> read-only</font>: A timestamp of a person's registration in BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp of when the personal information was last edited. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ActivationDate` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-only</font>: A timestamp of a person's email address verification. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.


[title] WebPage Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All WebPage entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier for the webpage entity
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the webpage entity. The maximum length of this string is 50 characters.
- `UploadDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the webpage instance was uploaded. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the webpage instance was last modified. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `IndexFile` <font color="#704ae0">WebPageAsset</font> <font color="#01a0af">read-write</font>: The [WebPage Asset](docId\:v9GQTYryzsBhf9Q3-3Y9u) entity for the webpage index file
- `Assets` <font color="#704ae0">WebPageAsset[]</font> <font color="#01a0af">read-write</font>: An array of [WebPage Asset](docId\:v9GQTYryzsBhf9Q3-3Y9u) entities for assets associated with the webpage
- `Presentations` <font color="#704ae0">PresentationInfo[]</font> <font color="#01a0af">read-only</font>: An array of [Presentation Info](docId\:rH_TKLzOo3RPBID0mDC9v) structures which indicate/reference presentations which include this web page.
- `Permissions` <font color="#704ae0">Permission[]</font> <font color="#01a0af">read-write</font>: A list of permission object instances representing permissions rules assigned to the webpage instance&#x20;




[title] Network Settings Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Network Settings entities are structured as follows:

`entity:`

- `UserAccessTokenLifetime` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The amount of time that a full access token for a user and a network remains valid. If not specified, this value defaults to 15 minutes. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `UserRefreshTokenLifetime` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The amount of time that a refresh token for a user and a network remains valid (for example, "30.00:00:00"). See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `DeviceAccessTokenLifetime` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The amount of time that an access token for a device remains valid. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `DeviceRefreshTokenLifetime` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The amount of time that a refresh token for a device remains valid. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `DeviceRegistrationTokenLifetime` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The amount of time that a device registration token remains valid. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `AutomaticTaggedPlaylistApprovalEnabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: If true, automatic tagged playlist are approved on this network
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The last date on which the subscription was modified, if available. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.


[title] Scheduled Presentation Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

The Scheduled Presentation entity is structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the scheduled presentation instance
- `PresentationId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: The identifier for the scheduled presentation instance
- `PresentationName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the scheduled presentation instance
- `IsRecurrent` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether the scheduled playback recurs every week
- `EventDate` <font color="#704ae0">Nullable&lt;DateTime&gt;</font> <font color="#01a0af">read-write</font>: Specifies the date when a non-recurrent presentation should begin playing. This value is null for recurring presentations. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `StartTime` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The time of day when playback begins. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Duration` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The duration of the playback window. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `RecurrenceStartDate` <font color="#704ae0">Nullable&lt;DateTime&gt;</font><font color="#01a0af"> read-write</font>: A timestamp indicating when recurring playback begins. If this value is null, then recurring playback begins immediately when scheduled. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `RecurrenceEndDate` <font color="#704ae0">Nullable&lt;DateTime&gt;</font> <font color="#01a0af">read-write</font>: A timestamp indicating when recurring playback ends. If this value is null, then recurring playback will not end. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `DaysOfWeek` <font color="#704ae0">DayOfWeek</font> <font color="#01a0af">read-write</font>: The days of the week during which the recurring schedule is active. See [DayOfWeek](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the ScheduledPresentation instance was created on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the ScheduledPresentation instance was last modified on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ExpirationDate` <font color="#704ae0">Nullable&lt;DateTime&gt;</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the scheduled presentation instance will expire. If this value is null, then the instance will never expire. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `InterruptScheduling` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the presentation can be interrupted. You can use this to schedule a presentation to interrupt a regular presentation at a specific time, but that interrupting presentation can not itself be interrupted.






[title] Player Settings Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Player Settings entities are structured as follows:

`entity`:

- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The player name. The maximum length of this string is 128 characters.
- `Description` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: A customer-defined description of the player. The description does not need to be unique within the scope of the account.
- `ConcatNameAndSerial` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: The player-naming method: `True` indicates that clients should append the device serial number to the player name, `False` indicates that nothing should be appended to the player name.
- `SetupType` <font color="#704ae0">DeviceSetupType</font> <font color="#01a0af">read-only</font>: Either "Standalone", "BSN", "LFN", "SFN", "PartnerApplication", or "Unknown"
- `Group` <font color="#704ae0">GroupInfo</font>:&#x20;
  - `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: The unique identifier for the group instance to which the device belongs.
  - `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the group instance to which the device belongs
- `BrightWall` <font color="#704ae0">object </font><font color="#01a0af">read-write</font>: This property is deprecated and will be removed in the next BSN.Cloud API version
- `Timezone` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The time zone of the player
- `Screen` <font color="#704ae0">DeviceScreenSettings</font>:&#x20;
  - `IdleColor` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The AARRGGBB color code for the idle screen
  - `SplashUrl` <font color="#704ae0">Uri</font> <font color="#01a0af">read-write</font>: The Uri address for the splash screen
- `Synchronization` <font color="#704ae0">PlayerSynchronizationSettings</font> <font color="#01a0af">read-write</font>: The [Player Synchronization Settings Entity](docId:9wQlt7eW-kTnaOgp5WTjD)&#x20;
- `Network` <font color="#704ae0">PlayerNetworkSettings</font> <font color="#01a0af">read-write</font>: The [Player Network Settings Entity](docId\:jLx8nx2W5TzDZSRyVoqDq)&#x20;
- `Beacons` <font color="#704ae0">DeviceBeacon[]</font> <font color="#01a0af">read-write</font>: An array of [Player Beacon](docId\:BsgHv6pw46ZE0xu2T2I8I) entities
- `Location` <font color="#704ae0">DeviceLocation</font>:&#x20;
  - `PlaceId` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The textual identifier of the player location
  - `GPSLatitude` <font color="#704ae0">Nullable&lt;double&gt;</font> <font color="#01a0af">read-write</font>: The latitude of the player location
  - `GPSLongitude` <font color="#704ae0">Nullable&lt;double&gt;</font> <font color="#01a0af">read-write</font>: The longitude of the player location
  - `Country` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The country in which the player is located (for example, "Germany")
  - `CountryLongName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The full name of the country in which the player is located (for example, "Federal Republic of Germany")
  - `AdminAreaLevel1` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The largest subnational administrative unit of a country (for example, "state" in the USA and "prefecture" in Japan) in which the player is located
  - `AdminAreaLevel1LongName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The full name of the largest subnational administrative unit of a country in which the player is located
  - `AdminAreaLevel2` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The county name (within the United States), or a second-order civil entity below adminAreaLevel1, in which the player is located.&#x20;
  - `AdminAreaLevel2LongName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The full county name (within the United States), or the full name of the second-order civil entity below adminAreaLevel1, in which the player is located.
  - `Locality` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the city, town, or rural area in which the player is located
  - `LocalityLongName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The full name of the city, town, or rural area in which the player is located
  - `Path` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The path property of the location structure. This value is the result of the concatenation of `Country`, `AdminAreaLevel1`, `AdminAreaLevel2`, and `Locality`.
  - `PathLongName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The path property of the location structure. This value is the result of the concatenation of `CountryLongName`, `AdminAreaLevel1LongName`, `AdminAreaLevel2LongName`, and `LocalityLongName`.
- `Screenshots` <font color="#704ae0">PlayerScreenshotsSettings</font>:&#x20;
  - `Interval` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: How often the player should take a snapshot of the presentation display. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
  - `CountLimit` <font color="#704ae0">ushort</font> <font color="#01a0af">read-write</font>: How many images can be stored on the local storage of the player (the maximum is 100 images)
  - `Quality` <font color="#704ae0">byte</font> <font color="#01a0af">read-write</font>: The quality level of each image file
  - `Orientation` <font color="#704ae0">ScreenOrientation</font><font color="#01a0af"> read-write</font>: One of "Unknown", "Landscape", "PortraitBottomLeft", or "PortraitBottomRight"
- `Logging` <font color="#704ae0">DeviceLogsSettings</font>:&#x20;
  - `EnableDiagnosticLog` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not diagnostic logging is enabled on the associated player
  - `EnableEventLog` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not event logging is enabled on the associated player
  - `EnablePlaybackLog` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not playback logging is enabled on the associated player
  - `EnableStateLog` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not state logging is enabled on the associated player
  - `EnableVariableLog` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not variable logging is enabled on the associated player
  - `UploadAtBoot` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether logs will be uploaded when the player boots
  - `UploadTime` <font color="#704ae0">Nullable&lt;TimeSpan&gt;</font> <font color="#01a0af">read-write</font>: The time when the player will upload logs to BSN.Cloud, if available. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LWS` <font color="#704ae0">LocalWebServerSettings</font>:&#x20;
  - `Username` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The local web server username (for example, "admin")
  - `Password` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The local web server password
  - `EnableUpdateNotifications` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not enable update notifications is enabled
- `LDWS` <font color="#704ae0">DiagnosticWebServerSettings</font>:&#x20;
  - `Password` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The password associated with the local diagnostic web server
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The date on which the settings were last modified. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.


[title] Role Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Role entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier for the role instance
- `IsCustom` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not the role is custom
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name associated with the role instance (for example, "Custom Administrators"). The maximum length of this string is 50 characters.
- `Description` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The customer-defined description of the role. The maximum length of this string is 256 characters.
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The date that the role was created. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `UserCount` <font color="#704ae0">ushort</font> <font color="#01a0af">read-only</font>: The number of users for the role instance
- `Users` <font color="#704ae0">UserInfo[]</font> <font color="#01a0af">read-only</font>: An array of the following information for each user assigned to the role instance:
  - `Login` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The login information for the user
- `Permissions`<font color="#704ae0"> Permission[]</font> <font color="#01a0af">read-write</font>: A list of permission object instances representing permissions rules assigned to the user




[title] Player Error Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

The structure of the Player Error entity is defined on the device level, so different properties will be returned depending on the type of error (for example, not all errors will return the response code).

Player error entities are structured as follows:

- `Timestamp` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: Indicates the most recent time that the player reported an error. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ErrorName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: One of:
  - Source field and device field of error event returned from operating system, in the event of a disk error
  - "Failed to download sync list", if there was an error downloading the sync list
  - The name of the new sync spec, if there was an unexpected error attempting to launch a sync spec download
  - The name of the file that failed to download, if a single file failed to download from BSN
  - None, if one or more files failed during a content download from BSN.
  - The event name, as returned from the operating system, if there was a failure when copying a new script or new firmware file into the root folder after the file has been downloaded into the pool
  - The name in the current sync spec, if the operation to protect certain files from deletion failed
- `ErrorEvent` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>:  One of "Disk error", "deviceError",  "FileDownloadFailure”, “POOL\_EVENT\_ALL\_FAILED”, or “Realize Failure”, depending on the type of error.
- `Reason` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: One of:
  - The failure reason, as returned by the operating system
  - The error field of the error event returned from the operating system, in the case of a disk error
  - The failure reason, as returned by the operating system, or the response code from the OS if no failure reason was present, in the case of an error downloading a sync list
  - “AsyncDownloadFailure:” followed by the failure reason as returned by the operating system, if an unexpected error occurred when attempting to launch a sync spec download
  - "ProtectFilesFailure: AssetPool Protect Failure" if the operation to protect certain files from deletion failed
- `ResponseCode` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: One of:
  - The response code returned by the operating system
  - The parameter field of the error event returned by the operating system, if the error is a disk error
  - The value returned by the GetEvent call to the operating system on the returned event object, if the error is a failure when copying a new script or new firmware file into the root folder after the file has been downloaded into the pool
  - There will be no response code if the error is an unexpected error when attempting to launch a sync spec download, or the operation to protect certain files from deletion failed
  - Some errors will not return a response code


[title] Player Subscription Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Player Subscription entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-onl</font><font color="#01a0af">y</font>: The unique identifier for the subscription instance
- `Device` <font color="#704ae0">DeviceInfo</font> <font color="#01a0af">read-only</font>:&#x20;
  - `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier for the player
  - `Serial` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The serial number of the player
- `Type` <font color="#704ae0">PlayerSubscriptionType</font> <font color="#01a0af">read-only</font>: Whether the network is "Content" or "Control"
- `ActivityPeriod` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-only</font>: The time span during which the subscription has been active. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Status` <font color="#704ae0">DeviceSubscriptionStatus</font> <font color="#01a0af">read-only</font>: Either "Active", "Suspending", or "Suspended"
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The creation date of the subscription. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ActivationDate` <font color="#704ae0">Nullable&lt;DateTime&gt;</font> <font color="#01a0af">read-only</font>: The date on which the subscription was activated, if available. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `SuspensionDate` <font color="#704ae0">Nullable&lt;DateTime&gt;</font> <font color="#01a0af">read-only</font>: The date on which the subscription was suspended, if available. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ExpirationDate` <font color="#704ae0">Nullable&lt;DateTime&gt;</font> <font color="#01a0af">read-only</font>: The date on which the subscription will expire, if available. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The last date on which the subscription was modified. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.






[title] Content Folder Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Content Folder entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the content folder. This value is generated by the server when the content folder is generated.
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the content folder. The maximum length of this string is 128 characters.
- `VirtualPath` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The location of the content folder in the BSN.Cloud virtual directory
- `ThumbPath` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The location of the thumbnail for the content folder in the server directory
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The date that the content folder was created on the network. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The last date that the content folder was modified on the network. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `HasSubFolders` <font color="#704ae0">bool</font> <font color="#01a0af">read-only</font>: Whether or not the Content Folder entity has subfolders
- `HasFiles` <font color="#704ae0">bool</font> <font color="#01a0af">read-only</font>: Whether or not the Content Folder entity contains files
- `Permissions` <font color="#704ae0">Permission[]</font> <font color="#01a0af">read-write</font>: A list of permission object instances representing permissions rules assigned to the content folder


[title] Feeds/Media Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

Use these endpoints to manage Live Media Feeds on the network. 

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Feeds/Media***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Returns a list of Live Media Feeds on a network

**Required Scope Token**

bsn.api.main.feeds.media.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (see [this page](docId:3L0afyD3xoOE-yTvfk2vs) for more information). The default value is null.
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of Live Media Feeds exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of Live Media Feeds that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[Name] BEGINS WITH 'Oct'`
- `sort` is set to `[LastModifiedDate] DESC`

```text
GET /2022/06/REST/Feeds/Media/?marker=OAb21dyge433&pageSize=1&filter=%5BName%5D%20BEGINS%20WITH%20%27Oct%27&sort=%5BLastModifiedDate%5D%20DESC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Live Media Feed Entities](docId\:bMW_LbF5Hs7k60Z4PdsxF) on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
  "items": [
    {
      "id": 12345678,
      "name": "Oct2023_LMF_2",
      "ttl": "00:01:00",
      "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/1903005a2e7c4255f162ca068eb925b6",
      "fileSize": 842,
      "fileHash": "SHA1:7DED344401FA3D60E33987B0B792EDE2A4583180",
      "creationDate": "2023-10-25T18:31:55.037Z",
      "lastModifiedDate": "2023-10-25T18:31:55.153Z",
      "content": null,
      "permissions": [],
      "presentations": [
        {
         "id": 12345,
         "name": "All Set Presentation",
         "type": "Presentation",
         "link": null
        }
      ]
    }
  ],
  "totalItemCount": 3,
  "matchingItemCount": 3,
  "pageSize": 1,
  "nextMarker": "MjAyMy0xMC0yNVQxODozMTo1NS4xNTNaLDExNTAzNjQ1",
  "prevMarker": "MjAyMy0xMC0yNVQxODozMTo1NS4xNTNaLDExNTAzSm01",
  "isTruncated": true,
  "sortExpression": "[LastModifiedDate] DESC",
  "filterExpression": "[Name] BEGINS WITH 'Oct'"
}
```

**Failure**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /

Creates a Live Media Feed on a network

**Required Scope Token**

bsn.api.main.feeds.media.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body** 

- The [Live Media Feed Entity](docId\:bMW_LbF5Hs7k60Z4PdsxF)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Feeds/Media/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 414
```

This is the example request body:

```json
{
  "id": 0,
  "name": "Main Screen Menu",
  "ttl": "00:05:00",
  "physicalPath": null,
  "fileSize": 0,
  "fileHash": null,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "content": [
    {
      "contentId": 12345,
      "fileName": "Saturday Breakfast Menu.jpg",
      "title": "Breakfast Menu",
      "description": "Saturday Breakfast Menu (November 2023)",
      "disabled": false,
      "displayDuration": "00:00:15",
      "validityStartDate": "2023-11-11T08:00:00Z",
      "validityEndDate": "2023-11-11T12:00:00Z",
      "customFields": {
        "meal": "Breakfast"
      }
    }
  ],
  "permissions": [],
  "presentations": null
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the [Live Media Feed Entity](docId\:bMW_LbF5Hs7k60Z4PdsxF) created and referenced by the Uri (given by the Location header field) in the response. 

**Example**

```json
{
  "id": 23456789,
  "name": "Main Screen Menu",
  "ttl": "00:05:00",
  "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/45ab34cb6a1827ad826562eb4e039d16",
  "fileSize": 350,
  "fileHash": "SHA1:ADD4E980482E239HCE4D6F9728999EBF838AB0CE",
  "creationDate": "2023-11-17T22:57:18.2028077Z",
  "lastModifiedDate": "2023-11-17T22:57:18.2028077Z",
  "content": [
    {
      "contentId": 12345,
      "fileName": "Saturday Breakfast Menu.jpg",
      "title": "Breakfast Menu",
      "description": "Saturday Breakfast Menu (November 2023)",
      "disabled": false,
      "displayDuration": "00:00:15",
      "validityStartDate": "2023-11-11T08:00:00Z",
      "validityEndDate": "2023-11-11T12:00:00Z",
      "customFields": {
        "meal": "Breakfast"
      }
    }
  ],
  "permissions": [],
  "presentations": []
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Removes Live Media Feeds, specified by a filter, from a network. This allows multiple Live Media Feeds to be deleted at once.

**Required Scope Token**

bsn.api.main.feeds.media.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[Name] ENDS WITH '3'`

```text
DELETE /2022/06/REST/Feeds/Media/?filter=%5BName%5D%20ENDS%20WITH%20%273%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the number of affected Live Media Feeds as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/ 

Returns the number of Live Media Feeds on the network that match the specified filter criteria. If no filter is included, this call returns the total number of Live Media Feeds on the network. 

**Required Scope Token**

bsn.api.main.feeds.media.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[Name] CONTAINS 'Oct'`

```text
GET /2022/06/REST/Feeds/Media/Count/?filter=%20%5BName%5D%20CONTAINS%20%27Oct%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The number of Live Media Feeds is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/

Returns the specified Live Media Feed&#x20;

**Required Scope Token**

bsn.api.main.feeds.media.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Live Media Feed&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Feeds/Media/12345678/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Live Media Feed Entity](docId\:bMW_LbF5Hs7k60Z4PdsxF)

**Example**

This is an example of a 200 level response:

```json
{
  "id": 12345678,
  "name": "Oct2023_LMF_2",
  "ttl": "00:01:00",
  "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/1903005a2e7c4255f162ca068eb925b6",
  "fileSize": 842,
  "fileHash": "SHA1:7DED344483FB4D60E33987B0B792EDE2A4583180",
  "creationDate": "2023-10-25T18:31:55.037Z",
  "lastModifiedDate": "2024-01-03T20:33:35.093Z",
  "content": [
    {
      "contentId": 911345,
      "fileName": "ProfilePhoto.png",
      "title": "ProfilePhoto.png",
      "description": "",
      "disabled": false,
      "displayDuration": "00:00:06",
      "validityStartDate": null,
      "validityEndDate": null,
      "customFields": {}
    }
  ],
  "permissions": [],
  "presentations": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/ 

Modifies the specified Live Media Feed

**Required Scope Token**

bsn.api.main.feeds.media.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Live Media Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Live Media Feed Entity](docId\:bMW_LbF5Hs7k60Z4PdsxF)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Feeds/Media/12345678/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Content-Type: application/json
Content-Length: 709
```

This is the example request body:

```json
{
  "id": 12345678,
  "name": "Oct2023_LMF_2",
  "ttl": "00:01:00",
  "physicalPath": null,
  "fileSize": 0,
  "fileHash": null,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "content": [
    {
      "contentId": 911345,
      "fileName": "ProfilePhoto.png",
      "title": "ProfilePhoto.png",
      "description": "",
      "disabled": false,
      "displayDuration": "00:00:06",
      "validityStartDate": null,
      "validityEndDate": null,
      "customFields": {
        "customField1": ""
      }
    }
  ],
  "permissions": [],
  "presentations": null
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Live Media Feed has been updated on the network 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/ 

Removes the specified Live Media Feed

**Required Scope Token**

bsn.api.main.feeds.media.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#7455f7">int: </font><font color="#0C121D">The</font> unique identifier of the Live Media Feed to delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `11475023`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Feeds/Media/11475023/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Live Media Feed has been removed

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/ 

Returns the specified Live Media Feed

**Required Scope Token**

bsn.api.main.feeds.media.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Media Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Oct2023_LMF_2`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Feeds/Media/Oct2023_LMF_2/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Live Media Feed Entity](docId\:bMW_LbF5Hs7k60Z4PdsxF)

**Example**

This is an example of a 200 level response:

```json
{
  "id": 12345678,
  "name": "Oct2023_LMF_2",
  "ttl": "00:01:00",
  "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/1903005a2e7c4255f162ca068eb925b6",
  "fileSize": 842,
  "fileHash": "SHA1:7DEB144483FA3D60E33987B0B792EDE2A4583180",
  "creationDate": "2023-10-25T18:31:55.037Z",
  "lastModifiedDate": "2024-01-03T20:33:35.093Z",
  "content": [
    {
      "contentId": 911345,
      "fileName": "ProfilePhoto.png",
      "title": "ProfilePhoto.png",
      "description": "",
      "disabled": false,
      "displayDuration": "00:00:06",
      "validityStartDate": null,
      "validityEndDate": null,
      "customFields": {}
    }
  ],
  "permissions": [],
  "presentations": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{name}/ 

Modifies the specified Live Media Feed

**Required Scope Token**

bsn.api.main.feeds.media.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Media Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Live Media Feed Entity](docId\:bMW_LbF5Hs7k60Z4PdsxF)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `Oct2023_LMF_2`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Feeds/Media/Oct2023_LMF_2/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Content-Type: application/json
Content-Length: 709
```

This is the example request body:

```text
{
  "id": 12345678,
  "name": "Oct2023_LMF_2",
  "ttl": "00:01:00",
  "physicalPath": null,
  "fileSize": 0,
  "fileHash": null,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "content": [
    {
      "contentId": 911345,
      "fileName": "ProfilePhoto.png",
      "title": "ProfilePhoto.png",
      "description": "",
      "disabled": false,
      "displayDuration": "00:00:06",
      "validityStartDate": null,
      "validityEndDate": null,
      "customFields": {
        "customField1": ""
      }
    }
  ],
  "permissions": [],
  "presentations": null
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Live Media Feed has been updated on the network 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/ 

Removes the specified Live Media Feed

**Required Scope Token**

bsn.api.main.feeds.media.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Media Feed to delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `Oct2023_LMF_2`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Feeds/Media/Oct2023_LMF_2/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 3 Jan 2024 20:33:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Live Media Feed has been removed

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/ 

Returns operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Feeds/Media/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

:::ExpandableHeading
Example

```json
{
   "uid": "4871f4d5-f78b-4c41-ab27-26391c40001a",
   "singularName": "Full Control",
   "pluralName": "Live Media Feed (Full Control)",
   "fullName": "Live Media Feed (Full Control)",
   "targetEntity": "LiveMediaFeed",
   "appliance": "Instance, Collection",
   "parent": null,
   "descendants":    [
            {
         "uid": "21529c26-0df7-4f25-8cd1-9156dffc9db6",
         "singularName": "View Live Media Feed",
         "pluralName": "View Live Media Feeds",
         "fullName": "Live Media Feed (Full Control) - View Live Media Feeds",
         "targetEntity": "LiveMediaFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "4871f4d5-f78b-4c41-ab27-26391c40001a",
            "singularName": "Full Control",
            "pluralName": "Live Media Feed (Full Control)",
            "fullName": "Live Media Feed (Full Control)",
            "targetEntity": "LiveMediaFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "21529c26-0df7-4f25-8cd1-9156dffc9db6",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.327Z"
            },
                        {
               "entityId": null,
               "operationUID": "21529c26-0df7-4f25-8cd1-9156dffc9db6",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.783Z"
            },
                        {
               "entityId": null,
               "operationUID": "21529c26-0df7-4f25-8cd1-9156dffc9db6",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "21529c26-0df7-4f25-8cd1-9156dffc9db6",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "21529c26-0df7-4f25-8cd1-9156dffc9db6",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.447Z"
            },
                        {
               "entityId": null,
               "operationUID": "21529c26-0df7-4f25-8cd1-9156dffc9db6",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.75Z"
            },
                        {
               "entityId": null,
               "operationUID": "21529c26-0df7-4f25-8cd1-9156dffc9db6",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-10-24T21:50:01.73Z"
            }
         ]
      },
            {
         "uid": "6342cb21-6a12-410a-b957-adf22aec3c85",
         "singularName": "View Contents",
         "pluralName": "View Contents",
         "fullName": "Live Media Feed (Full Control) - View Contents",
         "targetEntity": "LiveMediaFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "4871f4d5-f78b-4c41-ab27-26391c40001a",
            "singularName": "Full Control",
            "pluralName": "Live Media Feed (Full Control)",
            "fullName": "Live Media Feed (Full Control)",
            "targetEntity": "LiveMediaFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "6342cb21-6a12-410a-b957-adf22aec3c85",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.793Z"
            },
                        {
               "entityId": null,
               "operationUID": "6342cb21-6a12-410a-b957-adf22aec3c85",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "6342cb21-6a12-410a-b957-adf22aec3c85",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "6342cb21-6a12-410a-b957-adf22aec3c85",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.447Z"
            },
                        {
               "entityId": null,
               "operationUID": "6342cb21-6a12-410a-b957-adf22aec3c85",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.75Z"
            },
                        {
               "entityId": null,
               "operationUID": "6342cb21-6a12-410a-b957-adf22aec3c85",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.317Z"
            },
                        {
               "entityId": null,
               "operationUID": "6342cb21-6a12-410a-b957-adf22aec3c85",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-10-24T21:50:01.73Z"
            }
         ]
      },
            {
         "uid": "9cd07413-c9b3-43c9-bdb1-7c7c01dcd4fe",
         "singularName": "Create Live Media Feed",
         "pluralName": "Create Live Media Feed",
         "fullName": "Live Media Feed (Full Control) - Create Live Media Feed",
         "targetEntity": "LiveMediaFeed",
         "appliance": "Collection",
         "parent":          {
            "uid": "4871f4d5-f78b-4c41-ab27-26391c40001a",
            "singularName": "Full Control",
            "pluralName": "Live Media Feed (Full Control)",
            "fullName": "Live Media Feed (Full Control)",
            "targetEntity": "LiveMediaFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "9cd07413-c9b3-43c9-bdb1-7c7c01dcd4fe",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "9cd07413-c9b3-43c9-bdb1-7c7c01dcd4fe",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "9cd07413-c9b3-43c9-bdb1-7c7c01dcd4fe",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.447Z"
            },
                        {
               "entityId": null,
               "operationUID": "9cd07413-c9b3-43c9-bdb1-7c7c01dcd4fe",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.75Z"
            },
                        {
               "entityId": null,
               "operationUID": "9cd07413-c9b3-43c9-bdb1-7c7c01dcd4fe",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.317Z"
            },
                        {
               "entityId": null,
               "operationUID": "9cd07413-c9b3-43c9-bdb1-7c7c01dcd4fe",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.77Z"
            },
                        {
               "entityId": null,
               "operationUID": "9cd07413-c9b3-43c9-bdb1-7c7c01dcd4fe",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-10-24T21:50:01.73Z"
            }
         ]
      },
            {
         "uid": "cd97ae27-1335-4516-b8d8-f09411186df9",
         "singularName": "Rename Live Media Feed",
         "pluralName": "Rename Live Media Feed",
         "fullName": "Live Media Feed (Full Control) - Rename Live Media Feed",
         "targetEntity": "LiveMediaFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "4871f4d5-f78b-4c41-ab27-26391c40001a",
            "singularName": "Full Control",
            "pluralName": "Live Media Feed (Full Control)",
            "fullName": "Live Media Feed (Full Control)",
            "targetEntity": "LiveMediaFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "cd97ae27-1335-4516-b8d8-f09411186df9",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "cd97ae27-1335-4516-b8d8-f09411186df9",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "cd97ae27-1335-4516-b8d8-f09411186df9",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.447Z"
            },
                        {
               "entityId": null,
               "operationUID": "cd97ae27-1335-4516-b8d8-f09411186df9",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.75Z"
            },
                        {
               "entityId": null,
               "operationUID": "cd97ae27-1335-4516-b8d8-f09411186df9",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.317Z"
            },
                        {
               "entityId": null,
               "operationUID": "cd97ae27-1335-4516-b8d8-f09411186df9",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.77Z"
            },
                        {
               "entityId": null,
               "operationUID": "cd97ae27-1335-4516-b8d8-f09411186df9",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-10-24T21:50:01.73Z"
            }
         ]
      },
            {
         "uid": "b3eb9da2-b32a-473b-8b74-aa2bcb32199e",
         "singularName": "Update Live Media Feed",
         "pluralName": "Update Live Media Feed",
         "fullName": "Live Media Feed (Full Control) - Update Live Media Feed",
         "targetEntity": "LiveMediaFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "4871f4d5-f78b-4c41-ab27-26391c40001a",
            "singularName": "Full Control",
            "pluralName": "Live Media Feed (Full Control)",
            "fullName": "Live Media Feed (Full Control)",
            "targetEntity": "LiveMediaFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "b3eb9da2-b32a-473b-8b74-aa2bcb32199e",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "b3eb9da2-b32a-473b-8b74-aa2bcb32199e",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "b3eb9da2-b32a-473b-8b74-aa2bcb32199e",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.447Z"
            },
                        {
               "entityId": null,
               "operationUID": "b3eb9da2-b32a-473b-8b74-aa2bcb32199e",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.75Z"
            },
                        {
               "entityId": null,
               "operationUID": "b3eb9da2-b32a-473b-8b74-aa2bcb32199e",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.317Z"
            },
                        {
               "entityId": null,
               "operationUID": "b3eb9da2-b32a-473b-8b74-aa2bcb32199e",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.77Z"
            },
                        {
               "entityId": null,
               "operationUID": "b3eb9da2-b32a-473b-8b74-aa2bcb32199e",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-10-24T21:50:01.73Z"
            }
         ]
      },
            {
         "uid": "f54db9df-41c9-41a9-8735-c2d909f12450",
         "singularName": "Assign Live Media Feed",
         "pluralName": "Assign Live Media Feed",
         "fullName": "Live Media Feed (Full Control) - Assign Live Media Feed",
         "targetEntity": "LiveMediaFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "4871f4d5-f78b-4c41-ab27-26391c40001a",
            "singularName": "Full Control",
            "pluralName": "Live Media Feed (Full Control)",
            "fullName": "Live Media Feed (Full Control)",
            "targetEntity": "LiveMediaFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "f54db9df-41c9-41a9-8735-c2d909f12450",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "f54db9df-41c9-41a9-8735-c2d909f12450",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "f54db9df-41c9-41a9-8735-c2d909f12450",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.447Z"
            },
                        {
               "entityId": null,
               "operationUID": "f54db9df-41c9-41a9-8735-c2d909f12450",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.75Z"
            },
                        {
               "entityId": null,
               "operationUID": "f54db9df-41c9-41a9-8735-c2d909f12450",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.317Z"
            },
                        {
               "entityId": null,
               "operationUID": "f54db9df-41c9-41a9-8735-c2d909f12450",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.77Z"
            },
                        {
               "entityId": null,
               "operationUID": "f54db9df-41c9-41a9-8735-c2d909f12450",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-10-24T21:50:01.73Z"
            }
         ]
      },
            {
         "uid": "a2134e6b-9e70-40e8-88bd-e1a702197b53",
         "singularName": "Unassign Live Media Feed",
         "pluralName": "Unassign Live Media Feed",
         "fullName": "Live Media Feed (Full Control) - Unassign Live Media Feed",
         "targetEntity": "LiveMediaFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "4871f4d5-f78b-4c41-ab27-26391c40001a",
            "singularName": "Full Control",
            "pluralName": "Live Media Feed (Full Control)",
            "fullName": "Live Media Feed (Full Control)",
            "targetEntity": "LiveMediaFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "a2134e6b-9e70-40e8-88bd-e1a702197b53",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "a2134e6b-9e70-40e8-88bd-e1a702197b53",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "a2134e6b-9e70-40e8-88bd-e1a702197b53",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.447Z"
            },
                        {
               "entityId": null,
               "operationUID": "a2134e6b-9e70-40e8-88bd-e1a702197b53",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.75Z"
            },
                        {
               "entityId": null,
               "operationUID": "a2134e6b-9e70-40e8-88bd-e1a702197b53",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.317Z"
            },
                        {
               "entityId": null,
               "operationUID": "a2134e6b-9e70-40e8-88bd-e1a702197b53",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.77Z"
            },
                        {
               "entityId": null,
               "operationUID": "a2134e6b-9e70-40e8-88bd-e1a702197b53",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-10-24T21:50:01.73Z"
            }
         ]
      },
            {
         "uid": "a153fc6a-7185-42e4-9f95-6bc31b5fe1f0",
         "singularName": "Edit Permissions",
         "pluralName": "Edit Permissions",
         "fullName": "Live Media Feed (Full Control) - Edit Permissions",
         "targetEntity": "LiveMediaFeed",
         "appliance": "Collection",
         "parent":          {
            "uid": "4871f4d5-f78b-4c41-ab27-26391c40001a",
            "singularName": "Full Control",
            "pluralName": "Live Media Feed (Full Control)",
            "fullName": "Live Media Feed (Full Control)",
            "targetEntity": "LiveMediaFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "a153fc6a-7185-42e4-9f95-6bc31b5fe1f0",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "a153fc6a-7185-42e4-9f95-6bc31b5fe1f0",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "a153fc6a-7185-42e4-9f95-6bc31b5fe1f0",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.447Z"
            },
                        {
               "entityId": null,
               "operationUID": "a153fc6a-7185-42e4-9f95-6bc31b5fe1f0",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.75Z"
            },
                        {
               "entityId": null,
               "operationUID": "a153fc6a-7185-42e4-9f95-6bc31b5fe1f0",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.317Z"
            },
                        {
               "entityId": null,
               "operationUID": "a153fc6a-7185-42e4-9f95-6bc31b5fe1f0",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.77Z"
            },
                        {
               "entityId": null,
               "operationUID": "a153fc6a-7185-42e4-9f95-6bc31b5fe1f0",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-10-24T21:50:01.73Z"
            }
         ]
      },
            {
         "uid": "551fb25f-b467-4211-8dd6-f9ffffb1e47f",
         "singularName": "Delete Live Media Feed",
         "pluralName": "Delete Live Media Feed",
         "fullName": "Live Media Feed (Full Control) - Delete Live Media Feed",
         "targetEntity": "LiveMediaFeed",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "4871f4d5-f78b-4c41-ab27-26391c40001a",
            "singularName": "Full Control",
            "pluralName": "Live Media Feed (Full Control)",
            "fullName": "Live Media Feed (Full Control)",
            "targetEntity": "LiveMediaFeed",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "551fb25f-b467-4211-8dd6-f9ffffb1e47f",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.337Z"
            },
                        {
               "entityId": null,
               "operationUID": "551fb25f-b467-4211-8dd6-f9ffffb1e47f",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "551fb25f-b467-4211-8dd6-f9ffffb1e47f",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.18Z"
            },
                        {
               "entityId": null,
               "operationUID": "551fb25f-b467-4211-8dd6-f9ffffb1e47f",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.447Z"
            },
                        {
               "entityId": null,
               "operationUID": "551fb25f-b467-4211-8dd6-f9ffffb1e47f",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.75Z"
            },
                        {
               "entityId": null,
               "operationUID": "551fb25f-b467-4211-8dd6-f9ffffb1e47f",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.77Z"
            },
                        {
               "entityId": null,
               "operationUID": "551fb25f-b467-4211-8dd6-f9ffffb1e47f",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-10-24T21:50:01.73Z"
            }
         ]
      }
   ],
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
         "principal":          {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:45.893Z"
      },
            {
         "entityId": null,
         "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
         "principal":          {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:46.18Z"
      },
            {
         "entityId": null,
         "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
         "principal":          {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:46.447Z"
      },
            {
         "entityId": null,
         "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
         "principal":          {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:46.75Z"
      },
            {
         "entityId": null,
         "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
         "principal":          {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:47.317Z"
      },
            {
         "entityId": null,
         "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
         "principal":          {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:47.77Z"
      },
            {
         "entityId": null,
         "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
         "principal":          {
            "name": "Custom",
            "isCustom": true,
            "type": "Role",
            "id": 10498
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2023-10-24T21:50:01.73Z"
      }
   ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/ 

Includes object permissions for a given Live Media Feed&#x20;

**Required Scope Token**

bsn.api.main.feeds.media.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Live Media Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`

```text
GET /2022/06/REST/Feeds/Media/12345678/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 12345678,
    "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-25T22:17:24.28Z"
  },
  {
    "entityId": 12345678,
    "operationUID": "cd97ae27-1335-4516-b8d8-f09411186df9",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.053Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/ 

Adds permissions to Live Media Feed(s) with the specified id.

**Required Scope Token**

bsn.api.main.feeds.media.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Live Media Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`

```text
POST /2022/06/REST/Feeds/Media/12345678/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 328
```

This is the example request body:

```json
[
  {
    "entityId": 12345678,
    "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-25T22:17:24.28Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully granted

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/ 

Removes permissions from the specified Live Media Feed

**Required Scope Token**

bsn.api.main.feeds.media.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Live Media Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`

```text
DELETE /2022/06/REST/Feeds/Media/12345678/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 328
```

This is the example request body:

```json
[
  {
    "entityId": 12345678,
    "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-25T22:17:24.28Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Permissions/ 

Includes object permissions for a given Live Media Feed.

**Required Scope Token**

bsn.api.main.feeds.media.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Media Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Oct2023_LMF`

```text
GET /2022/06/REST/Feeds/Media/Oct2023_LMF/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 12345678,
    "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-25T22:17:24.28Z"
  },
  {
    "entityId": 12345678,
    "operationUID": "cd97ae27-1335-4516-b8d8-f09411186df9",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.053Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{name}/Permissions/ 

Adds permissions to Live Media Feed(s) with the specified name.

**Required Scope Token**

bsn.api.main.feeds.media.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Media Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Oct2023_LMF`

```text
POST /2022/06/REST/Feeds/Media/Oct2023_LMF/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 328
```

This is the example request body:

```json
[
  {
    "entityId": 12345678,
    "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-25T22:17:24.28Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully granted

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/Permissions/ 

Removes permissions from the specified Live Media Feed. 

**Required Scope Token**

bsn.api.main.feeds.media.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Live Media Feed

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Oct2023_LMF`

```text
DELETE /2022/06/REST/Feeds/Media/Oct2023_LMF/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 328
```

This is the example request body:

```json
[
  {
    "entityId": 12345678,
    "operationUID": "4871f4d5-f78b-4c41-ab27-26391c40001a",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-25T22:17:24.28Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Application Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

The Application entity is structured as follows:

`entity`:

- `Id` <font color="#704ae0">number</font> <font color="#01a0af">read-only</font>: The unique id of the Application instance
- `Owner` <font color="#704ae0">PersonInfo</font> <font color="#01a0af">read-only</font>: The [PersonInfo Entity (2022/06)](docId\:ZirFD24L2jmiQg5KRS13P) entity
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The unique name of a given Application provided by its owner
- `Description` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The description of a given Application provided by its owner
- `ClientId` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The OAuth2 client identifier associated with a given application instance&#x20;
- `ClientSecret` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The OAuth2 client secret associated with a given application instance&#x20;
- `Scopes` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: A string containing space-separated OAuth2 scope tokens which define the BSN.Cloud API resources available to the given application&#x20;
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The registration date of the given Application. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type. 
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The last date on which the Application was modified, if available. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type. 


[title] Permission Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

The Permission entity is structured as follows:

`entity`:

- `EntityId` <font color="#704ae0">int?</font> <font color="#01a0af">read-write</font>: This identifier is equal to the parent’s entity instance id.
- `OperationUID` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The unique identifier for the operation
- `Principal` <font color="#704ae0">Principal</font> <font color="#01a0af">read-write</font>: 
  - `name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name associated with the permissions (for example, "Custom Administrators")
  - `isCustom` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether or not this is a custom role
  - `type` <font color="#704ae0">PrincipalType</font> <font color="#01a0af">read-write</font>: 
    - `User` <font color="#01a0af">read-write</font>: When the type is user, "name" is login
    - `Role` <font color="#01a0af">read-write</font>: When the type is role, "name" is role
  - `id` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: The id associated with the permissions
- `IsFixed` <font color="#704ae0">bool</font> <font color="#01a0af">read-only</font>: Indicates if the entity permissions are editable by the customer or not
- `IsInherited` <font color="#704ae0">bool</font> <font color="#01a0af">read-only</font>: If true, the entity permissions are inherited
- `IsAllowed` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Allows or denies permissions to perform a given operation
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The date that the entity permissions were created. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.


[title] Self Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

These endpoints allow users to manage their settings in the current network. 

Base URL for these endpoints: ***https\://api.bsn.cloud/2022/06/REST***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /Self/ 

Returns your [Person Entity](docId\:vUywMGVG7yRdYb0AtZg5k) information

**Required Scope Token**

bsn.api.self.info.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /Self/` response.

```text
GET /2022/06/REST/Self/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Modified-Since: Wed, 29 Nov 2023 17:40:51 GMT
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Person Entity](docId\:vUywMGVG7yRdYb0AtZg5k)

**Example**

This is an example of a 200 level response:

```json
{
   "id": 12345,
   "login": "JaneDoe@brightsign.biz",
   "password": null,
   "firstName": "Jane",
   "lastName": "Doe",
   "creationDate": "2020-07-09T19:05:20.247Z",
   "lastModifiedDate": "2023-11-29T17:40:54.403Z",
   "activationDate": "2020-07-09T19:05:38.723Z"
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">4</font><font color="#9a0808">00</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /Self/ 

Registers the person and returns your person credentials (except the password if it was provided in your request). 

**Required Scope Token**

None

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Person Entity](docId\:vUywMGVG7yRdYb0AtZg5k). If you specify a password that matches our security policy, the server will apply the password you specify and will not return a password. If you do not specify a password, the server will generate a password and return it to you.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Self/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 309
```

This is the example request body:

```json
{
   "id": 0,
   "login": "JaneDoe@gmail.com",
   "password": null,
   "firstName": "Jane",
   "lastName": "Doe",
   "creationDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00",
   "activationDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Person Entity](docId\:vUywMGVG7yRdYb0AtZg5k)

**Example**

```json
{
   "id": 12345,
   "login": "JaneDoe@gmail.com",
   "password": "7t#Sqg7*",
   "firstName": "Jane",
   "lastName": "Doe",
   "creationDate": "2023-12-01T16:47:03.3893279Z",
   "lastModifiedDate": "2023-12-01T16:47:03.3893279Z",
   "activationDate": null
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error<font color="#0a0a0a06"> Any 500 code is an internal server error</font>

## GET /Self/Profile/ 

Returns a complete person profile

**Required Scope Token**

bsn.api.self.profile.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Self/Profile/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: The return type is object, where property names are profile keys and the profile values are those property values

**Example**

```json
{
   "personAccessTokenLifetime": "00:15:00",
   "personRefreshTokenLifetime": "1.00:00:00"
}
```

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /Self/Profile/ 

Creates a new profile property for a person

**Required Scope Token**

bsn.api.self.profile.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- `pair` <font color="#704ae0">&lt;string, string&gt;: </font>A key value pair of the person profile property

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Self/Profile/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 44
```

This is the example request body:

```json
{
	"key": "NewProperty1",
	"value": "111"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the new resource created and referenced by the Uri (given by the Location header field) in the response. Returns an object where property names correspond to profile keys and property values correspond to profile names.

**Example**

```json
{
   "key": "NewProperty1",
   "value": "111"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: Either the request is malformed and therefore invalid, or the specified profile property key is reserved or longer than 62 characters

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">409</font>: The person profile property with the specified key already exists

<font color="#9a0808">413</font>: The length of the specified person property profile value exceeds the 64KB limit

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Profile/\{key}/ 

Returns a profile property value for a person

**Required Scope Token**

bsn.api.self.profile.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `key` <font color="#704ae0">string: </font>The name of the profile property

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `key` is set to `PersonAccessTokenLifetime`

```text
GET /2022/06/REST/Self/Profile/PersonAccessTokenLifetime/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a profile property value

**Example**

This is an example of a 200 level response:

```json
"00:15:00"
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT  /Self/Profile/\{key}/ 

Creates or updates a person profile property value 

**Required Scope Token**

bsn.api.self.profile.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `key` <font color="#704ae0">string: </font>The name of the profile property

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- <font color="#704ae0">string: </font>The profile property value to update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `key` is set to `PersonRefreshTokenLifetime`

```text
PUT /2022/06/REST/Self/Profile/PersonRefreshTokenLifetime/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 12
```

This is the example request body:

```json
"1.00:00:00"
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">201</font>: Returns this status code if the person property value is defined for first time

<font color="#089a4d">204</font>: Returns this status code if the person property value already exists and has been updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">413</font>: The length of the specified user profile property exceeds the 64KB limit

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE  /Self/Profile/\{key}/ 

Removes a profile property for a person

**Required Scope Token**

bsn.api.self.profile.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `key` <font color="#704ae0">string: </font>The name of the profile property

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `key` is set to `NewProperty1`

```text
DELETE /2022/06/REST/Self/Profile/NewProperty1/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The profile property has been removed

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Session/

Retrieves the complete set of attributes defined in the context of the current person session.

**Request Example**

The example request parameters and headers are set as follows:

- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /Self/Session/` response.

```text
GET /2022/06/REST/Self/Session/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{AccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Modified-Since: Wed, 29 Nov 2023 17:40:51 GMT
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Session Context Structure](docId\:qfK7vzwEhSywCwtXSgHtS)&#x20;

**Example**

```json
{
   "network":    {
      "id": 12345,
      "name": "JohnDoe"
   },
   "authorizationScope": "bsn.api.main bsn.api.self bsn.api.upload bsn.ui.main player",
   "lastModifiedDate": "2024-08-08T16:10:13.673Z"
}
```

<font color="#089a4d">304</font>: The provided `If-Modified-Since` HTTP header value matches the timestamp of the current attribute value assignment

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The provided person access token is invalid and the session id cannot be retrieved

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">410</font>: The provided person access token is valid but the session with resolved id has been invalidated

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Session/Network/

Retrieves the identifiers of the network that the current user is signed into.

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Self/Session/Network/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{AccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the requested attribute value, which is either the [Network Info Entity](docId:5ki8DrPAXhS07hAXVT5Gg) or `null` if the current person is not signed into any network.

**Example**

```json
{
   "id": 12345,
   "name": "JohnDoe"
}
```

<font color="#089a4d">204</font>: The request is executed successfully, but there is no content to return (the network is not set in the context of the current session).

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The provided person access token is invalid and the session id cannot be retrieved

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">410</font>: The provided person access token is valid but the session with the resolved id has been invalidated

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /Self/Session/Network/

Allows a person to set or change a network the person is signed into in scope of the current session

**Request Example**

The example request parameters and headers are set as follows:

```text
PUT /2022/06/REST/Self/Session/Network/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{AccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 40
```

This is the example request body:

```json
{
   "id": 12345,
   "name": "JaneDoe"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">204</font>: The person is successfully signed into the specified network

**Failure Response**

<font color="#9a0808">400</font>: Invalid request and any of the following business rules violations:

- The provided [Network Info Entity](docId:5ki8DrPAXhS07hAXVT5Gg) has an invalid format
- Neither network id not network name is specified in the request
- A network with the specified id or name does not exist
- A network with the specified id or name is suspended
- The person who owns the provided access token is not a member of the network with the specified id or name
- The person in the network with the specified id or name is disabled

<font color="#9a0808">401</font>: The provided person access token is invalid and the session id cannot be retrieved

<font color="#9a0808">410</font>: The provided person access token is valid but the session with the resolved id has been invalidated

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Session/AuthorizationScope/

Retrieves the scope of actions the current user is authorized to do with the provided access token.

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Self/Session/AuthorizationScope/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{AccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the space-separated list of tokens which represent the available resources

**Example**

```json
"bsn.api.main bsn.api.self bsn.api.upload bsn.ui.main player"
```

**Failure Response**

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The provided person access token is invalid and the session id cannot be retrieved

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">410</font>: The provided person access token is valid but the session with the resolved id has been invalidated

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /Self/Session/AuthorizationScope/

Allows a person to change the list of resources he is authorized to access with the provided access token.

**Request Example**

The example request parameters and headers are set as follows:

```text
PUT /2022/06/REST/Self/Session/AuthorizationScope/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{AccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 40
```

This is the example request body:

```json
"bsn.api.main bsn.api.self bsn.api.upload bsn.ui.main player"
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The authorization scope has been successfully updated.

**Failure Response**

<font color="#9a0808">400</font>: Invalid request and any of the following business rules violations:

- The provided authorization scope has an invalid format
- One or more specified scope tokens are not available with the provided token

<font color="#9a0808">401</font>: The provided person access token is invalid and the session id cannot be retrieved

<font color="#9a0808">410</font>: The provided person access token is valid but the session with the resolved id has been invalidated

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Tokens/\{token}/ 

Gets the status of the specified OAuth2 person access or refresh token

**Required Scope Token**

bsn.api.self.token.validate

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `token` <font color="#704ae0">string: </font>A person access or refresh token

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `token` is set to `{{Token}}`

```text
GET /2022/06/REST/Self/Tokens/{{Token}}/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Token Info Entity](docId\:RMBciR76z7OjsYJB_U2pP)&#x20;

**Example**

```json
{
   "token": {{Token}},
   "scope": "bsn.api.self",
   "validFrom": "2023-11-29T17:43:55Z",
   "validTo": "2023-11-29T17:58:55Z"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The specified person or access refresh token is expired, revoked, or invalid.

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /Self/Tokens/\{token}/ 

Revokes a person access or refresh token

**Required Scope Token**

bsn.api.self.token.revoke

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `token` <font color="#704ae0">string: </font>A person access or refresh token

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `token` is set to `{{Token}}`

```text
DELETE /2022/06/REST/Self/Tokens/{{Token}}/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The person access or refresh token has been deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The specified person or access refresh token is expired, revoked, or invalid.

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Networks/ 

Returns the networks associated with a person

**Required Scope Token**

bsn.api.self.networks.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Self/Networks/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Network Entity](docId\:y77UIeCeDVnRZ0weS8VPL) instances in which the current person is a member

**Example**

```json
[
  {
    "id": 12345,
    "name": "ControlCloud_Network1",
    "creationDate": "2020-07-14T18:40:58.087Z",
    "lastModifiedDate": "2020-07-14T18:40:58.087Z",
    "lockoutDate": null,
    "isLockedOut": false,
    "lastLockoutDate": null,
    "settings": {
      "userAccessTokenLifetime": "00:15:00",
      "userRefreshTokenLifetime": "1.00:00:00",
      "deviceAccessTokenLifetime": "00:15:00",
      "deviceRefreshTokenLifetime": "730.00:00:00",
      "deviceRegistrationTokenLifetime": "730.00:00:00",
      "automaticTaggedPlaylistApprovalEnabled": false,
      "lastModifiedDate": "2020-07-14T18:41:00.613Z"
    },
    "subscription": {
      "id": 12345,
      "level": "Control",
      "creationDate": "2020-07-14T18:40:58.783Z",
      "lastModifiedDate": "2020-07-14T18:40:58.783Z",
      "expireDate": null
    }
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /Self/Networks/ 

Creates a network for the person.

**Required Scope Token**

bsn.api.self.networks.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Network Entity](docId\:y77UIeCeDVnRZ0weS8VPL)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Self/Networks/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 581
```

This is the example request body:

```json
{
  "id": 0,
  "name": "TestDisplay",
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "lockoutDate": null,
  "isLockedOut": false,
  "lastLockoutDate": null,
  "settings": {
    "userAccessTokenLifetime": "00:15:00",
    "userRefreshTokenLifetime": "1.00:00:00",
    "deviceAccessTokenLifetime": "00:15:00",
    "deviceRefreshTokenLifetime": "730.00:00:00",
    "deviceRegistrationTokenLifetime": "730.00:00:00",
    "automaticTaggedPlaylistApprovalEnabled": false,
    "lastModifiedDate": "0001-01-01T00:00:00"
  },
  "subscription": null
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the new resource created and referenced by the Uri (given by the Location header field) in the response. The response includes the network entity (see [Network Entity](docId\:y77UIeCeDVnRZ0weS8VPL)).

**Example**

```json
{
   "id": 12345,
   "name": "TestDisplay",
   "creationDate": "2023-12-07T18:29:58.5041056Z",
   "lastModifiedDate": "2023-12-07T18:29:58.5041056Z",
   "lockoutDate": null,
   "isLockedOut": false,
   "lastLockoutDate": null,
   "settings":    {
      "userAccessTokenLifetime": "00:15:00",
      "userRefreshTokenLifetime": "1.00:00:00",
      "deviceAccessTokenLifetime": "00:15:00",
      "deviceRefreshTokenLifetime": "730.00:00:00",
      "deviceRegistrationTokenLifetime": "730.00:00:00",
      "automaticTaggedPlaylistApprovalEnabled": false,
      "lastModifiedDate": "2023-12-07T18:29:58.5041056Z"
   },
   "subscription":    {
      "id": 12345,
      "level": "Control",
      "creationDate": "2023-12-07T18:29:58.5142438Z",
      "lastModifiedDate": "2023-12-07T18:29:58.5142438Z",
      "expireDate": null
   }
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Networks/\{id}/ 

Get a network associated with a specified id

**Required Scope Token**

bsn.api.self.networks.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for a network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Self/Networks/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Network Entity](docId\:y77UIeCeDVnRZ0weS8VPL)

**Example**

This is an example of a 200 level response:

```json
{
   "id": 12345,
   "name": "JaneDoeTesting",
   "creationDate": "2020-07-09T19:09:04.937Z",
   "lastModifiedDate": "2020-07-09T19:09:04.937Z",
   "lockoutDate": null,
   "isLockedOut": false,
   "lastLockoutDate": null,
   "settings":    {
      "userAccessTokenLifetime": "00:15:00",
      "userRefreshTokenLifetime": "1.00:00:00",
      "deviceAccessTokenLifetime": "00:15:00",
      "deviceRefreshTokenLifetime": "730.00:00:00",
      "deviceRegistrationTokenLifetime": "730.00:00:00",
      "automaticTaggedPlaylistApprovalEnabled": false,
      "lastModifiedDate": "2020-07-09T19:09:06.77Z"
   },
   "subscription":    {
      "id": 12345,
      "level": "Content",
      "creationDate": "2020-08-17T20:49:45.633Z",
      "lastModifiedDate": "2020-08-17T20:49:45.633Z",
      "expireDate": "2030-08-16T00:00:00Z"
   }
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PATCH /Self/Networks/\{networkId}/ 

Applies changes to a network associated with a specified id

**Required Scope Token**

bsn.api.self.networks.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `networkId` <font color="#704ae0">int: </font>The unique identifier for a network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

These properties are entries in an array. Every entry must have all three of these properties:

- `op` <font color="#704ae0">string</font>: The type of operation - in this case it is always "replace"
- `path` <font color="#704ae0">string</font>: A Uri path that references the location within the target document where the update will be performed
- `value` <font color="#704ae0">object</font> The replacement value(s) for the parameters that must be updated. This can be an array.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `networkId` is set to `12345`

```none
PATCH /2022/06/REST/Self/Networks/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json-patch+json
Content-Length: 94
```

This is the example request body:

```json
[
  {
    "op": "replace",
    "path": "/subscription/level/",
    "value": "Trial"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The parameters have been successfully replaced

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Networks/\{name}/ 

Returns a network associated with a specified name.

**Required Scope Token**

bsn.api.self.networks.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of a network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `JaneDoeTesting`

```text
GET /2022/06/REST/Self/Networks/JaneDoeTesting/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Network Entity](docId\:y77UIeCeDVnRZ0weS8VPL)

**Example**

This is an example of a 200 level response:

```json
{
   "id": 12345,
   "name": "JaneDoeTesting",
   "creationDate": "2020-07-09T19:09:04.937Z",
   "lastModifiedDate": "2020-07-09T19:09:04.937Z",
   "lockoutDate": null,
   "isLockedOut": false,
   "lastLockoutDate": null,
   "settings":    {
      "userAccessTokenLifetime": "00:15:00",
      "userRefreshTokenLifetime": "30.00:00:00",
      "deviceAccessTokenLifetime": "00:15:00",
      "deviceRefreshTokenLifetime": "730.00:00:00",
      "deviceRegistrationTokenLifetime": "730.00:00:00",
      "automaticTaggedPlaylistApprovalEnabled": false,
      "lastModifiedDate": "2023-12-07T21:41:44.01Z"
   },
   "subscription":    {
      "id": 12345,
      "level": "Content",
      "creationDate": "2020-08-17T20:49:45.633Z",
      "lastModifiedDate": "2020-08-17T20:49:45.633Z",
      "expireDate": "2030-08-16T00:00:00Z"
   }
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PATCH /Self/Networks/\{networkName}/ 

Applies changes to a network associated with a specified id

**Required Scope Token**

bsn.api.self.networks.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `networkName` <font color="#704ae0">string: </font>The name of the network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

These properties are entries in an array. Every entry must have all three of these properties:

- `op` <font color="#704ae0">string</font>: The type of operation - in this case it is always "replace"
- `path` <font color="#704ae0">string</font>: A Uri path that references the location within the target document where the update will be performed
- `value` <font color="#704ae0">object</font>: The replacement value(s) for the parameters that must be updated. This can be an array.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `networkName` is set to `JaneDoeTesting`

```text
PATCH /2022/06/REST/Self/Networks/JaneDoeTesting/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json-patch+json
Content-Length: 94
```

This is the example request body:

```json
[
  {
    "op": "replace",
    "path": "/subscription/level/",
    "value": "Trial"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The parameters have been successfully replaced

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Networks/\{id}/Settings/ 

Returns the settings associated with a specified network.

**Required Scope Token**

bsn.api.self.networks.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for a network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Self/Networks/12345/Settings/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Network Settings Entity](docId\:uAqtZaNLtnrCJbzF4Vjdw)

**Example**

This is an example of a 200 level response:

```json
{
   "userAccessTokenLifetime": "00:15:00",
   "userRefreshTokenLifetime": "1.00:00:00",
   "deviceAccessTokenLifetime": "00:15:00",
   "deviceRefreshTokenLifetime": "730.00:00:00",
   "deviceRegistrationTokenLifetime": "730.00:00:00",
   "automaticTaggedPlaylistApprovalEnabled": false,
   "lastModifiedDate": "2020-07-09T19:09:06.77Z"
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /Self/Networks/\{id}/Settings/ 

Update the settings associated with a specified network

**Required Scope Token**

bsn.api.self.networks.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for a network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Network Settings Entity](docId\:uAqtZaNLtnrCJbzF4Vjdw)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
PUT /2022/06/REST/Self/Networks/12345/Settings/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 335
```

This is the example request body:

```json
{
   "userAccessTokenLifetime": "00:15:00",
   "userRefreshTokenLifetime": "30.00:00:00",
   "deviceAccessTokenLifetime": "00:15:00",
   "deviceRefreshTokenLifetime": "730.00:00:00",
   "deviceRegistrationTokenLifetime": "730.00:00:00",
   "automaticTaggedPlaylistApprovalEnabled": false,
   "lastModifiedDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified settings have been updated on the network

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Networks/\{name}/Settings/ 

Get the settings associated with a specified network.

**Required Scope Token**

bsn.api.self.networks.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The network name

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `JaneDoeTesting`

```text
GET /2022/06/REST/Self/Networks/JaneDoeTesting/Settings/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Network Settings Entity](docId\:uAqtZaNLtnrCJbzF4Vjdw)

**Example**

```json
{
   "userAccessTokenLifetime": "00:15:00",
   "userRefreshTokenLifetime": "1.00:00:00",
   "deviceAccessTokenLifetime": "00:15:00",
   "deviceRefreshTokenLifetime": "730.00:00:00",
   "deviceRegistrationTokenLifetime": "730.00:00:00",
   "automaticTaggedPlaylistApprovalEnabled": false,
   "lastModifiedDate": "2020-07-09T19:09:06.77Z"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /Self/Networks/\{name}/Settings/ 

Update the settings associated with a specified network

**Required Scope Token**

bsn.api.self.networks.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The network name

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Network Settings Entity](docId\:uAqtZaNLtnrCJbzF4Vjdw)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `JaneDoeTesting`

```text
PUT /2022/06/REST/Self/Networks/JaneDoeTesting/Settings/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 335
```

This is the example request body:

```json
{
   "userAccessTokenLifetime": "00:15:00",
   "userRefreshTokenLifetime": "30.00:00:00",
   "deviceAccessTokenLifetime": "00:15:00",
   "deviceRefreshTokenLifetime": "730.00:00:00",
   "deviceRegistrationTokenLifetime": "730.00:00:00",
   "automaticTaggedPlaylistApprovalEnabled": false,
   "lastModifiedDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The network settings have been updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Networks/\{id}/Subscription/ 

Returns the current subscription information associated with a specified network.

**Required Scope Token**

bsn.api.self.networks.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for a network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Self/Networks/12345/Subscription/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Network Subscription Entity](docId:4aEKL8OUwp1jzomQCJ2iD)

**Example**

This is an example of a 200 level response:

```json
{
   "id": 12345,
   "level": "Content",
   "creationDate": "2020-08-17T20:49:45.633Z",
   "lastModifiedDate": "2020-08-17T20:49:45.633Z",
   "expireDate": "2030-08-16T00:00:00Z"
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /Self/Networks/\{id}/Subscription/ 

Updates the current subscription information associated with a specified network. A regular user can only use this to enable a trial period of the Content Cloud (if it was not previously enabled).

**Required Scope Token**

bsn.api.self.networks.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for a network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Network Subscription Entity](docId:4aEKL8OUwp1jzomQCJ2iD)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
PUT /2022/06/REST/Self/Networks/12345/Subscription/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 114
```

This is the example request body:

```json
{
   "id": 0,
   "level": "Trial",
   "creationDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00",
   "expireDate": null
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The subscription information was updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Networks/\{name}/Subscription/ 

Returns the current subscription information associated with a specified network.

**Required Scope**

bsn.api.self.networks.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The network name

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `JaneDoeTesting`

```text
GET /2022/06/REST/Self/Networks/JaneDoeTesting/Subscription/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Network Subscription Entity](docId:4aEKL8OUwp1jzomQCJ2iD)

**Example**

```json
{
   "id": 12345,
   "level": "Trial",
   "creationDate": "2020-08-17T20:49:45.633Z",
   "lastModifiedDate": "2020-08-17T20:49:45.633Z",
   "expireDate": "2030-08-16T00:00:00Z"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /Self/Networks/\{name}/Subscription/ 

Updates the current subscription information associated with a specified network. A regular user can only use this to enable a trial period of the Content Cloud (if it was not previously enabled).

**Required Scope Token**

bsn.api.self.networks.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The network name

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Network Subscription Entity](docId:4aEKL8OUwp1jzomQCJ2iD)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `JaneDoeTesting`

```text
PUT /2022/06/REST/Self/Networks/JaneDoeTesting/Subscription/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 114
```

This is the example request body:

```json
{
   "id": 0,
   "level": "Trial",
   "creationDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00",
   "expireDate": null
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: Updated the subscription information associated with the network

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Networks/\{id}/Subscriptions/ 

Returns the current subscription, and all previously expired subscriptions, associated with a specified network

**Required Scope Token**

bsn.api.self.networks.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The network identifier

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Self/Networks/12345/Subscriptions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Network Subscription](docId:4aEKL8OUwp1jzomQCJ2iD) entities 

**Example**

```json
[
      {
      "id": 12347,
      "level": "Content",
      "creationDate": "2020-08-17T20:49:45.633Z",
      "lastModifiedDate": "2020-08-17T20:49:45.633Z",
      "expireDate": "2030-08-16T00:00:00Z"
   },
      {
      "id": 12346,
      "level": "Trial",
      "creationDate": "2020-07-24T23:05:45.517Z",
      "lastModifiedDate": "2020-07-24T23:05:45.517Z",
      "expireDate": "2020-08-17T20:49:45.633Z"
   },
      {
      "id": 12345,
      "level": "Control",
      "creationDate": "2020-07-09T19:09:05.853Z",
      "lastModifiedDate": "2020-07-09T19:09:05.853Z",
      "expireDate": "2020-07-24T23:05:45.517Z"
   }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Networks/\{name}/Subscriptions/ 

Returns the current subscription, and all previously expired subscriptions, associated with a specified network

**Required Scope Token**

bsn.api.self.networks.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The network name

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `JaneDoeTesting`

```text
GET /2022/06/REST/Self/Networks/JaneDoeTesting/Subscriptions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Network Subscription](docId:4aEKL8OUwp1jzomQCJ2iD) entities 

**Example**

```json
[
      {
      "id": 12347,
      "level": "Content",
      "creationDate": "2020-08-17T20:49:45.633Z",
      "lastModifiedDate": "2020-08-17T20:49:45.633Z",
      "expireDate": "2030-08-16T00:00:00Z"
   },
      {
      "id": 12346,
      "level": "Trial",
      "creationDate": "2020-07-24T23:05:45.517Z",
      "lastModifiedDate": "2020-07-24T23:05:45.517Z",
      "expireDate": "2020-08-17T20:49:45.633Z"
   },
      {
      "id": 12345,
      "level": "Control",
      "creationDate": "2020-07-09T19:09:05.853Z",
      "lastModifiedDate": "2020-07-09T19:09:05.853Z",
      "expireDate": "2020-07-24T23:05:45.517Z"
   }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Users/ 

Returns all user entities that the customer is associated with over all networks where the person has a user record

**Required Scope Token**

bsn.api.self.users.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Self/Users/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of user entities (see [User Entity](docId:2FSBdEMevbu2CZlzCQnEC)) if the user is a member of multiple networks, or to a single [User Entity](docId:2FSBdEMevbu2CZlzCQnEC) if the user is only a member of one network, or nothing if the user is not a member of any network.

**Example**

```json
[
      {
      "id": 12345,
      "person":       {
         "id": 1234,
         "login": "JaneDoe@brightsign.biz",
         "password": null,
         "firstName": "Jane",
         "lastName": "Doe",
         "creationDate": "2020-07-09T19:05:20.247Z",
         "lastModifiedDate": "2023-11-29T17:40:54.403Z",
         "activationDate": "2020-07-09T19:05:38.723Z"
      },
      "network":       {
         "id": 1234,
         "name": "JaneDoeTesting"
      },
      "description": "Network Administrator",
      "creationDate": "2020-07-09T19:09:04.98Z",
      "lastModifiedDate": "2020-08-17T20:49:48.377Z",
      "lastLoginDate": "2023-12-07T22:11:53.24Z",
      "isLockedOut": false,
      "lastLockoutDate": null,
      "roleName": "Administrators",
      "permissions":       [
                  {
            "entityId": 54321,
            "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
            "principal":             {
               "login": "JaneDoe@brightsign.biz",
               "type": "User",
               "id": 12345
            },
            "isFixed": true,
            "isInherited": false,
            "isAllowed": true,
            "creationDate": "2020-08-17T20:49:48.353Z"
         }
      ]
   }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET  /Self/Users/\{id}/ 

Returns information about your membership in a network

**Required Scope Token**

bsn.api.self.users.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for a user

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Self/Users/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [User Entity](docId:2FSBdEMevbu2CZlzCQnEC)

**Example**

This is an example of a 200 level response:

```json
{
  "id": 12345,
  "person": {
    "id": 1234,
    "login": "JaneDoe@brightsign.biz",
    "password": null,
    "firstName": "Jane",
    "lastName": "Doe",
    "creationDate": "2020-07-09T19:05:20.247Z",
    "lastModifiedDate": "2023-11-29T17:40:54.403Z",
    "activationDate": "2020-07-09T19:05:38.723Z"
  },
  "network": {
    "id": 1234,
    "name": "JaneDoeTesting"
  },
  "description": "Network Administrator",
  "creationDate": "2020-07-09T19:09:04.98Z",
  "lastModifiedDate": "2020-08-17T20:49:48.377Z",
  "lastLoginDate": "2023-12-07T22:11:53.24Z",
  "isLockedOut": false,
  "lastLockoutDate": null,
  "roleName": "Administrators",
  "permissions": [
    {
      "entityId": 54321,
      "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
      "principal": {
        "login": "JaneDoe@brightsign.biz",
        "type": "User",
        "id": 12345
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2020-08-17T20:49:48.353Z"
    }
  ]
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Users/\{id}/Role/ 

Returns information about the role you have in a network

**Required Scope Token**

bsn.api.self.roles.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for a user

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Self/Users/12345/Role/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: This returns the [User Entity](docId:2FSBdEMevbu2CZlzCQnEC)

**Example**

This is an example of a 200 level response:

```json
{
   "id": 12345,
   "isCustom": true,
   "name": "CustomRole",
   "description": "",
   "creationDate": "2023-07-10T14:16:58.433Z",
   "userCount": 1,
   "users": null,
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
         "principal":          {
            "name": "CustomRole",
            "isCustom": true,
            "type": "Role",
            "id": 12345
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2023-08-17T20:49:45.793Z"
      }
   ]
}
```

**Success Response**

<font color="#089a4d">204</font>: No content (the user is not assigned to a role)

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Users/\{id}/Profile/ 

Returns the user profile settings

**Required Scope Token**

bsn.api.self.users.profile.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for a user

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Self/Users/12345/Profile/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{PersonAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The return type is object, where property names are profile keys and the profile values are those property values

**Example**

```json
{
   "enableCustomRolesManagement": "true",
   "showAdvancedSecuritySettings": "False"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /Self/Users/\{id}/Profile/ 

Creates a new user profile property (it does not replace an existing user profile property)

**Required Scope Token**

bsn.api.self.users.profile.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for a user

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- `pair` <font color="#704ae0">&lt;string, string&gt;: </font>A key value pair. There should be not more than 100 properties per user, and each property value should be not more than 64KB. 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
POST /2022/06/REST/Self/Users/12345/Profile/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 45
```

This is the example request body:

```json
{
	"key": "New Key 1",
	"value": "My Value"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the key value pair and a link to the GET method to retrieve it. 

**Example**

```json
{
   "key": "New Key 1",
   "value": "My Value"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">409</font>: The profile property with the specified key already exists or is reserved

<font color="#9a0808">413</font>: The specified profile property value size exceeds the 64KB limit

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Users/\{id}/Profile/\{key}/ 

Returns the value of a user profile property

**Required Scope Token**

bsn.api.self.users.profile.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for a user
- `key` <font color="#704ae0">string: </font>The name of the profile property

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- `key` is set to `New Key 1`

```text
GET /2022/06/REST/Self/Users/12345/Profile/New%20Key%201 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the value of the requested user profile key 

**Example**

This is an example of a status 200 response:

```json
"My Value"
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /Self/Users/\{id}/Profile/\{key}/ 

Creates or updates the value of a user profile property

**Required Scope Token**

bsn.api.self.users.profile.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segments**

- `id` <font color="#704ae0">int: </font>The unique identifier for a user
- `key` <font color="#704ae0">string: </font>The name of the profile property

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- <font color="#704ae0">string: </font>The profile property value to update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- `key` is set to `userStartupPage`
- `string` is set to `"Admin"`

```text
PUT /2022/06/REST/Self/Users/12345/Profile/userStartupPage HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 7
```

This is the example request body:

```json
"Admin"
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">201</font>: Returns this status code if the property value is defined for first time

<font color="#089a4d">204</font>: Returns this status code if the property already exists and has been updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: Either the request is malformed and therefore invalid, or the specified user profile property key is reserved or longer than 62 characters 

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">413</font>: The length of the specified user profile property exceeds the 64KB limit

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /Self/Users/\{id}/Profile/\{key}/ 

Removes a specified property from a user profile

**Required Scope Token**

bsn.api.self.users.profile.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segments**

- `id` <font color="#704ae0">int: </font>The unique identifier for a user
- `key` <font color="#704ae0">string: </font>The name of the profile property

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- `key` is set to `New Key 1`

```text
DELETE /2022/06/REST/Self/Users/12345/Profile/New%20Key%201 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified property has been removed from the user profile

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Users/\{id}/Permissions/ 

Returns the permissions granted to a given user

**Required Scope Token**

bsn.api.self.users.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a user

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Self/Users/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the paged list of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities granted to a specific user

**Example**

```json
[
  {
    "entityId": 12345,
    "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
    "principal": {
      "login": "JohnDoe@brightsign.biz",
      "type": "User",
      "id": 12345
    },
    "isFixed": true,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2020-08-17T20:49:48.353Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Users/\{id}/Role/Permissions/ 

Returns permissions granted to a given user

**Required Scope Token**

bsn.api.self.roles.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a user

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Self/Users/12345/Role/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities granted to a specific role

**Example**

```json
[
  {
    "entityId": null,
    "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
    "principal": {
      "name": "CustomRole",
      "isCustom": true,
      "type": "Role",
      "id": 12345
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2020-08-17T20:49:45.793Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Users/\{id}/Notifications/ 

Returns the user notification settings

**Required Scope Token**

bsn.api.self.users.notifications.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a user

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Self/Users/12345/Notifications/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns information about whether each setting in [User Notification Settings Entity](docId\:sUaNih9yxgTuVGgqi59l5) is enabled or disabled

**Example**

```json
{
   "networkSuspendingNotificationEnabled": false,
   "networkSuspendingNotificationTemplate": null,
   "networkSuspendedNotificationEnabled": true,
   "networkSuspendedNotificationTemplate": null,
   "networkSubscriptionUpgradedNotificationEnabled": true,
   "networkSubscriptionUpgradedNotificationTemplate": null,
   "networkTrialPeriodStartedNotificationEnabled": true,
   "networkTrialPeriodStartedNotificationTemplate": null,
   "networkTrialPeriodExpiringNotificationEnabled": true,
   "networkTrialPeriodExpiringNotificationTemplate": null,
   "networkTrialPeriodExpiredNotificationEnabled": true,
   "networkTrialPeriodExpiredNotificationTemplate": null,
   "deviceFailureNotificationEnabled": false,
   "deviceFailureNotificationTemplate": null,
   "devicesFailureNotificationEnabled": false,
   "devicesFailureNotificationTemplate": null,
   "deviceDisconnectedNotificationEnabled": false,
   "deviceDisconnectedNotificationTemplate": null,
   "devicesDisconnectedNotificationEnabled": false,
   "devicesDisconnectedNotificationTemplate": null,
   "subscriptionCreatedNotificationEnabled": false,
   "subscriptionCreatedNotificationTemplate": null,
   "subscriptionsCreatedNotificationEnabled": false,
   "subscriptionsCreatedNotificationTemplate": null,
   "subscriptionQueuedNotificationEnabled": false,
   "subscriptionQueuedNotificationTemplate": null,
   "subscriptionsQueuedNotificationEnabled": false,
   "subscriptionsQueuedNotificationTemplate": null,
   "graceSubscriptionExpiringNotificationEnabled": false,
   "graceSubscriptionExpiringNotificationTemplate": null,
   "graceSubscriptionsExpiringNotificationEnabled": false,
   "graceSubscriptionsExpiringNotificationTemplate": null,
   "demoSubscriptionExpiringNotificationEnabled": false,
   "demoSubscriptionExpiringNotificationTemplate": null,
   "demoSubscriptionsExpiringNotificationEnabled": false,
   "demoSubscriptionsExpiringNotificationTemplate": null,
   "subscriptionExpiringNotificationEnabled": false,
   "subscriptionExpiringNotificationTemplate": null,
   "subscriptionsExpiringNotificationEnabled": false,
   "subscriptionsExpiringNotificationTemplate": null,
   "subscriptionExpiredNotificationEnabled": false,
   "subscriptionExpiredNotificationTemplate": null,
   "subscriptionsExpiredNotificationEnabled": false,
   "subscriptionsExpiredNotificationTemplate": null,
   "subscriptionSuspendingNotificationEnabled": false,
   "subscriptionSuspendingNotificationTemplate": null,
   "subscriptionsSuspendingNotificationEnabled": false,
   "subscriptionsSuspendingNotificationTemplate": null,
   "subscriptionSuspendedNotificationEnabled": true,
   "subscriptionSuspendedNotificationTemplate": null,
   "subscriptionsSuspendedNotificationEnabled": true,
   "subscriptionsSuspendedNotificationTemplate": null
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /Self/Users/\{id}/Notifications/ 

Updates the user notification settings

**Required Scope Token**

bsn.api.self.users.notifications.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a user

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [User Notification Settings Entity](docId\:sUaNih9yxgTuVGgqi59l5) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
PUT /2022/06/REST/Self/Users/12345/Notifications/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 2799
```

This is the example request body:

```json
{
   "networkSuspendingNotificationEnabled": false,
   "networkSuspendingNotificationTemplate": null,
   "networkSuspendedNotificationEnabled": true,
   "networkSuspendedNotificationTemplate": null,
   "networkSubscriptionUpgradedNotificationEnabled": true,
   "networkSubscriptionUpgradedNotificationTemplate": null,
   "networkTrialPeriodStartedNotificationEnabled": true,
   "networkTrialPeriodStartedNotificationTemplate": null,
   "networkTrialPeriodExpiringNotificationEnabled": true,
   "networkTrialPeriodExpiringNotificationTemplate": null,
   "networkTrialPeriodExpiredNotificationEnabled": true,
   "networkTrialPeriodExpiredNotificationTemplate": null,
   "deviceFailureNotificationEnabled": false,
   "deviceFailureNotificationTemplate": null,
   "devicesFailureNotificationEnabled": false,
   "devicesFailureNotificationTemplate": null,
   "deviceDisconnectedNotificationEnabled": false,
   "deviceDisconnectedNotificationTemplate": null,
   "devicesDisconnectedNotificationEnabled": false,
   "devicesDisconnectedNotificationTemplate": null,
   "subscriptionCreatedNotificationEnabled": false,
   "subscriptionCreatedNotificationTemplate": null,
   "subscriptionsCreatedNotificationEnabled": false,
   "subscriptionsCreatedNotificationTemplate": null,
   "subscriptionQueuedNotificationEnabled": false,
   "subscriptionQueuedNotificationTemplate": null,
   "subscriptionsQueuedNotificationEnabled": false,
   "subscriptionsQueuedNotificationTemplate": null,
   "graceSubscriptionExpiringNotificationEnabled": false,
   "graceSubscriptionExpiringNotificationTemplate": null,
   "graceSubscriptionsExpiringNotificationEnabled": false,
   "graceSubscriptionsExpiringNotificationTemplate": null,
   "demoSubscriptionExpiringNotificationEnabled": false,
   "demoSubscriptionExpiringNotificationTemplate": null,
   "demoSubscriptionsExpiringNotificationEnabled": false,
   "demoSubscriptionsExpiringNotificationTemplate": null,
   "subscriptionExpiringNotificationEnabled": false,
   "subscriptionExpiringNotificationTemplate": null,
   "subscriptionsExpiringNotificationEnabled": false,
   "subscriptionsExpiringNotificationTemplate": null,
   "subscriptionExpiredNotificationEnabled": false,
   "subscriptionExpiredNotificationTemplate": null,
   "subscriptionsExpiredNotificationEnabled": false,
   "subscriptionsExpiredNotificationTemplate": null,
   "subscriptionSuspendingNotificationEnabled": false,
   "subscriptionSuspendingNotificationTemplate": null,
   "subscriptionsSuspendingNotificationEnabled": false,
   "subscriptionsSuspendingNotificationTemplate": null,
   "subscriptionSuspendedNotificationEnabled": true,
   "subscriptionSuspendedNotificationTemplate": null,
   "subscriptionsSuspendedNotificationEnabled": true,
   "subscriptionsSuspendedNotificationTemplate": null
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified user notification settings have been updated on the network

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error



## GET /Self/Applications/&#x20;

Returns pages of applications registered by an authenticated person, based on the filtering specified, in order of the specified sort query.

**Required Scope Token**

bsn.api.self.applications.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The default value is null. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (e.g. "\[Application].\[Name] ASC").&#x20;
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the isTruncated entry in the response body of the previous GET call indicates that the number of application instances exceeds the pageSize. This parameter is only required if you need more elements in the paged list than the pageSize (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of application instances that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[ClientId] IS '3fde8d97-2e40-4b0b-a76f-445804824799'`
- `sort` is set to `[LastModifiedDate] ASC`

```none
GET https://api.bsn.cloud/2022/06/REST/Self/Applications/?filter=%5BClientId%5D%20IS%20%273fde8d97-2e40-4b0b-a76f-445804824799%27&sort=%5BLastModifiedDate%5D%20ASC&pageSize=1 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/problem+json
Accept-Encoding: gzip,br
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns a paged list of [Application Entity](docId\:VdsymHQxz_VZAmKlkeug7)&#x20;

**Example**

This is an example of a 200 level response:

```json
{
  "items": [
    {
      "id": 12345,
      "owner": {
        "id": 54321,
        "login": "JaneDoe@brightsign.biz"
      },
      "clientId": "3fde8d97-2e40-4b0b-a76f-445804824799",
      "clientSecret": null,
      "scope": "self.info main.content upload",
      "name": "My Application",
      "description": "Sample Application",
      "creationDate": "2025-02-10T22:32:59.830Z",
      "lastModifiedDate": "2025-02-10T22:32:59.830Z"
    }
  ],
  "totalItemCount": 3,
  "matchingItemCount": 1,
  "pageSize": 1,
  "prevMarker": "MjAyNS0wMi0xMFQyMjozMjo1OS44MzBaLDM5LHByZXY=",
  "nextMarker": "MjAyNS0wMi0xMFQyMjozMjo1OS44MzBaLDM5LG5leHQ=",
  "isTruncated": false,
  "sortExpression": "[LastModifiedDate] ASC",
  "filterExpression": "[ClientId] IS '3fde8d97-2e40-4b0b-a76f-445804824799'"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method&#x20;

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Applications/Scopes/

Retrieves the list of available scope tokens which can be granted to a new or existing application.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```none
GET /2022/06/REST/Self/Applications/Scopes/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/problem+json
Accept-Encoding: gzip,br
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the list of available OAuth2 scope tokens

**Example**

```json
[
  "self.applications",
  "self.applications.create",
  "self.applications.delete",
  "self.applications.retrieve",
  "self.applications.update",
  "self.info",
  "self.info.retrieve",
  "self.info.update",
  "self.networks",
  "self.networks.create",
  "self.networks.retrieve",
  "self.networks.update",
  "self.profile",
  "self.profile.retrieve",
  "self.profile.update",
  "self.roles",
  "self.roles.retrieve",
  "self.token",
  "self.token.revoke",
  "self.token.validate",
  "self.users",
  "self.users.notifications.retrieve",
  "self.users.notifications.update",
  "self.users.profile.retrieve",
  "self.users.profile.update",
  "self.users.retrieve"
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method&#x20;

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /Self/Applications/

Registers a new application to obtain OAuth2 client credentials

**Required Scope Token**

bsn.api.self.applications.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The  [Application Entity](docId\:VdsymHQxz_VZAmKlkeug7)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```none
POST /2022/06/REST/Self/Applications/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Content-Type: application/json
Content-Length: 269
Accept: application/json, application/problem+json
Accept-Encoding: gzip,br
```

This is the example request body:

```json
{
  "id": 0,
  "name": "My Application",
  "description": "Sample Application",
  "owner": null,
  "scope": "self.info main.content upload",
  "clientId": "",
  "clientSecret": null,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the [Application Entity](docId\:VdsymHQxz_VZAmKlkeug7)&#x20;

:::ExpandableHeading
Example

```json
{
  "id": 12345,
  "owner": {
    "id": 54321,
    "login": "JaneDoe@brightsign.biz"
  },
  "clientId": "3fde8d97-2e40-4b0b-a76f-445804824799",
  "clientSecret": "EChCVGTKzOEx3pTKbgXq2UpMKMCQvXL7",
  "scope": "self.info main.content upload",
  "name": "My Application",
  "description": "Sample Application",
  "creationDate": "2025-02-10T22:32:59.828Z",
  "lastModifiedDate": "2025-02-10T22:32:59.828Z"
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations).

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules.

<font color="#9a0808">401</font>: The access token is invalid or not specified.

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method.

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header).

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header).

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error.

## DELETE /Self/Applications/

Unregisters the existing unused "Application" instances which are registered by an authenticated “Person” and satisfy the specified filter criteria, and revokes the related OAuth2 Client Credentials.&#x20;

**Required Scope Token**

bsn.api.self.applications.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs)  for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as foll`ow`s:

- `filter` is set to `[CreationDate] IS BEFORE '2025-01-01'`

```none
DELETE /2022/06/REST/Self/Applications/?filter=%5BCreationDate%5D%20IS%20BEFORE%20%272025-01-01%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/problem+json
Accept-Encoding: gzip,br
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The number of removed entities is returned.

**Failure**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method&#x20;

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Applications/Count/

Returns the number of application instances which are registered to an authenticated person and satisfy the specified filter criteria.

**Required Scope Token**

bsn.api.main.applications.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[CreationDate] IS BEFORE '2025-01-01'`

```none
GET /2022/06/REST/Self/Applications/Count/?filter=%5BCreationDate%5D%20IS%20BEFORE%20%272025-01-01%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/problem+json
Accept-Encoding: gzip,br
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The applications count is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Self/Applications/\{id}/

Returns information about an “Application” registered by an authenticated “Person” and having the specified “Id”.

**Required Scope Token**

bsn.api.self.applications.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">string: </font>The unique identifier of the application

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```none
GET /2022/06/REST/Self/Applications/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/problem+json
Accept-Encoding: gzip,br
If-Modified-Since: Thu, 06 Jun 2024 17:32:38 GMT
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Application Entity](docId\:VdsymHQxz_VZAmKlkeug7)

This is an example of a 200 level response:

```json
{
  "id": 12345,
  "owner": {
    "id": 54321,
    "login": "JaneDoe@brightsign.biz"
  },
  "clientId": "3fde8d97-2e40-4b0b-a76f-445804824799",
  "clientSecret": null,
  "scope": "self.info main.content upload",
  "name": "My Application",
  "description": "Sample Application",
  "creationDate": "2025-02-10T22:32:59.828Z",
  "lastModifiedDate": "2025-02-10T22:32:59.828Z"
}
```

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method&#x20;

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error



## PUT /Self/Applications/\{id}/

Edits information about an application which has a specified id

**Required Scope Token**

bsn.api.main.applications.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for an application

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Application Entity](docId\:VdsymHQxz_VZAmKlkeug7) &#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is `12345`

```none
PUT /2022/06/REST/Self/Applications/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Content-Type: application/json
Content-Length: 269
Accept: application/json, application/problem+json
Accept-Encoding: gzip,br
If-Unmodified-Since: Thu, 06 Jun 2024 17:32:38 GMT
```

This is the example request body:

```json
{
  "id": 0,
  "name": "My Application",
  "description": "Sample Application",
  "owner": null,
  "scope": "self.info main.content upload",
  "clientId": "",
  "clientSecret": null,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified application has been updated on the network&#x20;

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource/application changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /Self/Applications/\{id}/

Unregisters the existing unused “Application” instance registered by an authenticated “Person” and having the specified “Id”, and revokes the related OAuth2 Client Credentials.

**Required Scope Token**

bsn.api.self.applications.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">string: </font>The unique identifier of the application

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```none
DELETE /2022/06/REST/Self/Applications/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/problem+json
Accept-Encoding: gzip,br
If-Unmodified-Since: Thu, 06 Jun 2024 17:32:38 GMT
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified application has been removed

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid, or it is rejected in accordance with the business rules. For example, application service users may exist for this application and must be removed before it can be deleted.

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method&#x20;

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist).&#x20;

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /Self/Applications/\{id}/Secret/

Rotates the OAuth2 Client Secret of an existing “Application” instance registered by an authenticated “Person” and having the specified “Id”. See [this page](https://stackoverflow.com/questions/75571740/how-to-create-keyclock-clientsecret-via-api).

**Required Scope Token**

bsn.api.self.applications.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```none
POST /2022/06/REST/Self/Applications/12345/Secret/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/problem+json
Accept-Encoding: gzip,br
If-Unmodified-Since: Thu, 06 Jun 2024 17:32:38 GMT
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Invalidates the current OAuth2 client secret and issues a new one for a given application&#x20;

**Example**

```json
"jqVhz360hRnyMsu45Yx25N8TvNgwxZCB"
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations).

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules.

<font color="#9a0808">401</font>: The access token is invalid or not specified.

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method.

<font color="#9a0808">404</font>: The referenced application cannot be found.

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header).

<font color="#9a0808">412</font>: Precondition failed (the resource/group changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error.

[title] Roles Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

These endpoints allow users to manage roles on a network.

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Roles***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Returns a list of roles on a network

**Required Scope Token**

bsn.api.main.roles.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of role instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of role instances that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.
- `pageSize` is set to `1`

```text
GET /2022/06/REST/Roles/?marker=4kfak45jfk0915NVe&pageSize=1 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

S**uccess Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Role Entity](docId\:b3XQoT7IhHtHNVAcb0nGD) instances on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
  "items": [
    {
      "id": 12345,
      "isCustom": true,
      "name": "Custom Role 20231115",
      "description": "",
      "creationDate": "2023-11-15T19:14:10.087Z",
      "userCount": 0,
      "users": null,
      "permissions": [
        {
          "entityId": null,
          "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
          "principal": {
            "name": "Custom Role 20231115",
            "isCustom": true,
            "type": "Role",
            "id": 12345
          },
          "isFixed": false,
          "isInherited": false,
          "isAllowed": false,
          "creationDate": "2023-11-15T19:14:10.097Z"
        }
      ]
    }
  ],
  "totalItemCount": 8,
  "matchingItemCount": 8,
  "pageSize": 1,
  "nextMarker": "Cu20afjksdUN78q932",
  "prevMarker": "Cu20afjksdUN7813rf",
  "isTruncated": true,
  "sortExpression": "[Role].[Name] ASC",
  "filterExpression": ""
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /

Creates a role on a network

**Required Scope Token**

bsn.api.main.roles.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Role Entity](docId\:b3XQoT7IhHtHNVAcb0nGD) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Roles/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 962
```

This is the example request body:

```json
{
   "id": 0,
   "isCustom": true,
   "name": "Custom Role 20231115",
   "description": "",
   "creationDate": "0001-01-01T00:00:00",
   "userCount": 0,
   "users": null,
   "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the [Role Entity](docId\:b3XQoT7IhHtHNVAcb0nGD) created and referenced by the Uri (given by the Location header field) in the response. 

**Example**

```json
{
   "id": 12345,
   "isCustom": true,
   "name": "Custom Role 20231115",
   "description": "",
   "creationDate": "2023-11-15T19:14:10.087Z",
   "userCount": 0,
   "users": null,
   "permissions": []
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/ 

Returns a specified role on a network

**Required Scope Token**

bsn.api.main.roles.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a role

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Roles/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Role Entity](docId\:b3XQoT7IhHtHNVAcb0nGD) 

**Example**

This is an example of a 200 level response:

```json
{
  "id": 12345,
  "isCustom": true,
  "name": "Custom Role 20231115",
  "description": "",
  "creationDate": "2023-11-15T19:14:10.087Z",
  "userCount": 1,
  "users": [
    {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 54321
    }
  ],
  "permissions": [
    {
      "entityId": null,
      "operationUID": "3a67ae65-aa94-477b-acab-5291347cef2c",
      "principal": {
        "name": "Custom Role 20231115",
        "isCustom": true,
        "type": "Role",
        "id": 12345
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2023-12-01T16:37:19.553Z"
    }
  ]
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/ 

Updates the specified role on a network

**Required Scope Token**

bsn.api.main.roles.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a role 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Role Entity](docId\:b3XQoT7IhHtHNVAcb0nGD) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
PUT /2022/06/REST/Roles/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 756
```

This is the example request body:

```json
{
   "id": 0,
   "isCustom": true,
   "name": "Custom Role 20231115",
   "description": "",
   "creationDate": "0001-01-01T00:00:00",
   "userCount": 0,
   "users": null,
   "permissions": [
    {
      "entityId": null,
      "operationUID": "3a67ae65-aa94-477b-acab-5291347cef2c",
      "principal": {
        "name": "Custom Role 20231115",
        "isCustom": true,
        "type": "Role",
        "id": 12345
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "0001-01-01T00:00:00"
    }
  ]
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The role was successfully updated.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/ 

Removes the specified custom role on a network

**Required Scope Token**

bsn.api.main.roles.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a custom role

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
DELETE /2022/06/REST/Roles/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified role has been removed

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules (for example, if the user attempts to delete a system role).

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/ 

Returns the specified role on a network

**Required Scope Token**

bsn.api.main.roles.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the role

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Custom Role 20231115`

```text
GET /2022/06/REST/Roles/Custom Role 20231115/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Role Entity](docId\:b3XQoT7IhHtHNVAcb0nGD) 

**Example**

This is an example of a 200 level response:

```json
{
  "id": 12345,
  "isCustom": true,
  "name": "Custom Role 20231115",
  "description": "",
  "creationDate": "2023-11-15T19:14:10.087Z",
  "userCount": 1,
  "users": [
    {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 54321
    }
  ],
  "permissions": [
    {
      "entityId": null,
      "operationUID": "3a67ae65-aa94-477b-acab-5291347cef2c",
      "principal": {
        "name": "Custom Role 20231115",
        "isCustom": true,
        "type": "Role",
        "id": 12345
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2023-12-01T16:37:19.553Z"
    }
  ]
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{name}/ 

Updates the specified role on a network

**Required Scope Token**

bsn.api.main.roles.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the role

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Role Entity](docId\:b3XQoT7IhHtHNVAcb0nGD) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Custom Role 20231115`

```text
PUT /2022/06/REST/Roles/Custom Role 20231115/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 756
```

This is the example request body:

```json
{
   "id": 0,
   "isCustom": true,
   "name": "Custom Role 20231115",
   "description": "",
   "creationDate": "0001-01-01T00:00:00",
   "userCount": 0,
   "users": null,
   "permissions": [
    {
      "entityId": null,
      "operationUID": "3a67ae65-aa94-477b-acab-5291347cef2c",
      "principal": {
        "name": "Custom Role 20231115",
        "isCustom": true,
        "type": "Role",
        "id": 12345
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "0001-01-01T00:00:00"
    }
  ]
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The role was successfully updated.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/ 

Removes the specified custom role on a network

**Required Scope Token**

bsn.api.main.roles.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the custom role

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Custom Role 20231116`

```text
DELETE /2022/06/REST/Roles/Custom Role 20231116/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified role has been removed

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid, or it is rejected in accordance with the business rules (for example, if the user attempts to delete a system role).

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/ 

Returns operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Roles/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

:::ExpandableHeading
Example

```json
{
  "uid": "027a307a-a29d-d674-a935-da468ef03091",
  "singularName": "Full Control",
  "pluralName": "Role (Full Control)",
  "fullName": "Role (Full Control)",
  "targetEntity": "Role",
  "appliance": "Instance, Collection",
  "parent": null,
  "descendants": [
    {
      "uid": "0b943c8f-f889-2074-f152-014cff8c2e5d",
      "singularName": "View Role",
      "pluralName": "View Roles",
      "fullName": "Role (Full Control) - View Roles",
      "targetEntity": "Role",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "027a307a-a29d-d674-a935-da468ef03091",
        "singularName": "Full Control",
        "pluralName": "Role (Full Control)",
        "fullName": "Role (Full Control)",
        "targetEntity": "Role",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "0b943c8f-f889-2074-f152-014cff8c2e5d",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.16Z"
        },
        {
          "entityId": null,
          "operationUID": "0b943c8f-f889-2074-f152-014cff8c2e5d",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.283Z"
        },
        {
          "entityId": null,
          "operationUID": "0b943c8f-f889-2074-f152-014cff8c2e5d",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.38Z"
        },
        {
          "entityId": null,
          "operationUID": "0b943c8f-f889-2074-f152-014cff8c2e5d",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.45Z"
        },
        {
          "entityId": null,
          "operationUID": "0b943c8f-f889-2074-f152-014cff8c2e5d",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.62Z"
        },
        {
          "entityId": null,
          "operationUID": "0b943c8f-f889-2074-f152-014cff8c2e5d",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.803Z"
        }
      ]
    },
    {
      "uid": "f7d768be-c485-b4d4-5d98-bc80c329922c",
      "singularName": "View Users",
      "pluralName": "View Users",
      "fullName": "Role (Full Control) - View Users",
      "targetEntity": "Role",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "027a307a-a29d-d674-a935-da468ef03091",
        "singularName": "Full Control",
        "pluralName": "Role (Full Control)",
        "fullName": "Role (Full Control)",
        "targetEntity": "Role",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "f7d768be-c485-b4d4-5d98-bc80c329922c",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.16Z"
        },
        {
          "entityId": null,
          "operationUID": "f7d768be-c485-b4d4-5d98-bc80c329922c",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.283Z"
        },
        {
          "entityId": null,
          "operationUID": "f7d768be-c485-b4d4-5d98-bc80c329922c",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.38Z"
        },
        {
          "entityId": null,
          "operationUID": "f7d768be-c485-b4d4-5d98-bc80c329922c",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.45Z"
        },
        {
          "entityId": null,
          "operationUID": "f7d768be-c485-b4d4-5d98-bc80c329922c",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.62Z"
        },
        {
          "entityId": null,
          "operationUID": "f7d768be-c485-b4d4-5d98-bc80c329922c",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.803Z"
        }
      ]
    },
    {
      "uid": "f2293374-b9bb-2a04-b192-e1e3fb9b013a",
      "singularName": "Create Role",
      "pluralName": "Create Role",
      "fullName": "Role (Full Control) - Create Role",
      "targetEntity": "Role",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "027a307a-a29d-d674-a935-da468ef03091",
        "singularName": "Full Control",
        "pluralName": "Role (Full Control)",
        "fullName": "Role (Full Control)",
        "targetEntity": "Role",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "f2293374-b9bb-2a04-b192-e1e3fb9b013a",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.16Z"
        },
        {
          "entityId": null,
          "operationUID": "f2293374-b9bb-2a04-b192-e1e3fb9b013a",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.283Z"
        },
        {
          "entityId": null,
          "operationUID": "f2293374-b9bb-2a04-b192-e1e3fb9b013a",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.38Z"
        },
        {
          "entityId": null,
          "operationUID": "f2293374-b9bb-2a04-b192-e1e3fb9b013a",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.45Z"
        },
        {
          "entityId": null,
          "operationUID": "f2293374-b9bb-2a04-b192-e1e3fb9b013a",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.62Z"
        },
        {
          "entityId": null,
          "operationUID": "f2293374-b9bb-2a04-b192-e1e3fb9b013a",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.803Z"
        }
      ]
    },
    {
      "uid": "5cd2960f-5361-a504-81bf-9496384d1c24",
      "singularName": "Add User",
      "pluralName": "Add User",
      "fullName": "Role (Full Control) - Add User",
      "targetEntity": "Role",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "027a307a-a29d-d674-a935-da468ef03091",
        "singularName": "Full Control",
        "pluralName": "Role (Full Control)",
        "fullName": "Role (Full Control)",
        "targetEntity": "Role",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "5cd2960f-5361-a504-81bf-9496384d1c24",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.16Z"
        },
        {
          "entityId": null,
          "operationUID": "5cd2960f-5361-a504-81bf-9496384d1c24",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.283Z"
        },
        {
          "entityId": null,
          "operationUID": "5cd2960f-5361-a504-81bf-9496384d1c24",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.38Z"
        },
        {
          "entityId": null,
          "operationUID": "5cd2960f-5361-a504-81bf-9496384d1c24",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.45Z"
        },
        {
          "entityId": null,
          "operationUID": "5cd2960f-5361-a504-81bf-9496384d1c24",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.62Z"
        },
        {
          "entityId": null,
          "operationUID": "5cd2960f-5361-a504-81bf-9496384d1c24",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.803Z"
        }
      ]
    },
    {
      "uid": "a81a32c6-4291-05c4-71a2-6f899dc6da15",
      "singularName": "Remove User",
      "pluralName": "Remove User",
      "fullName": "Role (Full Control) - Remove User",
      "targetEntity": "Role",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "027a307a-a29d-d674-a935-da468ef03091",
        "singularName": "Full Control",
        "pluralName": "Role (Full Control)",
        "fullName": "Role (Full Control)",
        "targetEntity": "Role",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "a81a32c6-4291-05c4-71a2-6f899dc6da15",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.16Z"
        },
        {
          "entityId": null,
          "operationUID": "a81a32c6-4291-05c4-71a2-6f899dc6da15",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.283Z"
        },
        {
          "entityId": null,
          "operationUID": "a81a32c6-4291-05c4-71a2-6f899dc6da15",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.38Z"
        },
        {
          "entityId": null,
          "operationUID": "a81a32c6-4291-05c4-71a2-6f899dc6da15",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.45Z"
        },
        {
          "entityId": null,
          "operationUID": "a81a32c6-4291-05c4-71a2-6f899dc6da15",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.62Z"
        },
        {
          "entityId": null,
          "operationUID": "a81a32c6-4291-05c4-71a2-6f899dc6da15",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.803Z"
        }
      ]
    },
    {
      "uid": "b38189a5-84d8-fba4-bd56-f71a5dfba6e6",
      "singularName": "Edit Permissions",
      "pluralName": "Edit Permissions",
      "fullName": "Role (Full Control) - Edit Permissions",
      "targetEntity": "Role",
      "appliance": "Collection",
      "parent": {
        "uid": "027a307a-a29d-d674-a935-da468ef03091",
        "singularName": "Full Control",
        "pluralName": "Role (Full Control)",
        "fullName": "Role (Full Control)",
        "targetEntity": "Role",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "b38189a5-84d8-fba4-bd56-f71a5dfba6e6",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.16Z"
        },
        {
          "entityId": null,
          "operationUID": "b38189a5-84d8-fba4-bd56-f71a5dfba6e6",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.283Z"
        },
        {
          "entityId": null,
          "operationUID": "b38189a5-84d8-fba4-bd56-f71a5dfba6e6",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.38Z"
        },
        {
          "entityId": null,
          "operationUID": "b38189a5-84d8-fba4-bd56-f71a5dfba6e6",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.45Z"
        },
        {
          "entityId": null,
          "operationUID": "b38189a5-84d8-fba4-bd56-f71a5dfba6e6",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.62Z"
        },
        {
          "entityId": null,
          "operationUID": "b38189a5-84d8-fba4-bd56-f71a5dfba6e6",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.803Z"
        }
      ]
    },
    {
      "uid": "0a9b49c6-74a4-2834-15c6-606964e01f8b",
      "singularName": "Update Role",
      "pluralName": "Update Role",
      "fullName": "Role (Full Control) - Update Role",
      "targetEntity": "Role",
      "appliance": "Collection",
      "parent": {
        "uid": "027a307a-a29d-d674-a935-da468ef03091",
        "singularName": "Full Control",
        "pluralName": "Role (Full Control)",
        "fullName": "Role (Full Control)",
        "targetEntity": "Role",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "0a9b49c6-74a4-2834-15c6-606964e01f8b",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.16Z"
        },
        {
          "entityId": null,
          "operationUID": "0a9b49c6-74a4-2834-15c6-606964e01f8b",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.283Z"
        },
        {
          "entityId": null,
          "operationUID": "0a9b49c6-74a4-2834-15c6-606964e01f8b",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.38Z"
        },
        {
          "entityId": null,
          "operationUID": "0a9b49c6-74a4-2834-15c6-606964e01f8b",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.45Z"
        },
        {
          "entityId": null,
          "operationUID": "0a9b49c6-74a4-2834-15c6-606964e01f8b",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.62Z"
        },
        {
          "entityId": null,
          "operationUID": "0a9b49c6-74a4-2834-15c6-606964e01f8b",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.803Z"
        }
      ]
    },
    {
      "uid": "30af3135-5514-2f64-75e1-d31e074c16d5",
      "singularName": "Delete Role",
      "pluralName": "Delete Role",
      "fullName": "Role (Full Control) - Delete Role",
      "targetEntity": "Role",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "027a307a-a29d-d674-a935-da468ef03091",
        "singularName": "Full Control",
        "pluralName": "Role (Full Control)",
        "fullName": "Role (Full Control)",
        "targetEntity": "Role",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "30af3135-5514-2f64-75e1-d31e074c16d5",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.16Z"
        },
        {
          "entityId": null,
          "operationUID": "30af3135-5514-2f64-75e1-d31e074c16d5",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.283Z"
        },
        {
          "entityId": null,
          "operationUID": "30af3135-5514-2f64-75e1-d31e074c16d5",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.38Z"
        },
        {
          "entityId": null,
          "operationUID": "30af3135-5514-2f64-75e1-d31e074c16d5",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.45Z"
        },
        {
          "entityId": null,
          "operationUID": "30af3135-5514-2f64-75e1-d31e074c16d5",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.62Z"
        },
        {
          "entityId": null,
          "operationUID": "30af3135-5514-2f64-75e1-d31e074c16d5",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.803Z"
        }
      ]
    }
  ],
  "permissions": [
    {
      "entityId": null,
      "operationUID": "027a307a-a29d-d674-a935-da468ef03091",
      "principal": {
        "name": "Administrators",
        "isCustom": false,
        "type": "Role",
        "id": 1
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2024-01-03T01:44:13.16Z"
    },
    {
      "entityId": null,
      "operationUID": "027a307a-a29d-d674-a935-da468ef03091",
      "principal": {
        "name": "General Managers",
        "isCustom": false,
        "type": "Role",
        "id": 2
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2024-01-03T01:44:13.283Z"
    },
    {
      "entityId": null,
      "operationUID": "027a307a-a29d-d674-a935-da468ef03091",
      "principal": {
        "name": "Creators",
        "isCustom": false,
        "type": "Role",
        "id": 3
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2024-01-03T01:44:13.38Z"
    },
    {
      "entityId": null,
      "operationUID": "027a307a-a29d-d674-a935-da468ef03091",
      "principal": {
        "name": "Publishers",
        "isCustom": false,
        "type": "Role",
        "id": 4
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2024-01-03T01:44:13.45Z"
    },
    {
      "entityId": null,
      "operationUID": "027a307a-a29d-d674-a935-da468ef03091",
      "principal": {
        "name": "Network Managers",
        "isCustom": false,
        "type": "Role",
        "id": 5
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2024-01-03T01:44:13.62Z"
    },
    {
      "entityId": null,
      "operationUID": "027a307a-a29d-d674-a935-da468ef03091",
      "principal": {
        "name": "Viewers",
        "isCustom": false,
        "type": "Role",
        "id": 6
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2024-01-03T01:44:13.803Z"
    }
  ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/ 

Includes object permissions granted to a given role

**Required Scope Token**

bsn.api.main.roles.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a role

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Roles/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities granted to a given role

**Example**

```json
[
  {
    "entityId": null,
    "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
    "principal": {
      "name": "Creators",
      "isCustom": false,
      "type": "Role",
      "id": 12345
    },
    "isFixed": true,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2020-08-17T20:49:46.35Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/ 

Add permissions for specified roles on a network

**Required Scope Token**

bsn.api.main.roles.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a role

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
POST /2022/06/REST/Roles/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 292
```

This is the example request body:

```json
{
  "entityId": null,
  "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
  "principal": {
    "name": "Creators",
    "isCustom": false,
    "type": "Role",
    "id": 12345
  },
  "isFixed": false,
  "isInherited": false,
  "isAllowed": false,
  "creationDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified role

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/ 

Removes permissions for specified roles on a network

**Required Scope Token**

bsn.api.main.roles.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for a role

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
DELETE /2022/06/REST/Roles/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 359
```

This is the example request body:

```json
{
  "entityId": null,
  "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
  "principal": {
    "name": "Creators",
    "isCustom": false,
    "type": "Role",
    "id": 12345
  },
  "isFixed": false,
  "isInherited": false,
  "isAllowed": false,
  "creationDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions have been removed from the role

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Permissions/ 

Includes object permissions granted to a given role.

**Required Scope Token**

bsn.api.main.roles.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the role

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Creators`

```text
GET /2022/06/REST/Roles/Creators/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities granted to a given role

**Example**

```json
[
  {
    "entityId": null,
    "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
    "principal": {
      "name": "Creators",
      "isCustom": false,
      "type": "Role",
      "id": 12345
    },
    "isFixed": true,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2020-08-17T20:49:46.35Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{name}/Permissions/ 

Add permissions for specified roles on a network

**Required Scope Token**

bsn.api.main.roles.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name`  <font color="#704ae0">string: </font>The name of the role

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Creators`

```text
POST /2022/06/REST/Roles/Creators/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 292
```

This is the example request body:

```json
{
  "entityId": null,
  "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
  "principal": {
    "name": "Creators",
    "isCustom": false,
    "type": "Role",
    "id": 12345
  },
  "isFixed": false,
  "isInherited": false,
  "isAllowed": false,
  "creationDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified role

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist) 

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/Permissions/ 

Removes permissions for specified role on a network

**Required Scope Token**

bsn.api.main.roles.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the role

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Creators`

```text
DELETE /2022/06/REST/Roles/Creators/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 359
```

This is the example request body:

```json
{
  "entityId": null,
  "operationUID": "b41ac545-d505-7014-edde-51bc4c0d21a0",
  "principal": {
    "name": "Creators",
    "isCustom": false,
    "type": "Role",
    "id": 12345
  },
  "isFixed": false,
  "isInherited": false,
  "isAllowed": false,
  "creationDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions have been removed from the role

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Principal Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Principal entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier for either a user or a role
- `Type` <font color="#704ae0">PrincipalType</font> <font color="#01a0af">read-only</font>: The [PrincipalType Enumeration (2022/06)](docId\:Y3WCXS8fqkOs7oLOKwIX5)&#x20;














[title] Player Full Status Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Player Full Status entities are structured as follows:

`entity`:

- `Group` <font color="#704ae0">GroupInfo</font>: 
  - `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier for the group
  - `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the group
- `BrightWall` <font color="#704ae0">object </font>: This property is deprecated and will be removed in the next BSN.Cloud API version
- `Presentation` <font color="#704ae0">PresentationInfo</font> <font color="#01a0af">read-only</font>: An array of [Presentation Info](docId\:rH_TKLzOo3RPBID0mDC9v) entities for each presentation on the player
- `Script` <font color="#704ae0">PlayerScript</font>: 
  - `Type` <font color="#704ae0">ScriptType</font> <font color="#01a0af">read-only</font>: "Setup", "Autorun", "Recovery" or "Custom" enumeration values
  - `Version` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The reported version of the autorun/setup/recovery script running on the player
  - `Plugins` <font color="#704ae0">ScriptPluginInfo[]</font>: 
    - `FileName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The plugin *.brs* file name for the device instance
    - `FileSize` <font color="#704ae0">uint</font> <font color="#01a0af">read-only</font>: The size of the file in bytes
    - `FileHash` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The 40 digits hexadecimal SHA-1 hash of the file
- `Firmware` <font color="#704ae0">FirmwareInfo</font>: 
  - `Version` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The BrightSignOS version running on the player
- `Storage` <font color="#704ae0">StorageStatus[]</font> <font color="#01a0af">read-only</font>: See the [Storage Status Entity](docId:9Ya5dcJCCKo62Cr1lF3PI).
- `Network` <font color="#704ae0">PlayerNetworkStatus</font>: 
  - `ExternalIp` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: An IPv4 or IPv6 address 
  - `Interfaces` <font color="#704ae0">PlayerNetworkInterfaceStatus[]</font> <font color="#01a0af">read-only</font>: See the [Player Network Interface Status Entity](docId\:NaFlTsR_Qx_pClU1vKJmN)
- `Uptime` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-only</font>: The length of time that the player has been running. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `CurrentSettingsTimestamp` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The date and time. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `CurrentScheduleTimestamp` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The date and time of the current schedule. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Timezone` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The time zone of the player
- `Health` <font color="#704ae0">PlayerHealthStatus</font> <font color="#01a0af">read-only</font>: Returns either "Normal", "Warning", "Error", or "Unknown"
- `LastModifiedDate` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-only</font>: A UTC timestamp indicating when the last status update was reported by a player to BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information on this data type.&#x20;
- `Synchronization` <font color="#704ae0">PlayerSynchronizationStatus</font> <font color="#01a0af">read-only</font>: Supported representations include:
  - `Settings` <font color="#704ae0">PlayerSettingsSynchronizationStatus</font>: 
    - `Enabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-only</font>: Whether or not the player settings synchronization status is enabled
  - `Schedule` <font color="#704ae0">PlayerScheduleSynchronizationStatus</font>: 
    - `Enabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-only</font>: Whether or not the player schedule synchronization status is enabled
  - `Content` <font color="#704ae0">PlayerContentSynchronizationStatus</font>: 
    - `Enabled` <font color="#704ae0">bool</font> <font color="#01a0af">read-only</font>: Whether or not the player content synchronization status is enabled


[title] Custom Data Types (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/

The data types below, which are consistent across all APIs, are used in the BSN.Cloud Main API as are the entities in the child pages beneath this page (expand the left panel to see these pages).

## DateTime

Defines a moment in time using a sortable UTC pattern value format, based on [rfc3339](https://datatracker.ietf.org/doc/html/rfc3339). An example would be 2022-02-18T16:57:00.123Z 

## DayOfWeek

Represents the day of the week from Sunday to Saturday. The days are specified as a string list (for example, "Monday, Wednesday, Friday").  

## Nullable\<int>

Data types that are prefixed with "nullable" (for example, nullable\<int>) accept null value. Most data types are not nullable in this API framework, so this data type allows you to accept null for a non-nullable type. By default, nullable types are strings, objects, and arrays.

## TimeSpan

Represents a period of time. Possible values are: 

- 00:00 - 23:59 (hours and minutes)
- 00:00:00 - 23:59:59 (hours, minutes, and seconds. This is the default format)
- 00:00:00.000 - 23:59:59.999 (hours, minutes, seconds, and milliseconds)
- 1.00:00:00 - 99999.23:59:59 (date, hours, minutes, seconds)
- 1.00:00:00.000 - 99999.23:59:59.999 (date, hours, minutes, seconds, and milliseconds)

## Uri

A representation of a resource available on the internet or intranet. This data type is nullable.

[title] Player Network Settings Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Player Network Settings entities are structured as follows:

`entity`:

- `Hostname` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the host device
- `ProxyServer` <font color="#704ae0">URL</font> <font color="#01a0af">read-write</font>: The URL address of the proxy server
- `ProxyBypass` <font color="#704ae0">string[]</font> <font color="#01a0af">read-write</font>: The proxy bypass server names&#x20;
- `TimeServers` <font color="#704ae0">URL[]</font> <font color="#01a0af">read-write</font>: A collection of base URLs pointing to NTP or any general web server for time synchronization.
- `Interfaces` <font color="#704ae0">PlayerNetworkInterfaceSettings[]</font> <font color="#01a0af">read-write</font>: See the [Player Network Interface Settings Entity (2022/06)](docId\:GP0vpk4gDYjNwiwutMhew). Supported representations include:
  - `Type` <font color="#704ae0">PlayerNetworkInterfaceType</font> <font color="#01a0af">read-write</font>: One of "Ethernet", "Cellular", "WiFi", "Virtual", or "Other"




[title] Paged List Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

The Paged List entity is structured as follows:

`entity`:

- `Items` <font color="#704ae0">Entity []</font>: The subset of items contained only within this one page of the complete list of entities
- `TotalItemCount` <font color="#704ae0">int</font>: The number of requested entities contained within the whole network
- `MatchingItemCount` <font color="#704ae0">int</font>: The number of requested entities contained within the whole network which match the filter criteria specified in the request
- `PageSize` <font color="#704ae0">int</font>: The maximum number of objects that can be contained in the response body. 100 is the default and also the maximum. 
- `PrevMarker` <font color="#704ae0">string</font>: The marker of the first item in the paged subset.
- `NextMarker` <font color="#704ae0">string</font>: The marker of the last item in the paged subset. This value is useful if the `IsTruncated` entry in the response body indicates that the number of device webpage instances exceeds the `PageSize`. 
- `IsTruncated` <font color="#704ae0">bool</font>: Whether or not there are additional pages in the subset. If this value is True, add `NextMarker` in your URL "marker" parameter to get the next paged subset (you can also include the "PageSize" option if the "marker" parameter is present). 
- `SortExpression` <font color="#704ae0">string</font>:  An expression that has been previously applied to the list of returned items. Note that:
  - If the customer does not supply an expression, the default expression will be calculated.
  - The sort expression specifies the entry used for sorting, and the ascending/descending (ASC/DESC) sorting order. For example, "`[Device].[Serial] ASC`" is the default setting for devices (by serial number in ascending order), but the default setting will change depending on what entity type is being returned by the paged list call.
  - The server will parse, validate, and clarify the expression, so the returned expression might be slightly different than the expression provided by the customer.
- `FilterExpression` <font color="#704ae0">string</font>: An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering the returned paged list


[title] Groups/Regular Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

Use these endpoints to manage groups on the network. 

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Groups/Regular***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Retrieves a list of groups on the network.

**Required Scope Token**

bsn.api.main.groups.regular.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (see [this page](docId:3L0afyD3xoOE-yTvfk2vs) for more information). The default value is null.
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of group instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of group instances that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[CreationDate] IS IN THE RANGE '2020-07-01' AND '2023-08-01'`
- `sort` is set to `[Name] ASC`

```text
GET /2022/06/REST/Groups/Regular/?marker=YXVkaW8tdGVzdCwyNjQ1Mjg%3D&pageSize=1&filter=%5BCreationDate%5D%20IS%20IN%20THE%20RANGE%20%272020-07-01%27%20AND%20%272023-08-01%27&sort=%5BName%5D%20ASC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Regular Groups Entity](docId\:uzVWHpbOPgrY2Z9PqO9Gd) instances on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

:::ExpandableHeading
Example

```json
{
   "items": [   {
      "id": 123456,
      "name": "ConferenceRoom",
      "creationDate": "2023-7-11T22:24:51.347Z",
      "lastModifiedDate": "2023-12-11T22:45:47.007Z",
      "autorun": null,
      "hdX23Firmware": "",
      "hdX23FirmwareId": -1,
      "lsX23Firmware": "",
      "lsX23FirmwareId": -1,
      "hsX23Firmware": "",
      "hsX23FirmwareId": -1,
      "hoX23Firmware": "",
      "hoX23FirmwareId": -1,
      "xdX33Firmware": "",
      "xdX33FirmwareId": -1,
      "xtX43Firmware": "",
      "xtX43FirmwareId": -1,
      "xdX34_XTX44Firmware": "",
      "xdX34_XTX44FirmwareId": -1,
      "hdX4_HSX4_LSX4Firmware": "8.5.47",
      "hdX4_HSX4_LSX4FirmwareId": 12345678,
      "auX5Firmware": "",
      "auX5FirmwareId": -1,
      "4KX42Firmware": "",
      "4KX42FirmwareId": -1,
      "xcX55Firmware": "",
      "xcX55FirmwareId": -1,
      "xtX45_XDX35_HDX25_LS4X5_HS1X5Firmware": "",
      "xtX45_XDX35_HDX25_LS4X5_HS1X5FirmwareId": -1,
      "enableSerialDebugging": false,
      "enableSystemLogDebugging": false,
      "enableStorageSpaceLimit": false,
      "storageSpaceLimitUnits": "Percentage",
      "publishedDataSizeLimit": 0,
      "dynamicDataSizeLimit": 0,
      "htmlDataSizeLimit": 0,
      "htmlLocalStorageSizeLimit": 0,
      "webDatabaseSizeLimit": 0,
      "devicesCount": 2,
      "devicesHealthStatus":       {
         "normal": 1,
         "error": 1
      },
      "devices": null,
      "schedule": [],
      "permissions": []
   }],
   "totalItemCount": 8,
   "matchingItemCount": 8,
   "pageSize": 1,
   "nextMarker": "Q29uZmVyZW5jZVJvb20sMzIwMzA3",
   "prevMarker": "Q29uZmVyZW5jZVJvb20sMzIwMpG8",
   "isTruncated": true,
   "sortExpression": "[Name] ASC",
   "filterExpression": "[CreationDate] IS IN THE RANGE '2020-07-01T00:00:00.000Z' AND '2023-08-01T00:00:00.000Z'"
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /

Creates a group on the network.

**Required Scope Token**

bsn.api.main.groups.regular.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Regular Groups Entity](docId\:uzVWHpbOPgrY2Z9PqO9Gd) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Groups/Regular/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 1053
```

This is the example request body:

```json
{
   "id": 0,
   "name": "NewGroup",
   "creationDate": "0001-01-01T00:00:00.000Z",
   "lastModifiedDate": "0001-01-01T00:00:00.000Z",
   "autorun": null,
   "hdX23Firmware": "",
   "hdX23FirmwareId": -1,
   "lsX23Firmware": "",
   "lsX23FirmwareId": -1,
   "hsX23Firmware": "",
   "hsX23FirmwareId": -1,
   "hoX23Firmware": "",
   "hoX23FirmwareId": -1,
   "xdX33Firmware": "",
   "xdX33FirmwareId": -1,
   "xtX43Firmware": "",
   "xtX43FirmwareId": -1,
   "xdX34_XTX44Firmware": "",
   "xdX34_XTX44FirmwareId": -1,
   "hdX4_HSX4_LSX4Firmware": "8.5.47",
   "hdX4_HSX4_LSX4FirmwareId": -1,
   "4KX42Firmware": "",
   "4KX42FirmwareId": -1,
   "enableSerialDebugging": false,
   "enableSystemLogDebugging": false,
   "enableStorageSpaceLimit": false,
   "storageSpaceLimitUnits": "Percentage",
   "publishedDataSizeLimit": 0,
   "dynamicDataSizeLimit": 0,
   "htmlDataSizeLimit": 0,
   "htmlLocalStorageSizeLimit": 0,
   "webDatabaseSizeLimit": 0,
   "devicesCount": 0,
   "devicesHealthStatus": null,
   "devices": null,
   "schedule": null,
   "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the [Regular Groups Entity](docId\:uzVWHpbOPgrY2Z9PqO9Gd) created and referenced by the Uri (given by the Location header field) in the response.  

**Example**

```json
{
   "id": 123456,
   "name": "NewGroup",
   "creationDate": "2023-10-19T20:30:35.833Z",
   "lastModifiedDate": "2023-10-19T20:30:35.833Z",
   "autorun": null,
   "hdX23Firmware": "",
   "hdX23FirmwareId": -1,
   "lsX23Firmware": "",
   "lsX23FirmwareId": -1,
   "hsX23Firmware": "",
   "hsX23FirmwareId": -1,
   "hoX23Firmware": "",
   "hoX23FirmwareId": -1,
   "xdX33Firmware": "",
   "xdX33FirmwareId": -1,
   "xtX43Firmware": "",
   "xtX43FirmwareId": -1,
   "xdX34_XTX44Firmware": "",
   "xdX34_XTX44FirmwareId": -1,
   "hdX4_HSX4_LSX4Firmware": "8.5.47",
   "hdX4_HSX4_LSX4FirmwareId": 12345,
   "auX5Firmware": "",
   "auX5FirmwareId": -1,
   "4KX42Firmware": "",
   "4KX42FirmwareId": -1,
   "xcX55Firmware": "",
   "xcX55FirmwareId": -1,
   "xtX45_XDX35_HDX25_LS4X5_HS1X5Firmware": "",
   "xtX45_XDX35_HDX25_LS4X5_HS1X5FirmwareId": -1,
   "enableSerialDebugging": false,
   "enableSystemLogDebugging": false,
   "enableStorageSpaceLimit": false,
   "storageSpaceLimitUnits": "Percentage",
   "publishedDataSizeLimit": 0,
   "dynamicDataSizeLimit": 0,
   "htmlDataSizeLimit": 0,
   "htmlLocalStorageSizeLimit": 0,
   "webDatabaseSizeLimit": 0,
   "devicesCount": 0,
   "devicesHealthStatus": {},
   "devices": null,
   "schedule": [],
   "permissions": []
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Removes groups, specified by a filter, from a network. This allows multiple groups to be deleted at once.

**Required Scope Token**

bsn.api.main.groups.regular.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. 
- `reassignmentGroupId` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The identifier of the group instance to which affected devices should be reassigned. If this value is negative, the devices will be reassigned to the default “Unassigned” group instance. If a group instance with the specified positive \[int] Id does not exist, the method will return a descriptive error. The default value is 0.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[DevicesCount] IS 0`
- `reassignmentGroupId` is set to `12345`

```text
DELETE /2022/06/REST/Groups/Regular/?reassignmentGroupId=12345&filter=%5BDevicesCount%5D%20IS%200 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the number of affected groups as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/  

Returns the number of groups on the network that match the specified filter criteria. If no filter is included, this call returns the total number of groups on the network. 

**Required Scope Token**

bsn.api.main.groups.regular.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[Name] CONTAINS 'test'`

```text
GET /2022/06/REST/Groups/Regular/Count/?filter=%5BName%5D%20CONTAINS%20%27test%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The number of groups is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/  

Returns a specified group

**Required Scope Token**

bsn.api.main.groups.regular.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Groups/Regular/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Modified-Since: Wed, 20 Dec 2023 21:32:34 GMT
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Regular Groups Entity](docId\:uzVWHpbOPgrY2Z9PqO9Gd) 

**Example**

This is an example of a 200 level response:

```json
{
   "id": 12345,
   "name": "ConferenceRoom",
   "creationDate": "2023-12-11T22:24:51.347Z",
   "lastModifiedDate": "2023-12-20T21:32:35.093Z",
   "autorun": null,
   "hdX23Firmware": "",
   "hdX23FirmwareId": -1,
   "lsX23Firmware": "",
   "lsX23FirmwareId": -1,
   "hsX23Firmware": "",
   "hsX23FirmwareId": -1,
   "hoX23Firmware": "",
   "hoX23FirmwareId": -1,
   "xdX33Firmware": "",
   "xdX33FirmwareId": -1,
   "xtX43Firmware": "",
   "xtX43FirmwareId": -1,
   "xdX34_XTX44Firmware": "",
   "xdX34_XTX44FirmwareId": -1,
   "hdX4_HSX4_LSX4Firmware": "",
   "hdX4_HSX4_LSX4FirmwareId": -1,
   "auX5Firmware": "",
   "auX5FirmwareId": -1,
   "4KX42Firmware": "",
   "4KX42FirmwareId": -1,
   "xcX55Firmware": "",
   "xcX55FirmwareId": -1,
   "xtX45_XDX35_HDX25_LS4X5_HS1X5Firmware": "",
   "xtX45_XDX35_HDX25_LS4X5_HS1X5FirmwareId": -1,
   "enableSerialDebugging": true,
   "enableSystemLogDebugging": false,
   "enableStorageSpaceLimit": false,
   "storageSpaceLimitUnits": "Percentage",
   "publishedDataSizeLimit": 0,
   "dynamicDataSizeLimit": 0,
   "htmlDataSizeLimit": 0,
   "htmlLocalStorageSizeLimit": 0,
   "webDatabaseSizeLimit": 0,
   "devicesCount": 2,
   "devicesHealthStatus":    {
      "normal": 1,
      "error": 1
   },
   "devices":    [
            {
         "id": 12345,
         "serial": "XXXXXX000000"
      },
            {
         "id": 67890,
         "serial": "YYYYYY000000"
      }
   ],
   "schedule": [],
   "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the `If-Modified-Since` header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/  

Updates the specified group

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Regular Groups Entity](docId\:uzVWHpbOPgrY2Z9PqO9Gd) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Groups/Regular/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Content-Type: application/json
Content-Length: 1785
```

This is the example request body:

```json
{
  "id": 0,
  "name": "Default",
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "autorun": null,
  "hdX23Firmware": "",
  "hdX23FirmwareId": -1,
  "lsX23Firmware": "",
  "lsX23FirmwareId": -1,
  "hsX23Firmware": "",
  "hsX23FirmwareId": -1,
  "hoX23Firmware": "",
  "hoX23FirmwareId": -1,
  "xdX33Firmware": "",
  "xdX33FirmwareId": -1,
  "xtX43Firmware": "",
  "xtX43FirmwareId": -1,
  "xdX34_XTX44Firmware": "",
  "xdX34_XTX44FirmwareId": -1,
  "hdX4_HSX4_LSX4Firmware": "8.5.47",
  "hdX4_HSX4_LSX4FirmwareId": -1,
  "auX5Firmware": "",
  "auX5FirmwareId": -1,
  "4KX42Firmware": "",
  "4KX42FirmwareId": -1,
  "xcX55Firmware": "",
  "xcX55FirmwareId": -1,
  "xtX45_XDX35_HDX25_LS4X5_HS1X5Firmware": "",
  "xtX45_XDX35_HDX25_LS4X5_HS1X5FirmwareId": -1,
  "enableSerialDebugging": false,
  "enableSystemLogDebugging": true,
  "enableStorageSpaceLimit": false,
  "storageSpaceLimitUnits": "Percentage",
  "publishedDataSizeLimit": 0,
  "dynamicDataSizeLimit": 0,
  "htmlDataSizeLimit": 0,
  "htmlLocalStorageSizeLimit": 0,
  "webDatabaseSizeLimit": 0,
  "devicesCount": 0,
  "devicesHealthStatus": null,
  "devices": null,
  "schedule": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified group has been updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource/group changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PATCH /\{id}/  

Applies a sequence of changes to a specific group entity specified by id. See [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902).

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The identifier for the group entity, which is a resource Uri

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

These properties are entries in an array. Every entry must have all three of these properties:

- `op` <font color="#704ae0">string</font>:  The type of operation - in this case it is always "replace"
- `path` <font color="#704ae0">string</font>: A Uri path that references the location within the target document where the update will be performed
- `value` <font color="#704ae0">object</font>: The replacement value(s) for the parameters that must be updated. This can be an array.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is `12345`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PATCH /2022/06/REST/Groups/Regular/12345/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Content-Type: application/json-patch+json
Content-Length: 91
```

This is the example request body:

```json
[
  {
    "op": "replace",
    "path": "/xdX34_XTX44Firmware/",
    "value": "8.5.33"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The parameters have been successfully replaced.

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/  

Removes the specified group

**Required Scope Token**

bsn.api.main.groups.regular.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `reassignmentGroupId` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The identifier of the group instance to which affected devices should be reassigned. If this value is negative, the devices will be reassigned to the default “Unassigned” group instance. If a group instance with the specified positive \[int] Id does not exist, the method will return a descriptive error. The default value is 0.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`
- `reassignmentGroupId` is set to `90`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Groups/Regular/12345/?reassignmentGroupId=90 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified group has been removed from the network 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/  

Returns a specified group

**Required Scope Token**

bsn.api.main.groups.regular.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `ConferenceRoom`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Groups/Regular/ConferenceRoom/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Modified-Since: Wed, 20 Dec 2023 21:32:34 GMT
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Regular Groups Entity](docId\:uzVWHpbOPgrY2Z9PqO9Gd) 

**Example**

This is an example of a 200 level response:

```json
{
   "id": 456789,
   "name": "ConferenceRoom",
   "creationDate": "2023-12-11T22:24:51.347Z",
   "lastModifiedDate": "2023-12-20T21:32:35.093Z",
   "autorun": null,
   "hdX23Firmware": "",
   "hdX23FirmwareId": -1,
   "lsX23Firmware": "",
   "lsX23FirmwareId": -1,
   "hsX23Firmware": "",
   "hsX23FirmwareId": -1,
   "hoX23Firmware": "",
   "hoX23FirmwareId": -1,
   "xdX33Firmware": "",
   "xdX33FirmwareId": -1,
   "xtX43Firmware": "",
   "xtX43FirmwareId": -1,
   "xdX34_XTX44Firmware": "",
   "xdX34_XTX44FirmwareId": -1,
   "hdX4_HSX4_LSX4Firmware": "",
   "hdX4_HSX4_LSX4FirmwareId": -1,
   "auX5Firmware": "",
   "auX5FirmwareId": -1,
   "4KX42Firmware": "",
   "4KX42FirmwareId": -1,
   "xcX55Firmware": "",
   "xcX55FirmwareId": -1,
   "xtX45_XDX35_HDX25_LS4X5_HS1X5Firmware": "",
   "xtX45_XDX35_HDX25_LS4X5_HS1X5FirmwareId": -1,
   "enableSerialDebugging": true,
   "enableSystemLogDebugging": false,
   "enableStorageSpaceLimit": false,
   "storageSpaceLimitUnits": "Percentage",
   "publishedDataSizeLimit": 0,
   "dynamicDataSizeLimit": 0,
   "htmlDataSizeLimit": 0,
   "htmlLocalStorageSizeLimit": 0,
   "webDatabaseSizeLimit": 0,
   "devicesCount": 2,
   "devicesHealthStatus":    {
      "normal": 1,
      "error": 1
   },
   "devices":    [
            {
         "id": 12345,
         "serial": "XXXXXX000000"
      },
            {
         "id": 67890,
         "serial": "YYYYYY000000"
      }
   ],
   "schedule": [],
   "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{name}/  

Updates a specified group

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Regular Groups Entity](docId\:uzVWHpbOPgrY2Z9PqO9Gd) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Default`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Groups/Regular/Default/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Content-Type: Content-Type: application/json-patch+json
Content-Length: 1785
```

This is the example request body:

```json
{
  "id": 0,
  "name": "Default",
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "autorun": null,
  "hdX23Firmware": "",
  "hdX23FirmwareId": -1,
  "lsX23Firmware": "",
  "lsX23FirmwareId": -1,
  "hsX23Firmware": "",
  "hsX23FirmwareId": -1,
  "hoX23Firmware": "",
  "hoX23FirmwareId": -1,
  "xdX33Firmware": "",
  "xdX33FirmwareId": -1,
  "xtX43Firmware": "",
  "xtX43FirmwareId": -1,
  "xdX34_XTX44Firmware": "",
  "xdX34_XTX44FirmwareId": -1,
  "hdX4_HSX4_LSX4Firmware": "8.5.47",
  "hdX4_HSX4_LSX4FirmwareId": -1,
  "auX5Firmware": "",
  "auX5FirmwareId": -1,
  "4KX42Firmware": "",
  "4KX42FirmwareId": -1,
  "xcX55Firmware": "",
  "xcX55FirmwareId": -1,
  "xtX45_XDX35_HDX25_LS4X5_HS1X5Firmware": "",
  "xtX45_XDX35_HDX25_LS4X5_HS1X5FirmwareId": -1,
  "enableSerialDebugging": false,
  "enableSystemLogDebugging": true,
  "enableStorageSpaceLimit": false,
  "storageSpaceLimitUnits": "Percentage",
  "publishedDataSizeLimit": 0,
  "dynamicDataSizeLimit": 0,
  "htmlDataSizeLimit": 0,
  "htmlLocalStorageSizeLimit": 0,
  "webDatabaseSizeLimit": 0,
  "devicesCount": 0,
  "devicesHealthStatus": null,
  "devices": null,
  "schedule": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified group has been updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource/group changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PATCH /\{name}/  

Applies a sequence of changes to a specific group entity specified by name. See [RFC 6902](https://datatracker.ietf.org/doc/html/rfc6902).

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the group entity, which is a resource Uri

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

These properties are entries in an array. Every entry must have all three of these properties:

- `op` <font color="#704ae0">string: </font>The type of operation - in this case it is always "replace"
- `path` <font color="#704ae0">string</font>: A Uri path that references the location within the target document where the update will be performed
- `value` <font color="#704ae0">object</font>: The replacement value(s) for the parameters that must be updated. This can be an array.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is `Default`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PATCH /2022/06/REST/Groups/Regular/Default/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Content-Type: application/json-patch+json
Content-Length: 91
```

This is the example request body:

```json
[
  {
    "op": "replace",
    "path": "/xdX34_XTX44Firmware/",
    "value": "8.5.33"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The parameters have been successfully replaced.

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/  

Removes a specified group

**Required Scope Token**

bsn.api.main.groups.regular.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `reassignmentGroupId` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The identifier of the group instance to which affected devices should be reassigned. If this value is negative, the devices will be reassigned to the default “Unassigned” group instance. If a group instance with the specified positive \[int] Id does not exist, the method will return a descriptive error. The default value is 0.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `Default`
- `reassignmentGroupId` is set to `90`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Groups/Regular/Default/?reassignmentGroupId=90 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified group has been removed from the network 

**Failure** **Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{Id}/Schedule/  

Returns a list of the [Scheduled Presentation Entity](docId\:DRSRSrFhJ2cz61wdoL7QM) in the specified group

**Required Scope Token**

bsn.api.main.groups.regular.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `groupId` <font color="#704ae0">int: </font>The unique identifier of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of group instances exceeds the `pageSize`.
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of group instances that can be contained in the response body.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `groupId` is set to `12345`
- `pageSize` is set to `1`
- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.

```text
GET /2022/06/REST/Groups/Regular/12345/Schedule/?marker=Zy023g2B8&pageSize=1 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a list of the scheduled presentations of the specified group

**Example**

```json
{
   "items": [   {
      "id": 2345678,
      "presentationId": 123456,
      "presentationName": "October2023Prez",
      "isRecurrent": false,
      "eventDate": "2023-11-03T00:00:00",
      "startTime": "00:00:00",
      "duration": "23:59:00",
      "recurrenceStartDate": null,
      "recurrenceEndDate": null,
      "daysOfWeek": "None",
      "creationDate": "2023-11-03T21:04:32.81Z",
      "lastModifiedDate": "2023-11-03T21:04:32.81Z",
      "expirationDate": "2023-11-04T11:59:00Z",
      "interruptScheduling": false
   }],
   "totalItemCount": 3,
   "matchingItemCount": 3,
   "pageSize": 1,
   "nextMarker": "GWpbWFcsw15NjI5MjN0",
   "prevMarker": "GWpbWFcsw15NjI5hu8u",
   "isTruncated": true,
   "sortExpression": "[ScheduledPresentation].[ExpireDate] DESC",
   "filterExpression": null
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{Id}/Schedule/  

Adds a scheduled presentation to the specified group

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `groupId` <font color="#704ae0">int: </font>The unique identifier of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Scheduled Presentation Entity](docId\:DRSRSrFhJ2cz61wdoL7QM) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `groupId` is set to `12345`

```text
POST /2022/06/REST/Groups/Regular/12345/Schedule/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 419
```

This is the example request body:

```json
{
  "id": 0,
  "presentationId": 23456,
  "presentationName": "October2023Prez",
  "isRecurrent": false,
  "eventDate": "2023-11-04T00:00:00",
  "startTime": "00:00:00",
  "duration": "23:59:00",
  "recurrenceStartDate": null,
  "recurrenceEndDate": null,
  "daysOfWeek": "None",
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "expirationDate": null,
  "interruptScheduling": false
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the new resource created and referenced by the Uri (given by the Location header field) in the response. The response includes the [Scheduled Presentation Entity](docId\:DRSRSrFhJ2cz61wdoL7QM).

**Example**

```json
{
   "id": 1234567,
   "presentationId": 23456,
   "presentationName": "October2023Prez",
   "isRecurrent": false,
   "eventDate": "2023-11-04T00:00:00",
   "startTime": "00:00:00",
   "duration": "23:59:00",
   "recurrenceStartDate": null,
   "recurrenceEndDate": null,
   "daysOfWeek": "None",
   "creationDate": "2023-11-03T18:14:09.3506335Z",
   "lastModifiedDate": "2023-11-03T18:14:09.3506335Z",
   "expirationDate": "2023-11-05T11:59:00Z",
   "interruptScheduling": false
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Schedule/  

Returns a list of the [Scheduled Presentation Entity](docId\:DRSRSrFhJ2cz61wdoL7QM) in the specified group

**Required Scope Token**

bsn.api.main.groups.regular.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `groupName` <font color="#704ae0">string: </font>The name of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of group instances exceeds the `pageSize`.
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of group instances that can be contained in the response body.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `groupName` is set to `October2023Prez`
- `pageSize` is set to `1`
- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.

```text
GET /2022/06/REST/Groups/Regular/October2023Prez/Schedule/?marker=RGVmYXVsdMDkxNA&pageSize=1 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a list of the scheduled presentations of the specified group

**Example**

```json
{
   "items": [   {
      "id": 2345678,
      "presentationId": 123456,
      "presentationName": "October2023Prez",
      "isRecurrent": true,
      "eventDate": null,
      "startTime": "00:00:00",
      "duration": "1.00:00:00",
      "recurrenceStartDate": null,
      "recurrenceEndDate": null,
      "daysOfWeek": "EveryDay",
      "creationDate": "2023-10-20T21:11:48.233Z",
      "lastModifiedDate": "2023-10-20T21:11:48.233Z",
      "expirationDate": null,
      "interruptScheduling": false
   }],
   "totalItemCount": 3,
   "matchingItemCount": 3,
   "pageSize": 1,
   "nextMarker": "GWpbWFcsw15NjI5MjN0",
   "prevMarker": "GWpbWFcsw15NjI58901",
   "isTruncated": true,
   "sortExpression": "[ScheduledPresentation].[ExpireDate] DESC",
   "filterExpression": null
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist) 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{name}/Schedule/  

Adds a scheduled presentation to the specified group

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `groupName` <font color="#704ae0">string: </font>The name of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Scheduled Presentation Entity](docId\:DRSRSrFhJ2cz61wdoL7QM) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `groupName` is set to `October2023Prez`

```text
POST /2022/06/REST/Groups/Regular/October2023Prez/Schedule/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 419
```

This is the example request body:

```json
{
  "id": 0,
  "presentationId": 123456,
  "presentationName": "October2023Prez",
  "isRecurrent": false,
  "eventDate": "2023-11-04T00:00:00",
  "startTime": "00:00:00",
  "duration": "23:59:00",
  "recurrenceStartDate": null,
  "recurrenceEndDate": null,
  "daysOfWeek": "None",
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "expirationDate": null,
  "interruptScheduling": false
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the new resource created and referenced by the Uri (given by the Location header field) in the response. The response includes the [Scheduled Presentation Entity](docId\:DRSRSrFhJ2cz61wdoL7QM) .

**Example**

```json
{
   "id": 2345678,
   "presentationId": 23456,
   "presentationName": "October2023Prez",
   "isRecurrent": false,
   "eventDate": "2023-11-04T00:00:00",
   "startTime": "00:00:00",
   "duration": "23:59:00",
   "recurrenceStartDate": null,
   "recurrenceEndDate": null,
   "daysOfWeek": "None",
   "creationDate": "2023-11-03T18:14:09.3506335Z",
   "lastModifiedDate": "2023-11-03T18:14:09.3506335Z",
   "expirationDate": "2023-11-05T11:59:00Z",
   "interruptScheduling": false
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist) 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Schedule/\{scheduledPresentationId}/  

Returns the schedule of the specified presentation in the specified group

**Required Scope Token**

bsn.api.main.groups.regular.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

`groupId` <font color="#704ae0">int: </font>The unique identifier of the group

`scheduledPresentationId` <font color="#704ae0">int: </font>The unique identifier for the scheduled presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `groupId` is set to `12345`
- `scheduledPresentationId` is set to `234567`

```text
GET /2022/06/REST/Groups/Regular/12345/Schedule/234567/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Scheduled Presentation Entity](docId\:DRSRSrFhJ2cz61wdoL7QM) 

**Example**

```json
{
   "id": 234567,
   "presentationId": 1234567,
   "presentationName": "Default",
   "isRecurrent": true,
   "eventDate": null,
   "startTime": "00:00:00",
   "duration": "1.00:00:00",
   "recurrenceStartDate": null,
   "recurrenceEndDate": null,
   "daysOfWeek": "EveryDay",
   "creationDate": "2023-10-19T17:21:32.767Z",
   "lastModifiedDate": "2023-10-19T17:21:32.767Z",
   "expirationDate": null,
   "interruptScheduling": false
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/Schedule/\{scheduledPresentationId}/  

Updates the specified scheduled presentation in the specified group.

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `groupId` <font color="#704ae0">int: </font>The unique identifier of the group
- `scheduledPresentationId` <font color="#704ae0">int: </font>The unique identifier for the scheduled presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Scheduled Presentation Entity](docId\:DRSRSrFhJ2cz61wdoL7QM) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `groupId` is set to `12345`
- `scheduledPresentationId` is set to `234567`

```text
PUT /2022/06/REST/Groups/Regular/12345/Schedule/234567/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 443
```

This is the example request body:

```json
{
   "id": 0,
   "presentationId": 1234567,
   "presentationName": "Default",
   "isRecurrent": true,
   "eventDate": null,
   "startTime": "00:00:00",
   "duration": "1.00:00:00",
   "recurrenceStartDate": null,
   "recurrenceEndDate": null,
   "daysOfWeek": "EveryDay",
   "creationDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00",
   "expirationDate": null,
   "interruptScheduling": false
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The scheduled presentation in the specified group has been updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Schedule/\{scheduledPresentationId}/  

Removes a specified scheduled presentation from the specified group

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `groupId` <font color="#704ae0">int: </font>The unique identifier of the group
- `scheduledPresentationId` <font color="#704ae0">int: </font>The unique identifier for the scheduled presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `groupId` is set to `12345`
- `scheduledPresentationId` is set to `234567`

```text
DELETE /2022/06/REST/Groups/Regular/12345/Schedule/234567/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The scheduled presentation has been deleted from the specified group

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Schedule/\{scheduledPresentationId}/  

Returns the schedule of the specified presentation in the specified group

**Required Scope Token**

bsn.api.main.groups.regular.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `groupName` <font color="#704ae0">string: </font>The name of the group
- `scheduledPresentationId` <font color="#704ae0">int: </font>The unique identifier for the scheduled presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `groupName` is set to `Default`
- `scheduledPresentationId` is set to `234567`

```text
GET /2022/06/REST/Groups/Regular/Default/Schedule/234567/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Scheduled Presentation Entity](docId\:DRSRSrFhJ2cz61wdoL7QM).

**Example**

```json
{
   "id": 234567,
   "presentationId": 987654,
   "presentationName": "Default",
   "isRecurrent": true,
   "eventDate": null,
   "startTime": "00:00:00",
   "duration": "1.00:00:00",
   "recurrenceStartDate": null,
   "recurrenceEndDate": null,
   "daysOfWeek": "EveryDay",
   "creationDate": "2023-10-19T17:21:32.767Z",
   "lastModifiedDate": "2023-10-19T17:21:32.767Z",
   "expirationDate": null,
   "interruptScheduling": false
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{name}/Schedule/\{scheduledPresentationId}/  

Updates the specified scheduled presentation in the specified group.

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `groupName` <font color="#704ae0">string: </font>The name of the group
- `scheduledPresentationId` <font color="#704ae0">int: </font>The unique identifier for the scheduled presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Scheduled Presentation Entity](docId\:DRSRSrFhJ2cz61wdoL7QM) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `groupName` is set to `Default`
- `scheduledPresentationId` is set to `234567`

```text
PUT /2022/06/REST/Groups/Regular/Default/Schedule/234567/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 443
```

This is the example request body:

```json
{
   "id": 0,
   "presentationId": 987654,
   "presentationName": "Default",
   "isRecurrent": true,
   "eventDate": null,
   "startTime": "00:00:00",
   "duration": "1.00:00:00",
   "recurrenceStartDate": null,
   "recurrenceEndDate": null,
   "daysOfWeek": "EveryDay",
   "creationDate": "0001-01-01T00:00:00",
   "lastModifiedDate": "0001-01-01T00:00:00",
   "expirationDate": null,
   "interruptScheduling": false
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified scheduled presentation has been updated in the specified group

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/Schedule/\{scheduledPresentationId}/ 

Removes the specified scheduled presentation from the specified group

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `groupName` <font color="#704ae0">string: </font>The name of the group
- `scheduledPresentationId` <font color="#704ae0">int: </font>The unique identifier for the scheduled presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `groupName` is set to `Default`
- `scheduledPresentationId` is set to `234567`

```text
DELETE /2022/06/REST/Groups/Regular/Default/Schedule/234567/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified scheduled presentation has been deleted from the specified group

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/  

Returns operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.groups.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Groups/Regular/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

:::ExpandableHeading
Example

```json
{
   "uid": "d430853f-c05f-61b4-d137-0237a6984032",
   "singularName": "Full Control",
   "pluralName": "Group (Full Control)",
   "fullName": "Group (Full Control)",
   "targetEntity": "Group",
   "appliance": "Instance, Collection",
   "parent": null,
   "descendants":    [
            {
         "uid": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
         "singularName": "View Group",
         "pluralName": "View Groups",
         "fullName": "Group (Full Control) - View Groups",
         "targetEntity": "Group",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "d430853f-c05f-61b4-d137-0237a6984032",
            "singularName": "Full Control",
            "pluralName": "Group (Full Control)",
            "fullName": "Group (Full Control)",
            "targetEntity": "Group",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.907Z"
            },
                        {
               "entityId": null,
               "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.983Z"
            },
                        {
               "entityId": null,
               "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.95Z"
            },
                        {
               "entityId": null,
               "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.237Z"
            },
                        {
               "entityId": null,
               "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.553Z"
            },
                        {
               "entityId": null,
               "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.487Z"
            },
                        {
               "entityId": null,
               "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.543Z"
            }
         ]
      },
            {
         "uid": "2e0ef6d3-8e8e-f704-258c-82c8ecae089d",
         "singularName": "View Devices",
         "pluralName": "View Devices",
         "fullName": "Group (Full Control) - View Devices",
         "targetEntity": "Group",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "d430853f-c05f-61b4-d137-0237a6984032",
            "singularName": "Full Control",
            "pluralName": "Group (Full Control)",
            "fullName": "Group (Full Control)",
            "targetEntity": "Group",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "2e0ef6d3-8e8e-f704-258c-82c8ecae089d",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.993Z"
            },
                        {
               "entityId": null,
               "operationUID": "2e0ef6d3-8e8e-f704-258c-82c8ecae089d",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.95Z"
            },
                        {
               "entityId": null,
               "operationUID": "2e0ef6d3-8e8e-f704-258c-82c8ecae089d",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.237Z"
            },
                        {
               "entityId": null,
               "operationUID": "2e0ef6d3-8e8e-f704-258c-82c8ecae089d",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.553Z"
            },
                        {
               "entityId": null,
               "operationUID": "2e0ef6d3-8e8e-f704-258c-82c8ecae089d",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "2e0ef6d3-8e8e-f704-258c-82c8ecae089d",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.487Z"
            },
                        {
               "entityId": null,
               "operationUID": "2e0ef6d3-8e8e-f704-258c-82c8ecae089d",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.543Z"
            }
         ]
      },
            {
         "uid": "432d38a8-7055-40f0-8dd2-348805c1b725",
         "singularName": "View Schedule",
         "pluralName": "View Schedule",
         "fullName": "Group (Full Control) - View Schedule",
         "targetEntity": "Group",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "d430853f-c05f-61b4-d137-0237a6984032",
            "singularName": "Full Control",
            "pluralName": "Group (Full Control)",
            "fullName": "Group (Full Control)",
            "targetEntity": "Group",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "432d38a8-7055-40f0-8dd2-348805c1b725",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.93Z"
            },
                        {
               "entityId": null,
               "operationUID": "432d38a8-7055-40f0-8dd2-348805c1b725",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:48.003Z"
            },
                        {
               "entityId": null,
               "operationUID": "432d38a8-7055-40f0-8dd2-348805c1b725",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.95Z"
            },
                        {
               "entityId": null,
               "operationUID": "432d38a8-7055-40f0-8dd2-348805c1b725",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.237Z"
            },
                        {
               "entityId": null,
               "operationUID": "432d38a8-7055-40f0-8dd2-348805c1b725",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.553Z"
            },
                        {
               "entityId": null,
               "operationUID": "432d38a8-7055-40f0-8dd2-348805c1b725",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.487Z"
            },
                        {
               "entityId": null,
               "operationUID": "432d38a8-7055-40f0-8dd2-348805c1b725",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.543Z"
            }
         ]
      },
            {
         "uid": "08a3a36f-163c-7f44-9586-839aeee44587",
         "singularName": "Create Group",
         "pluralName": "Create Group",
         "fullName": "Group (Full Control) - Create Group",
         "targetEntity": "Group",
         "appliance": "Collection",
         "parent":          {
            "uid": "d430853f-c05f-61b4-d137-0237a6984032",
            "singularName": "Full Control",
            "pluralName": "Group (Full Control)",
            "fullName": "Group (Full Control)",
            "targetEntity": "Group",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "08a3a36f-163c-7f44-9586-839aeee44587",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.95Z"
            },
                        {
               "entityId": null,
               "operationUID": "08a3a36f-163c-7f44-9586-839aeee44587",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.237Z"
            },
                        {
               "entityId": null,
               "operationUID": "08a3a36f-163c-7f44-9586-839aeee44587",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.553Z"
            },
                        {
               "entityId": null,
               "operationUID": "08a3a36f-163c-7f44-9586-839aeee44587",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "08a3a36f-163c-7f44-9586-839aeee44587",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.487Z"
            },
                        {
               "entityId": null,
               "operationUID": "08a3a36f-163c-7f44-9586-839aeee44587",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.97Z"
            },
                        {
               "entityId": null,
               "operationUID": "08a3a36f-163c-7f44-9586-839aeee44587",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.543Z"
            }
         ]
      },
            {
         "uid": "294648cf-9961-4b93-9ab9-23264a58328d",
         "singularName": "Update Group",
         "pluralName": "Update Group",
         "fullName": "Group (Full Control) - Update Group",
         "targetEntity": "Group",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "d430853f-c05f-61b4-d137-0237a6984032",
            "singularName": "Full Control",
            "pluralName": "Group (Full Control)",
            "fullName": "Group (Full Control)",
            "targetEntity": "Group",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "294648cf-9961-4b93-9ab9-23264a58328d",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.95Z"
            },
                        {
               "entityId": null,
               "operationUID": "294648cf-9961-4b93-9ab9-23264a58328d",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.237Z"
            },
                        {
               "entityId": null,
               "operationUID": "294648cf-9961-4b93-9ab9-23264a58328d",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.553Z"
            },
                        {
               "entityId": null,
               "operationUID": "294648cf-9961-4b93-9ab9-23264a58328d",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "294648cf-9961-4b93-9ab9-23264a58328d",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.487Z"
            },
                        {
               "entityId": null,
               "operationUID": "294648cf-9961-4b93-9ab9-23264a58328d",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.97Z"
            },
                        {
               "entityId": null,
               "operationUID": "294648cf-9961-4b93-9ab9-23264a58328d",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.543Z"
            }
         ]
      },
            {
         "uid": "2f860f4e-c67b-a9d4-95de-f0bdd6c10f58",
         "singularName": "Add Device",
         "pluralName": "Add Device",
         "fullName": "Group (Full Control) - Add Device",
         "targetEntity": "Group",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "d430853f-c05f-61b4-d137-0237a6984032",
            "singularName": "Full Control",
            "pluralName": "Group (Full Control)",
            "fullName": "Group (Full Control)",
            "targetEntity": "Group",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "2f860f4e-c67b-a9d4-95de-f0bdd6c10f58",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.95Z"
            },
                        {
               "entityId": null,
               "operationUID": "2f860f4e-c67b-a9d4-95de-f0bdd6c10f58",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.237Z"
            },
                        {
               "entityId": null,
               "operationUID": "2f860f4e-c67b-a9d4-95de-f0bdd6c10f58",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.553Z"
            },
                        {
               "entityId": null,
               "operationUID": "2f860f4e-c67b-a9d4-95de-f0bdd6c10f58",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "2f860f4e-c67b-a9d4-95de-f0bdd6c10f58",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.487Z"
            },
                        {
               "entityId": null,
               "operationUID": "2f860f4e-c67b-a9d4-95de-f0bdd6c10f58",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.97Z"
            },
                        {
               "entityId": null,
               "operationUID": "2f860f4e-c67b-a9d4-95de-f0bdd6c10f58",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.543Z"
            }
         ]
      },
            {
         "uid": "31cd7f9e-1cd2-22b4-7909-83de98da8115",
         "singularName": "Remove Device",
         "pluralName": "Remove Device",
         "fullName": "Group (Full Control) - Remove Device",
         "targetEntity": "Group",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "d430853f-c05f-61b4-d137-0237a6984032",
            "singularName": "Full Control",
            "pluralName": "Group (Full Control)",
            "fullName": "Group (Full Control)",
            "targetEntity": "Group",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "31cd7f9e-1cd2-22b4-7909-83de98da8115",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.95Z"
            },
                        {
               "entityId": null,
               "operationUID": "31cd7f9e-1cd2-22b4-7909-83de98da8115",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.237Z"
            },
                        {
               "entityId": null,
               "operationUID": "31cd7f9e-1cd2-22b4-7909-83de98da8115",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.553Z"
            },
                        {
               "entityId": null,
               "operationUID": "31cd7f9e-1cd2-22b4-7909-83de98da8115",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "31cd7f9e-1cd2-22b4-7909-83de98da8115",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.487Z"
            },
                        {
               "entityId": null,
               "operationUID": "31cd7f9e-1cd2-22b4-7909-83de98da8115",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.97Z"
            },
                        {
               "entityId": null,
               "operationUID": "31cd7f9e-1cd2-22b4-7909-83de98da8115",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.543Z"
            }
         ]
      },
            {
         "uid": "66702586-1ae4-4079-83e7-d803e6b105d5",
         "singularName": "Update Schedule",
         "pluralName": "Update Schedule",
         "fullName": "Group (Full Control) - Update Schedule",
         "targetEntity": "Group",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "d430853f-c05f-61b4-d137-0237a6984032",
            "singularName": "Full Control",
            "pluralName": "Group (Full Control)",
            "fullName": "Group (Full Control)",
            "targetEntity": "Group",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "66702586-1ae4-4079-83e7-d803e6b105d5",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.943Z"
            },
                        {
               "entityId": null,
               "operationUID": "66702586-1ae4-4079-83e7-d803e6b105d5",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.5Z"
            },
                        {
               "entityId": null,
               "operationUID": "66702586-1ae4-4079-83e7-d803e6b105d5",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.95Z"
            },
                        {
               "entityId": null,
               "operationUID": "66702586-1ae4-4079-83e7-d803e6b105d5",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.237Z"
            },
                        {
               "entityId": null,
               "operationUID": "66702586-1ae4-4079-83e7-d803e6b105d5",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.553Z"
            },
                        {
               "entityId": null,
               "operationUID": "66702586-1ae4-4079-83e7-d803e6b105d5",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.97Z"
            },
                        {
               "entityId": null,
               "operationUID": "66702586-1ae4-4079-83e7-d803e6b105d5",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.543Z"
            }
         ]
      },
            {
         "uid": "df37d180-183f-68e4-1515-5ea51a0d053f",
         "singularName": "Edit Permissions",
         "pluralName": "Edit Permissions",
         "fullName": "Group (Full Control) - Edit Permissions",
         "targetEntity": "Group",
         "appliance": "Collection",
         "parent":          {
            "uid": "d430853f-c05f-61b4-d137-0237a6984032",
            "singularName": "Full Control",
            "pluralName": "Group (Full Control)",
            "fullName": "Group (Full Control)",
            "targetEntity": "Group",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "df37d180-183f-68e4-1515-5ea51a0d053f",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.95Z"
            },
                        {
               "entityId": null,
               "operationUID": "df37d180-183f-68e4-1515-5ea51a0d053f",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.237Z"
            },
                        {
               "entityId": null,
               "operationUID": "df37d180-183f-68e4-1515-5ea51a0d053f",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.553Z"
            },
                        {
               "entityId": null,
               "operationUID": "df37d180-183f-68e4-1515-5ea51a0d053f",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "df37d180-183f-68e4-1515-5ea51a0d053f",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.487Z"
            },
                        {
               "entityId": null,
               "operationUID": "df37d180-183f-68e4-1515-5ea51a0d053f",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.97Z"
            },
                        {
               "entityId": null,
               "operationUID": "df37d180-183f-68e4-1515-5ea51a0d053f",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.543Z"
            }
         ]
      },
            {
         "uid": "0720a4b7-7c43-76f4-4913-4d92f5709149",
         "singularName": "Delete Group",
         "pluralName": "Delete Group",
         "fullName": "Group (Full Control) - Delete Group",
         "targetEntity": "Group",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "d430853f-c05f-61b4-d137-0237a6984032",
            "singularName": "Full Control",
            "pluralName": "Group (Full Control)",
            "fullName": "Group (Full Control)",
            "targetEntity": "Group",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "0720a4b7-7c43-76f4-4913-4d92f5709149",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:45.95Z"
            },
                        {
               "entityId": null,
               "operationUID": "0720a4b7-7c43-76f4-4913-4d92f5709149",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:46.237Z"
            },
                        {
               "entityId": null,
               "operationUID": "0720a4b7-7c43-76f4-4913-4d92f5709149",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.553Z"
            },
                        {
               "entityId": null,
               "operationUID": "0720a4b7-7c43-76f4-4913-4d92f5709149",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:46.893Z"
            },
                        {
               "entityId": null,
               "operationUID": "0720a4b7-7c43-76f4-4913-4d92f5709149",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-08-17T20:49:47.487Z"
            },
                        {
               "entityId": null,
               "operationUID": "0720a4b7-7c43-76f4-4913-4d92f5709149",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-08-17T20:49:47.97Z"
            },
                        {
               "entityId": null,
               "operationUID": "0720a4b7-7c43-76f4-4913-4d92f5709149",
               "principal":                {
                  "name": "Custom",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10498
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-10-05T22:24:13.543Z"
            }
         ]
      }
   ],
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
         "principal":          {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:45.95Z"
      },
            {
         "entityId": null,
         "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
         "principal":          {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:46.237Z"
      },
            {
         "entityId": null,
         "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
         "principal":          {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:46.553Z"
      },
            {
         "entityId": null,
         "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
         "principal":          {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:46.893Z"
      },
            {
         "entityId": null,
         "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
         "principal":          {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-08-17T20:49:47.487Z"
      },
            {
         "entityId": null,
         "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
         "principal":          {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-08-17T20:49:47.97Z"
      },
            {
         "entityId": null,
         "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
         "principal":          {
            "name": "Custom",
            "isCustom": true,
            "type": "Role",
            "id": 10498
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2023-10-05T22:24:13.543Z"
      }
   ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/  

Includes object permissions for a given group instance.

**Required Scope Token**

bsn.api.main.groups.regular.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `56789`

```text
GET /2022/06/REST/Groups/Regular/56789/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 56789,
    "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
    "principal": {
      "login": "johndoe@brightsign.biz",
      "type": "User",
      "id": 5432
    },
    "isFixed": true,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2020-06-01T17:13:32.927Z"
  },
  {
    "entityId": 56789,
    "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 12345
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.053Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/  

Adds permissions to the specified group

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
POST /2022/06/REST/Groups/Regular/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 343
```

This is the example request body:

```json
{
  "entityId": 12345,
  "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
  "principal": {
    "login": "JaneDoe@brightsign.biz",
    "type": "User",
    "id": 12345
  },
  "isFixed": false,
  "isInherited": false,
  "isAllowed": true,
  "creationDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the group

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/  

Deletes permissions from the specified group

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `56789`

```text
DELETE /2022/06/REST/Groups/Regular/56789/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 604
```

This is the example request body:

```json
[
  {
    "entityId": 56789,
    "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 12345
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.053Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions have been removed from the group

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Permissions/  

Includes object permissions for a given group instance.

**Required Scope Token**

bsn.api.main.groups.regular.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Device Control`

```text
GET /2022/06/REST/Groups/Regular/Device Control/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 12345,
    "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
    "principal": {
      "login": "johndoe@brightsign.biz",
      "type": "User",
      "id": 1234
    },
    "isFixed": true,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2020-06-01T17:13:32.927Z"
  },
  {
    "entityId": 12345,
    "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 12345
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.053Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{name}/Permissions/  

Adds permissions to the specified group

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Device Control`

```text
POST /2022/06/REST/Groups/Regular/Device Control/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 343
```

This is the example request body:

```json
{
  "entityId": 56789,
  "operationUID": "67b9b0ab-fb5f-36c4-d598-a71aa8998e4e",
  "principal": {
    "login": "JaneDoe@brightsign.biz",
    "type": "User",
    "id": 12345
  },
  "isFixed": false,
  "isInherited": false,
  "isAllowed": true,
  "creationDate": "0001-01-01T00:00:00"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the group

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/Permissions/  

Removes permissions from the specified group

**Required Scope Token**

bsn.api.main.groups.regular.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Device Control`

```text
DELETE /2022/06/REST/Groups/Regular/Device Control/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 604
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "d430853f-c05f-61b4-d137-0237a6984032",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 12345
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.053Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions have been removed from the group

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Session Context Structure (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Session Context Structure entities are structured as follows:

`entity`:

- `Network` <font color="#704ae0">Nullable&lt;NetworkInfo&gt;</font> <font color="#01a0af">read-only</font>: A reference to a network which a current person may be logged into, in scope of the current session. The `null` value means that the person is signed out from all the networks.
- `AuthorizationScope` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: A space-separated array of scope tokens granted to the current user in a given session. A successful response will include the self value only (for example, "bsn.api.self")
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The date when the session context was last modified. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.





[title] Upload API Endpoints (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/

The Upload endpoints allow users to send files to the BSN.Cloud server.&#x20;

Base URL for this endpoint: ***https\://api.bsn.cloud/Upload/2019/03/REST***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*



## DELETE /Sessions/\{SessionToken}/

Cancels the specified Content Upload Session

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**&#x20;

- `SessionToken` <font color="#704ae0">string</font>: The Content Upload Session Token generated by the server

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `SessionToken` is set to `WIxMjM0NTY3ODkwIiwibmF`

```none
DELETE /Upload/2019/03/REST/Sessions/WIxMjM0NTY3ODkwIiwibmF/ HTTP/1.1 
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2024 21:32:34 GMT
Accept: application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#15803D">204</font>**:&#x20;**&#x54;he specified Content Upload Session was successfully cancelled

**Failure Response**

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#B91C1C">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The Content Upload Session with specified session token was not found

<font color="#9a0808">412</font>: The current Content Upload Session state has different timestamp than specified in request

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

****

## POST /Sessions/\{SessionToken}/Uploads/

Creates a new Content Upload either in scope of the specified Content Upload Session or standalone

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**&#x20;

- `SessionToken` <font color="#704ae0">string</font>: The Content Upload Session token generated by the server or `None `if the new Content Upload is standalone

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**&#x20;

- The [ContentUploadArguments (2019/03)](docId\:lb3FKxjOuW9bjVuWzYlDL).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `SessionToken` is set to `WIxMjM0NTY3ODkwIiwibmF`

**Content Upload Example**

```none
POST /Upload/2019/03/REST/Sessions/WIxMjM0NTY3ODkwIiwibmF/Uploads/ HTTP/1.1 
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/vnd.bsn.content.upload.status.201903+json, application/vnd.bsn.content.upload.negotiation.status.201903+json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

This request supports multiple payload representations for the different use cases:

- The `application/vnd.bsn.start.content.upload.arguments.201903+json` representation is used to start the new [Content Entity (2022/06)](docId\:fkVdcafrX380751m5hbNr) upload as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.start.content.upload.arguments.201903+json

```json
Content-Type: application/vnd.bsn.start.content.upload.arguments.201903+json
Content-Length: 277

{
  "sessionToken": null,
  "uploadToken": null,
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "",
  "fileThumb": null,
  "tags": {}
}
```
:::

- The `application/vnd.bsn.start.content.update.arguments.201903+json` representation is used to modify the previously uploaded [Content Entity (2022/06)](docId\:fkVdcafrX380751m5hbNr) as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.start.content.update.arguments.201903+json

```json
Content-Type: application/vnd.bsn.start.content.update.arguments.201903+json
Content-Length: 300

{
  "sessionToken": null,
  "uploadToken": null,
  "contentId": 12345,
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "",
  "fileThumb": null,
  "tags": {}
}
```
:::

- The `application/vnd.bsn.start.webpage.asset.upload.arguments.201903+json `representation is used to modify the previously uploaded [WebPage Asset Entity (2022/06)](docId\:v9GQTYryzsBhf9Q3-3Y9u) as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.start.webpage.asset.upload.arguments.201903+json&#x20;

```json
Content-Type: application/vnd.bsn.start.webpage.asset.upload.arguments.201903+json
Content-Length: 371

{
  "sessionToken": "271e6422-704f-4c6f-b6dc-60c17a00f0fc",
  "uploadToken": null,
  "webPageAssetId": 0,
  "relativePath": "/assets/text/",
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "",
  "fileThumb": null,
  "tags": {}
}
```
:::

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#15803D">201</font>: Returns the URI and timestamp of the [ContentUploadStatus (2019/03)](docId\:f5sqGRaUaymNao-bbjaJe) entity&#x20;

**Examples**

This response supports multiple payload representations for the different use cases:

- The `application/vnd.bsn.content.upload.status.201903+json` representation of the [ContentUploadStatus (2019/03)](docId\:f5sqGRaUaymNao-bbjaJe) which is used for uploads of content which doesn't have equivalents in the destination folder:

:::CodeblockTabs
application/vnd.bsn.content.upload.status.201903+json

```json
{
  "sessionToken": "",
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "contentId": 0,
  "fileName": "Hello World.txt",
  "fileSize": 12,
  "shA1Hash": "",
  "state": "Started",
  "startTime": "2025-08-26T23:47:37.937Z",
  "endTime": null,
  "lastActivityTime": "2025-08-26T23:47:37.937Z",
  "chunks": [
    {
      "count": 0,
      "length": 12,
      "state": "Uploading"
    }
  ]
}
```
:::

- The `application/vnd.bsn.content.upload.negotiation.status.201903+json` representation of the [ContentNegotiationStatus (2019/03)](docId\:ZWViwwBbLA9uvHIUsxiop) which is used to indicate that there is equivalent content in the destination folder and provide details about it:

:::CodeblockTabs
application/vnd.bsn.content.upload.negotiation.status.201903+json

```json
{
  "sessionToken": "",
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "contentId": 0,
  "fileName": "Hello World.txt",
  "fileSize": 12,
  "shA1Hash": "",
  "state": "Started",
  "startTime": "2025-08-26T23:47:37.937Z",
  "endTime": null,
  "lastActivityTime": "2025-08-26T23:47:37.937Z",
  "chunks": null,
  "matchingFiles": [
    {
      "id": 12345,
      "fileName": "Hello World.txt",
      "virtualPath": "\\Shared\\Unsorted\\",
      "mediaType": "Text",
      "fileSize": 12,
      "shA1Hash": "2EF7BDE608CE5404E97D5F042F95F89F1C232871",
      "uploadDate": "2025-08-05T16:30:15.003Z"
    }
  ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The acceptable Content Upload representations are not specified

<font color="#9a0808">400</font>: The specified Content Upload Arguments are incomplete or not acceptable

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">404</font>: The Content Upload Session with specified session token was not found

<font color="#9a0808">406</font>: The specified representaion of Content Upload entity is not acceptable

<font color="#9a0808">415</font>: The specified representaion of Content Upload Arguments is invalid or not supported

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error



## GET  /Sessions/\{SessionToken}/Uploads/\{UploadToken}/

Retrieves the status of specified Content Upload

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**&#x20;

- `SessionToken` <font color="#704ae0">string</font>: The Content Upload Session Token generated by the server or `None` if the new Content Upload is standalone
- `UploadToken` <font color="#704ae0">string</font>: The Upload Token generated by the server

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `SessionToken` is set to `None`
- `UploadToken` is set to `321e6fc1-553f-4bb0-8c7a-d5bf859be6b2`

```none
GET /Upload/2019/03/REST/Sessions/None/Uploads/321e6fc1-553f-4bb0-8c7a-d5bf859be6b2/  HTTP/1.1 
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 20 Dec 2024 21:32:34 GMT
Accept: application/vnd.bsn.content.upload.status.201903+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#15803D">200</font>: The [ContentUploadStatus (2019/03)](docId\:f5sqGRaUaymNao-bbjaJe) was successfully retrieved

**Example**

:::CodeblockTabs
application/vnd.bsn.content.upload.status.201903+json

```json
{
  "sessionToken": "",
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "contentId": 0,
  "fileName": "Hello World.txt",
  "fileSize": 12,
  "shA1Hash": "",
  "state": "Started",
  "startTime": "2025-08-26T23:47:37.937Z",
  "endTime": null,
  "lastActivityTime": "2025-08-26T23:47:37.937Z",
  "chunks": [
    {
      "count": 0,
      "length": 12,
      "state": "Uploading"
    }
  ]
}
```
:::

**Success Response**

<font color="#15803D">304</font>: The timestamp specified in the request is the same or newer than the timestamp in the current Content Upload state&#x20;

**Failure Response**

<font color="#B91C1C">300</font>: The acceptable Content Upload Session representations are not specified

<font color="#B91C1C">401</font>: The access token is invalid or not specified

<font color="#B91C1C">404</font>: A Content Upload Session with the specified session token was not found or the Content Upload with specified upload token was not found

<font color="#B91C1C">406</font>: The specified representation of the Content Upload Session entity is not acceptable

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

****

## PUT  /Sessions/\{SessionToken}/Uploads/\{UploadToken}/

Updates the status of the specified Content Upload

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**&#x20;

- `SessionToken` <font color="#704ae0">string</font>: The Content Upload Session Token generated by the server or `None` if the new Content Upload is standalone
- `UploadToken` <font color="#704ae0">string</font>: The Content Upload Token generated by the server

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**&#x20;

- The [ContentUploadArguments (2019/03)](docId\:lb3FKxjOuW9bjVuWzYlDL) for a new content upload, or [ContentUpdateArguments (2019/03)](docId\:L9u4ogJgYrotjnUdfx4nU) for editing the existing (previously uploaded) content, or<font color="#B91C1C"> </font> for a new webpage asset upload.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `SessionToken` is set to `None`
- `UploadToken` is set to `321e6fc1-553f-4bb0-8c7a-d5bf859be6b2`

**Content Upload, Start, and Complete Example&#x20;**

```none
PUT /Upload/2019/03/REST/Sessions/None/Uploads/321e6fc1-553f-4bb0-8c7a-d5bf859be6b2/ HTTP/1.1 
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2024 21:32:34 GMT
Accept: application/vnd.bsn.content.upload.status.201903+json, application/vnd.bsn.content.upload.negotiation.status.201903+json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

This request supports multiple payload representations for the different use cases:

- The `application/vnd.bsn.start.content.upload.arguments.201903+json` representation is used to begin a @content entity upload within an ongoing session as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.start.content.upload.arguments.201903+json

```json
Content-Type: application/vnd.bsn.start.content.upload.arguments.201903+json
Content-Length: 345

{
  "sessionToken": "271e6422-704f-4c6f-b6dc-60c17a00f0fc",
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "",
  "fileThumb": null,
  "tags": {}
}
```
:::

- The `application/vnd.bsn.content.upload.arguments.201903+json` representation is used to clarify an ongoing [Content Entity (2022/06)](docId\:fkVdcafrX380751m5hbNr) upload as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.content.upload.arguments.201903+json

```json
Content-Type: application/vnd.bsn.content.upload.arguments.201903+json
Content-Length: 351

{
  "sessionToken": null,
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "2EF7BDE608CE5404E97D5F042F95F89F1C232871",
  "fileThumb": null,
  "tags": {}
}
```
:::

- The `application/vnd.bsn.complete.content.upload.arguments.201903+json `representation is used to complete previously started [Content Entity (2022/06)](docId\:fkVdcafrX380751m5hbNr) uploads as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.complete.content.upload.arguments.201903+json&#x20;

```json
Content-Type: application/vnd.bsn.complete.content.upload.arguments.201903+json
Content-Length: 351

{
  "sessionToken": null,
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "2EF7BDE608CE5404E97D5F042F95F89F1C232871",
  "fileThumb": null,
  "tags": {}
}
```
:::

- The `application/vnd.bsn.start.content.update.arguments.201903+json` representation is used to start a new upload which modifies the previously uploaded [Content Entity (2022/06)](docId\:fkVdcafrX380751m5hbNr) as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.start.content.update.arguments.201903+json

```json
Content-Type: application/vnd.bsn.content.update.arguments.201903+json
Content-Length: 368

{
  "sessionToken": "271e6422-704f-4c6f-b6dc-60c17a00f0fc",
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "contentId": 12345,
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "",
  "fileThumb": null,
  "tags": {}
}
```
:::

- The `application/vnd.bsn.content.update.arguments.201903+json` representation is used to clarify an ongoing upload which modifies a previously uploaded [Content Entity (2022/06)](docId\:fkVdcafrX380751m5hbNr) as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.content.update.arguments.201903+json

```json
Content-Type: application/vnd.bsn.start.content.update.arguments.201903+json
Content-Length: 374

{
  "sessionToken": null,
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "contentId": 12345,
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "2EF7BDE608CE5404E97D5F042F95F89F1C232871",
  "fileThumb": null,
  "tags": {}
}
```
:::

- The `application/vnd.bsn.complete.content.upload.arguments.201903+json `representation is used to finish an upload which modifies the previously uploaded [Content Entity (2022/06)](docId\:fkVdcafrX380751m5hbNr) as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.complete.content.upload.arguments.201903+json

```json
Content-Type: application/vnd.bsn.complete.content.upload.arguments.201903+json
Content-Length: 374

{
  "sessionToken": null,
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "contentId": 12345,
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "2EF7BDE608CE5404E97D5F042F95F89F1C232871",
  "fileThumb": null,
  "tags": {}
}
```
:::

- The  `application/vnd.bsn.start.webpage.asset.upload.arguments.201903+json` representation is used to show the status of a new [WebPage Asset Entity (2022/06)](docId\:v9GQTYryzsBhf9Q3-3Y9u)  upload as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.start.webpage.asset.upload.arguments.201903+json

```json
Content-Type: application/vnd.bsn.start.webpage.asset.upload.arguments.201903+json
Content-Length: 371

{
  "sessionToken": "271e6422-704f-4c6f-b6dc-60c17a00f0fc",
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "webPageAssetId": 0,
  "relativePath": "/assets/text/",
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "",
  "fileThumb": null,
  "tags": {}
}
```
:::

- The `application/vnd.bsn.webpage.asset.upload.arguments.201903+json` representation is used to clarify an ongoing [WebPage Asset Entity (2022/06)](docId\:v9GQTYryzsBhf9Q3-3Y9u) upload as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.webpage.asset.upload.arguments.201903+json

```json
Content-Type: application/vnd.bsn.webpage.asset.upload.arguments.201903+json
Content-Length: 445

{
  "sessionToken": "271e6422-704f-4c6f-b6dc-60c17a00f0fc",
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "webPageAssetId": 0,
  "relativePath": "/assets/text/",
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "2EF7BDE608CE5404E97D5F042F95F89F1C232871",
  "fileThumb": null,
  "tags": {}
}
```
:::

- The `application/vnd.bsn.complete.webpage.asset.upload.arguments.201903+json` representation is used to complete previously started [WebPage Asset Entity (2022/06)](docId\:v9GQTYryzsBhf9Q3-3Y9u) uploads as shown in the example below:

:::CodeblockTabs
application/vnd.bsn.complete.webpage.asset.upload.arguments.201903+json

```json
Content-Type: application/vnd.bsn.complete.webpage.asset.upload.arguments.201903+json
Content-Length: 445

{
  "sessionToken": "271e6422-704f-4c6f-b6dc-60c17a00f0fc",
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "webPageAssetId": 0,
  "relativePath": "/assets/text/",
  "fileName": "Hello World.txt",
  "virtualPath": "\\Shared\\Unsorted\\",
  "mediaType": "Auto",
  "fileSize": 12,
  "fileLastModifiedDate": "0001-01-01T00:00:00",
  "sha1Hash": "2EF7BDE608CE5404E97D5F042F95F89F1C232871",
  "fileThumb": null,
  "tags": {}
}
```
:::

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [ContentUploadStatus (2019/03)](docId\:f5sqGRaUaymNao-bbjaJe)&#x20;

**Example**

:::CodeblockTabs
application/vnd.bsn.content.upload.status.201903+json

```json
{
  "sessionToken": "",
  "uploadToken": "321e6fc1-553f-4bb0-8c7a-d5bf859be6b2",
  "contentId": 0,
  "fileName": "Hello World.txt",
  "fileSize": 12,
  "shA1Hash": "2EF7BDE608CE5404E97D5F042F95F89F1C232871",
  "state": "Started",
  "startTime": "2025-08-26T23:47:37.937Z",
  "endTime": null,
  "lastActivityTime": "2025-08-26T23:47:37.937Z",
  "chunks": [
    {
      "count": 0,
      "length": 12,
      "state": "Uploading"
    }
  ]
}
```
:::

**Failure Response**

<font color="#B91C1C">300</font>**:&#x20;**&#x54;he acceptable Content Upload Session representations are not specified

<font color="#B91C1C">400</font>: The specified Content Upload Session Arguments are incomplete or not acceptable

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#B91C1C">404</font>: The Content Upload Session with the specified session token was not found or the Content Upload with specified upload token was not found

<font color="#B91C1C">406</font>: The specified representaion of the Content Upload Session entity is not acceptable

<font color="#B91C1C">412</font>: The current Content Upload Session state has different timestamp than specified in the request

<font color="#9a0808">415</font>: The specified representaion of the Content Upload Session Arguments is invalid or not supported

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error



## DELETE /Sessions/\{SessionToken}/Uploads/\{UploadToken}/

Cancels the specified Content Upload&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**&#x20;

- `SessionToken` <font color="#704ae0">string</font>: The Content Upload Session Token generated by the server or `None` if the new Content Upload is standalone
- `UploadToken` <font color="#704ae0">string</font>: The Content Upload Token generated by the server

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `SessionToken` is set to `None`
- `UploadToken` is set to `321e6fc1-553f-4bb0-8c7a-d5bf859be6b2`

```none
DELETE /Upload/2019/03/REST/Sessions/None/Uploads/321e6fc1-553f-4bb0-8c7a-d5bf859be6b2/ HTTP/1.1 
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2024 21:32:34 GMT
Accept: application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response&#x20;**

<font color="#15803D">204</font>**:&#x20;**&#x54;he specified Content Upload was successfully cancelled

**Failure Response**

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">404</font>: The Content Upload Session with specified session token was not found or the Content Upload with specified upload token was not found

<font color="#9a0808">412</font>: The current Content Upload state has different timestamp than specified in request

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

****

## GET /Sessions/\{SessionToken}/Uploads/\{UploadToken}/Chunks/

Retrieves the status of Content Chunks in the specified active Content Upload

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**&#x20;

- `SessionToken` <font color="#704ae0">string</font>: The Content Upload Session Token generated by the server or `None` if the new Content Upload is standalone
- `UploadToken` <font color="#704ae0">string</font>: The Content Upload Token generated by the server&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Examples**

The example request parameters and headers are set as follows:

- `SessionToken` is set to `None`
- `UploadToken` is set to `321e6fc1-553f-4bb0-8c7a-d5bf859be6b2`

```none
GET /Upload/2019/03/REST/Sessions/None/Uploads/321e6fc1-553f-4bb0-8c7a-d5bf859be6b2/Chunks/ HTTP/1.1 
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/vnd.bsn.upload.content.chunk.status.list.201903+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#15803D">200</font>: An array of [ContentChunkStatus (2019/03)](docId\:MxHDQ_5ih5SKYEWwBtWTz) entities was successfully retrieved&#x20;

**Example**

:::CodeblockTabs
application/vnd.bsn.upload.content.chunk.status.list.201903+json

```json
[
  {
    "count": 0,
    "length": 12,
    "state": "Uploading"
  }
]
```
:::

**Failure Response**

<font color="#B91C1C">300</font>: The acceptable Content Upload Session representations are not specified

<font color="#B91C1C">401</font>: The access token is invalid or not specified

<font color="#B91C1C">404</font>: A Content Upload Session with the specified session token was not found or the Content Upload with specified upload token was not found

<font color="#B91C1C">406</font>: The specified representation of the Content Chunk entity is not acceptable

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error



## POST  /Sessions/\{SessionToken}/Uploads/\{UploadToken}/Chunks/

Uploads a new Content Chunk in scope of the specified [ContentChunkStatus (2019/03)](docId\:MxHDQ_5ih5SKYEWwBtWTz)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**&#x20;

- `offset` <font color="#704ae0">string </font><font color="#01a0af">required</font>: Start position of the current file part

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**&#x20;

- `SessionToken` <font color="#704ae0">string</font>: The Content Upload Session Token generated by the server or `None` if the new Content Upload is standalone
- `UploadToken` <font color="#704ae0">string</font>: The Content Upload Token generated by the server

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**&#x20;

- The [ContentChunkStatus (2019/03)](docId\:MxHDQ_5ih5SKYEWwBtWTz)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Examples**

The example request parameters and headers are set as follows:

- `offset` is set to `0`
- `SessionToken` is set to `None`
- `UploadToken` is set to `321e6fc1-553f-4bb0-8c7a-d5bf859be6b2`

```none
POST /Upload/2019/03/REST/Sessions/None/Uploads/321e6fc1-553f-4bb0-8c7a-d5bf859be6b2/Chunks/?offset=0 HTTP/1.1 
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/octet-stream
Content-Length: 12
```

This is the example request body:

:::CodeblockTabs
application/octet-stream

```json
Hello World!
```
:::

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#15803D">202</font>**:&#x20;**&#x54;he specified Content Chunk has been successfully added to the queue

**Failure Response**

<font color="#B91C1C">4</font><font color="#B91C1C">00</font>: The specified Content Chunk data is incomplete or not acceptable

<font color="#B91C1C">401</font>: The access token is invalid or not specified

<font color="#B91C1C">404</font>: A Content Upload Session with the specified session token was not found or the Content Upload with specified upload token was not found

<font color="#B91C1C">415</font>: The specified Content Chunk format is invalid or not supported

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error




[title] Presentations Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

These endpoints allow for creation, modification, and retrieval of Presentation objects. 

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Presentations***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Retrieves a list of Presentations on the network.

**Required Scope Token**

bsn.api.main.presentations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (e.g. "`[Device].[Serial] ASC`"). The default value is null.
- `marker`  <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of presentations exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of presentations that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[Status] IS 'Published'`
- `sort` is set to `[Name] ASC`

```text
GET /2022/06/REST/Presentations/?marker=MDAxIC0gVXBwZXIgTGVmdCBNYXN0ZXIsOTQwODI%3D&pageSize=1&filter=%5BStatus%5D%20IS%20%27Published%27&sort=%5BName%5D%20ASC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Presentation Entities](docId:57R8l5zHZFPTus2rPV_JW) on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
   "items": [   {
      "id": 098765,
      "type": "Complete",
      "name": "001-LeftScreen-Years",
      "creationDate": "2023-05-10T16:20:37.37Z",
      "lastModifiedDate": "2023-06-20T15:14:13.063Z",
      "projectFile":       {
         "id": 1234567,
         "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/6391b7b4fa3cfd6213b053506824b940",
         "type": "Stored",
         "name": "001-LeftScreen-Years.bpfx",
         "size": 194873,
         "hash": "SHA1:9C36970CD4337F9D83D932500A173B590436F94CC",
         "creationDate": "2023-06-20T15:14:12.74Z",
         "lastModifiedDate": "2023-06-20T15:14:12.207Z"
      },
      "autorun":       {
         "version": "10.0.97",
         "isCustom": false
      },
      "deviceWebPage":       {
         "id": 2345678,
         "name": "Default_PresentationWebPage"
      },
      "deviceModel": "XT1144",
      "screenSettings":       {
         "videoMode": "1920x1080x60p",
         "orientation": "Landscape",
         "connector": "HDMI",
         "backgroundColor": "RGB:000000",
         "overscan": "NoOverscan"
      },
      "language": "English",
      "status": "Published",
      "autoplayFile":       {
         "id": 12345,
         "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/98b3a8e5f8179331bd54c5bd95178687",
         "type": "Stored",
         "name": "autoplay-001-LeftScreen-Years.json",
         "size": 128875,
         "hash": "SHA1:BB9C840B156B799389B78F404438456A861BFD67",
         "creationDate": "2023-06-20T15:14:12.613Z",
         "lastModifiedDate": "2023-06-20T15:14:12.207Z"
      },
      "resourcesFile":       {
         "id": 12345,
         "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/cd420f1f6e497e845e2b8350dda09e23",
         "type": "Stored",
         "name": "resources.txt",
         "size": 0,
         "hash": "SHA1:AA39B34B5E6B4B0D3255BFEF95601890AFD80709",
         "creationDate": "2023-05-10T16:25:06.717Z",
         "lastModifiedDate": "2023-05-10T16:25:06.02Z"
      },
      "userDefinedEventsFile": null,
      "thumbnailFile":       {
         "id": 12345,
         "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/cc79c72f771fa58dac9b23788381b337",
         "type": "Stored",
         "name": "001-LeftScreen-Years.thmb.jpg",
         "size": 1977,
         "hash": "SHA1:52G80141B47757FA2C540EBE6338FFC91EA6A52D",
         "creationDate": "2023-05-11T04:15:51.913Z",
         "lastModifiedDate": "2023-05-11T04:15:51.12Z"
      },
      "files": null,
      "autorunPlugins": null,
      "applications": [],
      "dependencies": null,
      "groups": [],
      "permissions": []
   }],
   "totalItemCount": 163,
   "matchingItemCount": 110,
   "pageSize": 1,
   "nextMarker": "MDAxLUxlZnRTY3JlZW4tWWVhcnMsMTcyMDU4",
   
   "isTruncated": true,
   "sortExpression": "[Name] ASC",
   "filterExpression": "[Status] IS 'Published'"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /

Creates a new Presentation on the network.

**Required Scope Token**

bsn.api.main.presentations.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Presentation Entity](docId:57R8l5zHZFPTus2rPV_JW)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Presentations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 1184
```

This is the example request body:

```json
{
  "id": 0,
  "name": "BestTest",
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "projectFile": null,
  "autorun": {
    "version": "10.0.98",
    "isCustom": false
  },
  "deviceWebPage": {
    "id": 2345678,
    "name": "Default_PresentationWebPage"
  },
  "deviceModel": "HD1024",
  "screenSettings": {
    "videoMode": "1920x1080x60p",
    "orientation": "Landscape",
    "connector": "HDMI",
    "backgroundColor": "RGB:000000",
    "overscan": "NoOverscan"
  },
  "language": "English",
  "status": "Draft",
  "autoplayFile": null,
  "resourcesFile": null,
  "userDefinedEventsFile": null,
  "thumbnailFile": {},
  "files": [],
  "autorunPlugins": null,
  "applications": [],
  "dependencies": [],
  "groups": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the [Presentation Entity](docId:57R8l5zHZFPTus2rPV_JW) created and referenced by the Uri (given by the Location header field) in the response. 

**Example**

```json
{
   "id": 098765,
   "name": "BestTest",
   "creationDate": "2023-11-08T22:37:53.9028274Z",
   "lastModifiedDate": "2023-11-08T22:37:53.9028274Z",
   "projectFile": null,
   "autorun":    {
      "version": "10.0.98",
      "isCustom": false
   },
   "deviceWebPage":    {
      "id": 2345678,
      "name": "Default_PresentationWebPage"
   },
   "deviceModel": "HD1024",
   "screenSettings":    {
      "videoMode": "1920x1080x60p",
      "orientation": "Landscape",
      "connector": "HDMI",
      "backgroundColor": "RGB:000000",
      "overscan": "NoOverscan"
   },
   "language": "English",
   "status": "Draft",
   "autoplayFile": null,
   "resourcesFile": null,
   "userDefinedEventsFile": null,
   "thumbnailFile": null,
   "files": [   {
      "id": 000001,
      "path": "https://bsncloud.s3.amazonaws.com/public/autoplugins.default.brs",
      "type": "Stored",
      "name": "autoplugins.brs",
      "size": 146,
      "hash": "SHA1:ABBCB3E76C85E48D326E802428B23F0325667410",
      "creationDate": "2020-07-09T19:09:06.713Z",
      "lastModifiedDate": "0001-01-01T00:00:00"
   }],
   "autorunPlugins": [],
   "applications": [],
   "dependencies": [],
   "groups": null,
   "permissions": []
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Removes Presentations, specified by a filter, from a network. This allows multiple Presentations to be deleted at once.

**Required Scope Token**

bsn.api.main.presentations.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[Status] IS 'Draft'`

```text
DELETE /2022/06/REST/Presentations/?filter=%5BStatus%5D%20IS%20%27Draft%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the number of affected Presentations as an integer value

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/ 

Retrieves the number of Presentations on the network matching the specified filter criteria. If no filter is included, this call returns the total number of Presentations on the network. 

**Required Scope Token**

bsn.api.main.presentations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[LastModifiedDate] IS IN THE RANGE '2020-07-01' AND '2020-08-01'`

```text
GET /2022/06/REST/Presentations/Count/?filter=%5BLastModifiedDate%5D%20IS%20IN%20THE%20RANGE%20%272020-07-01%27%20AND%20%272020-08-01%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The number of Presentations is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/ 

Returns the specified Presentation 

**Required Scope Token**

bsn.api.main.presentations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Presentation 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `123456`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Presentations/123456/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Presentation Entity](docId:57R8l5zHZFPTus2rPV_JW)&#x20;

**Example**

This is an example of a 200 level response:

```json
{
   "id": 123456,
   "type": "Complete",
   "name": "JaneDoeTest",
   "creationDate": "2023-05-10T16:20:37.37Z",
   "lastModifiedDate": "2023-12-20T21:32:35.093Z",
   "projectFile":    {
      "id": 1234567,
      "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/0a704ff75585f18147d83ac90d02bb8c",
      "type": "Stored",
      "name": "JaneDoeTest.bpfx",
      "size": 36903,
      "hash": "SHA1:36A3BBEC3E97F9B1C48248F7173FEE141245D122",
      "creationDate": "2023-09-08T16:08:13.09Z",
      "lastModifiedDate": "2023-09-08T16:08:12.523Z"
   },
   "autorun":    {
      "version": "10.0.98",
      "isCustom": false
   },
   "deviceWebPage":    {
      "id": 2345678,
      "name": "Default_PresentationWebPage"
   },
   "deviceModel": "HD1024",
   "screenSettings":    {
      "videoMode": "1920x1080x60p",
      "orientation": "Landscape",
      "connector": "HDMI",
      "backgroundColor": "RGB:000000",
      "overscan": "NoOverscan"
   },
   "language": "English",
   "status": "Draft",
   "autoplayFile":       {
         "id": 12345,
         "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/98b3a8e5f8179331bd54c5bd95178687",
         "type": "Stored",
         "name": "autoplay-JaneDoeTest.json",
         "size": 128875,
         "hash": "SHA1:BB9C850B156B799389B78F404448456A861BFD67",
         "creationDate": "2023-11-08T22:37:53.903Z",
         "lastModifiedDate": "2023-06-20T15:14:12.207Z"
      },
   "resourcesFile":       {
         "id": 12345,
         "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/cd420f1f6e497e845e2b8350dda09e23",
         "type": "Stored",
         "name": "resources.txt",
         "size": 0,
         "hash": "SHA1:DA39A3BB5E6B4B0D3255BFEF95601890AFD80709",
         "creationDate": "2023-05-10T16:25:06.717Z",
         "lastModifiedDate": "2023-05-10T16:25:06.02Z"
      },
   "userDefinedEventsFile": null,
   "thumbnailFile":       {
         "id": 12345,
         "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/cc79c72f771fa58dac9b23788381b337",
         "type": "Stored",
         "name": "JaneDoeTest.thmb.jpg",
         "size": 1977,
         "hash": "SHA1:52G80141B47757FA2C541EBE6338FFC91EA6A52D",
         "creationDate": "2023-05-11T04:15:51.913Z",
         "lastModifiedDate": "2023-05-11T04:15:51.12Z"
      },
   "files": [   {
      "id": 000001,
      "path": "https://bsncloud.s3.amazonaws.com/public/autoplugins.default.brs",
      "type": "Stored",
      "name": "autoplugins.brs",
      "size": 146,
      "hash": "SHA1:A34CB3E76C85E48D326E802428B23F0325667410",
      "creationDate": "2020-07-09T19:09:06.713Z",
      "lastModifiedDate": "0001-01-01T00:00:00"
   }],
   "autorunPlugins": [],
   "applications": [],
   "dependencies": [],
   "groups": [],
   "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/ 

Modifies the specified Presentation 

**Required Scope Token**

bsn.api.main.presentations.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Presentation Entity](docId:57R8l5zHZFPTus2rPV_JW)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `123456`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Presentations/123456/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Content-Type: application/json
Content-Length: 1341
```

This is the example request body:

```json
{
  "id": 123456,
  "type": "Complete",
  "name": "JaneDoeTest",
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "projectFile": {
    "id": 12345,
    "path": null,
    "type": "Stored",
    "name": "JaneDoeTest.bpfx",
    "size": 0,
    "hash": null,
    "creationDate": "0001-01-01T00:00:00",
    "lastModifiedDate": "0001-01-01T00:00:00"
  },
  "autorun": {
    "version": "10.0.98",
    "isCustom": false
  },
  "deviceWebPage": {
    "id": 2345678,
    "name": "Default_PresentationWebPage"
  },
  "deviceModel": "HD1024",
  "screenSettings": {
    "videoMode": "1920x1080x60p",
    "orientation": "Landscape",
    "connector": "HDMI",
    "backgroundColor": "RGB:000000",
    "overscan": "NoOverscan"
  },
  "language": "English",
  "status": "Draft",
  "autoplayFile": {
    "id": 12345,
    "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/98b3a8e5f8179331bd54c5bd95178687",
    "type": "Stored",
    "name": "autoplay-JaneDoeTest.json",
    "size": 128875,
    "hash": "SHA1:BB9C850B156B799389B78F404448456A861BFD67",
    "creationDate": "2023-11-08T22:37:53.903Z",
    "lastModifiedDate": "2023-06-20T15:14:12.207Z"
  },
  "resourcesFile": {
    "id": 12345,
    "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/cd420f1f6e497e845e2b8350dda09e23",
    "type": "Stored",
    "name": "resources.txt",
    "size": 0,
    "hash": "SHA1:DA39A3BB5E6B4B0D3255BFEF95601890AFD80709",
    "creationDate": "2023-05-10T16:25:06.717Z",
    "lastModifiedDate": "2023-05-10T16:25:06.02Z"
  },
  "userDefinedEventsFile": null,
  "thumbnailFile": {
    "id": 12345,
    "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/cc79c72f771fa58dac9b23788381b337",
    "type": "Stored",
    "name": "JaneDoeTest.thmb.jpg",
    "size": 1977,
    "hash": "SHA1:52G80141B47757FA2C541EBE6338FFC91EA6A52D",
    "creationDate": "2023-05-11T04:15:51.913Z",
    "lastModifiedDate": "2023-05-11T04:15:51.12Z"
  },
  "files": [
    {
      "mediaType": "Video",
      "id": 12345,
      "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/146bf3dd806cf10c940996c99c392a42",
      "type": "Media",
      "name": "New BrightWall Mockup.mp4",
      "size": 14788538,
      "hash": "SHA1:4271F163089C674826AECDDCD4FC6FA1B2332D66",
      "creationDate": "2022-07-29T16:26:17.7Z",
      "lastModifiedDate": "2022-07-26T14:58:26.57Z"
    }
  ],
  "autorunPlugins": [
    {
      "id": 12345,
      "name": "SetMultiScreenVideoMode",
      "fileInfo": {
        "id": 12345,
        "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/1d76cbeffb487d687fb8362593211e1b",
        "type": "Stored",
        "name": "SetMultiScreenVideoMode.brs",
        "size": 2628,
        "hash": "55F5B577643FBAFCF719016E04F1E458FCD2C104",
        "creationDate": "2024-01-12T17:06:40.64Z",
        "lastModifiedDate": "2024-01-12T17:06:40.64Z"
      },
      "presentations": null
    }
  ],
  "applications": [],
  "dependencies": [],
  "groups": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Presentation was successfully updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/ 

Removes the specified Presentation

**Required Scope Token**

bsn.api.main.presentations.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `123456`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Presentations/123456/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Presentation was successfully deleted from the network

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/ 

Returns the specified Presentation

**Required Scope Token**

bsn.api.main.presentations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Presentation 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `JaneDoeTest`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Presentations/JaneDoeTest/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Presentation Entity](docId:57R8l5zHZFPTus2rPV_JW)&#x20;

**Example**

```json
{
   "id": 123456,
   "type": "Complete",
   "name": "JaneDoeTest",
   "creationDate": "2023-05-10T16:20:37.37Z",
   "lastModifiedDate": "2023-12-20T21:32:35.093Z",
   "projectFile":    {
      "id": 1234567,
      "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/0a704ff75585f18147d83ac90d02bb8c",
      "type": "Stored",
      "name": "JaneDoeTest.bpfx",
      "size": 36903,
      "hash": "SHA1:36A3BBEC3E97F9B1C48248F7173FEE141245D122",
      "creationDate": "2023-09-08T16:08:13.09Z",
      "lastModifiedDate": "2023-09-08T16:08:12.523Z"
   },
   "autorun":    {
      "version": "10.0.98",
      "isCustom": false
   },
   "deviceWebPage":    {
      "id": 2345678,
      "name": "Default_PresentationWebPage"
   },
   "deviceModel": "HD1024",
   "screenSettings":    {
      "videoMode": "1920x1080x60p",
      "orientation": "Landscape",
      "connector": "HDMI",
      "backgroundColor": "RGB:000000",
      "overscan": "NoOverscan"
   },
   "language": "English",
   "status": "Draft",
   "autoplayFile":       {
         "id": 12345,
         "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/98b3a8e5f8179331bd54c5bd95178687",
         "type": "Stored",
         "name": "autoplay-JaneDoeTest.json",
         "size": 128875,
         "hash": "SHA1:BB9C850B156B799389B78F404448456A861BFD67",
         "creationDate": "2023-11-08T22:37:53.903Z",
         "lastModifiedDate": "2023-06-20T15:14:12.207Z"
      },
   "resourcesFile":       {
         "id": 12345,
         "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/cd420f1f6e497e845e2b8350dda09e23",
         "type": "Stored",
         "name": "resources.txt",
         "size": 0,
         "hash": "SHA1:DA39A3BB5E6B4A0D3255BFEF95601890AFD80709",
         "creationDate": "2023-05-10T16:25:06.717Z",
         "lastModifiedDate": "2023-05-10T16:25:06.02Z"
      },
   "userDefinedEventsFile": null,
   "thumbnailFile":       {
         "id": 12345,
         "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/cc79c72f771fa58dac9b23788381b337",
         "type": "Stored",
         "name": "JaneDoeTest.thmb.jpg",
         "size": 1977,
         "hash": "SHA1:52G80141B47857FA2C541EBE6338FFC91EA6A52D",
         "creationDate": "2023-05-11T04:15:51.913Z",
         "lastModifiedDate": "2023-05-11T04:15:51.12Z"
      },
   "files": [   {
      "id": 000001,
      "path": "https://bsncloud.s3.amazonaws.com/public/autoplugins.default.brs",
      "type": "Stored",
      "name": "autoplugins.brs",
      "size": 146,
      "hash": "SHA1:A34CB3E76C85E58D326E802428B23F0325667410",
      "creationDate": "2020-07-09T19:09:06.713Z",
      "lastModifiedDate": "0001-01-01T00:00:00"
   }],
   "autorunPlugins": [],
   "applications": [],
   "dependencies": [],
   "groups": [],
   "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{name}/ 

Modifies the specified Presentation

**Required Scope Token**

bsn.api.main.presentations.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Presentation Entity](docId:57R8l5zHZFPTus2rPV_JW)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `JaneDoeTest`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Presentations/JaneDoeTest/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Content-Type: application/json
Content-Length: 1341
```

This is the example request body:

```json
{
  "id": 123456,
  "type": "Complete",
  "name": "JaneDoeTest",
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "projectFile": {
    "id": 12345,
    "path": null,
    "type": "Stored",
    "name": "JaneDoeTest.bpfx",
    "size": 0,
    "hash": null,
    "creationDate": "0001-01-01T00:00:00",
    "lastModifiedDate": "0001-01-01T00:00:00"
  },
  "autorun": {
    "version": "10.0.98",
    "isCustom": false
  },
  "deviceWebPage": {
    "id": 2345678,
    "name": "Default_PresentationWebPage"
  },
  "deviceModel": "HD1024",
  "screenSettings": {
    "videoMode": "1920x1080x60p",
    "orientation": "Landscape",
    "connector": "HDMI",
    "backgroundColor": "RGB:000000",
    "overscan": "NoOverscan"
  },
  "language": "English",
  "status": "Draft",
  "autoplayFile": {
    "id": 12345,
    "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/98b3a8e5f8179331bd54c5bd95178687",
    "type": "Stored",
    "name": "autoplay-JaneDoeTest.json",
    "size": 128875,
    "hash": "SHA1:BB9C850B156B799389B78F404448456A861BFD67",
    "creationDate": "2023-11-08T22:37:53.903Z",
    "lastModifiedDate": "2023-06-20T15:14:12.207Z"
  },
  "resourcesFile": {
    "id": 12345,
    "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/cd420f1f6e497e845e2b8350dda09e23",
    "type": "Stored",
    "name": "resources.txt",
    "size": 0,
    "hash": "SHA1:DA39A3BB5E6B4B0D3255BFEF95601890AFD80709",
    "creationDate": "2023-05-10T16:25:06.717Z",
    "lastModifiedDate": "2023-05-10T16:25:06.02Z"
  },
  "userDefinedEventsFile": null,
  "thumbnailFile": {
    "id": 12345,
    "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/cc79c72f771fa58dac9b23788381b337",
    "type": "Stored",
    "name": "JaneDoeTest.thmb.jpg",
    "size": 1977,
    "hash": "SHA1:52G80141B47757FA2C541EBE6338FFC91EA6A52D",
    "creationDate": "2023-05-11T04:15:51.913Z",
    "lastModifiedDate": "2023-05-11T04:15:51.12Z"
  },
  "files": [
    {
      "mediaType": "Video",
      "id": 12345,
      "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/146bf3dd806cf10c940996c99c392a42",
      "type": "Media",
      "name": "New BrightWall Mockup.mp4",
      "size": 14788538,
      "hash": "SHA1:4271F163089C674826AECDDCD4FC6FA1B2332D66",
      "creationDate": "2022-07-29T16:26:17.7Z",
      "lastModifiedDate": "2022-07-26T14:58:26.57Z"
    }
  ],
  "autorunPlugins": [
    {
      "id": 12345,
      "name": "SetMultiScreenVideoMode",
      "fileInfo": {
        "id": 12345,
        "path": "https://bsncloud.s3.amazonaws.com/JaneDoeTesting/1d76cbeffb487d687fb8362593211e1b",
        "type": "Stored",
        "name": "SetMultiScreenVideoMode.brs",
        "size": 2628,
        "hash": "55F5B577643FBAFCF719016E04F1E458FCD2C104",
        "creationDate": "2024-01-12T17:06:40.64Z",
        "lastModifiedDate": "2024-01-12T17:06:40.64Z"
      },
      "presentations": null
    }
  ],
  "applications": [],
  "dependencies": [],
  "groups": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Presentation was successfully updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/ 

Removes the specified Presentation 

**Required Scope Token**

bsn.api.main.presentations.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `JaneDoeTest`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Presentations/JaneDoeTest/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Presentation was successfully deleted from the network

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/ 

Returns the operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Presentations/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

:::ExpandableHeading
Example

```json
{
  "uid": "5e368789-94d8-423e-bebb-2f5451398067",
  "singularName": "Full Control",
  "pluralName": "Presentation (Full Control)",
  "fullName": "Presentation (Full Control)",
  "targetEntity": "Presentation",
  "appliance": "Instance, Collection",
  "parent": null,
  "descendants": [
    {
      "uid": "c978aa8d-c7ac-410f-aec3-22e136d0ba58",
      "singularName": "View Presentation",
      "pluralName": "View Presentations",
      "fullName": "Presentation (Full Control) - View Presentations",
      "targetEntity": "Presentation",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "c978aa8d-c7ac-410f-aec3-22e136d0ba58",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.467Z"
        },
        {
          "entityId": null,
          "operationUID": "c978aa8d-c7ac-410f-aec3-22e136d0ba58",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.673Z"
        },
        {
          "entityId": null,
          "operationUID": "c978aa8d-c7ac-410f-aec3-22e136d0ba58",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.843Z"
        },
        {
          "entityId": null,
          "operationUID": "c978aa8d-c7ac-410f-aec3-22e136d0ba58",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "c978aa8d-c7ac-410f-aec3-22e136d0ba58",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "c978aa8d-c7ac-410f-aec3-22e136d0ba58",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.39Z"
        }
      ]
    },
    {
      "uid": "d08cf494-5a8d-45e5-99d8-0b8ec61547a0",
      "singularName": "View Autorun Plugin",
      "pluralName": "View Autorun Plugins",
      "fullName": "Presentation (Full Control) - View Autorun Plugins",
      "targetEntity": "Presentation",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "d08cf494-5a8d-45e5-99d8-0b8ec61547a0",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.843Z"
        },
        {
          "entityId": null,
          "operationUID": "d08cf494-5a8d-45e5-99d8-0b8ec61547a0",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "d08cf494-5a8d-45e5-99d8-0b8ec61547a0",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "d08cf494-5a8d-45e5-99d8-0b8ec61547a0",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.39Z"
        },
        {
          "entityId": null,
          "operationUID": "d08cf494-5a8d-45e5-99d8-0b8ec61547a0",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.467Z"
        },
        {
          "entityId": null,
          "operationUID": "d08cf494-5a8d-45e5-99d8-0b8ec61547a0",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.673Z"
        }
      ]
    },
    {
      "uid": "ffea0d95-b04f-4fb9-90d2-c8d314c89cd7",
      "singularName": "View Contents",
      "pluralName": "View Contents",
      "fullName": "Presentation (Full Control) - View Contents",
      "targetEntity": "Presentation",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "ffea0d95-b04f-4fb9-90d2-c8d314c89cd7",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.843Z"
        },
        {
          "entityId": null,
          "operationUID": "ffea0d95-b04f-4fb9-90d2-c8d314c89cd7",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "ffea0d95-b04f-4fb9-90d2-c8d314c89cd7",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "ffea0d95-b04f-4fb9-90d2-c8d314c89cd7",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.39Z"
        },
        {
          "entityId": null,
          "operationUID": "ffea0d95-b04f-4fb9-90d2-c8d314c89cd7",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.467Z"
        },
        {
          "entityId": null,
          "operationUID": "ffea0d95-b04f-4fb9-90d2-c8d314c89cd7",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.673Z"
        }
      ]
    },
    {
      "uid": "8054f9c1-4afe-487c-921c-15e118d5e89e",
      "singularName": "Create Presentation",
      "pluralName": "Create Presentation",
      "fullName": "Presentation (Full Control) - Create Presentation",
      "targetEntity": "Presentation",
      "appliance": "Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "8054f9c1-4afe-487c-921c-15e118d5e89e",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "8054f9c1-4afe-487c-921c-15e118d5e89e",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "8054f9c1-4afe-487c-921c-15e118d5e89e",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.39Z"
        },
        {
          "entityId": null,
          "operationUID": "8054f9c1-4afe-487c-921c-15e118d5e89e",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.467Z"
        },
        {
          "entityId": null,
          "operationUID": "8054f9c1-4afe-487c-921c-15e118d5e89e",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.673Z"
        },
        {
          "entityId": null,
          "operationUID": "8054f9c1-4afe-487c-921c-15e118d5e89e",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.843Z"
        }
      ]
    },
    {
      "uid": "bb823893-a8ff-49f1-8dca-63026c5e9787",
      "singularName": "Overwrite Presentation",
      "pluralName": "Overwrite Presentation",
      "fullName": "Presentation (Full Control) - Overwrite Presentation",
      "targetEntity": "Presentation",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "bb823893-a8ff-49f1-8dca-63026c5e9787",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "bb823893-a8ff-49f1-8dca-63026c5e9787",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "bb823893-a8ff-49f1-8dca-63026c5e9787",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.39Z"
        },
        {
          "entityId": null,
          "operationUID": "bb823893-a8ff-49f1-8dca-63026c5e9787",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.467Z"
        },
        {
          "entityId": null,
          "operationUID": "bb823893-a8ff-49f1-8dca-63026c5e9787",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.673Z"
        },
        {
          "entityId": null,
          "operationUID": "bb823893-a8ff-49f1-8dca-63026c5e9787",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.843Z"
        }
      ]
    },
    {
      "uid": "a9db6cdb-513b-4cca-a0ce-35d571c56cd6",
      "singularName": "Update Presentation",
      "pluralName": "Update Presentation",
      "fullName": "Presentation (Full Control) - Update Presentation",
      "targetEntity": "Presentation",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [
        {
          "uid": "f318d012-58f6-45e0-b347-a8e4418853f8",
          "singularName": "Add Autorun Plugin",
          "pluralName": "Add Autorun Plugin",
          "fullName": "Presentation (Full Control) - Update Presentation - Add Autorun Plugin",
          "targetEntity": "Presentation",
          "appliance": "Instance, Collection",
          "parent": {
            "uid": "a9db6cdb-513b-4cca-a0ce-35d571c56cd6",
            "singularName": "Update Presentation",
            "pluralName": "Update Presentation",
            "fullName": "Presentation (Full Control) - Update Presentation",
            "targetEntity": "Presentation",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
          },
          "descendants": [],
          "permissions": [
            {
              "entityId": null,
              "operationUID": "f318d012-58f6-45e0-b347-a8e4418853f8",
              "principal": {
                "name": "Administrators",
                "isCustom": false,
                "type": "Role",
                "id": 1
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": true,
              "creationDate": "2024-01-03T01:44:13.18Z"
            },
            {
              "entityId": null,
              "operationUID": "f318d012-58f6-45e0-b347-a8e4418853f8",
              "principal": {
                "name": "General Managers",
                "isCustom": false,
                "type": "Role",
                "id": 2
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": true,
              "creationDate": "2024-01-03T01:44:13.293Z"
            },
            {
              "entityId": null,
              "operationUID": "f318d012-58f6-45e0-b347-a8e4418853f8",
              "principal": {
                "name": "Creators",
                "isCustom": false,
                "type": "Role",
                "id": 3
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": true,
              "creationDate": "2024-01-03T01:44:13.39Z"
            },
            {
              "entityId": null,
              "operationUID": "f318d012-58f6-45e0-b347-a8e4418853f8",
              "principal": {
                "name": "Publishers",
                "isCustom": false,
                "type": "Role",
                "id": 4
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": false,
              "creationDate": "2024-01-03T01:44:13.467Z"
            },
            {
              "entityId": null,
              "operationUID": "f318d012-58f6-45e0-b347-a8e4418853f8",
              "principal": {
                "name": "Network Managers",
                "isCustom": false,
                "type": "Role",
                "id": 5
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": false,
              "creationDate": "2024-01-03T01:44:13.673Z"
            },
            {
              "entityId": null,
              "operationUID": "f318d012-58f6-45e0-b347-a8e4418853f8",
              "principal": {
                "name": "Viewers",
                "isCustom": false,
                "type": "Role",
                "id": 6
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": false,
              "creationDate": "2024-01-03T01:44:13.843Z"
            }
          ]
        },
        {
          "uid": "b2defd99-0cf9-46f7-949e-de9e6f5bce27",
          "singularName": "Remove Autorun Plugin",
          "pluralName": "Remove Autorun Plugin",
          "fullName": "Presentation (Full Control) - Update Presentation - Remove Autorun Plugin",
          "targetEntity": "Presentation",
          "appliance": "Instance, Collection",
          "parent": {
            "uid": "a9db6cdb-513b-4cca-a0ce-35d571c56cd6",
            "singularName": "Update Presentation",
            "pluralName": "Update Presentation",
            "fullName": "Presentation (Full Control) - Update Presentation",
            "targetEntity": "Presentation",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
          },
          "descendants": [],
          "permissions": [
            {
              "entityId": null,
              "operationUID": "b2defd99-0cf9-46f7-949e-de9e6f5bce27",
              "principal": {
                "name": "Administrators",
                "isCustom": false,
                "type": "Role",
                "id": 1
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": true,
              "creationDate": "2024-01-03T01:44:13.18Z"
            },
            {
              "entityId": null,
              "operationUID": "b2defd99-0cf9-46f7-949e-de9e6f5bce27",
              "principal": {
                "name": "General Managers",
                "isCustom": false,
                "type": "Role",
                "id": 2
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": true,
              "creationDate": "2024-01-03T01:44:13.293Z"
            },
            {
              "entityId": null,
              "operationUID": "b2defd99-0cf9-46f7-949e-de9e6f5bce27",
              "principal": {
                "name": "Creators",
                "isCustom": false,
                "type": "Role",
                "id": 3
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": true,
              "creationDate": "2024-01-03T01:44:13.39Z"
            },
            {
              "entityId": null,
              "operationUID": "b2defd99-0cf9-46f7-949e-de9e6f5bce27",
              "principal": {
                "name": "Publishers",
                "isCustom": false,
                "type": "Role",
                "id": 4
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": false,
              "creationDate": "2024-01-03T01:44:13.467Z"
            },
            {
              "entityId": null,
              "operationUID": "b2defd99-0cf9-46f7-949e-de9e6f5bce27",
              "principal": {
                "name": "Network Managers",
                "isCustom": false,
                "type": "Role",
                "id": 5
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": false,
              "creationDate": "2024-01-03T01:44:13.673Z"
            },
            {
              "entityId": null,
              "operationUID": "b2defd99-0cf9-46f7-949e-de9e6f5bce27",
              "principal": {
                "name": "Viewers",
                "isCustom": false,
                "type": "Role",
                "id": 6
              },
              "isFixed": true,
              "isInherited": true,
              "isAllowed": false,
              "creationDate": "2024-01-03T01:44:13.843Z"
            }
          ]
        }
      ],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "a9db6cdb-513b-4cca-a0ce-35d571c56cd6",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "a9db6cdb-513b-4cca-a0ce-35d571c56cd6",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "a9db6cdb-513b-4cca-a0ce-35d571c56cd6",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.39Z"
        },
        {
          "entityId": null,
          "operationUID": "a9db6cdb-513b-4cca-a0ce-35d571c56cd6",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.467Z"
        },
        {
          "entityId": null,
          "operationUID": "a9db6cdb-513b-4cca-a0ce-35d571c56cd6",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.673Z"
        },
        {
          "entityId": null,
          "operationUID": "a9db6cdb-513b-4cca-a0ce-35d571c56cd6",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.843Z"
        }
      ]
    },
    {
      "uid": "840fc61a-5b1c-4362-a8e8-70d99b6fb5a4",
      "singularName": "Add Content",
      "pluralName": "Add Content",
      "fullName": "Presentation (Full Control) - Add Content",
      "targetEntity": "Presentation",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "840fc61a-5b1c-4362-a8e8-70d99b6fb5a4",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "840fc61a-5b1c-4362-a8e8-70d99b6fb5a4",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "840fc61a-5b1c-4362-a8e8-70d99b6fb5a4",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.39Z"
        },
        {
          "entityId": null,
          "operationUID": "840fc61a-5b1c-4362-a8e8-70d99b6fb5a4",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.467Z"
        },
        {
          "entityId": null,
          "operationUID": "840fc61a-5b1c-4362-a8e8-70d99b6fb5a4",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.673Z"
        },
        {
          "entityId": null,
          "operationUID": "840fc61a-5b1c-4362-a8e8-70d99b6fb5a4",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.843Z"
        }
      ]
    },
    {
      "uid": "07d6f70f-daea-4baa-9fe9-522368120a1b",
      "singularName": "Remove Content",
      "pluralName": "Remove Content",
      "fullName": "Presentation (Full Control) - Remove Content",
      "targetEntity": "Presentation",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "07d6f70f-daea-4baa-9fe9-522368120a1b",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "07d6f70f-daea-4baa-9fe9-522368120a1b",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "07d6f70f-daea-4baa-9fe9-522368120a1b",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.39Z"
        },
        {
          "entityId": null,
          "operationUID": "07d6f70f-daea-4baa-9fe9-522368120a1b",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.467Z"
        },
        {
          "entityId": null,
          "operationUID": "07d6f70f-daea-4baa-9fe9-522368120a1b",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.673Z"
        },
        {
          "entityId": null,
          "operationUID": "07d6f70f-daea-4baa-9fe9-522368120a1b",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.843Z"
        }
      ]
    },
    {
      "uid": "610d19d9-b047-bce4-7957-da89011aa3d9",
      "singularName": "Assign Presentation",
      "pluralName": "Assign Presentation",
      "fullName": "Presentation (Full Control) - Assign Presentation",
      "targetEntity": "Presentation",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "610d19d9-b047-bce4-7957-da89011aa3d9",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.393Z"
        },
        {
          "entityId": null,
          "operationUID": "610d19d9-b047-bce4-7957-da89011aa3d9",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.483Z"
        },
        {
          "entityId": null,
          "operationUID": "610d19d9-b047-bce4-7957-da89011aa3d9",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "610d19d9-b047-bce4-7957-da89011aa3d9",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "610d19d9-b047-bce4-7957-da89011aa3d9",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.673Z"
        },
        {
          "entityId": null,
          "operationUID": "610d19d9-b047-bce4-7957-da89011aa3d9",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.843Z"
        }
      ]
    },
    {
      "uid": "9c0c314a-b5e1-49c7-82b8-f27b748c1a37",
      "singularName": "Unassign Presentation",
      "pluralName": "Unassign Presentation",
      "fullName": "Presentation (Full Control) - Unassign Presentation",
      "targetEntity": "Presentation",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "9c0c314a-b5e1-49c7-82b8-f27b748c1a37",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.393Z"
        },
        {
          "entityId": null,
          "operationUID": "9c0c314a-b5e1-49c7-82b8-f27b748c1a37",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.483Z"
        },
        {
          "entityId": null,
          "operationUID": "9c0c314a-b5e1-49c7-82b8-f27b748c1a37",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "9c0c314a-b5e1-49c7-82b8-f27b748c1a37",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "9c0c314a-b5e1-49c7-82b8-f27b748c1a37",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.673Z"
        },
        {
          "entityId": null,
          "operationUID": "9c0c314a-b5e1-49c7-82b8-f27b748c1a37",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.843Z"
        }
      ]
    },
    {
      "uid": "6304d004-450e-c694-05e6-adc7adc3efc6",
      "singularName": "Edit Permissions",
      "pluralName": "Edit Permissions",
      "fullName": "Presentation (Full Control) - Edit Permissions",
      "targetEntity": "Presentation",
      "appliance": "Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "6304d004-450e-c694-05e6-adc7adc3efc6",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "6304d004-450e-c694-05e6-adc7adc3efc6",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "6304d004-450e-c694-05e6-adc7adc3efc6",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.39Z"
        },
        {
          "entityId": null,
          "operationUID": "6304d004-450e-c694-05e6-adc7adc3efc6",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.467Z"
        },
        {
          "entityId": null,
          "operationUID": "6304d004-450e-c694-05e6-adc7adc3efc6",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.673Z"
        },
        {
          "entityId": null,
          "operationUID": "6304d004-450e-c694-05e6-adc7adc3efc6",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.843Z"
        }
      ]
    },
    {
      "uid": "87fd8615-7051-49c9-8ada-67b5f7fb31ae",
      "singularName": "Delete Presentation",
      "pluralName": "Delete Presentation",
      "fullName": "Presentation (Full Control) - Delete Presentation",
      "targetEntity": "Presentation",
      "appliance": "Instance, Collection",
      "parent": {
        "uid": "5e368789-94d8-423e-bebb-2f5451398067",
        "singularName": "Full Control",
        "pluralName": "Presentation (Full Control)",
        "fullName": "Presentation (Full Control)",
        "targetEntity": "Presentation",
        "appliance": "Instance, Collection",
        "parent": null,
        "descendants": null,
        "permissions": null
      },
      "descendants": [],
      "permissions": [
        {
          "entityId": null,
          "operationUID": "87fd8615-7051-49c9-8ada-67b5f7fb31ae",
          "principal": {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
          },
          "isFixed": true,
          "isInherited": false,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.673Z"
        },
        {
          "entityId": null,
          "operationUID": "87fd8615-7051-49c9-8ada-67b5f7fb31ae",
          "principal": {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.18Z"
        },
        {
          "entityId": null,
          "operationUID": "87fd8615-7051-49c9-8ada-67b5f7fb31ae",
          "principal": {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.293Z"
        },
        {
          "entityId": null,
          "operationUID": "87fd8615-7051-49c9-8ada-67b5f7fb31ae",
          "principal": {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": true,
          "creationDate": "2024-01-03T01:44:13.39Z"
        },
        {
          "entityId": null,
          "operationUID": "87fd8615-7051-49c9-8ada-67b5f7fb31ae",
          "principal": {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.467Z"
        },
        {
          "entityId": null,
          "operationUID": "87fd8615-7051-49c9-8ada-67b5f7fb31ae",
          "principal": {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
          },
          "isFixed": true,
          "isInherited": true,
          "isAllowed": false,
          "creationDate": "2024-01-03T01:44:13.843Z"
        }
      ]
    }
  ],
  "permissions": [
    {
      "entityId": null,
      "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
      "principal": {
        "name": "Administrators",
        "isCustom": false,
        "type": "Role",
        "id": 1
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2024-01-03T01:44:13.18Z"
    },
    {
      "entityId": null,
      "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
      "principal": {
        "name": "General Managers",
        "isCustom": false,
        "type": "Role",
        "id": 2
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2024-01-03T01:44:13.293Z"
    },
    {
      "entityId": null,
      "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
      "principal": {
        "name": "Creators",
        "isCustom": false,
        "type": "Role",
        "id": 3
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2024-01-03T01:44:13.39Z"
    },
    {
      "entityId": null,
      "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
      "principal": {
        "name": "Publishers",
        "isCustom": false,
        "type": "Role",
        "id": 4
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2024-01-03T01:44:13.467Z"
    },
    {
      "entityId": null,
      "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
      "principal": {
        "name": "Network Managers",
        "isCustom": false,
        "type": "Role",
        "id": 5
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2024-01-03T01:44:13.673Z"
    },
    {
      "entityId": null,
      "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
      "principal": {
        "name": "Viewers",
        "isCustom": false,
        "type": "Role",
        "id": 6
      },
      "isFixed": true,
      "isInherited": false,
      "isAllowed": false,
      "creationDate": "2024-01-03T01:44:13.843Z"
    }
  ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">500</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/ 

Includes object permissions for a given Presentation

**Required Scope Token**

bsn.api.main.presentations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345`

```text
GET /2022/06/REST/Presentations/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
      {
      "entityId": 12345,
      "operationUID": "840fc61a-5b1c-4362-a8e8-70d99b6fb5a4",
      "principal":       {
         "login": "JaneDoe@brightsign.biZ",
         "type": "User",
         "id": 123
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2023-11-13T23:56:31.11Z"
   },
      {
      "entityId": 12345,
      "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
      "principal":       {
         "name": "Custom",
         "isCustom": true,
         "type": "Role",
         "id": 456
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2023-11-13T23:56:31.09Z"
   }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/ 

Adds permissions for the specified Presentation

**Required Scope Token**

bsn.api.main.presentations.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int</font>: A unique identifier for the Presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is `12345`

```text
POST /2022/06/REST/Presentations/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 326
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 123
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified Presentation

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/ 

Removes permissions for the specified Presentation&#x20;

**Required Scope Token**

bsn.api.main.presentations.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is `12345`

```text
DELETE /2022/06/REST/Presentations/12345/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 326
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 123
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Permissions/ 

Includes object permissions for a given Presentation

**Required Scope Token**

bsn.api.main.presentations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `October2023Prez`

```text
GET /2022/06/REST/Presentations/October2023Prez/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
      {
      "entityId": 12345,
      "operationUID": "840fc61a-5b1c-4362-a8e8-70d99b6fb5a4",
      "principal":       {
         "login": "JaneDoe@brightsign.biZ",
         "type": "User",
         "id": 123
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2023-11-13T23:56:31.11Z"
   },
      {
      "entityId": 12345,
      "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
      "principal":       {
         "name": "Custom",
         "isCustom": true,
         "type": "Role",
         "id": 456
      },
      "isFixed": false,
      "isInherited": false,
      "isAllowed": true,
      "creationDate": "2023-11-13T23:56:31.09Z"
   }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{name}/Permissions/ 

Adds permissions for the specified Presentation

**Required Scope Token**

bsn.api.main.presentations.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `October2023Prez`

```text
POST /2022/06/REST/Presentations/October2023Prez/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 326
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 123
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified Presentation

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/Permissions/ 

Removes permissions for the specified Presentation

**Required Scope Token**

bsn.api.main.presentations.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Presentation

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is `October2023Prez`

```text
DELETE /2022/06/REST/Presentations/October2023Prez/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 326
```

This is the example request body:

```json
[
  {
    "entityId": 12345,
    "operationUID": "5e368789-94d8-423e-bebb-2f5451398067",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 123
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] WebPageUpdateArguments (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The WebPageUpdateArguments entity is structured as follows:

`entity`:

- `SessionToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#01a0af"> </font><font color="#01a0af">read-write</font>: The WebPage Upload Session Token generated by the server
- `UploadToken` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0">&gt; </font><font color="#01a0af">read-write</font>: The WebPage Upload Token generated by the server
- `WebPageId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: The identifier of an existing WebPage in the Library
- `Name` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The name of the entire WebPage being uploaded
- `Assets` <font color="#704ae0">WebPageAssetUploadArguments[] </font><font color="#01a0af">read-write</font>: The details about media assets related to the WebPage being uploaded in the current session
- `FileName` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: The name of an index file of the Web Page/Site being uploaded
- `VirtualPath` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The target virtual path in the library for the content being uploaded
- `MediaType` <font color="#704ae0">string </font><font color="#01a0af">read-write</font>: One of \{"WebPage", "DeviceWebPage"} enumeration values
- `FileSize` <font color="#704ae0">long</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The size in bytes of an index file of the Web Page/Site being uploaded
- `FileLastModifiedDate` <font color="#704ae0">DateTime </font><font color="#01a0af">read-write</font>: The timestamp of last modification of an original index file in local storage. See [DateTime](docId:8oxgPxYJltIKaU9ho1nr2) for more information about this data type. 
- `SHA1Hash` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">string&gt;</font><font color="#704ae0"> </font><font color="#01a0af">read-write</font>: The SHA1 hash of the index file being uploaded
- `FileThumb` <font color="#704ae0">Nullable&lt;</font><font color="#704ae0">byte[]&gt;</font> <font color="#01a0af">read-write</font>: A BASE64-encoded thumbnail for the Web Page/Site being uploaded.&#x20;




[title] Player Synchronization Settings Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Player Synchronization Settings entities are structured as follows:

`entity`:

- `Status` <font color="#704ae0">PlayerStatusSynchronizationSettings</font> <font color="#01a0af">read-write</font>:&#x20;
  - `Period` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The frequency of the status updates that the player sends to the server. Currently, the value is five minutes for all players.
- `Settings` <font color="#704ae0">PlayerSettingsSynchronizationSettings</font> <font color="#01a0af">read-write</font>:&#x20;
  - `Period` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The frequency of the synchronization settings updates that the player sends to and receives from the server, to ensure that it hasn’t missed an update from the server
- `Schedule` <font color="#704ae0">PlayerScheduleSynchronizationSettings</font> <font color="#01a0af">read-write</font>:
  - `Period` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: Players with "BSN" setup type only use this to check for missed updates of scheduled content
- `Content` <font color="#704ae0">PlayerContentSynchronizationSettings</font> <font color="#01a0af">read-write</font>:
  - `Start` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: Defines the time of the day when the player is allowed to download content (to avoid network impacts). See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
  - `End` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: Defines time of the day when the player is allowed to download content (to avoid network impacts). See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.


[title] BSN.Cloud API Integration
[path] Cloud APIs/

BSN.Cloud is our free service for player provisioning, diagnostics, and control for BrightSign players. It allows for automated provisioning of your customers' players to your CMS solution. You can also use BSN.Cloud to perform a host of diagnostic actions on a BrightSign player.

This page will show you how to provision BrightSign players out of the box (and to help your customers do the same, if necessary) and interact with the player over the internet using the BSN.Cloud REST API.

## Glossary of Terms

- **BSN.Cloud**: A set of player management and deployment services that include the B-Deploy API, Remote DWS, Authentication services, and a set of APIs
- **Partner**: The content management system (CMS) to integrate with BrightSign
- **Client Credentials**: A set of credentials, provided by BrightSign, that allows the partner to create and manage networks
- **Customer**: The individual purchasing content-management services from the partner in order to manage BrightSign players
- **Person**: A set of credentials (email and password) that allows an individual to create networks and access them as a user.
- **Network**: The structure for managing and monitoring players on BSN.Cloud:
  - A network can have any number of players, but a player can only belong to a single network at a time. To switch a player to another network, the device entry must be deleted from the original network on the BSN and B-Deploy services.
  - A network can have multiple users (i.e. persons), and persons can belong to multiple networks. The person who creates the network is the network administrator, but the administrator may give other users equivalent privileges.
  - One or more player subscriptions are required to upgrade a network to BrightSign Author Plus or Control Plus.

## Resources

The following resources are used for BrightSign Author and Control Plus operations:

- [BSN.Cloud APIs](docId\:gOEMCi9nmvGAktTR5qcjs)
- [Remote DWS API](docId\:Kku9e7f7CHC5LwofXs9E0)
- [B-Deploy ](https://brightsign.atlassian.net/wiki/spaces/DOC/pages/378831792/B-Deploy+Device+Provisioning)[B-Deploy/Provisioning APIs](docId\:wccw4TQERZPXV7KJq_a3P)&#x20;

## Obtaining BSN.Cloud Client Credentials

See [Authentication](docId\:HbYHyV8svQ0u6bZhuV50-).

## Determine Your Network Structure

Before creating BSN.Cloud networks, you will need to determine how to manage customer players on BSN.Cloud. There are three options:

- **One network for all customers**: You manage a single network for all customers' players. There is no way to segregate players by user, so you could not give customers direct access to Remote DWS or B-Deploy functionality.
- **You create networks for customers**: You will create a network for each of your customers. You can create an additional user on the network to give the customer access (as creator, you remain the network owner). The customer can either have full permissions or a subset of permissions.
- **Each customer creates a network**: The customer creates a network using the BSN.Cloud UI (or a custom UI that you create using the APIs). If you want access to your customers' networks, they will need to add you to the network or hand over their credentials.

## Determine Network Interface Priorities

### BrightSignOS Metric Logic

Prior to OS 8.4.6, the BrightSignOS (BOS) updated the metrics (interface priority) of wired and wireless interfaces using 0 as the highest metric value, and 1 as the secondary value, when specified through BrightSign Author.

In BrightSignOS 8.4.6 and above, the BOS will assign metrics in the following cases:

- Targeted Interfaces: Once the player has successfully connected to BSN.Cloud, metrics will be updated in interfaces provided by the Device Setup package.
- Discovered Interfaces: Once the player has successfully connected to BSN.Cloud, metrics will be updated in interfaces which are discovered either through a physical interface connection before power is applied or as a hotplug after power has been applied.

Metric value logic is used to determine the actual value used when applying to the BOS. Relative to the order of all the Targeted Interfaces and Discovered Interfaces, the metric will be calculated by starting the "metric assignment" at 100. The location (or index) of the interface is ordered relative to other interfaces, then multiplied by 10, then increased by 100. For example: 

| Interface | Index | Final Metric Value ((Index \* 10) + 100) |
| --------- | ----- | ---------------------------------------- |
| eth0      | 0     | 100                                      |
| wlan0     | 1     | 110                                      |
| ppp0      | 2     | 120                                      |
| usb0      | 3     | 130                                      |

### Metric Range Definitions

These metric range definitions are loose - there are no actual restrictions.

- 0 - 99: Used for interfaces which are not assigned by the BOS, possibly because the player is not connected to BSN.Cloud or older BOS version, or autorun. These would be explicitly assigned by older software.
- 100 - 199: Used for the BOS when assigning metrics.
- 200 - n: Used for interfaces which are not assigned by the BOS. This may be because the player is not connected to BSN.Cloud, or an older BOS version or autorun are running, where these were not assigned by any software.

### Disabling BrightSignOS Metrics

To keep the BOS from applying metrics for all interfaces, set `supervisor_apply_metrics` to `false` in the networking section registry key.

## Determine Your Provisioning Workflow

Depending on the network structure you've decided on, there are two workflows for provisioning customer players for your CMS and BSN.Cloud:

- **Option A - Partner Provisions Customer Devices**: You will use the B-Deploy APIs to generate a Device object for each player (using the serial number) and associate the Device objects with one or more Device Setup objects. You can either add Device objects using your Client Credentials (for example, before shipping them from your warehouse), or you can have customers enter the serial numbers themselves (which would require you to build a customer-facing UI that interacts with the B-Deploy APIs on the backend). When the customer connects players to the Internet on-site, they will contact the B-Deploy servers and provision themselves for your CMS.
- **Option B - Customer Links BSN.Cloud Network with Partner CMS**: Have the customer add players to their BSN.Cloud network, which your CMS has access to. Players that are registered on the customer's network will provision themselves for your CMS. This option requires that you gain access to a customer network; there are two ways to do this:
  - You create a BSN.Cloud network for the customer using the BSN.Cloud APIs and hand the credentials to the customer.
  - The customer creates an account using the new BrightSign device activation scheme. The customer will then need to hand the the credentials over to you.

## Hosting a Provisioning Package

You can use the B-Deploy application to set up players for your CMS application To do this, you will need to host a fixed application URL that BrightSign players can use to download a provisioning package. Contact BrightSign for help generating a provisioning package.

## Security

The BrightSign player exposes some APIs that serve up information required by various internal processes. These are open APIs, which are not secure. However they can only be called by other processes running on the player, not externally, and they do not serve any sensitive information.

[title] Token Info Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Token Info entities are structured as follows:

`entity`:

- `Token` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The token granted for authentication purposes
- `Scope` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The scope granted by the token. For example, a successful user authentication response will contain both "Full" and "Self" values.&#x20;
- `ValidFrom` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The token will be valid from this date and time. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ValidTo` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The date and time that the token expires. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.








[title] UploadStatus Enumeration (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The UploadStatus enumeration is structured as follows:

- `Unknown`
- `Queued`
- `Started`
- `Uploading`
- `Stopped`
- `Uploaded`
- `Verified`
- `Cancelled`
- `Corrupted`
- `Collected`
- `Terminated`
- `Completed`

[title] ContentChunkStatus (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The ContentChunkStatus entity is structured as follows:

`entity`:

- `Count` <font color="#704ae0">ulong </font><font color="#01a0af">read-only</font>: The number of uploaded Content Chunks in a section
- `Length` <font color="#704ae0">ulong </font><font color="#01a0af">read-only</font>: The size of a section
- `State` <font color="#704ae0">string </font><font color="#01a0af">read-only</font>: The state of a section upload. See [UploadStatus Enumeration (2019/03)](docId\:s0Gj0owfjf9OKNId86stN)&#x20;

[title] ContentMediaType Enumeration (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/DataTypes (2019/03)/Custom Data Types (2019/03)/

The ContentMediaType Enumeration is structured as follows:

- `Auto`
- `Auxiliary`
- `Stylesheet`
- `Font`
- `Text`
- `Image`
- `Video`
- `Audio`
- `WebPage`
- `DeviceWebPage`


[title] Rate Limits
[path] Cloud APIs/BSN.Cloud Main APIs/Making Requests/

Rate limiting is applied to the BSN.Cloud APIs to ensure that a high quality service is delivered for all users, and to protect client applications from unexpected loops.

### Session Endpoint Rate Limit

For the `REST/SELF/SESSION` endpoint you can make up to 360 requests within one hour. If you exceed this limit, you will receive a <font color="#B91C1C">`429 Too Many Requests`</font> HTTP status code for each request made within the rest of the one hour time frame. At the end of the period, your rate limit will reset back to 360 requests.

### Other Endpoints Rate Limit

(*PROVISIONAL*) For other endpoints you can make up to 3,600 requests within one hour. If you exceed this limit, you will receive a <font color="#B91C1C">`429 Too Many Requests`</font> HTTP status code for each request made within the remainder of the one hour time frame. At the end of the period, your rate limit will reset back to 3,600 requests.

### Higher Limits

If you have an application that requires a higher rate limit than these defaults, contact us.

We reserve the right to limit or remove without notice applications that regularly exceed or attempt to bypass the rate limits.

[title] Dynamic Playlists Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Dynamic Playlist entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the dynamic playlist instance. This value is generated by the server when the dynamic playlist is created.
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the dynamic playlist. The maximum character length for this string is 50 characters.
- `PhysicalPath` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The location of the dynamic playlist feed XML file in the server directory
- `FileSize` <font color="#704ae0">long</font> <font color="#01a0af">read-only</font>: The size of the dynamic playlist feed XML file (in bytes)
- `FileHash` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The hash algorithm and the value that results from performing the hash algorithm on the file. The string is formatted as "\{algorithm}:\{value}" (e.g. "SHA1:6DB465879088280AAC52DC22B07ED0AD493A99D4")
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A UTC timestamp indicating when the dynamic playlist was created on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information on this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A UTC timestamp indicating when the dynamic playlist was last modified on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information on this data type.
- `SupportsAudio` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: A flag indicating whether the dynamic playlist supports audio files
- `SupportsVideo` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: A flag indicating whether the dynamic playlist supports video files
- `SupportsImages` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: A flag indicating whether the dynamic playlist supports image files
- `Content` <font color="#704ae0">DynamicPlaylistContent[]</font> <font color="#01a0af">read-write</font>: An array of content object instances representing content files in the dynamic playlist: 
- `ContentId` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: The unique identifier for the dynamic playlist content
- `FileName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name assigned to the dynamic playlist content
- `DisplayDuration` <font color="#704ae0">TimeSpan</font> <font color="#01a0af">read-write</font>: The amount of time the content will be displayed before transitioning to the next entry. See [TimeSpan](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ValidityStartDate` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The validity start date for the entry (that is, the point at which it will start being included in the dynamic playlist). A null value specifies that the item is valid immediately when added to the dynamic playlist. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ValidityEndDate` <font color="#704ae0">Nullable</font><font color="#01a0af"> read-write</font>: The validity end date for the associated entry (that is, the point at which it will no longer be included in the dynamic playlist).  A null value specifies that the item will be valid until it is removed from the dynamic playlist manually by a user. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Presentations` <font color="#704ae0">PresentationInfo[]</font> <font color="#01a0af">read-only</font>: An array of [Presentation Info](docId\:rH_TKLzOo3RPBID0mDC9v) entities for each presentation associated with the dynamic playlist instance
- `Permissions` <font color="#704ae0">Permission[]</font> <font color="#01a0af">read-write</font>: A list of permission object instances representing permissions rules assigned to the dynamic playlist instance


[title] Playlists/Tagged Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

Use these endpoints to manage Tagged Playlists on the network. 

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Playlists/Tagged***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Returns a list of Tagged Playlists on the network.

**Required Scope Token**

bsn.api.main.playlists.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (e.g. "`[Device].[Serial] ASC`"). The default value is null.
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of Tagged Playlists exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of Tagged Playlists that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[WaitingForApprove] IS FALSE`
- `sort` is set to `[Name] DESC`

```text
GET /2022/06/REST/Playlists/Tagged/?marker=Qm9zZSw2OTk2MTMz&pageSize=1&filter=%5BWaitingForApprove%5D%20IS%20FALSE&sort=%5BName%5D%20DESC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Tagged Playlists Entities](docId\:AW3DnJhg-HwkyG5f1L8Vg) on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
   "items": [   {
      "id": 4629237,
      "name": "Animals",
      "physicalPath": "https://handlers.bsn.cloud/bs/GetFile.ashx?type=TaggedPlaylist&token=492A1CD3D8588F3DC1C61E082B77B901",
      "contentsVirtualPath": "\\Shared\\",
      "rule": "<Cats> IS 'Maine Coon' AND <Dogs> IS 'Beagle'",
      "orderTag": "<FileName> ASC",
      "ttl": "00:05:00",
      "waitingForApprove": false,
      "creationDate": "2022-08-22T19:01:19.457Z",
      "lastModifiedDate": "2022-08-22T19:01:19.457Z",
      "content": null,
      "presentations": [],
      "permissions": []
   }],
   "totalItemCount": 2,
   "matchingItemCount": 2,
   "pageSize": 1,
   "nextMarker": "QW5pbWFscyw0NjI5MjM2",
   "prevMarker": "QW5pbWFscyw0NjI55h67",
   "isTruncated": false,
   "sortExpression": "[Name] DESC",
   "filterExpression": "[WaitingForApprove] IS FALSE"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /

Creates a Tagged Playlist on the network.

**Required Scope Token**

bsn.api.main.playlists.tagged.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Tagged Playlists Entity](docId\:AW3DnJhg-HwkyG5f1L8Vg)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Playlists/Tagged/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 535
```

This is the example request body:

```json
{
  "id": 0,
  "name": "Entryway",
  "physicalPath": null,
  "contentsVirtualPath": "\\Shared\\Playlists\\",
  "rule": "<audio> IS 'song' AND <video> IS 'demo'",
  "orderTag": "<FileName> ASC",
  "ttl": "00:05:00",
  "waitingForApprove": false,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "content": null,
  "presentations": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the [Tagged Playlists Entity](docId\:AW3DnJhg-HwkyG5f1L8Vg) created and referenced by the Uri (given by the Location header field) in the response. 

**Example**

```json
{
  "id": 12345678,
  "name": "Entryway",
  "physicalPath": "https://handlers.bsn.cloud/bs/GetFile.ashx?type=TaggedPlaylist&token=3C149FB6DA45DA4EBB81AB9090CA0154",
  "contentsVirtualPath": "\\Shared\\Playlists\\",
  "rule": "<audio> IS 'song' AND <video> IS 'demo' AND <Speaker> IS 'revolve'",
  "orderTag": "<FileName> ASC",
  "ttl": "00:05:00",
  "waitingForApprove": false,
  "creationDate": "2023-11-17T23:58:59.5921725Z",
  "lastModifiedDate": "2023-11-17T23:58:59.5921725Z",
  "content": [
    {
      "contentId": 12345,
      "fileName": "audio1429519115.m4a",
      "displayDuration": null,
      "validityStartDate": null,
      "validityEndDate": null,
      "state": "Approved"
    }
  ],
  "presentations": [],
  "permissions": []
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Removes Tagged Playlists, specified by a filter, from the network. This allows you to delete multiple Tagged Playlists at once.

**Required Scope Token**

bsn.api.main.playlists.tagged.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[ContentsVirtualPath] IS '\\Shared\\Playlists\\'`

```text
DELETE /2022/06/REST/Playlists/Tagged/?filter=%5BContentsVirtualPath%5D%20IS%20%27%5C%5CShared%5C%5CPlaylists%5C%5C%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the number of affected Tagged Playlist as an integer value

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/   

Returns the number of Tagged Playlists on the network that match the specified filter criteria. If no filter is included, this call returns the total number of Tagged Playlists on the network. 

**Required Scope Token**

bsn.api.main.playlists.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[WaitingForApprove] IS FALSE`

```text
GET /2022/06/REST/Playlists/Tagged/Count/?filter=%5BWaitingForApprove%5D%20IS%20FALSE HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The number of Tagged Playlists is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/  

Returns the specified Tagged Playlist

**Required Scope Token**

bsn.api.main.playlists.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Playlists/Tagged/12345678/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Tagged Playlists Entity](docId\:AW3DnJhg-HwkyG5f1L8Vg)&#x20;

**Example**

This is an example of a 200 level response:

```json
{
  "id": 12345678,
  "name": "DecemberSaleEvent",
  "physicalPath": "https://handlers.bsn.cloud/bs/GetFile.ashx?type=TaggedPlaylist&token=03BAD9A1CD834901HT5E574983F8215D",
  "contentsVirtualPath": "\\Shared\\Playlists\\",
  "rule": "<audio> IS 'song' AND <video> IS 'demo' AND <Speaker> IS 'revolve'",
  "orderTag": "<FileName> ASC",
  "ttl": "00:05:00",
  "waitingForApprove": false,
  "creationDate": "2023-11-07T18:35:49.003Z",
  "lastModifiedDate": "2023-12-20T21:32:35.093Z",
  "content": [   
    {
      "contentId": 12345,
      "fileName": "audio1429519115.m4a",
      "displayDuration": null,
      "validityStartDate": null,
      "validityEndDate": null,
      "state": "Approved"
    }
  ],
  "presentations": [
    {
      "id": 54321,
      "name": "HTML_RedandGreen",
      "type": "Presentation",
      "link": null
    }
  ],
  "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/  

Modifies the specified Tagged Playlist

**Required Scope Token**

bsn.api.main.playlists.tagged.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Tagged Playlists Entity](docId\:AW3DnJhg-HwkyG5f1L8Vg)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Playlists/Tagged/12345678/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Content-Type: application/json
Content-Length: 705
```

This is the example request body:

```json
{
  "id": 12345678,
  "name": "DecemberSaleEvent",
  "physicalPath": null,
  "contentsVirtualPath": "\\Shared\\Playlists\\",
  "rule": "<audio> IS 'song' AND <video> IS 'demo' AND <Speaker> IS 'revolve'",
  "orderTag": "<FileName> ASC",
  "ttl": "00:05:00",
  "waitingForApprove": false,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "content": [
    {
      "contentId": 12345,
      "fileName": "audio1429519115.m4a",
      "displayDuration": "00:01:00",
      "validityStartDate": "2023-12-01T00:00:00",
      "validityEndDate": "2024-01-01T00:00:00",
      "state": "Approved"
    }
  ],
  "presentations": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Tagged Playlist has been updated on the network 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/  

Removes the specified Tagged Playlist

**Required Scope Token**

bsn.api.main.playlists.tagged.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Playlists/Tagged/12345678/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Tagged Playlist file has been removed

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/  

Returns the specified Tagged Playlist

**Required Scope Token**

bsn.api.main.playlists.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `DecemberSaleEvent`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Playlists/Tagged/DecemberSaleEvent/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Tagged Playlists Entity](docId\:AW3DnJhg-HwkyG5f1L8Vg)&#x20;

**Example**

This is an example of a 200 level response:

```json
{
  "id": 12345678,
  "name": "DecemberSaleEvent",
  "physicalPath": "https://handlers.bsn.cloud/bs/GetFile.ashx?type=TaggedPlaylist&token=03BAD9A1CD834901HT5E574983F8215D",
  "contentsVirtualPath": "\\Shared\\Playlists\\",
  "rule": "<audio> IS 'song' AND <video> IS 'demo' AND <Speaker> IS 'revolve'",
  "orderTag": "<FileName> ASC",
  "ttl": "00:05:00",
  "waitingForApprove": false,
  "creationDate": "2023-11-07T18:35:49.003Z",
  "lastModifiedDate": "2023-12-20T21:32:35.093Z",
  "content": [   
    {
      "contentId": 12345,
      "fileName": "audio1429519115.m4a",
      "displayDuration": null,
      "validityStartDate": null,
      "validityEndDate": null,
      "state": "Approved"
    }
  ],
  "presentations": [
    {
      "id": 242158,
      "name": "HTML_RedandGreen",
      "type": "Presentation",
      "link": null
    }
  ],
  "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{name}/  

Modifies the specified Tagged Playlist

**Required Scope Token**

bsn.api.main.playlists.tagged.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Tagged Playlists Entity](docId\:AW3DnJhg-HwkyG5f1L8Vg)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `DecemberSaleEvent`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Playlists/Tagged/DecemberSaleEvent/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Content-Type: application/json
Content-Length: 705
```

This is the example request body:

```json
{
  "id": 12345678,
  "name": "DecemberSaleEvent",
  "physicalPath": null,
  "contentsVirtualPath": "\\Shared\\Playlists\\",
  "rule": "<audio> IS 'song' AND <video> IS 'demo' AND <Speaker> IS 'revolve'",
  "orderTag": "<FileName> ASC",
  "ttl": "00:05:00",
  "waitingForApprove": false,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "content": [
    {
      "contentId": 12345,
      "fileName": "audio1429519115.m4a",
      "displayDuration": "00:01:00",
      "validityStartDate": "2023-12-01T00:00:00",
      "validityEndDate": "2024-01-01T00:00:00",
      "state": "Approved"
    }
  ],
  "presentations": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Tagged Playlist has been updated on the network 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header) 

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/  

Removes the specified Tagged Playlist

**Required Scope Token**

bsn.api.main.playlists.tagged.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `DecemberSaleEvent`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Playlists/Tagged/DecemberSaleEvent/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 20 Dec 2023 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Tagged Playlist file has been removed

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/  

Returns the operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.playlists.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Playlists/Tagged/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

:::ExpandableHeading
Example

```json
{
   "uid": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
   "singularName": "Full Control",
   "pluralName": "Tagged Playlist (Full Control)",
   "fullName": "Tagged Playlist (Full Control)",
   "targetEntity": "TaggedPlaylist",
   "appliance": "Instance, Collection",
   "parent": null,
   "descendants":    [
            {
         "uid": "8d4d37ee-e7c8-4944-bd29-4af1f2ad017b",
         "singularName": "View Tagged Playlists",
         "pluralName": "View Tagged Playlists",
         "fullName": "Tagged Playlist (Full Control) - View Tagged Playlists",
         "targetEntity": "TaggedPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
            "singularName": "Full Control",
            "pluralName": "Tagged Playlist (Full Control)",
            "fullName": "Tagged Playlist (Full Control)",
            "targetEntity": "TaggedPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "8d4d37ee-e7c8-4944-bd29-4af1f2ad017b",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:20.14Z"
            },
                        {
               "entityId": null,
               "operationUID": "8d4d37ee-e7c8-4944-bd29-4af1f2ad017b",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:20.567Z"
            },
                        {
               "entityId": null,
               "operationUID": "8d4d37ee-e7c8-4944-bd29-4af1f2ad017b",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.43Z"
            },
                        {
               "entityId": null,
               "operationUID": "8d4d37ee-e7c8-4944-bd29-4af1f2ad017b",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.533Z"
            },
                        {
               "entityId": null,
               "operationUID": "8d4d37ee-e7c8-4944-bd29-4af1f2ad017b",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.65Z"
            },
                        {
               "entityId": null,
               "operationUID": "8d4d37ee-e7c8-4944-bd29-4af1f2ad017b",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.813Z"
            },
                        {
               "entityId": null,
               "operationUID": "8d4d37ee-e7c8-4944-bd29-4af1f2ad017b",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.897Z"
            },
                        {
               "entityId": null,
               "operationUID": "8d4d37ee-e7c8-4944-bd29-4af1f2ad017b",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.287Z"
            },
                        {
               "entityId": null,
               "operationUID": "8d4d37ee-e7c8-4944-bd29-4af1f2ad017b",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:24.523Z"
            }
         ]
      },
            {
         "uid": "a1c2c673-988a-42c5-aa8d-abbe1808a9ea",
         "singularName": "Assign Tagged Playlist",
         "pluralName": "Assign Tagged Playlist",
         "fullName": "Tagged Playlist (Full Control) - Assign Tagged Playlist",
         "targetEntity": "TaggedPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
            "singularName": "Full Control",
            "pluralName": "Tagged Playlist (Full Control)",
            "fullName": "Tagged Playlist (Full Control)",
            "targetEntity": "TaggedPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "a1c2c673-988a-42c5-aa8d-abbe1808a9ea",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.43Z"
            },
                        {
               "entityId": null,
               "operationUID": "a1c2c673-988a-42c5-aa8d-abbe1808a9ea",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.533Z"
            },
                        {
               "entityId": null,
               "operationUID": "a1c2c673-988a-42c5-aa8d-abbe1808a9ea",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.65Z"
            },
                        {
               "entityId": null,
               "operationUID": "a1c2c673-988a-42c5-aa8d-abbe1808a9ea",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.813Z"
            },
                        {
               "entityId": null,
               "operationUID": "a1c2c673-988a-42c5-aa8d-abbe1808a9ea",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.137Z"
            },
                        {
               "entityId": null,
               "operationUID": "a1c2c673-988a-42c5-aa8d-abbe1808a9ea",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.563Z"
            },
                        {
               "entityId": null,
               "operationUID": "a1c2c673-988a-42c5-aa8d-abbe1808a9ea",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.897Z"
            },
                        {
               "entityId": null,
               "operationUID": "a1c2c673-988a-42c5-aa8d-abbe1808a9ea",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.287Z"
            },
                        {
               "entityId": null,
               "operationUID": "a1c2c673-988a-42c5-aa8d-abbe1808a9ea",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:24.523Z"
            }
         ]
      },
            {
         "uid": "f599610a-0d72-450e-a929-9a59b45455ef",
         "singularName": "Unassign Tagged Playlist",
         "pluralName": "Unassign Tagged Playlist",
         "fullName": "Tagged Playlist (Full Control) - Unassign Tagged Playlist",
         "targetEntity": "TaggedPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
            "singularName": "Full Control",
            "pluralName": "Tagged Playlist (Full Control)",
            "fullName": "Tagged Playlist (Full Control)",
            "targetEntity": "TaggedPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "f599610a-0d72-450e-a929-9a59b45455ef",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.43Z"
            },
                        {
               "entityId": null,
               "operationUID": "f599610a-0d72-450e-a929-9a59b45455ef",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.533Z"
            },
                        {
               "entityId": null,
               "operationUID": "f599610a-0d72-450e-a929-9a59b45455ef",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.65Z"
            },
                        {
               "entityId": null,
               "operationUID": "f599610a-0d72-450e-a929-9a59b45455ef",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.813Z"
            },
                        {
               "entityId": null,
               "operationUID": "f599610a-0d72-450e-a929-9a59b45455ef",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.137Z"
            },
                        {
               "entityId": null,
               "operationUID": "f599610a-0d72-450e-a929-9a59b45455ef",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.563Z"
            },
                        {
               "entityId": null,
               "operationUID": "f599610a-0d72-450e-a929-9a59b45455ef",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.897Z"
            },
                        {
               "entityId": null,
               "operationUID": "f599610a-0d72-450e-a929-9a59b45455ef",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.287Z"
            },
                        {
               "entityId": null,
               "operationUID": "f599610a-0d72-450e-a929-9a59b45455ef",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:24.523Z"
            }
         ]
      },
            {
         "uid": "da8cac65-d92b-44a8-8fd1-f0652b0db0cd",
         "singularName": "Create Tagged Playlist",
         "pluralName": "Create Tagged Playlist",
         "fullName": "Tagged Playlist (Full Control) - Create Tagged Playlist",
         "targetEntity": "TaggedPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
            "singularName": "Full Control",
            "pluralName": "Tagged Playlist (Full Control)",
            "fullName": "Tagged Playlist (Full Control)",
            "targetEntity": "TaggedPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "da8cac65-d92b-44a8-8fd1-f0652b0db0cd",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.43Z"
            },
                        {
               "entityId": null,
               "operationUID": "da8cac65-d92b-44a8-8fd1-f0652b0db0cd",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.533Z"
            },
                        {
               "entityId": null,
               "operationUID": "da8cac65-d92b-44a8-8fd1-f0652b0db0cd",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.65Z"
            },
                        {
               "entityId": null,
               "operationUID": "da8cac65-d92b-44a8-8fd1-f0652b0db0cd",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.813Z"
            },
                        {
               "entityId": null,
               "operationUID": "da8cac65-d92b-44a8-8fd1-f0652b0db0cd",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.137Z"
            },
                        {
               "entityId": null,
               "operationUID": "da8cac65-d92b-44a8-8fd1-f0652b0db0cd",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.563Z"
            },
                        {
               "entityId": null,
               "operationUID": "da8cac65-d92b-44a8-8fd1-f0652b0db0cd",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.897Z"
            },
                        {
               "entityId": null,
               "operationUID": "da8cac65-d92b-44a8-8fd1-f0652b0db0cd",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.287Z"
            },
                        {
               "entityId": null,
               "operationUID": "da8cac65-d92b-44a8-8fd1-f0652b0db0cd",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:24.523Z"
            }
         ]
      },
            {
         "uid": "14a889c3-8893-4e63-aa0a-5d6cbf37ddcb",
         "singularName": "View Contents",
         "pluralName": "View Contents",
         "fullName": "Tagged Playlist (Full Control) - View Contents",
         "targetEntity": "TaggedPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
            "singularName": "Full Control",
            "pluralName": "Tagged Playlist (Full Control)",
            "fullName": "Tagged Playlist (Full Control)",
            "targetEntity": "TaggedPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "14a889c3-8893-4e63-aa0a-5d6cbf37ddcb",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:20.567Z"
            },
                        {
               "entityId": null,
               "operationUID": "14a889c3-8893-4e63-aa0a-5d6cbf37ddcb",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.43Z"
            },
                        {
               "entityId": null,
               "operationUID": "14a889c3-8893-4e63-aa0a-5d6cbf37ddcb",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.533Z"
            },
                        {
               "entityId": null,
               "operationUID": "14a889c3-8893-4e63-aa0a-5d6cbf37ddcb",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.65Z"
            },
                        {
               "entityId": null,
               "operationUID": "14a889c3-8893-4e63-aa0a-5d6cbf37ddcb",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.813Z"
            },
                        {
               "entityId": null,
               "operationUID": "14a889c3-8893-4e63-aa0a-5d6cbf37ddcb",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.137Z"
            },
                        {
               "entityId": null,
               "operationUID": "14a889c3-8893-4e63-aa0a-5d6cbf37ddcb",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.897Z"
            },
                        {
               "entityId": null,
               "operationUID": "14a889c3-8893-4e63-aa0a-5d6cbf37ddcb",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.287Z"
            },
                        {
               "entityId": null,
               "operationUID": "14a889c3-8893-4e63-aa0a-5d6cbf37ddcb",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:24.523Z"
            }
         ]
      },
            {
         "uid": "f75edab2-ce60-4ea3-9c99-fec305fcc458",
         "singularName": "Rename Tagged Playlist",
         "pluralName": "Rename Tagged Playlist",
         "fullName": "Tagged Playlist (Full Control) - Rename Tagged Playlist",
         "targetEntity": "TaggedPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
            "singularName": "Full Control",
            "pluralName": "Tagged Playlist (Full Control)",
            "fullName": "Tagged Playlist (Full Control)",
            "targetEntity": "TaggedPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "f75edab2-ce60-4ea3-9c99-fec305fcc458",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.43Z"
            },
                        {
               "entityId": null,
               "operationUID": "f75edab2-ce60-4ea3-9c99-fec305fcc458",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.533Z"
            },
                        {
               "entityId": null,
               "operationUID": "f75edab2-ce60-4ea3-9c99-fec305fcc458",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.65Z"
            },
                        {
               "entityId": null,
               "operationUID": "f75edab2-ce60-4ea3-9c99-fec305fcc458",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.813Z"
            },
                        {
               "entityId": null,
               "operationUID": "f75edab2-ce60-4ea3-9c99-fec305fcc458",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.137Z"
            },
                        {
               "entityId": null,
               "operationUID": "f75edab2-ce60-4ea3-9c99-fec305fcc458",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.563Z"
            },
                        {
               "entityId": null,
               "operationUID": "f75edab2-ce60-4ea3-9c99-fec305fcc458",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.897Z"
            },
                        {
               "entityId": null,
               "operationUID": "f75edab2-ce60-4ea3-9c99-fec305fcc458",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.287Z"
            },
                        {
               "entityId": null,
               "operationUID": "f75edab2-ce60-4ea3-9c99-fec305fcc458",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:24.523Z"
            }
         ]
      },
            {
         "uid": "44e19ca0-d5a4-4603-a55e-04888b09d50c",
         "singularName": "Update Tagged Playlist",
         "pluralName": "Update Tagged Playlist",
         "fullName": "Tagged Playlist (Full Control) - Update Tagged Playlist",
         "targetEntity": "TaggedPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
            "singularName": "Full Control",
            "pluralName": "Tagged Playlist (Full Control)",
            "fullName": "Tagged Playlist (Full Control)",
            "targetEntity": "TaggedPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "44e19ca0-d5a4-4603-a55e-04888b09d50c",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.43Z"
            },
                        {
               "entityId": null,
               "operationUID": "44e19ca0-d5a4-4603-a55e-04888b09d50c",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.533Z"
            },
                        {
               "entityId": null,
               "operationUID": "44e19ca0-d5a4-4603-a55e-04888b09d50c",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.65Z"
            },
                        {
               "entityId": null,
               "operationUID": "44e19ca0-d5a4-4603-a55e-04888b09d50c",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.813Z"
            },
                        {
               "entityId": null,
               "operationUID": "44e19ca0-d5a4-4603-a55e-04888b09d50c",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.137Z"
            },
                        {
               "entityId": null,
               "operationUID": "44e19ca0-d5a4-4603-a55e-04888b09d50c",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.563Z"
            },
                        {
               "entityId": null,
               "operationUID": "44e19ca0-d5a4-4603-a55e-04888b09d50c",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.897Z"
            },
                        {
               "entityId": null,
               "operationUID": "44e19ca0-d5a4-4603-a55e-04888b09d50c",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.287Z"
            },
                        {
               "entityId": null,
               "operationUID": "44e19ca0-d5a4-4603-a55e-04888b09d50c",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:24.523Z"
            }
         ]
      },
            {
         "uid": "a8fd799c-838c-4cd7-aad3-2072dfd54ae9",
         "singularName": "Edit Permissions",
         "pluralName": "Edit Permissions",
         "fullName": "Tagged Playlist (Full Control) - Edit Permissions",
         "targetEntity": "TaggedPlaylist",
         "appliance": "Collection",
         "parent":          {
            "uid": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
            "singularName": "Full Control",
            "pluralName": "Tagged Playlist (Full Control)",
            "fullName": "Tagged Playlist (Full Control)",
            "targetEntity": "TaggedPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "a8fd799c-838c-4cd7-aad3-2072dfd54ae9",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.43Z"
            },
                        {
               "entityId": null,
               "operationUID": "a8fd799c-838c-4cd7-aad3-2072dfd54ae9",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.533Z"
            },
                        {
               "entityId": null,
               "operationUID": "a8fd799c-838c-4cd7-aad3-2072dfd54ae9",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.65Z"
            },
                        {
               "entityId": null,
               "operationUID": "a8fd799c-838c-4cd7-aad3-2072dfd54ae9",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.813Z"
            },
                        {
               "entityId": null,
               "operationUID": "a8fd799c-838c-4cd7-aad3-2072dfd54ae9",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.137Z"
            },
                        {
               "entityId": null,
               "operationUID": "a8fd799c-838c-4cd7-aad3-2072dfd54ae9",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.563Z"
            },
                        {
               "entityId": null,
               "operationUID": "a8fd799c-838c-4cd7-aad3-2072dfd54ae9",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.897Z"
            },
                        {
               "entityId": null,
               "operationUID": "a8fd799c-838c-4cd7-aad3-2072dfd54ae9",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.287Z"
            },
                        {
               "entityId": null,
               "operationUID": "a8fd799c-838c-4cd7-aad3-2072dfd54ae9",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:24.523Z"
            }
         ]
      },
            {
         "uid": "d47416ff-39f0-4d45-a5d1-7e0ebbacf4a7",
         "singularName": "Delete Tagged Playlist",
         "pluralName": "Delete Tagged Playlist",
         "fullName": "Tagged Playlist (Full Control) - Delete Tagged Playlist",
         "targetEntity": "TaggedPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
            "singularName": "Full Control",
            "pluralName": "Tagged Playlist (Full Control)",
            "fullName": "Tagged Playlist (Full Control)",
            "targetEntity": "TaggedPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "d47416ff-39f0-4d45-a5d1-7e0ebbacf4a7",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:20.143Z"
            },
                        {
               "entityId": null,
               "operationUID": "d47416ff-39f0-4d45-a5d1-7e0ebbacf4a7",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.43Z"
            },
                        {
               "entityId": null,
               "operationUID": "d47416ff-39f0-4d45-a5d1-7e0ebbacf4a7",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.533Z"
            },
                        {
               "entityId": null,
               "operationUID": "d47416ff-39f0-4d45-a5d1-7e0ebbacf4a7",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2022-06-21T05:03:19.65Z"
            },
                        {
               "entityId": null,
               "operationUID": "d47416ff-39f0-4d45-a5d1-7e0ebbacf4a7",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:19.813Z"
            },
                        {
               "entityId": null,
               "operationUID": "d47416ff-39f0-4d45-a5d1-7e0ebbacf4a7",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2022-06-21T05:03:20.563Z"
            },
                        {
               "entityId": null,
               "operationUID": "d47416ff-39f0-4d45-a5d1-7e0ebbacf4a7",
               "principal":                {
                  "name": "No Permissions",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10410
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2023-08-29T23:08:25.897Z"
            },
                        {
               "entityId": null,
               "operationUID": "d47416ff-39f0-4d45-a5d1-7e0ebbacf4a7",
               "principal":                {
                  "name": "Roll 1",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10470
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:04.287Z"
            },
                        {
               "entityId": null,
               "operationUID": "d47416ff-39f0-4d45-a5d1-7e0ebbacf4a7",
               "principal":                {
                  "name": "Roll 2",
                  "isCustom": true,
                  "type": "Role",
                  "id": 10471
               },
               "isFixed": false,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2023-09-01T14:45:24.523Z"
            }
         ]
      }
   ],
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
         "principal":          {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2022-06-21T05:03:19.43Z"
      },
            {
         "entityId": null,
         "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
         "principal":          {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2022-06-21T05:03:19.533Z"
      },
            {
         "entityId": null,
         "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
         "principal":          {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2022-06-21T05:03:19.65Z"
      },
            {
         "entityId": null,
         "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
         "principal":          {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2022-06-21T05:03:19.813Z"
      },
            {
         "entityId": null,
         "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
         "principal":          {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2022-06-21T05:03:20.137Z"
      },
            {
         "entityId": null,
         "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
         "principal":          {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2022-06-21T05:03:20.563Z"
      },
            {
         "entityId": null,
         "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
         "principal":          {
            "name": "No Permissions",
            "isCustom": true,
            "type": "Role",
            "id": 10410
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2023-08-29T23:08:25.897Z"
      },
            {
         "entityId": null,
         "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
         "principal":          {
            "name": "Roll 1",
            "isCustom": true,
            "type": "Role",
            "id": 10470
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2023-09-01T14:45:04.287Z"
      },
            {
         "entityId": null,
         "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
         "principal":          {
            "name": "Roll 2",
            "isCustom": true,
            "type": "Role",
            "id": 10471
         },
         "isFixed": false,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2023-09-01T14:45:24.523Z"
      }
   ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/  

Includes object permissions for a given Tagged Playlist

**Required Scope Token**

bsn.api.main.playlists.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`

```text
GET /2022/06/REST/Playlists/Tagged/12345678/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 12345678,
    "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-11-07T22:10:20.99Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/  

Retrieves the permissions for the specified Tagged Playlist on the network.

**Required Scope Token**

bsn.api.main.playlists.tagged.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`

```text
POST /2022/06/REST/Playlists/Tagged/12345678/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 484
```

This is the example request body:

```json
{
  "entityId": 12345678,
  "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
  "principal": {
    "name": "Custom",
    "isCustom": true,
    "type": "Role",
    "id": 10498
  },
  "isFixed": false,
  "isInherited": false,
  "isAllowed": true,
  "creationDate": "2023-11-09T18:03:06.673Z"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified Tagged Playlist

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header) 

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/  

Removes permissions for the specified Tagged Playlist

**Required Scope Token**

bsn.api.main.playlists.tagged.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`

```text
DELETE /2022/06/REST/Playlists/Tagged/12345678/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 321
```

This is the example request body:

```json
[
  {
    "entityId": 12345678,
    "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 0
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-11T18:46:30.1Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Permissions/ 

Includes object permissions for a given Tagged Playlist

**Required Scope Token**

bsn.api.main.playlists.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Afternoon`

```text
GET /2022/06/REST/Playlists/Tagged/Afternoon/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 12345678,
    "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-11-07T22:10:20.99Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{name}/Permissions/  

Retrieves the permissions for the specified Tagged Playlist on the network.

**Required Scope Token**

bsn.api.main.playlists.tagged.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `Morning`

```text
POST /2022/06/REST/Playlists/Tagged/Morning/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 484
```

This is the example request body:

```json
{
  "entityId": 23456789,
  "operationUID": "3cd50d9a-a3be-4d6f-84a9-323ab72cc39e",
  "principal": {
    "name": "Custom",
    "isCustom": true,
    "type": "Role",
    "id": 10498
  },
  "isFixed": false,
  "isInherited": false,
  "isAllowed": true,
  "creationDate": "2023-11-09T18:03:06.673Z"
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified Tagged Playlist

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/Permissions/  

Removes permissions for the specified Tagged Playlist

**Required Scope Token**

bsn.api.main.playlists.tagged.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Tagged Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Afternoon`

```text
DELETE /2022/06/REST/Playlists/Tagged/Afternoon/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 321
```

This is the example request body:

```json
[
  {
    "entityId": 12345678,
    "operationUID": "5c6ef943-d660-4907-aa56-e91903ff1772",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 0
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-11T18:46:30.1Z"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Playlists/Dynamic Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

Use these endpoints to manage Dynamic Playlists on the network. 

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Playlists/Dynamic***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Retrieves a list of Dynamic Playlists on the network.

**Required Scope Token**

bsn.api.main.playlists.dynamic.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (e.g. "`[Device].[Serial] ASC`"). The default value is null.
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of Dynamic Playlists exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of Dynamic Playlists that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `marker` value is set to the `[PagedList].[NextMarker]` property value from the previous BSN.cloud API response.
- `pageSize` is set to `1`
- `filter` is set to `[Name] CONTAINS 'Building'`
- `sort` is set to `[LastModifiedDate] DESC`

```text
GET /2022/06/REST/Playlists/Dynamic/?marker=MjAyMy0xMS0wMVQyMjozNzoyNC40MDNaLDExNjQwNDE3&pageSize=1&filter=%5BName%5D%20CONTAINS%20%27Building%27&sort=%5BLastModifiedDate%5D%20DESC HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Dynamic Playlists Entities](docId\:xMoTQL48ev94zyYTfUg9N) on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Example**

```json
{
   "items": [   {
      "id": 12345678,
      "name": "WestBuilding",
      "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoe/87a992afd6071576647ecd1fd65776ba",
      "fileSize": 1060,
      "fileHash": "SHA1:B995E0604EDD01F5E143B0329AABE9A14D06B821",
      "creationDate": "2023-11-01T22:36:42.153Z",
      "lastModifiedDate": "2023-11-01T22:36:42.253Z",
      "supportsAudio": true,
      "supportsVideo": true,
      "supportsImages": true,
      "content": null,
      "presentations": [      {
         "id": 3210,
         "name": "Test4Buildings",
         "type": "Presentation",
         "link": null
      }],
      "permissions": []
   }],
   "totalItemCount": 3,
   "matchingItemCount": 2,
   "pageSize": 1,
   "nextMarker": "MjAyMy0xMS0wMVQyMjozNjo0Mi4yNTNaLDExNjQwNDE1",
   "prevMarker": "MjAyMy0xMS0wMVQyMjozNjo0Mi4yNTNaLDExNjQwafg9",
   "isTruncated": false,
   "sortExpression": "[LastModifiedDate] DESC",
   "filterExpression": "[Name] CONTAINS 'Building'"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /

Create a new Dynamic Playlist on the network.

**Required Scope Token**

bsn.api.main.playlists.dynamic.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Dynamic Playlists Entity](docId\:xMoTQL48ev94zyYTfUg9N)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Playlists/Dynamic/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 328
```

This is the example request body:

```json
{
  "id": 0,
  "name": "NorthwestBuilding",
  "physicalPath": null,
  "fileSize": 0,
  "fileHash": null,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "supportsAudio": true,
  "supportsVideo": true,
  "supportsImages": true,
  "content": [
    {
      "contentId": 12345,
      "fileName": "Saturday Breakfast Menu.jpg",
      "displayDuration": "00:00:15",
      "validityStartDate": "2023-11-11T08:00:00",
      "validityEndDate": "2023-11-11T12:00:00"
    }
  ],
  "presentations": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the [Dynamic Playlists Entity](docId\:xMoTQL48ev94zyYTfUg9N) created and referenced by the Uri (given by the Location header field) in the response

**Example**

```json
{
  "id": 23456789,
  "name": "NorthwestBuilding",
  "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoe/3004b40831e00749a44e646fbe1ad068",
  "fileSize": 334,
  "fileHash": "SHA1:4ADEBD82AB32F6E9FD4733F552D56C0282736BBD",
  "creationDate": "2023-11-03T16:44:44.9301064Z",
  "lastModifiedDate": "2023-11-03T16:44:44.9301064Z",
  "supportsAudio": true,
  "supportsVideo": true,
  "supportsImages": true,
  "content": [
    {
      "contentId": 12345,
      "fileName": "Saturday Breakfast Menu.jpg",
      "displayDuration": "00:00:15",
      "validityStartDate": "2023-11-11T08:00:00",
      "validityEndDate": "2023-11-11T12:00:00"
    }
  ],
  "presentations": [],
  "permissions": []
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Removes Dynamic Playlists, specified by a filter, from a network. This allows multiple Dynamic Playlists to be deleted at once.

**Required Scope Token**

bsn.api.main.playlists.dynamic.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[Name] CONTAINS 'Southeast'`

```text
DELETE /2022/06/REST/Playlists/Dynamic/?filter=%5BName%5D%20CONTAINS%20%27Southeast%27 HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the number of affected Dynamic Playlists as an integer value

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules (for example, the specified Dynamic Playlist is being used in a presentation and cannot be deleted)

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/  

Returns the number of Dynamic Playlists on the network that match the specified filter criteria. If no filter is included, this call returns the total number of Dynamic Playlists on the network. 

**Required Scope Token**

bsn.api.main.playlists.dynamic.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `filter` is set to `[SupportsVideo] IS TRUE`

```text
GET /2022/06/REST/Playlists/Dynamic/Count/?filter=%5BSupportsVideo%5D%20IS%20TRUE HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The number of Dynamic Playlists is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/  

Returns the specified Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `12345678`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Playlists/Dynamic/12345678/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 13 Mar 2024 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Dynamic Playlists Entity](docId\:xMoTQL48ev94zyYTfUg9N)

**Example**

This is an example of a 200 level response:

```json
{
  "id": 12345678,
  "name": "WestBuilding",
  "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoe/87a992afd6071576647ecd1fd65776ba",
  "fileSize": 1060,
  "fileHash": "SHA1:B895E0604EDD11F5E143B1329AABE9L13D06B821",
  "creationDate": "2023-11-01T22:36:42.153Z",
  "lastModifiedDate": "2024-03-13T21:32:35.093Z",
  "supportsAudio": true,
  "supportsVideo": true,
  "supportsImages": true,
  "content": [
    {
      "contentId": 123456,
      "fileName": "Steampunk Resin Clock With Metallic Cogs And Gears.mp4",
      "displayDuration": "00:00:00",
      "validityStartDate": null,
      "validityEndDate": null
    }
  ],
  "presentations": [
    {
      "id": 987654,
      "name": "Test4Buildings",
      "type": "Presentation",
      "link": null
    }
  ],
  "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/  

Modifies the specified Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Dynamic Playlists Entity](docId\:xMoTQL48ev94zyYTfUg9N)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `1234567`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Playlists/Dynamic/1234567/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 13 Mar 2024 21:32:34 GMT
Content-Type: application/json
Content-Length: 320
```

This is the example request body:

```json
{
  "id": 0,
  "name": "Southwest",
  "physicalPath": null,
  "fileSize": 0,
  "fileHash": null,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "supportsAudio": true,
  "supportsVideo": true,
  "supportsImages": true,
  "content":  [
    {
      "contentId": 123456,
      "fileName": "Steampunk Resin Clock With Metallic Cogs And Gears.mp4",
      "displayDuration": "00:00:00",
      "validityStartDate": null,
      "validityEndDate": null
    }
  ],
  "presentations": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Dynamic Playlist has been modified

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/  

Removes the specified Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `1234567`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Playlists/Dynamic/1234567/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 13 Mar 2024 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Dynamic Playlist file has been removed from the network

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/  

Returns the specified Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `WestBuilding`
- The optional `If-Modified-Since` header value equals the `Last-Modified` header value retrieved from the previous `GET /id` or `GET /name` response

```text
GET /2022/06/REST/Playlists/Dynamic/WestBuilding/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Modified-Since: Wed, 13 Mar 2024 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Dynamic Playlists Entity](docId\:xMoTQL48ev94zyYTfUg9N)

**Example**

This is an example of a 200 level response:

```json
{
  "id": 12345678,
  "name": "WestBuilding",
  "physicalPath": "https://bsncloud.s3.amazonaws.com/JaneDoe/87a992afd6071576647ecd1fd65776ba",
  "fileSize": 1060,
  "fileHash": "SHA1:B895E0604EDD11F5E143B0329AABE9A13D06B821",
  "creationDate": "2023-11-01T22:36:42.153Z",
  "lastModifiedDate": "2024-03-13T21:32:35.093Z",
  "supportsAudio": true,
  "supportsVideo": true,
  "supportsImages": true,
  "content": [
    {
      "contentId": 123456,
      "fileName": "Steampunk Resin Clock With Metallic Cogs And Gears.mp4",
      "displayDuration": "00:00:00",
      "validityStartDate": null,
      "validityEndDate": null
    }
  ],
  "presentations": [
    {
      "id": 987654,
      "name": "Test4Buildings",
      "type": "Presentation",
      "link": null
    }
  ],
  "permissions": []
}
```

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{name}/  

Modifies the specified Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Dynamic Playlists Entity](docId\:xMoTQL48ev94zyYTfUg9N)

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Southwest`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
PUT /2022/06/REST/Playlists/Dynamic/Southwest/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
If-Unmodified-Since: Wed, 13 Mar 2024 21:32:34 GMT
Content-Type: application/json
Content-Length: 320
```

This is the example request body:

```json
{
  "id": 0,
  "name": "Southwest",
  "physicalPath": null,
  "fileSize": 0,
  "fileHash": null,
  "creationDate": "0001-01-01T00:00:00",
  "lastModifiedDate": "0001-01-01T00:00:00",
  "supportsAudio": true,
  "supportsVideo": true,
  "supportsImages": true,
  "content": [
    {
      "contentId": 123456,
      "fileName": "Steampunk Resin Clock With Metallic Cogs And Gears.mp4",
      "displayDuration": "00:00:00",
      "validityStartDate": null,
      "validityEndDate": null
    }
  ],
  "presentations": null,
  "permissions": []
}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Dynamic Playlist has been modified

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/  

Removes the specified Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is set to `Northeast`
- The optional `If-Unmodified-Since` header value equals the `Last-Modified` header value retrieved from the `GET /id` or `GET /name` response.

```text
DELETE /2022/06/REST/Playlists/Dynamic/Northeast/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
If-Unmodified-Since: Wed, 13 Mar 2024 21:32:34 GMT
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified Dynamic Playlist file has been removed from the network

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/  

Returns the operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /2022/06/REST/Playlists/Dynamic/Operations/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

:::ExpandableHeading
Example

```json
{
   "uid": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
   "singularName": "Full Control",
   "pluralName": "Dynamic Playlist (Full Control)",
   "fullName": "Dynamic Playlist (Full Control)",
   "targetEntity": "DynamicPlaylist",
   "appliance": "Instance, Collection",
   "parent": null,
   "descendants":    [
            {
         "uid": "3c2c75a2-b799-8174-3992-f1974b7122a9",
         "singularName": "View Dynamic Playlist",
         "pluralName": "View Dynamic Playlists",
         "fullName": "Dynamic Playlist (Full Control) - View Dynamic Playlists",
         "targetEntity": "DynamicPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
            "singularName": "Full Control",
            "pluralName": "Dynamic Playlist (Full Control)",
            "fullName": "Dynamic Playlist (Full Control)",
            "targetEntity": "DynamicPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "3c2c75a2-b799-8174-3992-f1974b7122a9",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.363Z"
            },
                        {
               "entityId": null,
               "operationUID": "3c2c75a2-b799-8174-3992-f1974b7122a9",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.91Z"
            },
                        {
               "entityId": null,
               "operationUID": "3c2c75a2-b799-8174-3992-f1974b7122a9",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.023Z"
            },
                        {
               "entityId": null,
               "operationUID": "3c2c75a2-b799-8174-3992-f1974b7122a9",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.277Z"
            },
                        {
               "entityId": null,
               "operationUID": "3c2c75a2-b799-8174-3992-f1974b7122a9",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.523Z"
            },
                        {
               "entityId": null,
               "operationUID": "3c2c75a2-b799-8174-3992-f1974b7122a9",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.847Z"
            }
         ]
      },
            {
         "uid": "cf5f189b-3be8-0244-65e0-382f9da93c0e",
         "singularName": "View Contents",
         "pluralName": "View Contents",
         "fullName": "Dynamic Playlist (Full Control) - View Contents",
         "targetEntity": "DynamicPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
            "singularName": "Full Control",
            "pluralName": "Dynamic Playlist (Full Control)",
            "fullName": "Dynamic Playlist (Full Control)",
            "targetEntity": "DynamicPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "cf5f189b-3be8-0244-65e0-382f9da93c0e",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.927Z"
            },
                        {
               "entityId": null,
               "operationUID": "cf5f189b-3be8-0244-65e0-382f9da93c0e",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.023Z"
            },
                        {
               "entityId": null,
               "operationUID": "cf5f189b-3be8-0244-65e0-382f9da93c0e",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.277Z"
            },
                        {
               "entityId": null,
               "operationUID": "cf5f189b-3be8-0244-65e0-382f9da93c0e",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.523Z"
            },
                        {
               "entityId": null,
               "operationUID": "cf5f189b-3be8-0244-65e0-382f9da93c0e",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.847Z"
            },
                        {
               "entityId": null,
               "operationUID": "cf5f189b-3be8-0244-65e0-382f9da93c0e",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.35Z"
            }
         ]
      },
            {
         "uid": "4c377bf1-0f9c-a194-edbf-ac79f6b7d305",
         "singularName": "Create Dynamic Playlist",
         "pluralName": "Create Dynamic Playlist",
         "fullName": "Dynamic Playlist (Full Control) - Create Dynamic Playlist",
         "targetEntity": "DynamicPlaylist",
         "appliance": "Collection",
         "parent":          {
            "uid": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
            "singularName": "Full Control",
            "pluralName": "Dynamic Playlist (Full Control)",
            "fullName": "Dynamic Playlist (Full Control)",
            "targetEntity": "DynamicPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "4c377bf1-0f9c-a194-edbf-ac79f6b7d305",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.023Z"
            },
                        {
               "entityId": null,
               "operationUID": "4c377bf1-0f9c-a194-edbf-ac79f6b7d305",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.277Z"
            },
                        {
               "entityId": null,
               "operationUID": "4c377bf1-0f9c-a194-edbf-ac79f6b7d305",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.523Z"
            },
                        {
               "entityId": null,
               "operationUID": "4c377bf1-0f9c-a194-edbf-ac79f6b7d305",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.847Z"
            },
                        {
               "entityId": null,
               "operationUID": "4c377bf1-0f9c-a194-edbf-ac79f6b7d305",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.35Z"
            },
                        {
               "entityId": null,
               "operationUID": "4c377bf1-0f9c-a194-edbf-ac79f6b7d305",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.897Z"
            }
         ]
      },
            {
         "uid": "f8d54357-096e-cfc4-f153-419b50a4697f",
         "singularName": "Rename Dynamic Playlist",
         "pluralName": "Rename Dynamic Playlist",
         "fullName": "Dynamic Playlist (Full Control) - Rename Dynamic Playlist",
         "targetEntity": "DynamicPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
            "singularName": "Full Control",
            "pluralName": "Dynamic Playlist (Full Control)",
            "fullName": "Dynamic Playlist (Full Control)",
            "targetEntity": "DynamicPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "f8d54357-096e-cfc4-f153-419b50a4697f",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.023Z"
            },
                        {
               "entityId": null,
               "operationUID": "f8d54357-096e-cfc4-f153-419b50a4697f",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.277Z"
            },
                        {
               "entityId": null,
               "operationUID": "f8d54357-096e-cfc4-f153-419b50a4697f",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.523Z"
            },
                        {
               "entityId": null,
               "operationUID": "f8d54357-096e-cfc4-f153-419b50a4697f",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.847Z"
            },
                        {
               "entityId": null,
               "operationUID": "f8d54357-096e-cfc4-f153-419b50a4697f",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.35Z"
            },
                        {
               "entityId": null,
               "operationUID": "f8d54357-096e-cfc4-f153-419b50a4697f",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.897Z"
            }
         ]
      },
            {
         "uid": "7d6e1999-ebdc-4ae7-b242-a903c5c6695e",
         "singularName": "Update Dynamic Playlist",
         "pluralName": "Update Dynamic Playlist",
         "fullName": "Dynamic Playlist (Full Control) - Update Dynamic Playlist",
         "targetEntity": "DynamicPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
            "singularName": "Full Control",
            "pluralName": "Dynamic Playlist (Full Control)",
            "fullName": "Dynamic Playlist (Full Control)",
            "targetEntity": "DynamicPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "7d6e1999-ebdc-4ae7-b242-a903c5c6695e",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.023Z"
            },
                        {
               "entityId": null,
               "operationUID": "7d6e1999-ebdc-4ae7-b242-a903c5c6695e",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.277Z"
            },
                        {
               "entityId": null,
               "operationUID": "7d6e1999-ebdc-4ae7-b242-a903c5c6695e",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.523Z"
            },
                        {
               "entityId": null,
               "operationUID": "7d6e1999-ebdc-4ae7-b242-a903c5c6695e",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.847Z"
            },
                        {
               "entityId": null,
               "operationUID": "7d6e1999-ebdc-4ae7-b242-a903c5c6695e",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.35Z"
            },
                        {
               "entityId": null,
               "operationUID": "7d6e1999-ebdc-4ae7-b242-a903c5c6695e",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.897Z"
            }
         ]
      },
            {
         "uid": "4cbdae4a-a900-4535-9d32-443ea077fc21",
         "singularName": "Assign Dynamic Playlist",
         "pluralName": "Assign Dynamic Playlist",
         "fullName": "Dynamic Playlist (Full Control) - Assign Dynamic Playlist",
         "targetEntity": "DynamicPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
            "singularName": "Full Control",
            "pluralName": "Dynamic Playlist (Full Control)",
            "fullName": "Dynamic Playlist (Full Control)",
            "targetEntity": "DynamicPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "4cbdae4a-a900-4535-9d32-443ea077fc21",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.023Z"
            },
                        {
               "entityId": null,
               "operationUID": "4cbdae4a-a900-4535-9d32-443ea077fc21",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.277Z"
            },
                        {
               "entityId": null,
               "operationUID": "4cbdae4a-a900-4535-9d32-443ea077fc21",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.523Z"
            },
                        {
               "entityId": null,
               "operationUID": "4cbdae4a-a900-4535-9d32-443ea077fc21",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.847Z"
            },
                        {
               "entityId": null,
               "operationUID": "4cbdae4a-a900-4535-9d32-443ea077fc21",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.35Z"
            },
                        {
               "entityId": null,
               "operationUID": "4cbdae4a-a900-4535-9d32-443ea077fc21",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.897Z"
            }
         ]
      },
            {
         "uid": "1c434b6b-355e-4bdb-b6b5-60dc7a145bf9",
         "singularName": "Unassign Dynamic Playlist",
         "pluralName": "Unassign Dynamic Playlist",
         "fullName": "Dynamic Playlist (Full Control) - Unassign Dynamic Playlist",
         "targetEntity": "DynamicPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
            "singularName": "Full Control",
            "pluralName": "Dynamic Playlist (Full Control)",
            "fullName": "Dynamic Playlist (Full Control)",
            "targetEntity": "DynamicPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "1c434b6b-355e-4bdb-b6b5-60dc7a145bf9",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.023Z"
            },
                        {
               "entityId": null,
               "operationUID": "1c434b6b-355e-4bdb-b6b5-60dc7a145bf9",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.277Z"
            },
                        {
               "entityId": null,
               "operationUID": "1c434b6b-355e-4bdb-b6b5-60dc7a145bf9",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.523Z"
            },
                        {
               "entityId": null,
               "operationUID": "1c434b6b-355e-4bdb-b6b5-60dc7a145bf9",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.847Z"
            },
                        {
               "entityId": null,
               "operationUID": "1c434b6b-355e-4bdb-b6b5-60dc7a145bf9",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.35Z"
            },
                        {
               "entityId": null,
               "operationUID": "1c434b6b-355e-4bdb-b6b5-60dc7a145bf9",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.897Z"
            }
         ]
      },
            {
         "uid": "4ab8f14f-be27-41d7-9e6f-38317bf269ba",
         "singularName": "Edit Permissions",
         "pluralName": "Edit Permissions",
         "fullName": "Dynamic Playlist (Full Control) - Edit Permissions",
         "targetEntity": "DynamicPlaylist",
         "appliance": "Collection",
         "parent":          {
            "uid": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
            "singularName": "Full Control",
            "pluralName": "Dynamic Playlist (Full Control)",
            "fullName": "Dynamic Playlist (Full Control)",
            "targetEntity": "DynamicPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "4ab8f14f-be27-41d7-9e6f-38317bf269ba",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.023Z"
            },
                        {
               "entityId": null,
               "operationUID": "4ab8f14f-be27-41d7-9e6f-38317bf269ba",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.277Z"
            },
                        {
               "entityId": null,
               "operationUID": "4ab8f14f-be27-41d7-9e6f-38317bf269ba",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.523Z"
            },
                        {
               "entityId": null,
               "operationUID": "4ab8f14f-be27-41d7-9e6f-38317bf269ba",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.847Z"
            },
                        {
               "entityId": null,
               "operationUID": "4ab8f14f-be27-41d7-9e6f-38317bf269ba",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.35Z"
            },
                        {
               "entityId": null,
               "operationUID": "4ab8f14f-be27-41d7-9e6f-38317bf269ba",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.897Z"
            }
         ]
      },
            {
         "uid": "60252669-c9ea-c784-7de0-1d685b99c255",
         "singularName": "Delete Dynamic Playlist",
         "pluralName": "Delete Dynamic Playlist",
         "fullName": "Dynamic Playlist (Full Control) - Delete Dynamic Playlist",
         "targetEntity": "DynamicPlaylist",
         "appliance": "Instance, Collection",
         "parent":          {
            "uid": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
            "singularName": "Full Control",
            "pluralName": "Dynamic Playlist (Full Control)",
            "fullName": "Dynamic Playlist (Full Control)",
            "targetEntity": "DynamicPlaylist",
            "appliance": "Instance, Collection",
            "parent": null,
            "descendants": null,
            "permissions": null
         },
         "descendants": [],
         "permissions":          [
                        {
               "entityId": null,
               "operationUID": "60252669-c9ea-c784-7de0-1d685b99c255",
               "principal":                {
                  "name": "Network Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 5
               },
               "isFixed": true,
               "isInherited": false,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:06.377Z"
            },
                        {
               "entityId": null,
               "operationUID": "60252669-c9ea-c784-7de0-1d685b99c255",
               "principal":                {
                  "name": "Administrators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 1
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.023Z"
            },
                        {
               "entityId": null,
               "operationUID": "60252669-c9ea-c784-7de0-1d685b99c255",
               "principal":                {
                  "name": "General Managers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 2
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.277Z"
            },
                        {
               "entityId": null,
               "operationUID": "60252669-c9ea-c784-7de0-1d685b99c255",
               "principal":                {
                  "name": "Creators",
                  "isCustom": false,
                  "type": "Role",
                  "id": 3
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": true,
               "creationDate": "2020-03-05T16:59:05.523Z"
            },
                        {
               "entityId": null,
               "operationUID": "60252669-c9ea-c784-7de0-1d685b99c255",
               "principal":                {
                  "name": "Publishers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 4
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:05.847Z"
            },
                        {
               "entityId": null,
               "operationUID": "60252669-c9ea-c784-7de0-1d685b99c255",
               "principal":                {
                  "name": "Viewers",
                  "isCustom": false,
                  "type": "Role",
                  "id": 6
               },
               "isFixed": true,
               "isInherited": true,
               "isAllowed": false,
               "creationDate": "2020-03-05T16:59:06.897Z"
            }
         ]
      }
   ],
   "permissions":    [
            {
         "entityId": null,
         "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
         "principal":          {
            "name": "Administrators",
            "isCustom": false,
            "type": "Role",
            "id": 1
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:05.023Z"
      },
            {
         "entityId": null,
         "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
         "principal":          {
            "name": "General Managers",
            "isCustom": false,
            "type": "Role",
            "id": 2
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:05.277Z"
      },
            {
         "entityId": null,
         "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
         "principal":          {
            "name": "Creators",
            "isCustom": false,
            "type": "Role",
            "id": 3
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": true,
         "creationDate": "2020-03-05T16:59:05.523Z"
      },
            {
         "entityId": null,
         "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
         "principal":          {
            "name": "Publishers",
            "isCustom": false,
            "type": "Role",
            "id": 4
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:05.847Z"
      },
            {
         "entityId": null,
         "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
         "principal":          {
            "name": "Network Managers",
            "isCustom": false,
            "type": "Role",
            "id": 5
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:06.35Z"
      },
            {
         "entityId": null,
         "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
         "principal":          {
            "name": "Viewers",
            "isCustom": false,
            "type": "Role",
            "id": 6
         },
         "isFixed": true,
         "isInherited": false,
         "isAllowed": false,
         "creationDate": "2020-03-05T16:59:06.897Z"
      }
   ]
}
```
:::

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/  

Includes object permissions for a given Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is `12345678`

```text
GET /2022/06/REST/Playlists/Dynamic/12345678/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 12345678,
    "operationUID": "60252669-c9ea-c784-7de0-1d685b99c255",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-25T22:17:24.28Z"
  },
  {
    "entityId": 12345678,
    "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.053Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/  

Adds permissions to the specified Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `987654321`

```text
POST /2022/06/REST/Playlists/Dynamic/987654321/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 318
```

This is the example request body:

```json
[
  {
    "entityId": 987654321,
    "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10701
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified dynamic playlist

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/  

Removes permissions for the specified Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>A unique identifier for the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is `12345678`

```text
DELETE /2022/06/REST/Playlists/Dynamic/12345678/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 318
```

This is the example request body:

```json
[
  {
    "entityId": 12345678,
    "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10701
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Permissions/  

Includes object permissions for a given Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `name` is `NorthBuilding`

```text
GET /2022/06/REST/Playlists/Dynamic/NorthBuilding/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Example**

```json
[
  {
    "entityId": 12345678,
    "operationUID": "60252669-c9ea-c784-7de0-1d685b99c255",
    "principal": {
      "login": "JaneDoe@brightsign.biz",
      "type": "User",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "2023-10-25T22:17:24.28Z"
  },
  {
    "entityId": 4567890,
    "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10498
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": false,
    "creationDate": "2023-10-27T18:48:11.053Z"
  }
]
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{name}/Permissions/  

Adds permissions to the specified Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is set to `NorthBuilding`

```text
POST /2022/06/REST/Playlists/Dynamic/NorthBuilding/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 318
```

This is the example request body:

```json
[
  {
    "entityId": 12345678,
    "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10701
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified Dynamic Playlist

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/Permissions/  

Removes permissions for the specified Dynamic Playlist

**Required Scope Token**

bsn.api.main.playlists.dynamic.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the Dynamic Playlist

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `id` is `NorthBuilding`

```text
DELETE /2022/06/REST/Playlists/Dynamic/NorthBuilding/Permissions/ HTTP/1.1
Host: api.bsn.cloud
Connection: Keep-Alive
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
Content-Type: application/json
Content-Length: 318
```

This is the example request body:

```json
[
  {
    "entityId": 12345678,
    "operationUID": "cc86a53e-e63d-4268-b2bf-fe4579d461f4",
    "principal": {
      "name": "Custom",
      "isCustom": true,
      "type": "Role",
      "id": 10701
    },
    "isFixed": false,
    "isInherited": false,
    "isAllowed": true,
    "creationDate": "0001-01-01T00:00:00"
  }
]
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were successfully deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] Authentication
[path] Cloud APIs/BSN.Cloud Main APIs/Making Requests/

BrightSign’s authentication server supports Single Sign-On (SSO), Multi-Factor Authentication (MFA), and other standard protocols such as OpenID Connect, OAuth 2.0, and SAML.

We have implemented the OAuth2 “*Client Credentials Flow*” to allow customers to *self-serve* their credentials (Client ID and Secret) and to allow for more granular control of what the resulting tokens can do, improving security.

Client Credentials are used when clients (applications and services) want to obtain access on behalf of themselves rather than on behalf of a user. For example, these credentials can be useful for background services that apply changes to the system in general rather than for a specific user.

# API Workflow

This document describes the steps required use our APIs along with code examples.

## Create Client Credentials

To create new client credentials:

1\. Login into BrightSign Control at *control.bsn.cloud*.

2\. <font color="hsl(var(--ab-gray-900))">Select one of your networks</font>. Note that the list of features available to your applications depends on your access level in the selected network.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/Nu6ClWhaNe9Xsm372H2ws-20251008-165412.png)

3. Once the network is selected, you will enter the Home screen. Go to **Administration > Applications** and select **Add Application.**

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/PH5Mtha21LCVdjnBfh0Ru_screenshot-2026-07-29-at-80111-am.png)

5\. Enter an application name and description, and select the features which your application needs to access. According to the best security practices, you should select only the features which correspond to the BrightSign Cloud API methods that the related application actually uses. For information about what scopes are required for each API call, see the [Feature Access](docId\:uu_ZUpqKQuF54Rpi79xl1) and [BSN.Cloud API](docId\:gOEMCi9nmvGAktTR5qcjs) documentation.&#x20;

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/Nac-N5SGKr7zyYZZMJuRG_screenshot-2026-07-29-at-83251-am.png)

6\. Click the **Save&#x20;**&#x62;utton. The new Client ID and Secret will be displayed.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/ZqbFRst4WHIGGT4wKzycD_2026-07-29-08-11-35.png)

7\. Copy these values and store them securely, ideally in a password manager. They will not be shown again after leaving this screen.

:::hint{type="warning"}
Secrets expire every 180 days. You should rotate them on or before they expire.
:::

**Notes**

- Multiple Applications can be created
- Application name, description and permitted features can be edited or deleted
- Secrets can be rotated (see below).

## Get Access Token

To make any API calls to BrightSign Cloud, an access token must be obtained from the token endpoint: *https\://auth.bsn.cloud/realms/bsncloud/protocol/openid-connect/token.&#x20;*&#x4E;ote that according to [RFC6749 Section 4.4.2](https://www.rfc-editor.org/rfc/rfc6749#section-4.4.2), the issued client credentials must be provided using the "Basic" authentication scheme in Base64 format (as in the examples below).

**HTTP - Get Access Token**

```none
POST https://auth.bsn.cloud/realms/bsncloud/protocol/openid-connect/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic [base64-encoded-clientId-and-secret]
Accept: application/json

grant_type=client_credentials
```

**TypeScript - Get Access Token**

```typescript
const clientId = '[clientId]';
const clientSecret = '[clientSecret]';
const clientCredentials = Buffer.from(`${clientId}:${clientSecret}`).toString('base64');

const request = formBody({
	grant_type: 'client_credentials'
}).toString();

const headers = {
	'Content-Type': 'application/x-www-form-urlencoded',
	'Authorization': `Basic ${client_credentials}`,
	'Accept': "application/json",
};

const response = await axios.post(`https://auth.bsn.cloud/realms/bsncloud/protocol/openid-connect/token`, request, { headers });
return response.data as { accessToken: string };
```

**Expected Response Codes**

| **Code**                           | **Description**                                                 |
| ---------------------------------- | --------------------------------------------------------------- |
| <font color="#9a0808">`200`</font> | <font color="#9a0808">OK</font>                                 |
| <font color="#089a4d">`401`</font> | <font color="#089a4d">Unauthorized - Invalid Credentials</font> |

**Notable Response Data**

| **Property**   | **Description**                                     |
| -------------- | --------------------------------------------------- |
| `access_token` | Access token to be used with API calls until expiry |
| `expires_in`   | Time to expiry of the access token                  |
| `scope`        | Permitted scopes                                    |

## Set Network

Each application you register has access to all the networks of which you are currently a member, so every time you obtain an access token, the next step is to select the network which you want to access in the scope of this session. For this purpose, you need to call the "PUT /2022/06/REST/Self/Session/Network/" method, provide the access token issued in the previous step, and the name or identifier of the selected network.

**HTTP - Select network by ID**

```none
PUT https://api.bsn.cloud/2022/06/REST/Self/Session/Network
Content-Type: application/json
Authorization: Bearer [accessToken]
Accept: application/json

{
  "id": [networkId]
}
```

**HTTP - Select Network by Name**

```none
PUT https://api.bsn.cloud/2022/06/REST/Self/Session/Network
Content-Type: application/json
Authorization: Bearer [accessToken]
Accept: application/json

{
  "name": "[networkName]"
}
```

**TypeScript - Select Network by Id or Name**

```typescript
const network = "[networkId|networkName]";

const body =
	isNumber(network) ? { id: network } :
	isString(network) ? { name: network } :
	network;

return await this.put(`2022/06/REST/Self/Session/Network`, body, ["vnd.bsn.error"]);
```

**Expected Response Codes**

| **Code**                           | **Description**                                                      |
| ---------------------------------- | -------------------------------------------------------------------- |
| <font color="#089a4d">`204`</font> | <font color="#089a4d">OK - No Content</font>                         |
| <font color="#9a0808">`400`</font> | <font color="#9a0808">Bad Request - Network does not exist</font>    |
| <font color="#9a0808">`401`</font> | <font color="#9a0808">Unauthorized - Access token has expired</font> |

## Use the API

Once the network is selected, the current application has access to all of its resources but is limited by the permissions of the user who registered it, as well as features selected during registration. Be aware that every time an application issues a new access token, the target network needs to be selected again. If the permissions of a user who registered a given application get changed or this user gets removed from the target network, the resources available to a given application change accordingly.

When a `401` error code is received, this indicates that the access token has expired. You should then repeat the above process to obtain a new access token and set a network.

In some scenarios it might prove optimal to get a new access token prior to it expiring. You can use the `expires_in` value returned in the get access token payload, to calculate the expiry time and prefetch a new token ahead of time.

If a `403` error code is received, this indicates that your access token is not authorized to make this request, and you should check the Application scopes are correctly specified.

**Expected Response Codes**

| **Code**                           | **Description**                                                                            |
| ---------------------------------- | ------------------------------------------------------------------------------------------ |
| <font color="#089a4d">`200`</font> | <font color="#089a4d">OK</font>                                                            |
| <font color="#9a0808">`401`</font> | <font color="#9a0808">Unauthorized - Access token has expired</font>                       |
| <font color="#9a0808">`403`</font> | <font color="#9a0808">Forbidden - Access token is not permitted to make the request</font> |

# Rotating Client Secrets

Client secrets are expired every 180 days. Secrets can be rotated more often for additional security.

You can rotate the secrets automatically via the API, or manually via the user interface.

If a secret is suspected to be compromised, you should immediately rotate it by using the **Rotate Secret** option in the user interface. Rotating will return a new secret immediately, this should be stored securely. The old secret will continue to work for a limited time, but you should switch your application to the new secret as soon as possible.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/9DJmnORzg4m0qCsxVFBUY_image-20250213-141403.png)

**HTTP - Rotate client secret**

To rotate the client secret via the API the following method is provided. Replace \{id} with the Application ID, not the Client ID.

```none
POST https://api.bsn.cloud/2022/06/REST/Self/Applications/{id}/Secret/ 
Content-Type: application/json
Authorization: Bearer [accessToken]
Accept: application/json
```

**Expected Response Codes**

| **Code**                           | **Description**                                                                                                      |
| ---------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| <font color="#089a4d">`200`</font> | <font color="#15803D">Success - existing client secret was invalidated and new secret is provided in response</font> |
| <font color="#9a0808">`401`</font> | <font color="#9a0808">Unauthorized - Access token has expired</font>                                                 |
| <font color="#9a0808">`403`</font> | <font color="#9a0808">Forbidden - Access token is not permitted to make the request</font>                           |

# FAQ

1. **How do I obtain a new Client ID and Secret?**
   You will need to use BrightSign Control to create a new Application to obtain a new Client ID and Secret.
2. **How do I know what scopes to allocate to my application?**
   For information about what scopes are required for each API call, see the [BSN.Cloud API documentation](docId\:gOEMCi9nmvGAktTR5qcjs).
3. **How long does the new Access Token lifetime last?**
   5 minutes 30 seconds
4. **How long does Network Session lifetime last?**
   24 hours
5. **Are Refresh Tokens supported?**
   No, refresh tokens not supported with the OAuth2 “*Client Credentials Flow*”.
6. **Can I still use the old legacy API token endpoint with a new Client ID and Secret?**
   You should *NOT* do this. The legacy API token endpoint ceased to work on February 23, 2026.
7. **What if I suspect my Client Secret has been compromised?**
   You should use BrightSign Control to rotate the secret and then continue to use the old secret until it no longer works, then use the new secret.
8. **Are there other ways to handle a compromised Client Secret?**
   Yes, you can simply delete the Application. This will destroy the existing Client ID and Secret. You can create another Application to obtain a new Client ID and Secret.
9. **Do Client Secrets expire?**
   Yes, Client Secrets expire every 180 days. You should rotate them automatically or manually on or before they expire.

# Further Information

For further information contact: [support@brightsign.biz](mailto\:support@brightsign.biz)




[title] Provisioning Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

The Provisioning resources allow users to setup players or change player setups. 

Base URL for this endpoint:  ***https\://api.bsn.cloud/2022/06/REST/Provisioning***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## POST /Setups/Tokens/

Issues a token which allows you to register players in the current network

**Required Scope Token**

bsn.api.main.devices.setups.token.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- A [Token Info Entity](docId\:RMBciR76z7OjsYJB_U2pP)&#x20;

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /2022/06/REST/Provisioning/Setups/Tokens/ HTTP/1.1 
Host: api.bsn.cloud 
Connection: Keep-Alive 
Authorization: Bearer {{UserAccessToken}} 
Accept: application/json, application/vnd.bsn.error+json 
Accept-Encoding: gzip,deflate 
```

There is no request body since the required information is passed in the URL.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: A setup token has been issued for players on the specified network

**Example**

```json
{
   "token": {{token}},
   "scope": "cert",
   "validFrom": "2024-05-21T00:00:00Z",
   "validTo": "2024-11-17T00:00:00Z"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: Either the request or request body is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Setups/Tokens/\{token}/

Validates a player setup token on the current network and retrieves its metadata

**Required Scope Token**

bsn.api.main.devices.setups.token.validate

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `token` <font color="#704ae0">string: </font>An OAuth2 token for player registration in the current network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `token` is set to `{{Token}}`

```text
GET /2022/06/REST/Provisioning/Setups/Tokens/{{Token}}/ HTTP/1.1 
Host: api.bsn.cloud 
Connection: Keep-Alive 
Authorization: Bearer {{UserAccessToken}} 
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate 
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">200</font>: Returns a [Token Info Entity](docId\:RMBciR76z7OjsYJB_U2pP)&#x20;

**Example**

```json
{
   "token": {{token}},
   "scope": "cert",
   "validFrom": "2024-05-16T16:36:04.000Z",
   "validTo": "2026-05-16T16:36:04.000Z"
}
```

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the token is expired or invalid)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /Setups/Tokens/\{token}/

Revokes a player setup token on the current network

**Required Scope Token**

bsn.api.main.devices.setups.token.revoke

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `token` <font color="#704ae0">string: </font>An OAuth2 token for player registration in the current network

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

The example request parameters and headers are set as follows:

- `token` is set to `{{Token}}`

```text
DELETE /2022/06/REST/Provisioning/Setups/Tokens/{{Token}}/ HTTP/1.1
Host: api.bsn.cloud 
Connection: Keep-Alive 
Authorization: Bearer {{UserAccessToken}} 
Accept: application/json, application/vnd.bsn.error+json
Accept-Encoding: gzip,deflate
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">204</font>: The player setup token has been revoked

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the token is expired or invalid)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">500</font>: Any 500 code is an internal server error

[title] Business Operations Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Business Operations entities are structured as follows:

`entity`:

- `UID` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The unique identifier of the business operation
- `SingularName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the operation in singular form. This value is useful for displaying in entity properties dialogs.
- `PluralName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the operation in plural form. This value is useful for displaying in user and role properties dialogs.
- `FullName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the current operation along with its parent operations (if any). Since many operation names aren't unique, this value is useful for differentiating similar business operations.
- `TargetEntity` <font color="#704ae0">EntityType</font> <font color="#01a0af">read-only</font>: The [EntityType Enumeration (2022/06)](docId\:Qnu0TDke-zAnbMMICY6rx)
- `Parent` <font color="#704ae0">BusinessOperation</font> <font color="#01a0af">read-only</font>: An operation instance indicating the operation from which permissions are inherited. This value will be "null" if there is no parent operation.
- `Descendants` <font color="#704ae0">BusinessOperation[]</font> <font color="#01a0af">read-only</font>: An array of operation instances that inherit permissions from this operation. This value is "null" if there are no descendant operations.
- `Permissions` <font color="#704ae0">Permission[]</font> <font color="#01a0af">read-only</font>: The permissions entity associated with this operation. See the [Permission Entity (2022/06)](docId\:JWfyMC42cdRG5jY2SkYsU).
-  `Appliance` <font color="#704ae0">OperationAppliance</font> read-only: 
  - `Instance` <font color="#01a0af">read-only</font>: Indicates that given business operation applies to specific entity instances. It is visible in the "Security" section of the Properties Panel.
  - `Collection` <font color="#01a0af">read-only</font>: Indicates that given business operation applies to collections of entities, in the entire network and associated folders. It is visible in the "Permissions" page and folder Properties Panel.
  - `Unknown` <font color="#01a0af">read-only</font>: Included for forward compatibility


[title] Request/Response Rules
[path] Cloud APIs/BSN.Cloud Main APIs/Making Requests/

# Requests&#x20;

### Completeness

All the entities and structures sent to the server in the POST/PUT request body must contain all documented properties regardless of whether their values are needed. Unknown and optional values may be either "null" or "0" but must be specified explicitly. In response, the server also will always send complete structures so the client doesn't have to check the presence of each property before reading it.

### Values

The actual values in requests must strictly match the data types in the properties.&#x20;

Note that some properties are nullable, while others always require a specific value which matches their data types. You can find that information in the data type definitions section of each Main API version specification. 

### Data Request Structures

Each BSN REST API data request must contain the "Accept" HTTP header and list only the content representations that are supported by the client. Values like "\*" and "application\*" are accepted but produce random result from the list of representations supported by the server, which also may change from time to time, according to [rfc7231#section-3.4](https://datatracker.ietf.org/doc/html/rfc7231#section-3.4). For example, for most methods you should enter something like *Accept: application/json, application/vnd.bsn.error+json* instead of *Accept \*/\** because *Accept \*/\** is ambiguous. 

Each BSN REST API data request may also contain an "Accept-Encoding" HTTP header with the list of traffic compression algorithms supported by the client, and expect either non-compressed or compressed by the algorithm specified in "Content-Encoding" HTTP response header according to [rfc7231](https://datatracker.ietf.org/doc/html/rfc7231).

### Conditional Requests

BrightSign BSN REST APIs support conditional requests in all singular entity retrieval editing and removal methods (for example, PUT, DELETE, PATCH). You should use conditional requests when multiple retrievals of the same entity are expected and especially in update and delete requests of a single entity. These are implemented according to [rfc2616](https://datatracker.ietf.org/doc/html/rfc2616) on the server side and based on the "Last-Modified", "If-Modified-Since" and "If-Unmodified-Since" HTTP headers.

### Compression

Traffic compression for BSN REST API requests may also be implemented on demand but this case is not described in [rfcStandards](https://www.rfc-editor.org/standards).

It is good practice to specify the “Accept-Encoding” header in forming the server so that it may compress the response when reasonable (when its size exceeds 800 bytes). The supported compression algorithms are gzip and deflate.

# Responses

BrightSign uses standard HTTP response codes to communicate the success or failure of API requests.

XML is the default response format. JSON format will be returned if you specify the HTTP request header *Accept: application/json*.

[title] EntityType Enumeration (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

This is an enumeration data type. All EntityTypes enumerations are structured as follows:

- `Unknown`&#x20;
- `Player`&#x20;
- `Group`&#x20;
- `TaggedGroup`&#x20;
- `BrightWall`&#x20;
- `BrightWallConfiguration`&#x20;
- `BrightWallScreen`&#x20;
- `BrightWallGroup`&#x20;
- `Presentation`&#x20;
- `BrightWallPresentation`&#x20;
- `Content`&#x20;
- `DynamicPlaylist`&#x20;
- `TaggedPlaylist`&#x20;
- `LiveTextFeed`&#x20;
- `LiveMediaFeed`&#x20;
- `WebPage`&#x20;
- `DeviceWebPage`&#x20;
- `PlayerSubscription`&#x20;
- `PlayerSubscriptionInvoice`&#x20;
- `TrafficInvoice`&#x20;
- `PlayerSetupPackage`&#x20;
- `AutorunPlugin`&#x20;
- `Person`&#x20;
- `Network`&#x20;
- `User`&#x20;
- `Role`&#x20;
- `WebApplication`&#x20;


[title] Live Text Feed Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Live Text Feed entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier for the Live Text Feed instance
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the Live Text Feed instance. The maximum length of this string is 50 characters.
- `PhysicalPath` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The location of the Live Text Feed XML file in the server directory
- `FileSize` <font color="#704ae0">long</font> <font color="#01a0af">read-only</font>: The size of the Live Text Feed XML file (in bytes)
- `FileHash` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The hash value of the Live Text Feed file. The string is formatted as "\{algorithm}:\{value}" (e.g. "SHA1:6DB465879088280AAC52DC22B07ED0AD493A99D4").
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the Live Text Feed was created on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the Live Text Feed was last modified on BSN.Cloud. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Items` <font color="#704ae0">LiveTextFeedItem[]</font> <font color="#01a0af">read-write</font>: 
- `Title` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The key (RSS item title) of the item in the associated Live Text Feed
- `Description` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The value (RSS item description) of the item in the associated Live Text Feed
- `ValidityStartDate` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The validity start date for the entry (that is, the point at which it will start being included in the Live Text Feed). A null value specifies that the item is valid immediately when added to the Live Text Feed. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ValidityEndDate` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-write</font>: The validity end date for the associated entry (that is, the point at which it will no longer be included in the Live Text Feed).  A null value specifies that the item will be valid until it is removed from the Live Text Feed manually by a user. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `Presentations` <font color="#704ae0">PresentationInfo[]</font> <font color="#01a0af">read-only</font>: An array of [Presentation Info](docId\:rH_TKLzOo3RPBID0mDC9v) entities for each presentation associated with the Live Text Feed instance
- `Permissions` <font color="#704ae0">Permission[]</font> <font color="#01a0af">read-write</font>: A list of permission object instances representing permissions rules assigned to the Live Text Feed instance


[title] WebPage Asset Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Webpage Asset entities are structured as follows:

`entity`:

- `FileName` <font color="#704ae0">string</font>: The name of the webpage asset file
- `PhysicalPath` <font color="#704ae0">string</font>: The location of the webpage asset file in the server directory
- `RelativePath` <font color="#704ae0">string</font>: The path of the webpage asset file relative to the HTML file
- `FileSize` <font color="#704ae0">long</font>: The size of the webpage asset file (in bytes)
- `FileHash` <font color="#704ae0">string</font>: The hash algorithm and the value that results from performing the hash algorithm on the webpage asset. The string is formatted as `"{algorithm}:{value}"` (for example, `"SHA1:6DB465879088280AAC52DC22B07ED0AD493A99D4"`)
















[title] VideoMode Enumeration (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

This is an enumeration data type. All videomodes are structured as follows:

- `7680x4320x60p `
- `7680x4320x59.94p `
- `7680x4320x50p `
- `7680x4320x30p `
- `7680x4320x29.97p `
- `7680x4320x25p `
- `7680x4320x24p `
- `7680x4320x23.976p `
- `4096x2160x60p `
- `4096x2160x59.94p `
- `4096x2160x50p `
- `4096x2160x30p `
- `4096x2160x29.97p `
- `4096x2160x25p `
- `4096x2160x24p `
- `4096x2160x23.976p `
- `3840x2160x60p `
- `3840x2160x59.94p `
- `3840x2160x50p `
- `3840x2160x30p `
- `3840x2160x29.97p `
- `3840x2160x25p `
- `3840x2160x24p`
- `3840x2160x23.976p`
- `3840x1200x60p`
- `3840x1200x30p`
- `3840x1080x60p `
- `3840x1080x50p `
- `3840x1080x30p `
- `3840x1080x25p`
- `3840x600x60p`
- `3440x1440x60p`
- `3440x1440x50p`
- `3440x1440x30p`
- `3072x2048x30p`
- `2880x720x60p`
- `2560x1600x60p`
- `2560x1440x60p`
- `2560x1440x30p`
- `2560x1080x60p`
- `2560x960x60p`
- `2560x800x60p`
- `2376x288x60p`
- `2048x1152x60p`
- `1920x1920x60p`
- `1920x1920x50p`
- `1920x1920x30p`
- `1920x1920x25p`
- `1920x1200x60p`
- `1920x1200x50p`
- `1920x1080x60p`
- `1920x1080x59.94p`
- `1920x1080x50p`
- `1920x1080x30p`
- `1920x1080x29.97p`
- `1920x1080x25p`
- `1920x1080x24p`
- `1920x1080x23.976p`
- `1920x1080x60i`
- `1920x1080x59.94i`
- `1920x1080x50i`
- `1920x540x60p`
- `1792x1344x60p`
- `1728x1296x60p`
- `1680x1050x60p`
- `1600x1200x60p`
- `1600x900x60p`
- `1536x2048x30p`
- `1440x1088x57p`
- `1440x1080x60p `
- `1440x900x75p `
- `1440x900x60p `
- `1400x1050x75p `
- `1400x1050x60p `
- `1366x768x60p `
- `1360x768x60p `
- `1280x1024x75p `
- `1280x1024x60p `
- `1280x960x60p `
- `1280x800x75p `
- `1280x800x60p `
- `1280x768x60p `
- `1280x720x60p `
- `1280x720x59.94p `
- `1280x720x50p `
- `1280x720x25p `
- `1280x720x24p `
- `1280x720x23.976p `
- `1200x1920x60p `
- `1024x768x75p `
- `1024x768x60p `
- `960x960x60p `
- `848x480x60p `
- `800x1280x60p `
- `800x600x75p `
- `800x600x60p `
- `720x576x50i `
- `720x576x50p `
- `720x480x60p `
- `720x480x60i `
- `720x480x50i `
- `720x480x59.94p `
- `640x480x60p `
- `SECAM `
- `NTSC-COMPONENT `
- `PAL-COMPONENT `
- `NTSC-M `
- `NTSC-M-JPN `
- `PAL-I `
- `PAL-BG `
- `PAL-N `
- `PAL-NC `
- `PAL-M `













[title] Groups/Tagged Endpoints (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

Use these endpoints to manage tagged groups on the network. 

Base URL for these endpoints:  ***https\://api.bsn.cloud/2022/06/REST/Groups/Tagged***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /

Retrieves a list of tagged groups on the network

**Required Scope Token**

bsn.api.main.groups.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameters**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results. The default value is null.
- `sort` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An expression for sorting the search results. The sort expression specifies the entry used for sorting and the ascending/descending (ASC/DESC) sorting order (e.g. "`[Device].[Serial] ASC`"). The default value is null.
- `marker` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>A value specifying which page to retrieve. This value is useful if the `isTruncated` entry in the response body of the previous GET call indicates that the number of tagged group instances exceeds the `pageSize`. This parameter is only required if you need more elements in the paged list than the `pageSize` (100).
- `pageSize` <font color="#704ae0">int</font> <font color="#01a0af">optional: </font>The maximum number of tagged group instances that can be contained in the response body. This defaults to the maximum allowed page size (100).

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns a [paged list](docId\:Pwwr0Ln3-binNgL-mr3St) of [Tagged Groups Entity](docId:7rAXuFH54wfvbWPhF1hJ_) instances on a network. This will return not more than 100 entities along with the information necessary to return any other remaining pages.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /

Creates a tagged group on a network

**Required Scope Token**

bsn.api.main.groups.tagged.create

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Tagged Groups Entity](docId:7rAXuFH54wfvbWPhF1hJ_) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">201</font>: Returns the [Tagged Groups Entity](docId:7rAXuFH54wfvbWPhF1hJ_) created and referenced by the Uri (given by the Location header field) in the response.  

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /

Removes tagged groups, specified by a filter, from a network. This allows multiple tagged groups to be deleted at once.

**Required Scope Token**

bsn.api.main.groups.tagged.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">required: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the number of affected tagged groups as an integer value

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Count/ 

Returns the number of tagged groups on the network that match the specified filter criteria. If no filter is included, this call returns the total number of tagged groups on the network. 

**Required Scope Token**

bsn.api.main.groups.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Query String Parameter**

- `filter` <font color="#704ae0">string</font> <font color="#01a0af">optional: </font>An [expression](docId:3L0afyD3xoOE-yTvfk2vs) for filtering search results

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: The number of tagged groups is returned as an integer value.

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/  

Returns the specified tagged group

**Required Scope Token**

bsn.api.main.groups.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Tagged Groups Entity](docId:7rAXuFH54wfvbWPhF1hJ_) 

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{id}/  

Updates the specified tagged group

**Required Scope Token**

bsn.api.main.groups.tagged.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Tagged Groups Entity](docId:7rAXuFH54wfvbWPhF1hJ_) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The tagged group was updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource/group changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/  

Deletes a specified tagged group 

**Required Scope Token**

bsn.api.main.groups.tagged.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The tagged group was deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/  

Returns the specified tagged group

**Required Scope Token**

bsn.api.main.groups.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response with Body**

<font color="#089a4d">200</font>: Returns the [Tagged Groups Entity](docId:7rAXuFH54wfvbWPhF1hJ_) 

**Success Response**

<font color="#089a4d">304</font>: The resource was not modified since the time specified in the “If-Modified-Since” header

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## PUT /\{name}/  

Updates the specified tagged group

**Required Scope Token**

bsn.api.main.groups.tagged.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- The [Tagged Groups Entity](docId:7rAXuFH54wfvbWPhF1hJ_) 

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The tagged group was updated

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource/group changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/  

Deletes a specified tagged group

**Required Scope Token**

bsn.api.main.groups.tagged.delete

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The tagged group was deleted

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">412</font>: Precondition failed (the resource changed since the time specified in the “If-Unmodified-Since” header value)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /Operations/  

Returns operational permissions granted to roles for specific business operations

**Required Scope Token**

bsn.api.main.groups.operations.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns the [Business Operations Entity](docId\:eI98k7OUl6z5i-5B-D6js)

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{id}/Permissions/  

Includes object permissions for a given tagged group instance.

**Required Scope Token**

bsn.api.main.groups.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist) 

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{id}/Permissions/  

Adds permissions for a specified tagged group

**Required Scope Token**

bsn.api.main.groups.tagged.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified tagged group instance

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{id}/Permissions/  

Removes permissions for a specified tagged group

**Required Scope Token**

bsn.api.main.groups.tagged.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `id` <font color="#704ae0">int: </font>The unique identifier for the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were removed from the tagged group

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## GET /\{name}/Permissions/  

Includes object permissions for a given tagged group instance.

**Required Scope Token**

bsn.api.main.groups.tagged.retrieve

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#089a4d">200</font>: Returns an array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities 

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request is malformed and therefore invalid

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## POST /\{name}/Permissions/  

Adds permissions for a specified tagged group

**Required Scope Token**

bsn.api.main.groups.tagged.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The permissions were successfully added to the specified tagged group instance

**Failure Response**

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">415</font>: The server cannot accept the data representation that you sent (as specified in the "Content-Type" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

## DELETE /\{name}/Permissions/  

Removes permissions for a specified tagged group

**Required Scope Token**

bsn.api.main.groups.tagged.update

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Segment**

- `name` <font color="#704ae0">string: </font>The name of the tagged group

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Body**

- An array of [Permission](docId\:JWfyMC42cdRG5jY2SkYsU) entities

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response**

<font color="#089a4d">204</font>: The specified permissions were removed from the tagged group

**Failure Response**

<font color="#9a0808">300</font>: The requested representation could not be returned because it is ambiguous (there are multiple requested representations)

<font color="#9a0808">400</font>: The request or request body is malformed and therefore invalid, or it is rejected in accordance with the business rules

<font color="#9a0808">401</font>: The access token is invalid or not specified

<font color="#9a0808">403</font>: The supplied access token, though valid, doesn't provide access to this method 

<font color="#9a0808">404</font>: The server cannot find the requested resource (the path does not exist)

<font color="#9a0808">406</font>: The server cannot return the data representation that you requested (as specified in the "Accept" header)

<font color="#9a0808">5XX</font>: Any 500 code is an internal server error

[title] User Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All User entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the user
- `Person` <font color="#704ae0">Person</font> <font color="#01a0af">read-only</font>: A single entity instance for a given customer (there can be only one person per network, but there can be 0 to an infinite number of users). This is a complex entity with its own set of properties (see [Person Entity](docId\:vUywMGVG7yRdYb0AtZg5k)).&#x20;
- `Description` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The customer-defined description of the user (for example, "Network Administrator"). The maximum length of this string is 256 characters.
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The date when the network was created. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font><font color="#01a0af"> read-only</font>: The date when the network was last modified. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastLoginDate` <font color="#704ae0">Nullable&lt;DateTime&gt;</font> <font color="#01a0af">read-only</font>: The last login date on the network, if available. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `IsLockedOut` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether the user is locked out of the network. False is the default value.
- `LastLockoutDate` <font color="#704ae0">Nullable&lt;DateTime&gt;</font> <font color="#01a0af">read-only</font>: The last date on which the user was locked out, if applicable. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `RoleName` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the role assigned to the user (for example, "Administrators")
- `Permissions` <font color="#704ae0">Permission[]</font> <font color="#01a0af">read-write</font>: A list of permission object instances representing permissions rules assigned to the user




[title] PersonInfo Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All PersonInfo entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier of the person&#x20;
- `Login` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The login of the person.


[title] Players Region Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Players Region entities are structured as follows:

entity:

- `Country` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The country where the player is located (for example, "Germany")
- `CountryLongName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The full name of the country in which the player is located (for example, "Federal Republic of Germany")
- `AdminAreaLevel1` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The largest subnational administrative unit of a country (for example, "state" in the USA and "prefecture" in Japan) in which the player is located
- `AdminAreaLevel1LongName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The full name of the largest subnational administrative unit of a country in which the player is located
- `AdminAreaLevel2` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The county name (within the United States), or a second-order civil entity below `adminAreaLevel1`, in which the player is located.&#x20;
- `AdminAreaLevel2LongName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The full county name (within the United States), or the full name of the second-order civil entity below `adminAreaLevel1`, in which the player is located.
- `Locality` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the city, town, or rural area in which the player is located
- `LocalityLongName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The full name of the city, town, or rural area in which the player is located
- `MinGPSLatitude` <font color="#704ae0">Nullable&lt;double&gt;</font> <font color="#01a0af">read-only</font>: The minimum GPS latitude (a coordinate which designates a rectangle on the map to indicate the current region)
- `MaxGPSLatitude` <font color="#704ae0">Nullable&lt;double&gt;</font> <font color="#01a0af">read-only</font>: The maximum GPS latitude (a coordinate which designates a rectangle on the map to indicate the current region)
- `MinGPSLongitude` <font color="#704ae0">Nullable&lt;double&gt;</font> <font color="#01a0af">read-only</font>: The minimum GPS longitude (a coordinate which designates a rectangle on the map to indicate the current region)
- `MaxGPSLongitude` <font color="#704ae0">Nullable&lt;double&gt;</font> <font color="#01a0af">read-only</font>: The maximum GPS longitude (a coordinate which designates a rectangle on the map to indicate the current region)
- `DevicesCount` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The number of players on the network
- `DevicesHealthStatus` <font color="#704ae0">DeviceHealthStatus[]</font> <font color="#01a0af">read-only</font>: An aggregate of player status information. The array can contain the following string values: "Normal","Warning","Error", or "No Subscription". The presence of a value indicates that one or more player is in that state.
- `LocationPath` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: Includes the parts of the returned path (country, province, city, etc.) that are common to all players in a location (for example, if you query all players in California, "United States" would be a common to all players).&#x20;


[title] Network Info Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Network Info entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font>:  A unique identifier for the network. This value is generated by the server when the network is created.
- `Name` <font color="#704ae0">string</font>: The name of the network. The maximum length of this string is 100 characters.


[title] Player Family Enumeration (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

This is an enumeration data type. All player families are structured as follows:

- `Unknown`&#x20;
- `Tiger`&#x20;
- `Pantera`&#x20;
- `Impala`&#x20;
- `Malibu`&#x20;
- `Pagani`&#x20;
- `Sebring`&#x20;
- `Raptor`&#x20;
- `Cobra`&#x20;


[title] PrincipalType Enumeration (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

This is an enumeration data type. All PrincipalType enumerations are structured as follows:

- `User`&#x20;
- `Role`&#x20;


































[title] Upload API version 2019/03
[path] Cloud APIs/BSN.Cloud Main APIs/

The Upload API, which consists of multiple endpoints, is based on the OpenAPI specification 2.0 ([swagger.io/specification/v2/](https://swagger.io/specification/v2/)). This specification is machine-readable so there is no need to manually upload the API client. To create clients, find a generator which accepts this specification and will create a proxy class, with all appropriate methods, on your chosen platform and in your chosen language. To do this, download the machine-readable .yaml application at [https://api.bsn.cloud/Upload/2019/03/REST/OAS/](https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fapi.bsn.cloud%2FUpload%2F2019%2F03%2FREST%2FOAS%2F\&data=05%7C01%7Csmulqueen%40brightsign.biz%7C0e158b6db7294b0fb48108da23d8ccee%7C8fbcdf641ab847cebdc743e23b04fb3c%7C0%7C0%7C637861711331602708%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C\&sdata=wdqC7%2BF8%2FG%2FQgtsfwWd4HbdR7YAZsptCpKycGyYdQa4%3D\&reserved=0)






[title] DataTypes (2019/03)
[path] Cloud APIs/BSN.Cloud Main APIs/Upload API version 2019/03/

See the child pages for more information on [Custom Data Types (2019/03)](docId:8oxgPxYJltIKaU9ho1nr2) and [Primitive/Base Data Types (2019/03)](docId\:nt_qd2F2PHCRgONbFeBZl).

[title] Main API version 2022/06
[path] Cloud APIs/BSN.Cloud Main APIs/

BrightSign Main API operations and services are based on the REST principles. This approach allows you to group your data by resources and define a list of operations for each resource. The REST style is commonly used for create, read, update, and delete (crud) operations.

The 2022/06 BSN.Cloud Main REST API base URL is  ***https\://api.bsn.cloud/2022/06/REST***

Endpoints are appended to this base URL. Trailing slashes can be used on BSN.cloud endpoints but are optional (for example, */Presentations/* ). 


[title] Making Requests
[path] Cloud APIs/BSN.Cloud Main APIs/

This section describes the key concepts to understand when making requests to the BrightSign Main API:

- [Authentication](docId\:HbYHyV8svQ0u6bZhuV50-)&#x20;
- [Rate Limits](docId\:kmMhRQk30_84Pv-K1EDnA)&#x20;
- [Request/Response Rules](docId\:TCVDohXQJyjf2D0csxgsX)&#x20;

[title] General Information
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

See the following pages for further information about the 2022/06 Main API:

- [Filtering and Sorting Expressions](docId:3L0afyD3xoOE-yTvfk2vs)&#x20;
- [User Permissions](docId\:KAoSbeeB-bpo3HbvrZxE9)&#x20;

[title] Filtering and Sorting Expressions
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/General Information/

This page describes filtering and sorting expressions in the Main API.

## Filtering and Sorting Expressions 

This example describes the player entity, but the same solution is implemented for all other entities (for example, groups, feeds, playlists, etc.). 

### Example

The BSN.Cloud Main API currently exposes the following player management methods which accept optional filter and sort expressions:

:::BlockQuote
GET \~/\{\{version}}/REST/Devices/\[?marker=\{string}]\[\&pageSize=\{byte}]\[\&filter=\{expression}]\[\&sort=\{expression}]
:::

which retrieves the paged list including up to 100 'Device' instances starting from the specified marker, matching the specified filter expression and sorted in accordance to the specified sort expression.

:::BlockQuote
GET \~/\{\{version}}/REST/Devices/Regions/\{\*locationPath}/\[?filter=\{expression}]
:::

which retrieves the list of 'DevicesRegion' providing the aggregated information of locations of 'Device' instances matching the specified location path and filter expression.

:::BlockQuote
GET \~/\{\{version}}/REST/Devices/Count/\[?filter=\{expression}]
:::

which retrieves the number of 'Device' instances matching the specified filter expression.

:::BlockQuote
PATCH \~/\{\{version}}/REST/Devices/\[?filter=\{expression}]
:::

(in development) which applies the specified changes to 'Device' instances matching the specified filter expression.

:::BlockQuote
DELETE \~/\{\{version}}/REST/Devices/\[?filter=\{expression}]
:::

which deletes the 'Device' instances matching the specified filter expression.

## Filter Expression Criteria

- Each filter expression may contain one or more criteria combined by AND/OR operators and optionally grouped by parentheses.
- Each criteria may be based on property name, system tag, or custom tag.
- All property names are based on data contract of the target Main API version

## System and Custom Tags

In addition to properties each 'Player' entity instance may have a different set of system and custom tags specified by customer, exposed via the `[Dictionary<string, object>] Tags` property and managed via the following BSN.Cloud Main API methods:

:::BlockQuote
PUT \~/\{version}/REST/Devices/\{playerId\:int}/
:::

:::BlockQuote
PUT \~/\{version}/REST/Devices/\{serial}/
:::

:::BlockQuote
PATCH \~/\{version}/REST/Devices/\{playerId\:int}/
:::

:::BlockQuote
PATCH \~/\{version}/REST/Devices/\{serial}/
:::

:::BlockQuote
GET \~/\{version}/REST/Devices/\{playerId\:int}/Tags/
:::

:::BlockQuote
GET \~/\{version}/REST/Devices/\{serial}/Tags/
:::

:::BlockQuote
POST \~/\{version}/REST/Devices/\{playerId\:int}/Tags/
:::

:::BlockQuote
POST \~/\{version}/REST/Devices/\{serial}/Tags/
:::

:::BlockQuote
DELETE \~/\{version}/REST/Devices/\{playerId\:int}/Tags/
:::

:::BlockQuote
DELETE \~/\{version}/REST/Devices/\{serial}/Tags/
:::

Each system and custom tag must be explicitly specified for the target entity instance but the list of available system tags is predefined by product owners and mapped to some properties so their values must be always in sync. For example, the system tag mapped to the Player Health Status property is called:

`string::[Device].<HealthStatus>`

## Property and Tag Mentions in Expressions

Property and tag mentions in expressions are different: properties are wrapped by square brackets and are separated by dots while tags are wrapped by angle brackets and may optionally be prepended by the target entity name in square brackets, and the data type is separated by double colon as you can see in the example above. Each property and tag has a strong data type, for properties and system tags it is defined in data contract of a target API version and for custom tags it is resolved either from fully qualified name or first assigned value. In addition, there is a request to support custom tags without values acting as labels. The data type defines which operators and functions are applicable to a given property or tag in conditions.

The properties and tags of **boolean** data type typically support the following operators:

:::BlockQuote
IS TRUE
:::

:::BlockQuote
IS FALSE
:::

The properties and tags of **numeric** data types typically support the following operators:

:::BlockQuote
IS \{number}
:::

:::BlockQuote
IS NOT \{number}
:::

:::BlockQuote
IS GREATER THAN \{number}
:::

:::BlockQuote
IS LESS THAN \{number}
:::

:::BlockQuote
IS IN THE RANGE \{number} AND \{number}
:::

:::BlockQuote
IS NOT IN THE RANGE \{number} AND \{number}
:::

:::BlockQuote
IS IN (\{number}, \{number}, ...)
:::

:::BlockQuote
IS NOT IN (\{number}, \{number}, ...)
:::

The GPS coordinates also support expressions like:

:::BlockQuote
GPS LOCATION (\[Latitude] AND \[Longitude]) IN (\{latitude}, \{longitude}, \{distance})
:::

:::BlockQuote
GPS LOCATION (\[Latitude] AND \[Longitude]) NOT IN (\{latitude}, \{longitude}, \{distance})
:::

The properties and tags of **string** data type typically support the following operators:

:::BlockQuote
IS NULL
:::

:::BlockQuote
IS NOT NULL
:::

:::BlockQuote
IS '\{expression}'
:::

:::BlockQuote
IS NOT '\{expression}'
:::

:::BlockQuote
BEGINS WITH '\{string}'
:::

:::BlockQuote
ENDS WITH '\{string}'
:::

:::BlockQuote
CONTAINS '\{string}'
:::

:::BlockQuote
DOES NOT CONTAIN '\{string}'
:::

:::BlockQuote
CONTAINS ALL ('\{string}', '\{string}', ...)
:::

:::BlockQuote
CONTAINS ANY ('\{string}', '\{string}', ...)
:::

:::BlockQuote
IS IN ('\{string}', '\{string}', ...)
:::

:::BlockQuote
IS NOT IN ('\{string}', '\{string}', ...)
:::

The expressions used in IS and IS NOT operators may include '\*', '?', '\[' + ']' wildcards.

The properties and tags of **DateTime** (timestamp) data type typically support the following operators:

:::BlockQuote
IS '\{DateTime}'
:::

:::BlockQuote
IS NOT '\{DateTime}'
:::

:::BlockQuote
IS AFTER '\{DateTime}'
:::

:::BlockQuote
IS BEFORE '\{DateTime}'
:::

:::BlockQuote
IN THE LAST (\{interval}, \{range}, '\{DateTime}')&#x20;
:::

where \{interval} is one of \{ "YEARS", "MONTHS", "DAYS" } enumeration values

:::BlockQuote
NOT IN THE LAST (\{interval}, \{range}, '\{DateTime}')&#x20;
:::

where \{interval} is one of \{ "YEARS", "MONTHS", "DAYS" } enumeration values

:::BlockQuote
IS IN THE RANGE '\{DateTime}' AND '\{DateTime}'
:::

:::BlockQuote
IS NOT IN THE RANGE '\{DateTime}' AND '\{DateTime}'
:::

:::BlockQuote
IS IN ('\{DateTime}', '\{DateTime}')
:::

:::BlockQuote
IS NOT IN ('\{DateTime}', '\{DateTime}')
:::

The '\{DateTime}' value format must follow ISO 8601 and is typically like '2021-12-20T18:25:01.123Z'.

The properties and tags of **TimeSpan** (time interval) data type typically support the following operators:

:::BlockQuote
IS '\{TimeSpan}'
:::

:::BlockQuote
IS NOT '\{TimeSpan}'
:::

:::BlockQuote
IS GREATER THAN '\{TimeSpan}'
:::

:::BlockQuote
IS LESS THAN '\{TimeSpan}'
:::

:::BlockQuote
IS IN ('\{TimeSpan}', '\{TimeSpan}')
:::

:::BlockQuote
IS NOT IN ('\{TimeSpan}', '\{TimeSpan}')
:::

The '\{TimeSpan}' value format must follow ISO 8601 and is typically like '3.18:25:01'.

The properties and tags of **numeric array** data types typically support the following operators:

:::BlockQuote
IS NULL
:::

:::BlockQuote
IS NOT NULL
:::

:::BlockQuote
CONTAINS ALL ('\{number}', '\{number}', ...)
:::

:::BlockQuote
CONTAINS ANY ('\{number}', '\{number}', ...)
:::

The properties and tags of **string array** data type typically support the following operators:

:::BlockQuote
IS NULL
:::

:::BlockQuote
IS NOT NULL
:::

:::BlockQuote
CONTAINS ALL ('\{string}', '\{string}', ...)
:::

:::BlockQuote
CONTAINS ANY ('\{string}', '\{string}', ...)
:::

The properties and tags of **object** data type typically support the following operators:

:::BlockQuote
IS NULL
:::

:::BlockQuote
IS NOT NULL
:::

Sort expressions may contain only one fully qualified property name or tag with optional ASC/DESC qualifier, but should support more in future.

[title] Data Types (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/

Data types are used in the BSN.Cloud Main REST API to indicate the type of values that will be stored. Among primitive data types, only the string and object data types are nullable. See the following pages for more information:

- [Custom Data Types (2022/06)](docId\:dX1C8uSfkXPwntpRb9f-T)&#x20;
- [Primitive/Base Data Types (2022/06)](docId\:mYhxTCSOAAqQiG3sSKzMR)&#x20;

Note that the device API framework differs from the older framework used in the main API.

[title] Presentation Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Presentation entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the presentation instance
- `Type` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: This property is present and it is always set to "Complete"
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The presentation name. The maximum length of this string is 100 characters.
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the file was created. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: A timestamp indicating when the file was last modified. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ProjectFile` <font color="#704ae0">FileInfo</font> <font color="#01a0af">read-write</font>: Can be one of the following FileInfo elements: [NewFileEntity](docId:-4Cfj_WoodAbYkXTlxXfO), [RemoteFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), or [StoredFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO)&#x20;
- `AutoplayFile` <font color="#704ae0">FileInfo</font> <font color="#01a0af">read-write</font>: Can be one of the following FileInfo elements: [NewFileEntity](docId:-4Cfj_WoodAbYkXTlxXfO), [RemoteFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), or [StoredFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO)&#x20;
- `ResourcesFile` <font color="#704ae0">FileInfo</font> <font color="#01a0af">read-write</font>: Can be one of the following FileInfo elements: [NewFileEntity](docId:-4Cfj_WoodAbYkXTlxXfO), [RemoteFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), or [StoredFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO) &#x20;
- `UserDefinedEventsFile` <font color="#704ae0">FileInfo</font> <font color="#01a0af">read-write</font>: Can be one of the following FileInfo elements: [NewFileEntity](docId:-4Cfj_WoodAbYkXTlxXfO), [RemoteFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), or [StoredFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO)&#x20;
- `ThumbnailFile` <font color="#704ae0">FileInfo</font> <font color="#01a0af">read-write</font>: Can be one of the following FileInfo elements: [NewFileEntity](docId:-4Cfj_WoodAbYkXTlxXfO), [RemoteFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), or [StoredFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO)&#x20;
- `Files` <font color="#704ae0">FileInfo[]</font> <font color="#01a0af">read-write</font>: Can be one of the following FileInfo elements: [MediaFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), [RemoteFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), [StoredFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), [DynamicPlaylistFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO),  [LiveMediaFeedFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO),  [LiveTextFeedFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), [TaggedPlaylistFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), or [WebPageFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO).
- `Applications` <font color="#704ae0">object</font> <font color="#01a0af">read-write</font>: Returns a list of the web applications associated with the presentation
- `Autorun` <font color="#704ae0">DeviceAutorunInfo</font> <font color="#01a0af">read-write</font>:&#x20;
  - `Version` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The current BrightSign Author autorun version assigned to the device
  - `IsCustom` <font color="#704ae0">bool</font> <font color="#01a0af">read-write</font>: Whether the autorun is a standard BrightSign Author file (`false`) or a custom-built file (`true`)
- `DeviceWebPage` <font color="#704ae0">DeviceWebPageInfo</font> <font color="#01a0af">read-write</font>:&#x20;
  - `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-write</font>: The identifier for the player webpage
  - `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the player webpage
- `DeviceModel` <font color="#704ae0">DeviceModel</font> <font color="#01a0af">read-write</font>: The target BrightSign player model for the presentation (for example, "HD223" or "LS423"). The `DeviceModel` value cannot be modified after a presentation instance is created
- `ScreenSettings` <font color="#704ae0">ScreenSettings</font> <font color="#01a0af">read-write</font>: An array of values indicating the screen settings of the presentation. This entry can also be Null for player models that do not support video output (i.e. the LS322):
  - `VideoMode` <font color="#704ae0">VideoMode</font> <font color="#01a0af">r</font><font color="#01a0af">ead-write</font>: The supported video mode (for example, "4096x2160x60p")
  - `Orientation` <font color="#704ae0">ScreenOrientation</font><font color="#01a0af"> read-write</font>: One of "Landscape", "PortraitBottomLeft", "PortraitBottomRight" or "Unknown"
  - `Connector` <font color="#704ae0">ConnectorType</font> <font color="#01a0af">read-write</font>: One of "VGA", "HDMI", or "Component"
  - `BackgroundColor` <font color="#704ae0">string</font>: The background color assigned to the screen
  - `Overscan` <font color="#704ae0">ScreenOverscan</font> <font color="#01a0af">read-write</font>: One of "NoOverscan", "OverscanActionSafeArea", or "OverscanTitleSafeArea"
- `Language` <font color="#704ae0">PresentationLanguage</font> <font color="#01a0af">read-write</font>: The language of the ticker zone in simple presentations. This property currently has no effect on the operation of a presentation. The following are valid return values: "Unknown", "English", "French", "Italian", "German", "Spanish", "Swedish"
- `AutorunPlugins` <font color="#704ae0">AutorunPlugin[]</font> <font color="#01a0af">read-write</font>: The [Autorun Plugin Entity](docId\:p6QURv3eOh-SC3xNQggeM).
- `Dependencies` <font color="#704ae0">PresentationInfo[]</font> <font color="#01a0af">read-write</font>: An array of [Presentation Info](docId\:rH_TKLzOo3RPBID0mDC9v) entities associated with each dependency for the presentation
- `Groups` <font color="#704ae0">GroupInfo[]</font> <font color="#01a0af">read-only</font>: An array of Group object instances representing groups to which the presentation belongs:
  - `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the group object instance
  - `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the group object instance
  - `Link` <font color="#704ae0">Uri</font> <font color="#01a0af">read-only</font>: The path to the group object instance Uri&#x20;
- `Permissions` <font color="#704ae0">Permission[]</font> <font color="#01a0af">read-write</font>: An list of permission object instances representing permissions rules assigned to the presentation
- `Status` <font color="#704ae0">PresentationStatus</font> <font color="#01a0af">read-write</font>: The authoring status of the presentation entity. A "Draft" value indicates that the presentation is incomplete, lacking the autoplay-\[PresentationName].xml or resources.txt file. A "Published" value indicates that the presentation has the necessary files to be published.


[title] Player Download Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Player Download entities are structured as follows:

`entity`:

- `Timestamp` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>:  Indicates when the player reported the current download. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `FileName` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The name of the file that is being (or has been) downloaded by the player
- `FileHash` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The SHA1 hash of the file that is being (or has been) downloaded by the player
- `Progress` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A value ranging from 0 to 100 indicating the progress of the current download
- `Status` <font color="#704ae0">string</font> <font color="#01a0af">read-only</font>: The status of the current download


[title] Network Subscription Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Network Subscription entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: The unique identifier for the Network Subscription entity
- `Level` <font color="#704ae0">NetworkSubscriptionLevel</font> <font color="#01a0af">read-write</font>: Whether the network is "Content" or "Control"
- `CreationDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The creation date of the subscription. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `LastModifiedDate` <font color="#704ae0">DateTime</font> <font color="#01a0af">read-only</font>: The last date on which the subscription was modified, if available. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.
- `ExpireDate` <font color="#704ae0">Nullable</font> <font color="#01a0af">read-only</font>: The date on which the network subscription will expire, if available. See [DateTime](docId\:dX1C8uSfkXPwntpRb9f-T) for more information about this data type.


[title] Autorun Plugin Entity (2022/06)
[path] Cloud APIs/BSN.Cloud Main APIs/Main API version 2022/06/Data Types (2022/06)/Custom Data Types (2022/06)/

All Autorun Plugin entities are structured as follows:

`entity`:

- `Id` <font color="#704ae0">int</font> <font color="#01a0af">read-only</font>: A unique identifier for the autorun plugin instance.
- `Name` <font color="#704ae0">string</font> <font color="#01a0af">read-write</font>: The name of the autorun plugin instance. The maximum length of this string is 100 characters. This read-only property is required.
- `FileInfo` <font color="#704ae0">FileInfo</font> <font color="#01a0af">read-write</font>: Can be one of the following FileInfo elements: [NewFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), [RemoteFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO), or [StoredFile Entity](docId:-4Cfj_WoodAbYkXTlxXfO).
- `Presentations` <font color="#704ae0">PresentationInfo[]</font> <font color="#01a0af">read-only</font>:  An array of [Presentation Info](docId\:rH_TKLzOo3RPBID0mDC9v)  entities for each presentation that uses the autorun plugin entity.


[title] LDWS Logs Endpoints
[path] Diagnostic Web Server APIs/Untitled/

## GET /v1/logs/ 

Returns the player serial logs

**Request Example**

```text
GET /api/v1/logs/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `result` <font color="#704ae0">string</font>: The raw contents of the player log. Each line is separated by a newline character `\n`

**Response Example**

```json
{
    "data": {
        "result": "[    0.000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]\n[    0.000] Linux version 5.10.160+bs9.0.97 (builder@brightsign) (aarch64-oe-linux-gcc (GCC) 9.5.0, GNU ld (GNU Binutils) 2.34.0.20200910) #1 SMP PREEMPT Wed Aug 16 18:56:35 UTC 2023\n[    0.000] Machine model: BrightSign Cobra\n[    0.000] Zone ranges:\n[    0.000]   DMA      [mem 0x0000000000200000-0x00000000f7ffffff]\n[    0.000]   DMA32    empty\n[    0.000]   Normal   empty\n[    0.000] Movable zone start for each node\n[    0.000] Early memory node ranges\n[    0.000]   node   0: [mem 0x0000000000200000-0x00000000083fffff]\n[    0.000]   node   0: [mem 0x000000000a200000-0x00000000f7ffffff]\n[    0.000] Initmem setup node 0 [mem 0x0000000000200000-0x00000000f7ffffff]\n[    0.000] On node 0 totalpages: 1007616\n[    0.000]   DMA zone: 15864 pages used for memmap\n[    0.000]   DMA zone: 0 pages reserved\n[    0.000]   DMA zone: 1007616 pages, LIFO batch:63\n[    0.000] cma: Reserved 16 MiB at 0x00000000f2800000\n[    0.000] psci: probing for conduit method from DT.\n[    0.000] psci: PSCIv1.0 detected in firmware.\n[    0.000] psci: Using standard PSCI v0.2 function IDs\n[    0.000] psci: Trusted OS migration not required\n[    0.000] psci: SMC Calling Convention v1.0\n[    0.000] percpu: Embedded 31 pages/cpu s87000 r8192 d31784 u126976\n[    0.000] pcpu-alloc: s87000 r8192 d31784 u126976 alloc=31*4096\n[    0.000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3 [0] 4 [0] 5 \n[    0.000] Detected VIPT I-cache on CPU0\n[    0.000] CPU features: detected: GIC system register CPU interface\n[    0.000] Built 1 zonelists, mobility grouping on.  Total pages: 991752\n[    0.000] Kernel command line: \n[    0.000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)\n[    0.000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)\n[    0.000] mem auto-init: stack:off, heap alloc:off, heap free:off\n[    0.000] Memory: 3899096K/4030464K available (15102K kernel code, 2736K rwdata, 6044K rodata, 5248K init, 784K bss, 114984K reserved, 16384K cma-reserved)\n[    0.000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=6, Nodes=1\n[    0.000] ftrace: allocating 49739 entries in 195 pages\n[    0.000] ftrace: allocated 195 pages with 4 groups\n[    0.000] rcu: Preemptible hierarchical RCU implementation.\n[    0.000] rcu: \tRCU event tracing is enabled.\n[    0.000] rcu: \tRCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=6.\n[    0.000] \tTrampoline variant of Tasks RCU enabled.\n[    0.000] \tRude variant of Tasks RCU enabled.\n[    0.000] \tTracing variant of Tasks RCU enabled.\n[    0.000] rcu: RCU calculated value of scheduler-enlistment delay is 30 jiffies.\n[    0.000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=6\n[    0.000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0\n[    0.000] GICv3: GIC: Using split EOI/Deactivate mode\n[    0.000] GICv3: 256 SPIs implemented\n[    0.000] GICv3: 0 Extended SPIs implemented\n[    0.000] GICv3: Distributor has no Range Selector support\n[    0.000] GICv3: 16 PPIs implemented\n[    0.000] GICv3: CPU0: found redistributor 0 region 0:0x00000000fef00000\n[    0.000] ITS [mem 0xfee20000-0xfee3ffff]\n[    0.000] ITS@0x00000000fee20000: allocated 65536 Devices @2600000 (flat, esz 8, psz 64K, shr 0)\n[    0.000] ITS: using cache flushing for cmd queue\n[    0.000] GICv3: using LPI property table @0x00000000025a0000\n[    0.000] GIC: using cache flushing for LPI property table\n[    0.000] GICv3: CPU0: using allocated LPI pending table @0x00000000025b0000\n[    0.000] GICv3: GIC: PPI partition interrupt-partition-0[0] { /cpus/cpu@0[0] /cpus/cpu@1[1] /cpus/cpu@2[2] /cpus/cpu@3[3] }\n[    0.000] GICv3: GIC: PPI partition interrupt-partition-1[1] { /cpus/cpu@100[4] /cpus/cpu@101[5] }\n[    0.000] rockchip_clk_register_frac_branch: could not find dclk_vop0_frac as parent of dclk_vop0, rate changes may not work\n[    0.000] rockchip_clk_register_frac_branch: could not find dclk_vop1_frac as parent of dclk_vop1, rate changes may not work\n[    0.000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).\n[    0.000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns\n[    0.000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns\n[    0.001] Console: colour dummy device 80x25\n[    0.001] printk: console [tty0] enabled\n[    0.001] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=80000)\n[    0.001] pid_max: default: 32768 minimum: 301\n[    0.002] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)\n[    0.002] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)\n[    0.005] rcu: Hierarchical SRCU implementation.\n[    0.006] Platform MSI: interrupt-controller@fee20000 domain created\n[    0.007] PCI/MSI: /interrupt-controller@fee00000/interrupt-controller@fee20000 domain created\n[    0.008] smp: Bringing up secondary CPUs ...\n[    0.009] Detected VIPT I-cache on CPU1\n[    0.009] GICv3: CPU1: found redistributor 1 region 0:0x00000000fef20000\n[    0.009] GICv3: CPU1: using allocated LPI pending table @0x00000000025c0000\n[    0.009] CPU1: Booted secondary processor 0x0000000001 [0x410fd034]\n[    0.010] Detected VIPT I-cache on CPU2\n[    0.011] GICv3: CPU2: found redistributor 2 region 0:0x00000000fef40000\n[    0.011] GICv3: CPU2: using allocated LPI pending table @0x00000000025d0000\n[    0.011] CPU2: Booted secondary processor 0x0000000002 [0x410fd034]\n[    0.012] Detected VIPT I-cache on CPU3\n[    0.012] GICv3: CPU3: found redistributor 3 region 0:0x00000000fef60000\n[    0.012] GICv3: CPU3: using allocated LPI pending table @0x00000000025e0000\n[    0.012] CPU3: Booted secondary processor 0x0000000003 [0x410fd034]\n[    0.013] CPU features: detected: Spectre-v2\n[    0.013] CPU features: detected: Spectre-v4\n[    0.013] CPU features: detected: ARM errata 1165522, 1319367, or 1530923\n[    0.013] CPU features: detected: Spectre-BHB\n[    0.013] Detected PIPT I-cache on CPU4\n[    0.013] GICv3: CPU4: found redistributor 100 region 0:0x00000000fef80000\n[    0.013] GICv3: CPU4: using allocated LPI pending table @0x00000000025f0000\n[    0.014] CPU4: Booted secondary processor 0x0000000100 [0x410fd082]\n[    0.015] Detected PIPT I-cache on CPU5\n[    0.015] GICv3: CPU5: found redistributor 101 region 0:0x00000000fefa0000\n[    0.015] GICv3: CPU5: using allocated LPI pending table @0x0000000002680000\n[    0.015] CPU5: Booted secondary processor 0x0000000101 [0x410fd082]\n[    0.015] smp: Brought up 1 node, 6 CPUs\n[    0.015] SMP: Total of 6 processors activated.\n[    0.015] CPU features: detected: 32-bit EL0 Support\n[    0.015] CPU features: detected: CRC32 instructions\n[    0.015] CPU: All CPU(s) started at EL2\n[    0.015] alternatives: patching kernel code\n[    0.017] devtmpfs: initialized\n[    0.030] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370867519511994 ns\n[    0.030] futex hash table entries: 2048 (order: 5, 131072 bytes, linear)\n[    0.030] pinctrl core: initialized pinctrl subsystem\n[    0.031] regulator-dummy: no parameters, enabled\n[    0.032] NET: Registered protocol family 16\n[    0.034] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations\n[    0.035] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations\n[    0.035] audit: initializing netlink subsys (disabled)\n[    0.035] audit: type=2000 audit(0.033:1): state=initialized audit_enabled=0 res=1\n[    0.036] thermal_sys: Registered thermal governor 'fair_share'\n[    0.036] thermal_sys: Registered thermal governor 'step_wise'\n[    0.036] thermal_sys: Registered thermal governor 'user_space'\n[    0.037] thermal_sys: Registered thermal governor 'power_allocator'\n[    0.037] thermal thermal_zone1: power_allocator: sustainable_power will be estimated\n[    0.037] cpuidle: using governor menu\n[    0.037] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.\n[    0.037] ASID allocator initialised with 65536 entries\n[    0.061] platform ff770000.syscon:phy@f780: Fixing up cyclic dependency with fe330000.sdhci\n[    0.078] rockchip-gpio ff720000.gpio0: probed /pinctrl/gpio0@ff720000\n[    0.079] rockchip-gpio ff730000.gpio1: probed /pinctrl/gpio1@ff730000\n[    0.079] rockchip-gpio ff780000.gpio2: probed /pinctrl/gpio2@ff780000\n[    0.080] rockchip-gpio ff788000.gpio3: probed /pinctrl/gpio3@ff788000\n[    0.081] rockchip-gpio ff790000.gpio4: probed /pinctrl/gpio4@ff790000\n[    0.081] rockchip-pinctrl pinctrl: probed pinctrl\n[    0.118] vcc12v_dcin: 12000 mV, enabled\n[    0.118] reg-fixed-voltage dc-12v: vcc12v_dcin supplying 12000000uV\n[    0.118] reg-fixed-voltage vcc-sys: Looking up vin-supply from device tree\n[    0.118] vcc5v0_sys: supplied by vcc12v_dcin\n[    0.118] vcc12v_dcin: could not add device link regulator.2: -ENOENT\n[    0.118] vcc5v0_sys: 5000 mV, enabled\n[    0.118] reg-fixed-voltage vcc-sys: vcc5v0_sys supplying 5000000uV\n[    0.118] reg-fixed-voltage vcc3v3-sys: Looking up vin-supply from device tree\n[    0.118] vcc3v3_sys: supplied by vcc5v0_sys\n[    0.118] vcc5v0_sys: could not add device link regulator.3: -ENOENT\n[    0.118] vcc3v3_sys: 3300 mV, enabled\n[    0.119] reg-fixed-voltage vcc3v3-sys: vcc3v3_sys supplying 3300000uV\n[    0.119] reg-fixed-voltage vcc5v0-host-regulator: Looking up vin-supply from device tree\n[    0.119] vcc5v0_host: supplied by vcc5v0_sys\n[    0.119] vcc5v0_sys: could not add device link regulator.4: -ENOENT\n[    0.119] vcc5v0_host: at 5000 mV, enabled\n[    0.119] reg-fixed-voltage vcc5v0-host-regulator: vcc5v0_host supplying 0uV\n[    0.119] reg-fixed-voltage vcc5v0-typec-regulator: Looking up vin-supply from device tree\n[    0.119] vcc5v0_typec: supplied by vcc5v0_sys\n[    0.119] vcc5v0_sys: could not add device link regulator.5: -ENOENT\n[    0.119] vcc5v0_typec: at 5000 mV, enabled\n[    0.120] reg-fixed-voltage vcc5v0-typec-regulator: vcc5v0_typec supplying 0uV\n[    0.120] vcc_lan: 3300 mV, enabled\n[    0.120] reg-fixed-voltage vcc3v3-phy-regulator: vcc_lan supplying 3300000uV\n[    0.120] sd_vcc: no parameters, disabled\n[    0.120] reg-fixed-voltage sd-vcc-regulator: Looking up vin-supply from device tree\n[    0.120] sd_vcc: supplied by vcc3v3_sys\n[    0.120] reg-fixed-voltage sd-vcc-regulator: sd_vcc supplying 0uV\n[    0.121] iommu: Default domain type: Translated \n[    0.122] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vcodec-supply from device tree\n[    0.122] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vcodec-supply property in node /power-management@ff310000/power-controller failed\n[    0.122] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vdu-supply from device tree\n[    0.122] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vdu-supply property in node /power-management@ff310000/power-controller failed\n[    0.123] rockchip-pm-domain ff310000.power-management:power-controller: Looking up iep-supply from device tree\n[    0.123] rockchip-pm-domain ff310000.power-management:power-controller: Looking up iep-supply property in node /power-management@ff310000/power-controller failed\n[    0.124] SCSI subsystem initialized\n[    0.124] usbcore: registered new interface driver usbfs\n[    0.124] usbcore: registered new interface driver hub\n[    0.124] usbcore: registered new device driver usb\n[    0.125] mc: Linux media interface: v0.10\n[    0.125] videodev: Linux video capture interface: v2.00\n[    0.125] pps_core: LinuxPPS API ver. 1 registered\n[    0.125] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>\n[    0.125] PTP clock support registered\n[    0.125] EDAC MC: Ver: 3.0.0\n[    0.128] Advanced Linux Sound Architecture Driver Initialized.\n[    0.129] Bluetooth: Core ver 2.22\n[    0.129] NET: Registered protocol family 31\n[    0.129] Bluetooth: HCI device and connection manager initialized\n[    0.129] Bluetooth: HCI socket layer initialized\n[    0.129] Bluetooth: L2CAP socket layer initialized\n[    0.129] Bluetooth: SCO socket layer initialized\n[    0.130] clocksource: Switched to clocksource arch_sys_counter\n[    0.297] NET: Registered protocol family 2\n[    0.297] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)\n[    0.300] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)\n[    0.300] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)\n[    0.300] TCP bind hash table entries: 32768 (order: 7, 524288 bytes, linear)\n[    0.301] TCP: Hash tables configured (established 32768 bind 32768)\n[    0.301] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)\n[    0.301] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)\n[    0.301] NET: Registered protocol family 1\n[    0.302] RPC: Registered named UNIX socket transport module.\n[    0.302] RPC: Registered udp transport module.\n[    0.302] RPC: Registered tcp transport module.\n[    0.302] RPC: Registered tcp NFSv4.1 backchannel transport module.\n[    0.303] PCI: CLS 0 bytes, default 64\n[    0.303] Trying to unpack rootfs image as initramfs...\n[    1.680] Freeing initrd memory: 3864K\n[    1.681] rockchip-thermal ff260000.tsadc: tsadc is probed successfully!\n[    1.682] hw perfevents: enabled with armv8_cortex_a53 PMU driver, 7 counters available\n[    1.683] hw perfevents: enabled with armv8_cortex_a72 PMU driver, 7 counters available\n[    1.685] Initialise system trusted keyrings\n[    1.685] workingset: timestamp_bits=46 max_order=20 bucket_order=0\n[    1.692] squashfs: version 4.0 (2009/01/31) Phillip Lougher\n[    1.693] ntfs: driver 2.1.32 [Flags: R/O].\n[    1.694] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.\n[    1.694] fuse: init (API version 7.32)\n[    1.742] Key type asymmetric registered\n[    1.742] Asymmetric key parser 'x509' registered\n[    1.743] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 243)\n[    1.743] io scheduler mq-deadline registered\n[    1.743] io scheduler kyber registered\n[    1.745] phy phy-ff770000.syscon:phy@f780.0: Looking up phy-supply from device tree\n[    1.745] phy phy-ff770000.syscon:phy@f780.0: Looking up phy-supply property in node /syscon@ff770000/phy@f780 failed\n[    1.746] rockchip-usb2phy ff770000.syscon:usb2-phy@e450: IRQ index 0 not found\n[    1.746] phy phy-ff770000.syscon:usb2-phy@e450.1: Looking up phy-supply from device tree\n[    1.746] vcc5v0_host: could not add device link phy-ff770000.syscon:usb2-phy@e450.1: -ENOENT\n[    1.747] phy phy-ff770000.syscon:usb2-phy@e450.2: Looking up phy-supply from device tree\n[    1.747] phy phy-ff770000.syscon:usb2-phy@e450.2: Looking up phy-supply property in node /syscon@ff770000/usb2-phy@e450/otg-port failed\n[    1.747] phy phy-ff770000.syscon:usb2-phy@e450.2: Looking up vbus-supply from device tree\n[    1.747] phy phy-ff770000.syscon:usb2-phy@e450.2: Looking up vbus-supply property in node /syscon@ff770000/usb2-phy@e450/otg-port failed\n[    1.748] rockchip-usb2phy ff770000.syscon:usb2-phy@e460: IRQ index 0 not found\n[    1.748] phy phy-ff770000.syscon:usb2-phy@e460.3: Looking up phy-supply from device tree\n[    1.748] vcc5v0_host: could not add device link phy-ff770000.syscon:usb2-phy@e460.3: -ENOENT\n[    1.749] phy phy-ff770000.syscon:usb2-phy@e460.4: Looking up phy-supply from device tree\n[    1.749] phy phy-ff770000.syscon:usb2-phy@e460.4: Looking up phy-supply property in node /syscon@ff770000/usb2-phy@e460/otg-port failed\n[    1.749] phy phy-ff770000.syscon:usb2-phy@e460.4: Looking up vbus-supply from device tree\n[    1.749] phy phy-ff770000.syscon:usb2-phy@e460.4: Looking up vbus-supply property in node /syscon@ff770000/usb2-phy@e460/otg-port failed\n[    1.751] phy phy-ff770000.syscon:pcie-phy.5: Looking up phy-supply from device tree\n[    1.751] phy phy-ff770000.syscon:pcie-phy.5: Looking up phy-supply property in node /syscon@ff770000/pcie-phy failed\n[    1.751] phy phy-ff770000.syscon:pcie-phy.6: Looking up phy-supply from device tree\n[    1.751] phy phy-ff770000.syscon:pcie-phy.6: Looking up phy-supply property in node /syscon@ff770000/pcie-phy failed\n[    1.752] phy phy-ff770000.syscon:pcie-phy.7: Looking up phy-supply from device tree\n[    1.752] phy phy-ff770000.syscon:pcie-phy.7: Looking up phy-supply property in node /syscon@ff770000/pcie-phy failed\n[    1.752] phy phy-ff770000.syscon:pcie-phy.8: Looking up phy-supply from device tree\n[    1.752] phy phy-ff770000.syscon:pcie-phy.8: Looking up phy-supply property in node /syscon@ff770000/pcie-phy failed\n[    1.753] phy phy-ff7c0000.phy.9: Looking up phy-supply from device tree\n[    1.753] phy phy-ff7c0000.phy.9: Looking up phy-supply property in node /phy@ff7c0000/dp-port failed\n[    1.753] phy phy-ff7c0000.phy.10: Looking up phy-supply from device tree\n[    1.753] phy phy-ff7c0000.phy.10: Looking up phy-supply property in node /phy@ff7c0000/usb3-port failed\n[    1.753] rockchip-pm-domain ff310000.power-management:power-controller: Looking up tcpd0-supply from device tree\n[    1.753] rockchip-pm-domain ff310000.power-management:power-controller: Looking up tcpd0-supply property in node /power-management@ff310000/power-controller failed\n[    1.754] phy phy-ff800000.phy.11: Looking up phy-supply from device tree\n[    1.754] phy phy-ff800000.phy.11: Looking up phy-supply property in node /phy@ff800000/dp-port failed\n[    1.754] phy phy-ff800000.phy.12: Looking up phy-supply from device tree\n[    1.754] phy phy-ff800000.phy.12: Looking up phy-supply property in node /phy@ff800000/usb3-port failed\n[    1.754] rockchip-pm-domain ff310000.power-management:power-controller: Looking up tcpd1-supply from device tree\n[    1.754] rockchip-pm-domain ff310000.power-management:power-controller: Looking up tcpd1-supply property in node /power-management@ff310000/power-controller failed\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 0 I=120 O=120 OE=64\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 1 I=121 O=121 OE=65\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 2 I=122 O=122 OE=66\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 3 I=123 O=123 OE=67\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 4 I=124 O=124 OE=68\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 5 I=125 O=125 OE=69\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 6 I=126 O=126 OE=70\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 7 I=127 O=127 OE=71\n[    1.758] iep ff670000.iep: Adding to iommu group 2\n[    1.758] iep: failed to find iep power down clock source.\n[    1.759] iep: IEP Power ON\n[    1.759] iep: IEP Power OFF\n[    1.759] iep: IEP Driver loaded succesfully\n[    1.759] iep: Module initialized.\n[    1.759] mpp_service mpp-srv: unknown mpp version for missing VCS info\n[    1.759] mpp_service mpp-srv: probe start\n[    1.760] mpp_rkvdec ff660000.rkvdec: Adding to iommu group 1\n[    1.761] mpp_rkvdec ff660000.rkvdec: probing start\n[    1.761] rkvdec_init:1242: failed on clk_get clk_hevc_cabac\n[    1.761] mpp_rkvdec ff660000.rkvdec: shared_video_hevc_cabac is not found!\n[    1.761] rkvdec_init:1273: No hevc cabac reset resource define\n[    1.761] mpp_rkvdec ff660000.rkvdec: probing finish\n[    1.763] mpp_vdpu2 ff650400.vdpu: Adding to iommu group 0\n[    1.763] mpp_vdpu2 ff650400.vdpu: probe device\n[    1.763] mpp_vdpu2 ff650400.vdpu: reset_group->rw_sem_on=0\n[    1.763] mpp_vdpu2 ff650400.vdpu: reset_group->rw_sem_on=0\n[    1.763] mpp_vdpu2 ff650400.vdpu: probing finish\n[    1.764] mpp_vepu2 ff650000.vepu: Adding to iommu group 0\n[    1.764] mpp_vepu2 ff650000.vepu: probing start\n[    1.764] mpp_vepu2 ff650000.vepu: reset_group->rw_sem_on=0\n[    1.764] mpp_vepu2 ff650000.vepu: reset_group->rw_sem_on=0\n[    1.765] mpp_vepu2 ff650000.vepu: probing finish\n[    1.766] mpp_service mpp-srv: probe success\n[    1.769] dma-pl330 ff6d0000.dma-controller: Loaded driver for PL330 DMAC-241330\n[    1.769] dma-pl330 ff6d0000.dma-controller: \tDBUFF-32x8bytes Num_Chans-6 Num_Peri-12 Num_Events-12\n[    1.771] dma-pl330 ff6e0000.dma-controller: Loaded driver for PL330 DMAC-241330\n[    1.771] dma-pl330 ff6e0000.dma-controller: \tDBUFF-128x8bytes Num_Chans-8 Num_Peri-20 Num_Events-16\n[    1.771] rockchip-pvtm ff770000.syscon:pvtm: pvtm@0 probed\n[    1.771] rockchip-pvtm ff770000.syscon:pvtm: pvtm@1 probed\n[    1.771] rockchip-pvtm ff770000.syscon:pvtm: pvtm@2 probed\n[    1.771] rockchip-pvtm ff770000.syscon:pvtm: pvtm@3 probed\n[    1.772] rockchip-system-monitor rockchip-system-monitor: system monitor probe\n[    1.773] input: brightsign-polled-io as /devices/platform/brightsign-polled-io/input/input0\n[    1.774] brightsign-poe-load brightsign-poe-load: PoE fitted\n[    1.774] of_pwm_get(): can't parse \"pwms\" property\n[    1.775] Serial: 8250/16550 driver, 10 ports, IRQ sharing disabled\n[    1.776] ff1a0000.serial: ttyS0 at MMIO 0xff1a0000 (irq = 46, base_baud = 1500000) is a 16550A\n[    1.779] cacheinfo: Unable to detect cache hierarchy for CPU 0\n[    1.786] brd: module loaded\n[    1.794] loop: module loaded\n[    1.794] zram: Added device: zram0\n[    1.794] lkdtm: No crash points registered, enable through debugfs\n[    1.795] no ATF memory for init\n[    1.799] rk_gmac-dwmac fe300000.ethernet: IRQ eth_wake_irq not found\n[    1.799] rk_gmac-dwmac fe300000.ethernet: IRQ eth_lpi not found\n[    1.799] rk_gmac-dwmac fe300000.ethernet: PTP uses main clock\n[    1.799] rk_gmac-dwmac fe300000.ethernet: Looking up phy-supply from device tree\n[    1.800] rk_gmac-dwmac fe300000.ethernet: clock input or output? (output).\n[    1.800] rk_gmac-dwmac fe300000.ethernet: TX delay(0x28).\n[    1.800] rk_gmac-dwmac fe300000.ethernet: RX delay(0x20).\n[    1.800] rk_gmac-dwmac fe300000.ethernet: integrated PHY? (no).\n[    1.800] rk_gmac-dwmac fe300000.ethernet: cannot get clock clk_mac_speed\n[    1.800] rk_gmac-dwmac fe300000.ethernet: init for RGMII\n[    1.800] rk_gmac-dwmac fe300000.ethernet: User ID: 0x10, Synopsys ID: 0x35\n[    1.800] rk_gmac-dwmac fe300000.ethernet: \tDWMAC1000\n[    1.800] rk_gmac-dwmac fe300000.ethernet: DMA HW capability register supported\n[    1.800] rk_gmac-dwmac fe300000.ethernet: RX Checksum Offload Engine supported\n[    1.800] rk_gmac-dwmac fe300000.ethernet: COE Type 2\n[    1.800] rk_gmac-dwmac fe300000.ethernet: TX Checksum insertion supported\n[    1.800] rk_gmac-dwmac fe300000.ethernet: Wake-Up On Lan supported\n[    1.800] rk_gmac-dwmac fe300000.ethernet: Normal descriptors\n[    1.800] rk_gmac-dwmac fe300000.ethernet: Ring mode enabled\n[    1.800] rk_gmac-dwmac fe300000.ethernet: Enable RX Mitigation via HW Watchdog Timer\n[    1.931] RTL8211F Gigabit Ethernet stmmac-0:00: attached PHY driver [RTL8211F Gigabit Ethernet] (mii_bus:phy_addr=stmmac-0:00, irq=POLL)\n[    1.931] RTL8211F Gigabit Ethernet stmmac-0:01: attached PHY driver [RTL8211F Gigabit Ethernet] (mii_bus:phy_addr=stmmac-0:01, irq=POLL)\n[    1.933] PPP generic driver version 2.4.2\n[    1.934] usbcore: registered new interface driver rtl8150\n[    1.934] usbcore: registered new interface driver r8152\n[    1.934] usbcore: registered new interface driver asix\n[    1.934] usbcore: registered new interface driver ax88179_178a\n[    1.934] usbcore: registered new interface driver cdc_ether\n[    1.934] usbcore: registered new interface driver net1080\n[    1.934] usbcore: registered new interface driver rndis_host\n[    1.934] usbcore: registered new interface driver cdc_subset\n[    1.934] usbcore: registered new interface driver cdc_ncm\n[    1.946] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver\n[    1.946] ehci-pci: EHCI PCI platform driver\n[    1.946] ehci-platform: EHCI generic platform driver\n[    1.949] ehci-platform fe380000.usb: EHCI Host Controller\n[    1.949] ehci-platform fe380000.usb: new USB bus registered, assigned bus number 1\n[    1.949] ehci-platform fe380000.usb: irq 38, io mem 0xfe380000\n[    1.960] ehci-platform fe380000.usb: USB 2.0 started, EHCI 1.00\n[    1.961] hub 1-0:1.0: USB hub found\n[    1.961] hub 1-0:1.0: 1 port detected\n[    1.964] ehci-platform fe3c0000.usb: EHCI Host Controller\n[    1.964] ehci-platform fe3c0000.usb: new USB bus registered, assigned bus number 2\n[    1.965] ehci-platform fe3c0000.usb: irq 40, io mem 0xfe3c0000\n[    1.976] ehci-platform fe3c0000.usb: USB 2.0 started, EHCI 1.00\n[    1.977] hub 2-0:1.0: USB hub found\n[    1.977] hub 2-0:1.0: 1 port detected\n[    1.979] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver\n[    1.979] ohci-platform: OHCI generic platform driver\n[    1.979] ohci-platform fe3a0000.usb: Generic Platform OHCI controller\n[    1.979] ohci-platform fe3a0000.usb: new USB bus registered, assigned bus number 3\n[    1.980] ohci-platform fe3a0000.usb: irq 39, io mem 0xfe3a0000\n[    2.038] hub 3-0:1.0: USB hub found\n[    2.038] hub 3-0:1.0: 1 port detected\n[    2.038] ohci-platform fe3e0000.usb: Generic Platform OHCI controller\n[    2.039] ohci-platform fe3e0000.usb: new USB bus registered, assigned bus number 4\n[    2.039] ohci-platform fe3e0000.usb: irq 41, io mem 0xfe3e0000\n[    2.098] hub 4-0:1.0: USB hub found\n[    2.098] hub 4-0:1.0: 1 port detected\n[    2.099] phy phy-ff770000.syscon:usb2-phy@e450.2: illegal mode\n[    2.099] xhci-hcd xhci-hcd.0.auto: xHCI Host Controller\n[    2.099] xhci-hcd xhci-hcd.0.auto: new USB bus registered, assigned bus number 5\n[    2.099] xhci-hcd xhci-hcd.0.auto: hcc params 0x0220fe64 hci version 0x110 quirks 0x0000000002010010\n[    2.099] xhci-hcd xhci-hcd.0.auto: irq 75, io mem 0xfe800000\n[    2.100] hub 5-0:1.0: USB hub found\n[    2.100] hub 5-0:1.0: 1 port detected\n[    2.101] xhci-hcd xhci-hcd.0.auto: xHCI Host Controller\n[    2.101] xhci-hcd xhci-hcd.0.auto: new USB bus registered, assigned bus number 6\n[    2.101] xhci-hcd xhci-hcd.0.auto: Host supports USB 3.0 SuperSpeed\n[    2.101] usb usb6: We don't know the algorithms for LPM for this host, disabling LPM.\n[    2.101] hub 6-0:1.0: USB hub found\n[    2.101] hub 6-0:1.0: 1 port detected\n[    2.102] phy phy-ff770000.syscon:usb2-phy@e460.4: illegal mode\n[    2.102] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller\n[    2.102] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 7\n[    2.102] xhci-hcd xhci-hcd.1.auto: hcc params 0x0220fe64 hci version 0x110 quirks 0x0000000002010010\n[    2.102] xhci-hcd xhci-hcd.1.auto: irq 76, io mem 0xfe900000\n[    2.103] hub 7-0:1.0: USB hub found\n[    2.103] hub 7-0:1.0: 1 port detected\n[    2.104] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller\n[    2.104] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 8\n[    2.104] xhci-hcd xhci-hcd.1.auto: Host supports USB 3.0 SuperSpeed\n[    2.104] usb usb8: We don't know the algorithms for LPM for this host, disabling LPM.\n[    2.104] hub 8-0:1.0: USB hub found\n[    2.104] hub 8-0:1.0: 1 port detected\n[    2.105] usbcore: registered new interface driver cdc_acm\n[    2.105] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters\n[    2.105] usbcore: registered new interface driver usb-storage\n[    2.105] usbcore: registered new interface driver usbserial_generic\n[    2.105] usbserial: USB Serial support registered for generic\n[    2.105] usbcore: registered new interface driver ch341\n[    2.105] usbserial: USB Serial support registered for ch341-uart\n[    2.105] usbcore: registered new interface driver cp210x\n[    2.105] usbserial: USB Serial support registered for cp210x\n[    2.106] usbcore: registered new interface driver ftdi_sio\n[    2.106] usbserial: USB Serial support registered for FTDI USB Serial Device\n[    2.106] usbcore: registered new interface driver keyspan\n[    2.106] usbserial: USB Serial support registered for Keyspan - (without firmware)\n[    2.106] usbserial: USB Serial support registered for Keyspan 1 port adapter\n[    2.106] usbserial: USB Serial support registered for Keyspan 2 port adapter\n[    2.106] usbserial: USB Serial support registered for Keyspan 4 port adapter\n[    2.106] usbcore: registered new interface driver option\n[    2.106] usbserial: USB Serial support registered for GSM modem (1-port)\n[    2.106] usbcore: registered new interface driver oti6858\n[    2.106] usbserial: USB Serial support registered for oti6858\n[    2.107] usbcore: registered new interface driver pl2303\n[    2.107] usbserial: USB Serial support registered for pl2303\n[    2.107] usbcore: registered new interface driver qcserial\n[    2.107] usbserial: USB Serial support registered for Qualcomm USB modem\n[    2.107] usbcore: registered new interface driver sierra\n[    2.107] usbserial: USB Serial support registered for Sierra USB modem\n[    2.107] mousedev: PS/2 mouse device common for all mice\n[    2.108] usbcore: registered new interface driver usbtouchscreen\n[    2.108] i2c /dev entries driver\n[    2.113] rk808 0-001b: chip id: 0x0\n[    2.116] rk808-regulator rk808-regulator: there is no dvs0 gpio\n[    2.117] rk808-regulator rk808-regulator: there is no dvs1 gpio\n[    2.118] rk808 0-001b: Looking up vcc1-supply from device tree\n[    2.118] vdd_center: supplied by vcc5v0_sys\n[    2.118] vcc5v0_sys: could not add device link regulator.8: -ENOENT\n[    2.119] vdd_center: 750 <--> 1350 mV at 900 mV, enabled\n[    2.120] rk808 0-001b: Looking up vcc2-supply from device tree\n[    2.120] vdd_cpu_l: supplied by vcc5v0_sys\n[    2.120] vcc5v0_sys: could not add device link regulator.9: -ENOENT\n[    2.122] vdd_cpu_l: 750 <--> 1300 mV at 900 mV, enabled\n[    2.122] rk808 0-001b: Looking up vcc3-supply from device tree\n[    2.122] vcc_ddr: supplied by vcc5v0_sys\n[    2.122] vcc5v0_sys: could not add device link regulator.10: -ENOENT\n[    2.123] vcc_ddr: at 5000 mV, enabled\n[    2.124] rk808 0-001b: Looking up vcc4-supply from device tree\n[    2.124] vcc_1v8: supplied by vcc5v0_sys\n[    2.124] vcc5v0_sys: could not add device link regulator.11: -ENOENT\n[    2.125] vcc_1v8: 1800 mV, enabled\n[    2.126] LDO_REG1: at 1800 mV, enabled\n[    2.127] rk808 0-001b: Looking up vcc6-supply from device tree\n[    2.127] LDO_REG1: supplied by vcc5v0_sys\n[    2.128] rk808 0-001b: Looking up vcc6-supply from device tree\n[    2.128] vcc1v8_hdmi: supplied by vcc5v0_sys\n[    2.128] vcc5v0_sys: could not add device link regulator.13: -ENOENT\n[    2.129] vcc1v8_hdmi: 1800 mV, enabled\n[    2.130] rk808 0-001b: Looking up vcc7-supply from device tree\n[    2.130] vcca_1v8: supplied by vcc5v0_sys\n[    2.130] vcc5v0_sys: could not add device link regulator.14: -ENOENT\n[    2.131] vcca_1v8: 1800 mV, enabled\n[    2.132] rk808 0-001b: Looking up vcc9-supply from device tree\n[    2.132] vcc_sdio: supplied by vcc5v0_sys\n[    2.132] vcc5v0_sys: could not add device link regulator.15: -ENOENT\n[    2.134] vcc_sdio: 1800 <--> 3300 mV at 3300 mV, enabled\n[    2.135] LDO_REG5: at 3000 mV, enabled\n[    2.135] rk808 0-001b: Looking up vcc9-supply from device tree\n[    2.135] LDO_REG5: supplied by vcc5v0_sys\n[    2.136] rk808 0-001b: Looking up vcc10-supply from device tree\n[    2.136] vcc_1v5: supplied by vcc5v0_sys\n[    2.136] vcc5v0_sys: could not add device link regulator.17: -ENOENT\n[    2.137] vcc_1v5: 1500 mV, enabled\n[    2.138] rk808 0-001b: Looking up vcc7-supply from device tree\n[    2.138] vcc0v9_hdmi: supplied by vcc5v0_sys\n[    2.138] vcc5v0_sys: could not add device link regulator.18: -ENOENT\n[    2.139] vcc0v9_hdmi: 900 mV, enabled\n[    2.141] rk808 0-001b: Looking up vcc11-supply from device tree\n[    2.141] vcc_3v0: supplied by vcc5v0_sys\n[    2.141] vcc5v0_sys: could not add device link regulator.19: -ENOENT\n[    2.142] vcc_3v0: 3000 mV, enabled\n[    2.143] SWITCH_REG1: no parameters, enabled\n[    2.143] rk808 0-001b: Looking up vcc8-supply from device tree\n[    2.143] SWITCH_REG1: supplied by vcc3v3_sys\n[    2.144] SWITCH_REG2: no parameters, enabled\n[    2.144] rk808 0-001b: Looking up vcc12-supply from device tree\n[    2.144] SWITCH_REG2: supplied by vcc3v3_sys\n[    2.146] fan53555-regulator 0-0040: FAN53555 Option[8] Rev[1] Detected!\n[    2.149] fan53555-regulator 0-0040: Looking up vin-supply from device tree\n[    2.149] vdd_cpu_b: supplied by vcc5v0_sys\n[    2.149] vcc5v0_sys: could not add device link regulator.22: -ENOENT\n[    2.151] vdd_cpu_b: 712 <--> 1300 mV at 1000 mV, enabled\n[    2.154] fan53555-regulator 0-0041: FAN53555 Option[8] Rev[1] Detected!\n[    2.157] fan53555-regulator 0-0041: Looking up vin-supply from device tree\n[    2.157] vdd_gpu: supplied by vcc5v0_sys\n[    2.157] vcc5v0_sys: could not add device link regulator.23: -ENOENT\n[    2.159] vdd_gpu: 712 <--> 1300 mV at 1000 mV, enabled\n[    2.165] dw_wdt ff848000.watchdog: No valid TOPs array specified\n[    2.166] device-mapper: ioctl: 4.44.0-ioctl (2021-02-01) initialised: dm-devel@redhat.com\n[    2.167] cpu cpu0: bin=1\n[    2.167] cpu cpu0: leakage=18\n[    2.167] cpu cpu0: Looking up cpu-supply from device tree\n[    2.167] cpu cpu0: bin-scale=34\n[    2.167] cpu cpu4: bin=1\n[    2.167] cpu cpu4: leakage=31\n[    2.167] cpu cpu4: Looking up cpu-supply from device tree\n[    2.168] cpu cpu4: bin-scale=17\n[    2.168] cpu cpu0: Looking up cpu-supply from device tree\n[    2.169] cpu cpu0: avs=0\n[    2.169] cpu cpu4: Looking up cpu-supply from device tree\n[    2.171] cpu cpu4: avs=0\n[    2.171] cpu cpu0: EM: created perf domain\n[    2.171] cpu cpu0: l=10000 h=2147483647 hyst=5000 l_limit=0 h_limit=0 h_table=0\n[    2.171] cpu cpu0: failed to read out thermal zone (-22)\n[    2.175] cpu cpu4: EM: OPP:600000 is inefficient\n[    2.175] cpu cpu4: EM: OPP:408000 is inefficient\n[    2.175] cpu cpu4: EM: created perf domain\n[    2.176] cpu cpu4: l=10000 h=2147483647 hyst=5000 l_limit=0 h_limit=0 h_table=0\n[    2.176] cpu cpu4: failed to read out thermal zone (-22)\n[    2.210] sdhci: Secure Digital Host Controller Interface driver\n[    2.210] sdhci: Copyright(c) Pierre Ossman\n[    2.210] Synopsys Designware Multimedia Card Interface Driver\n[    2.211] sdhci-pltfm: SDHCI platform and OF driver helper\n[    2.212] dwmmc_rockchip fe320000.mmc: No normal pinctrl state\n[    2.212] dwmmc_rockchip fe320000.mmc: No idle pinctrl state\n[    2.212] dwmmc_rockchip fe320000.mmc: IDMAC supports 32-bit address mode.\n[    2.212] dwmmc_rockchip fe320000.mmc: Using internal DMA controller.\n[    2.212] dwmmc_rockchip fe320000.mmc: Version ID is 270a\n[    2.212] dwmmc_rockchip fe320000.mmc: DW MMC controller at irq 36,32 bit host data width,256 deep fifo\n[    2.212] dwmmc_rockchip fe320000.mmc: Looking up vmmc-supply from device tree\n[    2.212] dwmmc_rockchip fe320000.mmc: Looking up vqmmc-supply from device tree\n[    2.213] dwmmc_rockchip fe320000.mmc: Got CD GPIO\n[    2.213] sdhci-arasan fe330000.sdhci: Looking up vmmc-supply from device tree\n[    2.213] sdhci-arasan fe330000.sdhci: Looking up vmmc-supply property in node /sdhci@fe330000 failed\n[    2.213] sdhci-arasan fe330000.sdhci: Looking up vqmmc-supply from device tree\n[    2.213] sdhci-arasan fe330000.sdhci: Looking up vqmmc-supply property in node /sdhci@fe330000 failed\n[    2.214] cryptodev: driver 1.12 loaded.\n[    2.215] hid: raw HID events driver (C) Jiri Kosina\n[    2.215] usbcore: registered new interface driver usbhid\n[    2.215] usbhid: USB HID core driver\n[    2.215] rockchip-dmc dmc: Looking up center-supply from device tree\n[    2.216] rockchip-dmc dmc: Looking up center-supply from device tree\n[    2.216] vdd_center: could not add device link dmc: -EEXIST\n[    2.216] vdd_center: Failed to create debugfs directory\n[    2.216] rockchip-dmc dmc: Failed to get ddr_leakage\n[    2.216] rockchip-dmc dmc: avs=0\n[    2.216] rockchip-dmc dmc: failed to get vop bandwidth to dmc rate\n[    2.216] rockchip-dmc dmc: l=-2147483648 h=2147483647 hyst=0 l_limit=0 h_limit=0 h_table=0\n[    2.216] rockchip-dmc dmc: could not find power_model node\n[    2.218] rockchip-saradc ff100000.saradc: Looking up vref-supply from device tree\n[    2.220] usbcore: registered new interface driver snd-usb-audio\n[    2.222] rockchip-pm-domain ff310000.power-management:power-controller: Looking up sdioaudio-supply from device tree\n[    2.222] rockchip-pm-domain ff310000.power-management:power-controller: Looking up sdioaudio-supply property in node /power-management@ff310000/power-controller failed\n[    2.224] u32 classifier\n[    2.224]     input device check on\n[    2.224]     Actions configured\n[    2.224] Initializing XFRM netlink socket\n[    2.225] NET: Registered protocol family 10\n[    2.225] Segment Routing with IPv6\n[    2.225] NET: Registered protocol family 17\n[    2.225] NET: Registered protocol family 15\n[    2.226] Bridge firewalling registered\n[    2.226] [BT_RFKILL]: Enter rfkill_rk_init\n[    2.226] [WLAN_RFKILL]: Enter rfkill_wlan_init\n[    2.226] mmc_host mmc1: Bus speed (slot 0) = 400000Hz (slot req 400000Hz, actual 400000HZ div = 0)\n[    2.227] registered taskstats version 1\n[    2.227] Loading compiled-in X.509 certificates\n[    2.228] rga: rga2, irq = 56, match scheduler\n[    2.228] rga: rga2 hardware loaded successfully, hw_version:3.2.18218.\n[    2.228] rockchip-pm-domain ff310000.power-management:power-controller: Looking up rga-supply from device tree\n[    2.228] rockchip-pm-domain ff310000.power-management:power-controller: Looking up rga-supply property in node /power-management@ff310000/power-controller failed\n[    2.228] rga: rga2 probe successfully\n[    2.229] rga_iommu: IOMMU binding successfully, default mapping core[0x4]\n[    2.229] rga: Module initialized. v1.2.27\n[    2.239] mmc0: SDHCI controller on fe330000.sdhci [fe330000.sdhci] using ADMA\n[    2.250] reg-fixed-voltage vcc-0v9: Looking up vin-supply from device tree\n[    2.250] vcc_0v9: supplied by vcc3v3_sys\n[    2.250] vcc3v3_sys: could not add device link regulator.24: -ENOENT\n[    2.250] vcc_0v9: 900 mV, enabled\n[    2.250] reg-fixed-voltage vcc-0v9: vcc_0v9 supplying 900000uV\n[    2.250] rockchip-iodomain ff320000.syscon:io-domains: Looking up pmu1830-supply from device tree\n[    2.251] rockchip-iodomain ff320000.syscon:io-domains: pmu1830(1800000 uV) supplied by vcc_1v8\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: Looking up bt656-supply from device tree\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: bt656(3000000 uV) supplied by vcc_3v0\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: Looking up audio-supply from device tree\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: audio(3000000 uV) supplied by vcc_3v0\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: Looking up sdmmc-supply from device tree\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: sdmmc(3300000 uV) supplied by vcc_sdio\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: Looking up gpio1830-supply from device tree\n[    2.252] rockchip-iodomain ff770000.syscon:io-domains: gpio1830(3000000 uV) supplied by vcc_3v0\n[    2.259] rockchip-pcie f8000000.pcie: host bridge /pcie@f8000000 ranges:\n[    2.259] rockchip-pcie f8000000.pcie:      MEM 0x00fa000000..0x00fbdfffff -> 0x00fa000000\n[    2.259] rockchip-pcie f8000000.pcie:       IO 0x00fbe00000..0x00fbefffff -> 0x00fbe00000\n[    2.260] rockchip-pcie f8000000.pcie: Looking up vpcie12v-supply from device tree\n[    2.260] rockchip-pcie f8000000.pcie: Looking up vpcie12v-supply property in node /pcie@f8000000 failed\n[    2.260] rockchip-pcie f8000000.pcie: no vpcie12v regulator found\n[    2.260] rockchip-pcie f8000000.pcie: Looking up vpcie3v3-supply from device tree\n[    2.260] rockchip-pcie f8000000.pcie: Looking up vpcie1v8-supply from device tree\n[    2.260] rockchip-pcie f8000000.pcie: Looking up vpcie0v9-supply from device tree\n[    2.279] mmc0: new HS200 MMC card at address 0001\n[    2.280] mmcblk0: mmc0:0001 4FTE4R 1.82 GiB \n[    2.280] mmcblk0boot0: mmc0:0001 4FTE4R partition 1 4.00 MiB\n[    2.281] mmcblk0boot1: mmc0:0001 4FTE4R partition 2 4.00 MiB\n[    2.281] mmcblk0rpmb: mmc0:0001 4FTE4R partition 3 512 KiB, chardev (237:0)\n[    2.284]  mmcblk0: p1 p2 p3 p4 p5 p6 p7\n[    2.345] vendor storage:20190527 ret = 0\n[    2.353] usb 7-1: new high-speed USB device number 2 using xhci-hcd\n[    2.480] vcc_sdio: ramp_delay not set\n[    2.507] mmc_host mmc1: Bus speed (slot 0) = 148500000Hz (slot req 150000000Hz, actual 148500000HZ div = 0)\n[    2.532] usb-storage 7-1:1.0: USB Mass Storage device detected\n[    2.533] scsi host0: usb-storage 7-1:1.0\n[    2.650] dwmmc_rockchip fe320000.mmc: Successfully tuned phase to 211\n[    2.650] mmc1: new ultra high speed SDR104 SDHC card at address aaaa\n[    2.650] mmcblk1: mmc1:aaaa SK32G 29.7 GiB \n[    2.652]  mmcblk1: p1\n[    2.710] rockchip-pm-domain ff310000.power-management:power-controller: Looking up sd-supply from device tree\n[    2.710] rockchip-pm-domain ff310000.power-management:power-controller: Looking up sd-supply property in node /power-management@ff310000/power-controller failed\n[    2.817] rockchip-pcie f8000000.pcie: PCIe link training gen1 timeout!\n[    2.817] rockchip-pcie f8000000.pcie: deferred probe failed\n[    2.819] rockchip-pcie: probe of f8000000.pcie failed with error -110\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up isp1-supply from device tree\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up isp1-supply property in node /power-management@ff310000/power-controller failed\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up isp0-supply from device tree\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up isp0-supply property in node /power-management@ff310000/power-controller failed\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up gpu-supply from device tree\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up gpu-supply property in node /power-management@ff310000/power-controller failed\n[    2.822] cfg80211: Loading compiled-in X.509 certificates for regulatory database\n[    2.828] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'\n[    2.828] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2\n[    2.828] cfg80211: failed to load regulatory.db\n[    2.830] ALSA device list:\n[    2.830]   #0: add2010-audio\n[    2.830]   #1: spdif-audio\n[    2.834] Freeing unused kernel memory: 5248K\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vopb-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vopb-supply property in node /power-management@ff310000/power-controller failed\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vopl-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vopl-supply property in node /power-management@ff310000/power-controller failed\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vo-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vo-supply property in node /power-management@ff310000/power-controller failed\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up hdcp-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up hdcp-supply property in node /power-management@ff310000/power-controller failed\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vio-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vio-supply property in node /power-management@ff310000/power-controller failed\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up edp-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up edp-supply property in node /power-management@ff310000/power-controller failed\n[    2.853] Run /init as init process\n[    2.853]   with arguments:\n[    2.853]     /init\n[    2.853]   with environment:\n[    2.853]     HOME=/\n[    2.853]     TERM=linux\n[    2.872] random: pvscan: uninitialized urandom read (4 bytes read)\n[    2.888]   pvscan[1738] PV /dev/mmcblk0p7 online, VG bsos is complete.\n[    2.888]   pvscan[1738] VG bsos run autoactivation.\n[    2.894]   3 logical volume(s) in volume group \"bsos\" now active\n[    2.951] random: pvscan: uninitialized urandom read (4 bytes read)\n[    2.966]   pvscan[1751] PV /dev/mmcblk0p7 online, VG bsos is complete.\n[    2.966]   pvscan[1751] VG bsos skip autoactivation.\n[    3.032] random: pvs: uninitialized urandom read (4 bytes read)\n[    3.061]   PV             VG   Fmt  Attr PSize  PFree  \n[    3.061]   /dev/mmcblk0p7 bsos lvm2 a--  <1.67g 720.00m\n[    3.126]   VG   #PV #LV #SN Attr   VSize  VFree  \n[    3.126]   bsos   1   3   0 wz--n- <1.67g 720.00m\n[    3.203]   LV       VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert\n[    3.203]   rootfs   bsos -wi-a----- 188.00m                                                    \n[    3.203]   storage  bsos -wi-a----- 768.00m                                                    \n[    3.203]   writable bsos -wi-a-----  32.00m                                                    \n[    3.345] device-mapper: verity: sha256 using implementation \"sha256-generic\"\n[    3.552] scsi 0:0:0:0: Direct-Access     Realtek  RTL9210B-CG      1.00 PQ: 0 ANSI: 6\n[    3.560] sd 0:0:0:0: [sda] Read Capacity(10) failed: Result: hostbyte=0x00 driverbyte=0x08\n[    3.560] sd 0:0:0:0: [sda] Sense Key : 0x5 [current] \n[    3.560] sd 0:0:0:0: [sda] ASC=0x24 ASCQ=0x0 \n[    3.560] sd 0:0:0:0: [sda] 0 512-byte logical blocks: (0 B/0 B)\n[    3.560] sd 0:0:0:0: [sda] 0-byte physical blocks\n[    3.561] sd 0:0:0:0: [sda] Write Protect is off\n[    3.561] sd 0:0:0:0: [sda] Mode Sense: 37 00 00 08\n[    3.561] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA\n[    3.605] sd 0:0:0:0: [sda] Read Capacity(10) failed: Result: hostbyte=0x00 driverbyte=0x08\n[    3.605] sd 0:0:0:0: [sda] Sense Key : 0x5 [current] \n[    3.605] sd 0:0:0:0: [sda] ASC=0x24 ASCQ=0x0 \n[    3.607] sd 0:0:0:0: [sda] Attached SCSI removable disk\n[    3.612] Starting udev\n[    3.668] \n[    3.668] \n[    3.669] udevd[1801]: starting version 3.2.9\n[    3.714] udevd[1802]: starting eudev-3.2.9\n[    3.939] random: lvm: uninitialized urandom read (4 bytes read)\n[    4.057] random: pvscan: uninitialized urandom read (4 bytes read)\n[    4.098]   pvscan[1830] PV /dev/mmcblk0p7 online, VG bsos is complete.\n[    4.098]   pvscan[1830] VG bsos run autoactivation.\n[    4.100]   3 logical volume(s) in volume group \"bsos\" now active\n[    4.148] random: pvs: uninitialized urandom read (4 bytes read)\n[    4.172]   PV             VG   Fmt  Attr PSize  PFree  \n[    4.172]   /dev/mmcblk0p7 bsos lvm2 a--  <1.67g 720.00m\n[    4.243]   VG   #PV #LV #SN Attr   VSize  VFree  \n[    4.243]   bsos   1   3   0 wz--n- <1.67g 720.00m\n[    4.381] total 0\n[    4.381] brw------- 1 root root 253,   2 Jan  1 00:00 bsos-rootfs\n[    4.381] brw------- 1 root root 253,   3 Jan  1 00:00 bsos-rootfs-verified\n[    4.381] brw------- 1 root root 253,   1 Jan  1 00:00 bsos-storage\n[    4.381] brw------- 1 root root 253,   0 Jan  1 00:00 bsos-writable\n[    4.381] crw------- 1 root root  10, 236 Jan  1 00:00 control\n[    4.394] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)\n[    4.718] BRIGHTSIGN boot=9.0.85 rescue=9.0.74 mission=9.0.97 model=XD1035 REVE serial=RE433D006644 hw=80102114f79 sk=1 sb=0\n[    4.764] UTC read from RTC: Wed Nov  8 06:10:46 2023\n[    4.773] Looking for crash dump: \n[    4.813] Reset causes: 0x0 unsupported-on-native\n[    4.813] No post-mortem crash dump available.\n[    4.854] Starting system message bus: \n[    4.896] dbus.\n[    5.221] handle_net /devices/platform/fe300000.ethernet/net/eth0 eth0\n[    5.224] Configuring IO scheduler for mmcblk1\n[    5.225] handle_net /devices/virtual/net/lo lo\n[    5.225] Hotplug ignoring network interface: lo\n[    5.229] Configuring IO scheduler for sda\n[    5.230] Configuring IO scheduler for mmcblk0\n[    5.233] USB vidpid=1d6b:0001\n[    5.235] USB vidpid=1d6b:0002\n[    5.236] USB vidpid=1d6b:0001\n[    5.236] USB vidpid=0bda:9210\n[    5.236] USB vidpid=1d6b:0003\n[    5.238] USB vidpid=1d6b:0002\n[    5.239] USB vidpid=1d6b:0003\n[    5.239] USB vidpid=1d6b:0002\n[    5.240] USB vidpid=1d6b:0002\n[    5.247] usbmount-1936: mount mmcblk1 /devices/platform/fe320000.mmc/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1\n[    5.247] usbmount-1937: mount mmcblk0 /devices/platform/fe330000.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0\n[    5.258] usbmount-1936: path='/sys/devices/platform/fe320000.mmc/mmc_host/mmc1/mmc1:aaaa'\n[    5.258] usbmount-1937: path='/sys/devices/platform/fe330000.sdhci/mmc_host/mmc0/mmc0:0001'\n[    5.259] usbmount-1937: Ignoring eMMC\n[    5.263]  mmcblk1: p1\n[    5.275] Disk /dev/mmcblk1: 30 GB, 31914983424 bytes, 62333952 sectors\n[    5.275] 3880 cylinders, 255 heads, 63 sectors/track\n[    5.275] Units: sectors of 1 * 512 = 512 bytes\n[    5.275] \n[    5.275] Device       Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type\n[    5.275] /dev/mmcblk1p1    0,130,3     1023,254,63       8192   62333951   62325760 29.7G  c Win95 FAT32 (LBA)\n[    5.293] usbmount-1936: Whole device /dev/mmcblk1...\n[    5.388] ID_PART_TABLE_TYPE=dos\n[    5.388] usbmount-1936: Considering /dev/mmcblk1p4...\n[    5.391] usbmount-1936: Considering /dev/mmcblk1p3...\n[    5.394] usbmount-1936: Considering /dev/mmcblk1p2...\n[    5.398] usbmount-1936: Considering /dev/mmcblk1p1...\n[    5.402] usbmount-1936: /dev/mmcblk1p1 is a valid block device\n[    5.406] Hotplug ignoring network interface: eth0\n[    5.441] ID_FS_UUID=6432-3934\n[    5.441] ID_FS_UUID_ENC=6432-3934\n[    5.441] ID_FS_BLOCK_SIZE=512\n[    5.441] ID_FS_TYPE=vfat\n[    5.449] usbmount-1936: Filesystem on /dev/mmcblk1p1\n[    5.541] storage-monitor ADD sda\n[    5.543] storage-monitor sda media added\n[    5.547] Mounting storage volume\n[    5.549] usbmount-2062: mount sda /block/sda\n[    5.552] usbmount-2062: path='/sys/devices/platform/usb@fe900000/fe900000.usb/xhci-hcd.1.auto/usb7/7-1/7-1:1.0/host0/target0:0:0/0:0:0:0'\n[    5.553] usbmount-1936: ID_FS_TYPE=vfat\n[    5.555] usbmount-2062: ssd_device=/sys/devices/platform/usb@fe900000/fe900000.usb/xhci-hcd.1.auto/usb8/8-1/8-1:1.0/host0/target0:0:0/0:0:0:0\n[    5.555] EXT4-fs (dm-1): mounted filesystem with ordered data mode. Opts: (null)\n[    5.566] sd 0:0:0:0: [sda] Read Capacity(10) failed: Result: hostbyte=0x00 driverbyte=0x08\n[    5.566] sd 0:0:0:0: [sda] Sense Key : 0x5 [current] \n[    5.566] sd 0:0:0:0: [sda] ASC=0x24 ASCQ=0x0 \n[    5.570] fdisk: can't open '/dev/sda'\n[    5.573] usbmount-2062: Whole device /dev/sda...\n[    5.575] usbmount-1936: device_size=62325760\n[    5.576] usbmount-1936: fsck_timeout=3626s calculated\n[    5.579] usbmount-2062: Considering /dev/sda4...\n[    5.582] usbmount-2062: Considering /dev/sda3...\n[    5.584] usbmount-2062: Considering /dev/sda2...\n[    5.587] usbmount-2062: Considering /dev/sda1...\n[    5.590] usbmount-2062: Considering /dev/sda...\n[    5.592] usbmount-2062: /dev/sda is a valid block device\n[    5.600] usbmount-2062: Unknown volume type on usb\n[    5.650] No appropriate upgrade files found.\n[    5.779] net-configure: eth0 start\n[    5.816] iep: iep dpi mode inactivity\n[    5.856] Successfully initialized wpa_supplicant\n[    5.887] rk_gmac-dwmac fe300000.ethernet eth0: PHY [stmmac-0:00] driver [RTL8211F Gigabit Ethernet] (irq=POLL)\n[    5.896] rk_gmac-dwmac fe300000.ethernet eth0: No Safety Features support found\n[    5.896] rk_gmac-dwmac fe300000.ethernet eth0: PTP not supported by HW\n[    5.897] rk_gmac-dwmac fe300000.ethernet eth0: configuring for phy/rgmii link mode\n[    5.925] fsck.fat 3.0.25 (2014-01-17)\n[    5.925] /dev/mmcblk1p1: 44 files, 621/973584 clusters\n[    5.928] timely: /sbin/dosfsck exited with 0 after 0s\n[    5.929] usbmount-1936: fsck.vfat /dev/mmcblk1p1 succeeded\n[    5.936] mount-filesystem-2142: /dev/mmcblk1p1 /storage/sd.fwup vfat\n[    5.978] dhcpcd[2147]: dhcpcd not running\n[    6.017] mount-filesystem-2142: Successfully mounted /dev/mmcblk1p1 at /storage/sd.fwup\n[    6.018] usbmount-1936: Successfully mounted /dev/mmcblk1p1 at /storage/sd.fwup\n[    6.020] usbmount-1936: Cleaned up fsck cruft at /storage/sd.fwup\n[    6.036] dhcpcd[2159]: dhcpcd-9.4.1 starting\n[    6.037] dhcpcd[2163]: DUID 00:02:04:33:69:4d:34:45:33:33:44:30:30:36:38:32:34\n[    6.052] forked to background, child pid 2163\n[    6.062] IP:eth0 NOCARRIER down\n[    6.083] No inbound bandwidth shaping on eth0\n[    6.175] usbmount-1936: Looking for firmware update at /storage/sd.fwup\n[    6.199] No appropriate upgrade files found.\n[    6.202] usbmount-1936: Migrating mounted filesystem from /storage/sd.fwup to /storage/sd\n[    6.250] Power source: PSU\n[    6.267] modprobe: module phy-brcm-usb-dvr not found in modules.dep\n[    6.269] modprobe: module xhci-brcm not found in modules.dep\n[    7.325] usbcore: registered new interface driver btusb\n[    7.380] random: avahi-daemon: uninitialized urandom read (4 bytes read)\n[    7.398] WiFi not found\n[    7.460] tun: Universal TUN/TAP device driver, 1.6\n[    7.476] net.ipv4.conf.eth0.force_igmp_version = 0\n[    7.530] BrightSign RTL9210 is at /dev/sda\n[    7.614] Current RTL9210 firmware version is - 1.30.28\n[    7.614] RTL9210 firmware is up to date\n[    7.621] sd 0:0:0:0: [sda] Read Capacity(10) failed: Result: hostbyte=0x00 driverbyte=0x08\n[    7.621] sd 0:0:0:0: [sda] Sense Key : 0x5 [current] \n[    7.621] sd 0:0:0:0: [sda] ASC=0x24 ASCQ=0x0 \n[    7.724] Panda firmware version 01.02 available for upgrades\n[    7.951] rk_gmac-dwmac fe300000.ethernet eth0: Link is Up - 100Mbps/Half - flow control off\n[    7.951] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready\n[    7.980] random: dhcpcd: uninitialized urandom read (112 bytes read)\n[    7.984] No Pandas found\n[    7.995] tangent: loading out-of-tree module taints kernel.\n[    8.043] tangent 1-0018: Tangent Micro version: tangent beabe2e (cobra)\n[    8.070] tangent 1-0018: Subdev 0 (\"\") is the CORE\n[    8.070] tangent 1-0018: Subdev 1 (\"IR-TRS\") is Infrared I/O\n[    8.070] Registered IR keymap rc-empty\n[    8.070] rc rc0: IR-TRS as /devices/platform/ff110000.i2c/i2c-1/1-0018/rc/rc0\n[    8.070] rc rc0: lirc_dev: driver tangent registered at minor = 0, raw IR receiver, raw IR transmitter\n[    8.071] input: IR-TRS as /devices/platform/ff110000.i2c/i2c-1/1-0018/rc/rc0/input1\n[    8.071] tangent 1-0018: Subdev 2 (\"IR-IO\") is Infrared I/O\n[    8.071] Registered IR keymap rc-empty\n[    8.071] rc rc1: IR-IO as /devices/platform/ff110000.i2c/i2c-1/1-0018/rc/rc1\n[    8.074] rc rc1: lirc_dev: driver tangent registered at minor = 1, raw IR receiver, raw IR transmitter\n[    8.075] input: IR-IO as /devices/platform/ff110000.i2c/i2c-1/1-0018/rc/rc1/input2\n[    8.082] tangent: uC running version:    beabe2e\n[    8.089] tangent: uC available version:  beabe2e\n[    8.090] tangent: firmware already matches available version\n[    8.105] random: dbus-uuidgen: uninitialized urandom read (8 bytes read)\n[    8.106] Starting extensions message bus: \n[    8.114] dbus.\n[    8.324] dw-apb-uart ff1a0000.serial: failed to request DMA, use interrupt mode\n[    8.324] share-terminal: serial console only\n[    8.355] bluetoothd[2372]: Bluetooth daemon 5.43\n[    8.366] bluetoothd[2372]: Starting SDP server\n[    8.378] bluetoothd[2372]: kernel lacks bnep-protocol support\n[    8.378] bluetoothd[2372]: System does not support network plugin\n[    8.380] bluetoothd[2372]: Bluetooth management interface 1.18 initialized\n[    8.468] random: certutil: uninitialized urandom read (32 bytes read)\n[    8.539] Loading Panfrost GPU driver\n[    8.555] panfrost ff9a0000.gpu: clock rate = 200000000\n[    8.556] panfrost ff9a0000.gpu: Looking up mali-supply from device tree\n[    8.557] panfrost ff9a0000.gpu: mali-t860 id 0x860 major 0x2 minor 0x0 status 0x0\n[    8.557] panfrost ff9a0000.gpu: features: 00000000,100e77bf, issues: 00000000,24040400\n[    8.557] panfrost ff9a0000.gpu: Features: L2:0x07120206 Shader:0x00000000 Tiler:0x00000809 Mem:0x1 MMU:0x00002830 AS:0xff JS:0x7\n[    8.557] panfrost ff9a0000.gpu: shader_present=0xf l2_present=0x1\n[    8.559] [drm] Initialized panfrost 1.1.0 20180908 for ff9a0000.gpu on minor 0\n[    8.562] Default to restarting weston with brightsign\n[    8.625] Failed to initialize DRI paths\n[    8.625] GraphicsUpscaleFactor: 1\n[    8.625] repaint-window set to 16\n[    8.672] rockchip-vop ff900000.vop: Adding to iommu group 3\n[    8.677] Win 2 set to primary\n[    8.677] Init primary/cursor Win 2\n[    8.678] Init primary/cursor Win 3\n[    8.678] Init overlay Win 0\n[    8.678] Init overlay Win 1\n[    8.678] Init overlay Win 4\n[    8.678] Init overlay Win 5\n[    8.678] Init overlay Win 6\n[    8.678] rockchip-drm display-subsystem: bound ff900000.vop (ops vop_component_ops [rockchipdrm])\n[    8.679] dwhdmi-rockchip ff940000.hdmi: Detected HDMI TX controller v2.11a with HDCP (DWC HDMI 2.0 TX PHY)\n[    8.680] dwhdmi-rockchip ff940000.hdmi: IRQ index 1 not found\n[    8.681] rockchip-drm display-subsystem: bound ff940000.hdmi (ops dw_hdmi_rockchip_ops [rockchipdrm])\n[    8.682] rockchip-drm display-subsystem: failed to parse loader memory\n[    8.716] rockchip-drm display-subsystem: [drm] fb0: rockchipdrmfb frame buffer device\n[    8.734] [drm] Initialized rockchip 3.0.0 20140818 for display-subsystem on minor 1\n[    8.735] no ATF memory for init\n[    8.824] input: hdmi_cec_key as /devices/platform/ff940000.hdmi/dw-hdmi-cec.3.auto/input/input3\n[    9.843] Starting weston --tty 1 --debug --config=/var/volatile/etc/bs_weston.ini -Swayland-0 --continue-without-input\n[    9.844] VOP1 disable weston restarts\n[    9.844] Starting BrightSign application...\n[    9.908] Starting brightsign tracing: default\n[    9.908] /etc/init.d/brightsign.sh: \n[    9.908] line 12: \n[    9.908] can't create /var/volatile/lttng/trace-brightsign.log: nonexistent directory\n[    9.908] \n[    9.908] Failed to start tracing 0\n[    9.939] WARNING: debug protocol has been enabled. This is a potential denial-of-service attack vector and information leak.\n[   10.411] Failed to create /home/root/.cache for shader cache (Read-only file system)---disabling.\n[   11.262] IP:eth0 BOUND6 ip=2600:1700:dac0:2060::23 dns=\n[   11.270] random: crng init done\n[   11.270] random: 28 urandom warning(s) missed due to ratelimiting\n[   11.630] could not load cursor 'dnd-move'\n[   11.630] could not load cursor 'dnd-copy'\n[   11.630] could not load cursor 'dnd-none'\n[   11.633] could not load cursor 'dnd-move'\n[   11.633] could not load cursor 'dnd-copy'\n[   11.633] could not load cursor 'dnd-none'\n[   11.736] xkbcommon: ERROR: \n[   11.736] couldn't find a Compose file for locale \"C\"\n[   11.736] could not create XKB compose table for locale 'C'.  Disabiling compose\n[   13.543] xkbcommon: ERROR: \n[   13.543] couldn't find a Compose file for locale \"C\"\n[   13.543] could not create XKB compose table for locale 'C'.  Disabiling compose\n[   15.490] BrightSign application cobra-9.0.97 starting\n[   15.589] OpenVpn is not configured\n[   15.599] NetworkTime: server changed to 'http://time.brightsignnetwork.com'\n[   15.599] NetworkTime: Configuration changed.\n[   15.659] \n[   15.659]    ~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.4.17 |~~~~~~~~~~~~~~~~~~~~~~~~~~\n[   15.659]         (c) 2001-2012  The world wide DirectFB Open Source Community\n[   15.659]         (c) 2000-2004  Convergence (integrated media) GmbH\n[   15.659]       ----------------------------------------------------------------\n[   15.659] \n[   15.659] (*) DirectFB/Core: Single Application Core. (2023-05-24 15:31) [ DEBUG ]\n[   15.687] (*) Direct/Memcpy: Using Generic 64bit memcpy()\n[   15.696] (*) DirectFB/Graphics: Generic Software Rasterizer 0.7 (directfb.org)\n[   15.701] (*) DirectFB/Core/WM: Default 0.3 (directfb.org)\n[   15.724] WestonDebug: log, Weston and Wayland log\n[   15.724] WestonDebug: scene-graph, Scene graph details\n[   15.724] WestonDebug: timeline, Timeline event points\n[   15.724] WestonDebug: proto, Wayland protocol dump for all clients.\n[   15.724] WestonDebug: drm-backend, Debug messages from DRM/KMS backend\n[   15.724] WestonDebug: gl-shader-generator, GL renderer shader compilation and cache.\n[   15.724] WestonDebug: content-protection-debug, debug-logs for content-protection\n[   15.732] Configure HDMI-1 as 1920x1080x60p , modeline \"148.5 1920 2008 2052 2200 1080 1084 1089 1125 +hsync +vsync\"\n[   15.736] VSYNC alignment enabled\n[   15.796] ALSA lib ../../../alsa-lib-1.2.1.2/src/pcm/pcm.c:2642:(snd_pcm_open_noupdate) \n[   15.796] Unknown PCM Headphone\n[   15.796] \n[   15.797] No path switch element\n[   15.797] ALSA lib ../../../alsa-lib-1.2.1.2/src/pcm/pcm.c:2642:(snd_pcm_open_noupdate) \n[   15.797] Unknown PCM hdmi2\n[   15.797] \n[   15.797] No path switch element\n[   15.799] Failed to open /sys/block/mapper/bsos-storage/error_report\n[   15.829] /dev/input/event3: supported event types 0000000000000003\n[   15.829] Found a keyboard at /dev/input/event3\n[   15.857] /dev/input/event2: Not a physical device\n[   15.873] /dev/input/event1: Not a physical device\n[   15.883] IP:eth0 BOUND ip=192.168.1.174 nm=255.255.255.0 gw=192.168.1.254 domain=attlocal.net dns=192.168.1.254\n[   15.890] /dev/input/event0: Ignoring Brightsign GPIO device\n[   16.003] Failed to create /home/root/.cache for shader cache (Read-only file system)---disabling.\n[   16.275] CPUs armv8_cortex_a72 from 4 to 5 (4,5)\n[   16.275] CPUs armv8_cortex_a53 from 0 to 3 (0,1,2,3)\n[   16.275] Configured CPUs for /bin/node: 0,1,2,3\n[   17.404] JS.Bootstrap : Loading bootstrap...\n[   17.512] JS.Bootstrap : INFO Last tried supervisor was ''\n[   17.512] JS.Bootstrap : Starting bootstrap...\n[   17.513] JS.Bootstrap :   bootstrap version {\"major\":1,\"minor\":0,\"patch\":1}\n[   17.514] JS.Bootstrap :   NodeJS version {\"major\":\"14\",\"minor\":\"17\",\"patch\":\"6\"}\n[   17.514] JS.Bootstrap : INFO Generating Supervisor services list\n[   17.515] JS.Bootstrap : INFO Scanning directory to find supervisors\n[   17.524] JS.Bootstrap : INFO Reference name detected as 2023-08-16T15-40-45.909Z\n[   17.525] JS.Bootstrap : INFO Supervisor, /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/2023-08-16T15-40-45.909Z.js :  Creating...\n[   18.079] Setting system clock to 1706641057.000000\n[   18.081] NetworkTime: clock set to 2024/01/30 18:57:37.001 UTC\n[   19.096] JS.Bootstrap : INFO Supervisor, /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/2023-08-16T15-40-45.909Z.js (v 2.1.10) :    Complete\n[   19.096] JS.Bootstrap : INFO Enumeration of supervisor list complete.\n[   19.097] JS.Bootstrap : INFO No previous supervisors have been tried, so none will be locked\n[   19.098] JS.Bootstrap : INFO Supervisor, /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/2023-08-16T15-40-45.909Z.js (v 2.1.10) :  Supervisor bootcheck has 14400 seconds to respond\n[   19.099] JS.Bootstrap : INFO Supervisor, /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/2023-08-16T15-40-45.909Z.js (v 2.1.10) :  Starting...\n[   19.108] JS.Supervisor : Starting supervisor version {\"major\":2,\"minor\":1,\"patch\":10}\n[   19.110] JS.Bootstrap : INFO Writing last tried entry of 2023-08-16T15-40-45.909Z\n[   20.407] JS.remote view :  INFO Constructing remote view service, with {}\n[   20.876] JS.FailSafe : INFO Constructing fail safe service, with {}\n[   20.885] JS.Supervisor : Service configure-bootstrap : Loading version {\"major\":0,\"minor\":0,\"patch\":0} (Standalone)\n[   20.888] JS.configure bootstrap :  INFO Preparing logging level\n[   20.901] JS.Bootstrap : Logs now report to Info as set by setLoggingLevelTo\n[   20.902] JS.configure bootstrap :  INFO Looking for proxy configuration\n[   20.919] JS.configure bootstrap :  INFO No proxy configured\n[   20.925] JS.Supervisor : INFO Launched all services in step 0 with success\n[   20.927] JS.Supervisor : Service configure-autorun : Loading version {\"major\":0,\"minor\":0,\"patch\":0} (Standalone)\n[   20.928] JS.Supervisor : Service configure-supervisor : Loading version {\"major\":0,\"minor\":0,\"patch\":0} (Standalone)\n[   20.930] JS.Supervisor : Service configure-network : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   20.931] JS.Supervisor : Service cellular-modem : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   20.938] JS.configure network :  INFO Checking registry for meta client\n[   20.970] JS.configure network :  INFO Configuring network to {\"base\":\"https://handlers.bsn.cloud/\",\"contentDownloadsRestricted\":\"no\",\"contentXfersEnabledWired\":\"true\",\"deviceScreenShotsCountLimit\":\"1\",\"deviceScreenShotsEnabled\":\"no\",\"deviceScreenShotsInterval\":\"60\",\"deviceScreenShotsOrientation\":\"Landscape\",\"deviceScreenShotsQuality\":\"0\",\"deviceScreenShotsTemporaryStorage\":\"https://bsncloud-dssp.s3.amazonaws.com/DeviceScreenShots/Incoming/\",\"devicedownload\":\"/bs/DeviceDownload.ashx\",\"devicedownloadprogress\":\"/bs/DeviceDownloadProgress.ashx\",\"deviceerror\":\"/bs/DeviceError.ashx\",\"diagnosticLoggingEnabled\":\"no\",\"dwsEnabled\":\"no\",\"dwsPassword\":null,\"enableSerialDebugging\":\"False\",\"enableSystemLogDebugging\":\"True\",\"event\":\"/bs/Events.ashx\",\"eventLoggingEnabled\":\"no\",\"getfile\":\"/bs/GetFile.ashx\",\"healthXfersEnabledWired\":\"true\",\"heartbeat\":\"/bs/Heartbeat.ashx\",\"idleScreenColor\":\"FF702896\",\"incomingDeviceScreenshotsQueue\":\"http://queue.amazonaws.com/965175186373/bsn-cloud-dssp\",\"limitSt<...>\n[   20.970] pace\":\"False\",\"logUploadsXfersEnabledWired\":\"true\",\"mediaFeedsXfersEnabledWired\":\"true\",\"networkConnectionPriorityWired\":\"0\",\"networkConnectionPriorityWireless\":\"-1\",\"networkdiagnostic\":\"/bs/NetworkDiagnostic.ashx\",\"next\":\"/bs/CheckForContent.ashx\",\"playbackLoggingEnabled\":\"no\",\"rateLimitModeInWindow\":\"default\",\"rateLimitModeInitialDownloads\":\"default\",\"rateLimitModeOutsideWindow\":\"unlimited\",\"rateLimitRateInWindow\":\"0\",\"rateLimitRateInitialDownloads\":\"0\",\"rateLimitRateOutsideWindow\":\"0\",\"stateLoggingEnabled\":\"no\",\"textFeedsXfersEnabledWired\":\"true\",\"timeBetweenNetConnects\":\"21600\",\"timeServer\":\"http://time.brightsignnetwork.com\",\"timezone\":\"PST\",\"trafficdownload\":\"/bs/TrafficDownload.ashx\",\"unitDescription\":\"Trying again\",\"unitName\":\"XD5\",\"unitNamingMethod\":\"appendUnitIDToUnitName\",\"uploadLogFilesAtBoot\":\"no\",\"uploadLogFilesAtSpecificTime\":\"no\",\"uploadLogFilesTime\":\"0\",\"uploadlogs\":\"/bs/UploadLogs.ashx\",\"useDHCP\":\"yes\",\"useWireless\":\"no\",\"variableLoggingEnabled\":\"no\"}\n[   20.972] JS.configure network :  INFO Configuring pre-registered network\n[   20.974] JS.configure network :  INFO In configureNetworkBeforeRegistered: Player has registered.\n[   21.034] JS.configure supervisor : INFO Looking for local presentations...\n[   21.036] JS.configure supervisor : INFO There is a presentation stored locally at /storage/sd/autorun.brs\n[   21.191] JS.configure supervisor : INFO Enabling BSN cloud, because enabled in registry or sync spec, or bsn.cloud is not explicitly disabled\n[   21.200] JS.configure supervisor : INFO bacon flag set by registry : true\n[   21.217] JS.Supervisor : INFO Launched all services in step 1 with success\n[   21.218] JS.Supervisor : Service internal-garbage-collector : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.219] JS.Supervisor : Service internal-watchdog : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.229] JS.Supervisor : Service internal-test : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.230] JS.Supervisor : Service internal-test-fail : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.231] JS.Supervisor : Service configure-connection : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.233] JS.Supervisor : Service api-bridge : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.244] JS.Configure-connection : INFO No network detected\n[   21.248] JS.Configure-connection : Refreshing features state from network server.\n[   21.291] JS.Supervisor : INFO Launched all services in step 2 with success\n[   21.292] JS.Supervisor : Service configure-process : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.299] JS.Supervisor : INFO Launched all services in step 3 with success\n[   21.300] JS.Supervisor : Service bacon-runner : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.308] JS.Supervisor : Service token-services : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.342] JS.token services :  INFO Registry already contains a valid access token, no need to exchange refresh token\n[   21.349] JS.system runner : INFO Stopping httpd\n[   21.371] JS.Configure-connection : INFO Check endpoints from server at https://certs.bsn.cloud/features/api/v1/features\n[   21.423] JS.Configure-connection : INFO Check endpoints from server at https://certs.bsn.cloud/features/api/v1/features\n[   21.497] SignalDispatcher received signal 17\n[   21.499] JS.system runner : INFO Starting http with start-local\n[   21.578] SignalDispatcher received signal 17\n[   21.579] JS.Supervisor : INFO Launched all services in step 4 with success\n[   21.581] JS.Supervisor : Service remote-storage : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.582] JS.Supervisor : Service channel-autorun : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.596] JS.Supervisor : Service DWS : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.602] JS.Supervisor : INFO Logging is now unmuted for messages with the prefix 'JS.REST API :'\n[   21.603] JS.Supervisor : Service channel-bsn : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.604] JS.Supervisor : INFO Logging is now unmuted for messages with the prefix 'JS.websocket-player :'\n[   21.606] JS.Supervisor : Service supervisor-upgrader : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.610] JS.AutoUpgrade : INFO Getting up-to-date list of available firmware from server.\n[   21.621] JS.Supervisor : Service remote-view : Loading version {\"major\":0,\"minor\":0,\"patch\":0} (Networked)\n[   21.664] JS.REST API : INFO Local DWS UI flag set to : false\n[   21.697] JS.Channel-AUTORUN: INFO Autorun messaging socket now being created\n[   21.710] JS.Channel-AUTORUN: INFO Autorun messaging applicationport now being created\n[   21.722] JS.REST API : INFO DWS UI is secured by DIGEST authentication.\n[   21.723] JS.REST API : INFO Local html_path set to : /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/DWS_html\n[   21.872] JS.Channel-BSN: INFO Features payload has not been retrieved\n[   21.872] JS.Channel-BSN: INFO BSN.cloud is enabled; New Local DWS is disabled, Remote DWS is enabled\n[   21.964] JS.REST API : INFO http server now running on port 80\n[   21.965] JS.Supervisor : INFO Launched all services in step 5 with success\n[   21.966] JS.Supervisor : Service player-register : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.968] JS.player-register : INFO Websocket has not open yet. Do not trigger registration request\n[   21.968] JS.Supervisor : Service player-status : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.969] JS.Supervisor : Service player-settings : Loading version {\"major\":1,\"minor\":2,\"patch\":0} (Networked)\n[   21.972] JS.Supervisor : Service autorun-invoker : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.975] JS.Supervisor : Service fail-safe : Loading version {\"major\":0,\"minor\":0,\"patch\":0} (Networked)\n[   21.976] JS.FailSafe : INFO Preparing timeout to check failsafe in 69 minutes\n[   21.977] JS.Supervisor : Service rollback : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.985] Autorun.payload-cellular : INFO Did not find any active supported modems\n[   22.034] JS.system rollback : INFO Retrieving rollback state\n[   22.043] JS.Bootstrap : INFO Supervisor is now invoking autorun.\n[   22.088] JS.Supervisor : INFO Launched all services in step 6 with success\n[   22.089] JS.Bootstrap : INFO Supervisor, /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/2023-08-16T15-40-45.909Z.js (v 2.1.10) :  is HAPPY\n[   22.090] JS.Bootstrap : INFO Writing last tried entry of <empty>\n[   22.104] JS.Configure-connection : INFO No payload processing required\n[   22.181] JS.Channel-BSN: INFO Received message: sys.network.boot.connected\n[   22.182] JS.Channel-BSN: INFO Received sys.network.boot.connected\n[   22.184] JS.player-register : INFO Received a network connection, try registration\n[   22.184] JS.player-register : INFO Websocket has not open yet. Do not trigger registration request\n[   22.184] JS.player-status : INFO Received sys.network.boot.connected\n[   22.188] JS.Channel-BSN: ERROR checkWebSocketStability has failed. Attempting to restart websockets.\n[   22.194] JS.Channel-BSN: INFO BSN.cloud is enabled; New Local DWS is disabled, Remote DWS is enabled\n[   22.199] JS.websocket-player : INFO Creating WS listener\n[   22.700] Checking for network recovery override.\n[   22.701] Looking for recovery script at 'https://handlers.bsn.cloud//recovery/recovery.ashx'\n[   23.176] JS.websocket-player : INFO { 2024-01-30T18:57:42.095Z} WS connection open\n[   23.177] JS.player-register : INFO Received a websocket connection, try registration\n[   23.186] JS.player-register : INFO checkForRegistration: Device is already registered\n[   23.303] Recovery server response code: 204\n[   23.327] Server provided empty recovery response\n[   23.348] JS.AutoUpgrade : ERROR No auto-upgrades available : {\"size\":0,\"timeout\":0}\n[   23.368] Loading 'SD:/autorun.brs' (739ff2e102438ccea53877e7889a7efbf77dabe8)\n[   23.619] JS.Channel-AUTORUN: INFO Message from application: ' \"{}\"'\n[   23.667] JS.Supervisor : INFO API GET request \"/v1/system\"\n[   23.809] JS.Supervisor : INFO API response to \"/v1/system\" => {\"nodejs\":{\"version\":{\"major\":\"14\",\"minor\":\"17\",\"patch\":\"6\"}},\"firmware\":{\"version\":{\"major\":\"9\",\"minor\":\"0\",\"patch\":\"97\",\"description\":\"9.0.97\"}},\"bootstrap\":{\"version\":{\"major\":1,\"minor\":0,\"patch\":1},\"autorun_drive\":\"/storage/sd/\",\"supervisors_available\"... [truncated]\n[   23.862] JS.Supervisor : INFO API GET request \"/v1/system/supervisor/registration\"\n[   23.877] JS.Supervisor : INFO API response to \"/v1/system/supervisor/registration\" => {\"token\":\"\",\"isRegistered\":true,\"setupSupport\":{\"network\":true}}\n[   23.923] JS.Channel-AUTORUN: INFO Message from application: ' \"{\\\"payload\\\":{\\\"body\\\":{\\\"script\\\":{\\\"type\\\":\\\"Autorun\\\",\\\"version\\\":\\\"10.0.98\\\"}},\\\"route\\\":\\\"/v1/script-status\\\"}}\"'\n[   23.924] JS.player-status : INFO Received sync.status.update\n[   23.925] Autorun.status : INFO Update status payload from autorun message.\n[   23.935] Autorun.status : INFO Sending status request.\n[   24.002] JS.Supervisor : INFO API GET request \"/v1/system/supervisor/autorun-config\"\n[   24.055] JS.Supervisor : INFO API response to \"/v1/system/supervisor/autorun-config\" => {\"status\":200,\"settings\":{\"meta\":{\"client\":{\"lastModifiedAutorunSettingsAt\":\"2024-01-09T18:03:50.000Z\",\"contentDownloadsRestricted\":false,\"deviceScreenShotsEnabled\":false,\"deviceScreenShotsInterval\":60,\"deviceScreenShotsCountLimit\":1,\"deviceScreenShotsQual... [truncated]\n[   24.134] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[   24.142] JS.Supervisor : INFO API GET request \"/v1/system/supervisor/autorun-config\"\n[   24.200] JS.Supervisor : INFO API response to \"/v1/system/supervisor/autorun-config\" => {\"status\":200,\"settings\":{\"meta\":{\"client\":{\"lastModifiedAutorunSettingsAt\":\"2024-01-09T18:03:50.000Z\",\"contentDownloadsRestricted\":false,\"deviceScreenShotsEnabled\":false,\"deviceScreenShotsInterval\":60,\"deviceScreenShotsCountLimit\":1,\"deviceScreenShotsQual... [truncated]\n[   24.252] BrightScript creation of roControlPort failed:\n[   24.252]   GPIO port 'LightController-0-CONTROL' not found\n[   24.252] BrightScript creation of roControlPort failed:\n[   24.252]   GPIO port 'LightController-1-CONTROL' not found\n[   24.253] BrightScript creation of roControlPort failed:\n[   24.253]   GPIO port 'LightController-2-CONTROL' not found\n[   24.253] BrightScript creation of roControlPort failed:\n[   24.253]   GPIO port 'LightController-0-DIAGNOSTICS' not found\n[   24.253] BrightScript creation of roControlPort failed:\n[   24.253]   GPIO port 'LightController-1-DIAGNOSTICS' not found\n[   24.253] BrightScript creation of roControlPort failed:\n[   24.253]   GPIO port 'LightController-2-DIAGNOSTICS' not found\n[   24.253] BrightScript creation of roControlPort failed:\n[   24.253]   GPIO port 'TouchBoard-0-GPIO' not found\n[   24.254] BrightScript creation of roControlPort failed:\n[   24.254]   GPIO port 'TouchBoard-1-GPIO' not found\n[   24.254] BrightScript creation of roControlPort failed:\n[   24.254]   GPIO port 'TouchBoard-2-GPIO' not found\n[   24.254] BrightScript creation of roControlPort failed:\n[   24.254]   GPIO port 'TouchBoard-3-GPIO' not found\n[   24.309] JS.websocket-player : INFO { 2024-01-30T18:57:43.228Z} sync.status.response message received from : BSN with id r7iXidpsp \n[   24.310] + 2024/01/30 10:57:43.230\n[   24.311] + ### Current active sync list suggests next URL of https://handlers.bsn.cloud//bs/CheckForContent.ashx\n[   24.311] + ### Time between net connects = 21600\n[   24.311] + ### Content downloads are unrestricted\n[   24.311] + SetInboundShaperRate to -1\n[   24.351] net-configure: eth0 reconfigure\n[   24.367] dhcpcd[2714]: sending signal TERM to pid 2163\n[   24.367] dhcpcd[2714]: waiting for pid 2163 to exit\n[   24.370] IP:eth0 STOP6 unexpected\n[   24.459] IP:eth0 STOP down\n[   24.460] JS.Configure-connection : The network interface eth0 has been detached via hotplug.\n[   24.461] JS.Channel-BSN: INFO Received message: sys.network.hotplug\n[   24.461] JS.Channel-BSN: INFO Received SYS_NETWORK_HOTPLUG; sending a WSS ping\n[   24.464] JS.Configure-connection : Refreshing features state from network server.\n[   24.472] IP:eth0 STOPPED unexpected\n[   24.478] JS.Configure-connection : INFO Check endpoints from server at https://certs.bsn.cloud/features/api/v1/features\n[   24.588] Removing bandwidth shaper (if present) for eth0\n[   24.618] Error: Cannot find specified qdisc on specified device\n[   24.618] .\n[   24.618] \n[   24.642] dhcpcd[2751]: dhcpcd-9.4.1 starting\n[   24.644] dhcpcd[2754]: DUID 00:02:04:33:69:4d:34:45:33:33:44:30:30:36:38:32:34\n[   24.650] forked to background, child pid 2754\n[   24.677] No inbound bandwidth shaping on eth0\n[   24.680] SignalDispatcher received signal 17\n[   24.681] + NetworkScheduler: entry signal\n[   24.681] + RetrievingSyncList: entry signal\n[   24.681] + 2024/01/30 10:57:43.601\n[   24.681] + ### start_sync download\n[   24.683] + ### xfer created - identity =  18 ###\n[   24.683] + ### Looking for new sync list from https://handlers.bsn.cloud//bs/CheckForContent.ashx\n[   24.687] + 2024/01/30 10:57:43.607\n[   24.687] + GetBindingByPriority entry:\n[   24.687] + dataType: contentDownloadEnabled\n[   24.687] + priorityIndex:  0\n[   24.687] + Selected network_interface:  0\n[   24.687] + roNetworkConfiguration succeeded for selected network_interface\n[   24.703] + GetCurrentConfig succeeded for selected network_interface\n[   24.703] + Return network_interface:  0\n[   24.703] + ### Binding for StartSync is  0\n[   24.714] + Set idle screen color: red =  112, green =  40, blue =  150\n[   24.764] JS.Supervisor : INFO API POST request \"/v1/system/supervisor/capabilities\"\n[   24.766] JS.player-status : INFO Received sync.status.update\n[   24.766] Autorun.status : INFO Update status payload from autorun message.\n[   24.768] JS.Settings : INFO Settings Handler enabled by /capabilities or UDP/IPC.\n[   24.774] JS.Supervisor : INFO API response to \"/v1/system/supervisor/capabilities\" => {\"success\":true}\n[   24.789] JS.Settings : INFO Requesting a settings update from BSN with msgId py4YmCr7M\n[   24.790] JS.Channel-BSN: INFO Received message: ws.registration.request.send\n[   24.798] JS.websocket-player : INFO sendWsRequest (sync.device.settings.retrieval.request)\n[   24.805] JS.Supervisor : INFO API POST request \"/v1/system/supervisor/capabilities\"\n[   24.806] JS.player-status : INFO Received sync.status.update\n[   24.806] Autorun.status : INFO Update status payload from autorun message.\n[   24.807] JS.Settings : INFO Settings Handler enabled by /capabilities or UDP/IPC.\n[   24.810] JS.Supervisor : INFO API response to \"/v1/system/supervisor/capabilities\" => {\"success\":true}\n[   24.866] + Creating roDatagramSender for notifications\n[   24.866] + UDP notification sent: startPlayback\n[   24.866] BrightScript creation of roStorageInfo failed:\n[   24.866]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] + Player: entry signal\n[   24.868] + Waiting: entry signal\n[   24.868] + 2024/01/30 10:57:43.788\n[   24.868] + msg received - type=roNetworkDetached\n[   24.868] + 2024/01/30 10:57:43.788\n[   24.868] + msg received - type=roUrlEvent\n[   24.868] + STRetrievingSyncListEventHandler: roUrlEvent\n[   24.868] + ### reset_download_timer_to_do_retry - wait  60 seconds.\n[   24.868] + ### Failed to download sync list: Could not resolve host: handlers.bsn.cloud\n[   24.868] + ### UploadDeviceError\n[   24.871] + 2024/01/30 10:57:43.791\n[   24.871] + GetBindingByPriority entry:\n[   24.871] + dataType: contentDownloadEnabled\n[   24.871] + priorityIndex:  0\n[   24.871] + Selected network_interface:  0\n[   24.871] + roNetworkConfiguration succeeded for selected network_interface\n[   24.883] + GetCurrentConfig succeeded for selected network_interface\n[   24.883] + Return network_interface:  0\n[   24.884] + ### Binding for UploadDeviceError is  0\n[   24.884] + RetrievingSyncList: exit signal\n[   24.884] + WaitForTimeout: entry signal\n[   24.884] + 2024/01/30 10:57:43.804\n[   24.884] + msg received - type=roStorageAttached\n[   24.885] + 2024/01/30 10:57:43.805\n[   24.885] + msg received - type=roAssociativeArray\n[   24.886] + 2024/01/30 10:57:43.806\n[   24.886] + msg received - type=roUrlEvent\n[   24.886] + ### UploadDeviceError\n[   28.648] IP:eth0 BOUND6 ip=2600:1700:dac0:2060::23 dns=\n[   31.334] + 2024/01/30 10:57:50.254\n[   31.334] + msg received - type=roNetworkAttached\n[   31.336] JS.Configure-connection : The network interface eth0 has been attached via hotplug.\n[   31.338] IP:eth0 BOUND ip=192.168.1.174 nm=255.255.255.0 gw=192.168.1.254 domain=attlocal.net dns=192.168.1.254\n[   31.352] + WaitForTimeout: exit signal\n[   31.352] + RetrievingSyncList: entry signal\n[   31.352] + 2024/01/30 10:57:50.272\n[   31.352] + ### start_sync download\n[   31.355] + ### xfer created - identity =  24 ###\n[   31.355] + ### Looking for new sync list from https://handlers.bsn.cloud//bs/CheckForContent.ashx\n[   31.359] + 2024/01/30 10:57:50.279\n[   31.359] + GetBindingByPriority entry:\n[   31.359] + dataType: contentDownloadEnabled\n[   31.359] + priorityIndex:  0\n[   31.359] + Selected network_interface:  0\n[   31.359] + roNetworkConfiguration succeeded for selected network_interface\n[   31.374] + GetCurrentConfig succeeded for selected network_interface\n[   31.374] + Return network_interface:  0\n[   31.374] + ### Binding for StartSync is  0\n[   31.375] + 2024/01/30 10:57:50.295\n[   31.375] + msg received - type=roAssociativeArray\n[   31.378] JS.Configure-connection : INFO Check endpoints from server at https://certs.bsn.cloud/features/api/v1/features\n[   31.944] + 2024/01/30 10:57:50.863\n[   31.944] + msg received - type=roUrlEvent\n[   31.944] + STRetrievingSyncListEventHandler: roUrlEvent\n[   31.944] + ### Spec received from server\n[   31.946] + GetSyncSpecChangeType ### Server has given us a spec that matches current-sync. Nothing more to do.\n[   31.946] + ### UploadDeviceDownload\n[   31.948] + ### UploadDeviceDownload - proceed with post\n[   31.948] + 2024/01/30 10:57:50.868\n[   31.948] + GetBindingByPriority entry:\n[   31.948] + dataType: contentDownloadEnabled\n[   31.948] + priorityIndex:  0\n[   31.948] + Selected network_interface:  0\n[   31.948] + roNetworkConfiguration succeeded for selected network_interface\n[   31.961] + GetCurrentConfig succeeded for selected network_interface\n[   31.961] + Return network_interface:  0\n[   31.961] + ### Binding for UploadDeviceDownload is  0\n[   31.988] + ### UploadDeviceDownloadProgressFileList\n[   31.991] + ### UploadDeviceDownloadProgressItems\n[   31.991] + ### UploadDeviceDownloadProgressItems - proceed with post\n[   31.993] + 2024/01/30 10:57:50.913\n[   31.994] + GetBindingByPriority entry:\n[   31.994] + dataType: contentDownloadEnabled\n[   31.994] + priorityIndex:  0\n[   31.994] + Selected network_interface:  0\n[   31.994] + roNetworkConfiguration succeeded for selected network_interface\n[   32.010] + GetCurrentConfig succeeded for selected network_interface\n[   32.010] + Return network_interface:  0\n[   32.010] + ### Binding for UploadDeviceDownloadProgressItems is  0\n[   32.011] + RetrievingSyncList: exit signal\n[   32.011] + WaitForTimeout: entry signal\n[   32.031] JS.Configure-connection : Refreshing features state from network server.\n[   32.047] JS.Configure-connection : INFO Check endpoints from server at https://certs.bsn.cloud/features/api/v1/features\n[   32.154] + 2024/01/30 10:57:51.074\n[   32.154] + msg received - type=roUrlEvent\n[   32.155] + ### UploadDeviceDownload\n[   32.496] + 2024/01/30 10:57:51.416\n[   32.496] + msg received - type=roUrlEvent\n[   32.497] + ### UploadDeviceDownloadProgressItems\n[   32.700] JS.Configure-connection : INFO No payload processing required\n[   32.748] JS.Configure-connection : Network hotplug: Found connection, notifying services\n[   32.754] JS.Channel-BSN: INFO Received message: sys.network.hotplug\n[   32.754] JS.Channel-BSN: INFO Received SYS_NETWORK_HOTPLUG; sending a WSS ping\n[   32.756] JS.player-register : INFO Received a network hotplug, checking for registration\n[   32.757] JS.player-status : INFO Received sys.network.hotplug\n[   32.764] JS.token services :  INFO Registry already contains a valid access token, no need to exchange refresh token\n[   32.766] JS.player-register : INFO checkForRegistration: Device is already registered\n[   33.082] JS.websocket-player : INFO { 2024-01-30T18:57:52.002Z} sync.device.settings.retrieval.response message received from : bsn.cloud-py4YmCr7M with id py4YmCr7M for /2022/06/REST/Devices/RE433D006644/Settings/\n[   33.083] JS.websocket-player : INFO sync.device.settings.retrieval.response : {\"source\":{\"type\":\"app\",\"name\":\"bsn.cloud-py4YmCr7M\"},\"destination\":{\"type\":\"player\",\"name\":\"RE433D006644\"},\"type\":\"sync.device.settings.retrieval.response\",\"payload\":{\"route\":\"/2022/06/REST/Devices/RE433D006644/Settings/\",\"headers\":{\"Content-Type\":\"application/vnd.bsn.device.settings+json\",\"Last-Modified\":\"Tue, 09 Jan 2024 18:03:50 GMT\"},\"data\":{\"statusCode\":200,\"result\":{\"name\":\"XD5\",\"description\":\"Trying again\",\"concatNameAndSerial\":true,\"setupType\":\"BSN\",\"lastModifiedDate\":\"2024-01-09T18:03:50Z\",\"group\":{\"id\":30914,\"name\":\"Default\",\"link\":null},\"brightWall\":null,\"timezone\":\"PST\",\"screen\":{\"idleColor\":\"FF702896\",\"splashUrl\":null},\"synchronization\":{\"status\":{\"period\":\"00:05:00\"},\"settings\":{\"period\":\"06:00:00\"},\"schedule\":{\"period\":\"06:00:00\"},\"content\":{\"start\":null,\"end\":null}},\"network\":{\"hostname\":null,\"proxyServer\":null,\"proxyBypass\":[],\"timeServers\":[\"http://time.brightsignnetwork.com\"],\"interf<...>\n[   33.083] [{\"enabled\":true,\"proto\":\"DHCP\",\"ip\":null,\"gateway\":null,\"dns\":null,\"rateLimitDuringInitialDownloads\":0,\"rateLimitInsideContentDownloadWindow\":0,\"rateLimitOutsideContentDownloadWindow\":null,\"contentDownloadEnabled\":true,\"textFeedsDownloadEnabled\":true,\"mediaFeedsDownloadEnabled\":true,\"healthReportingEnabled\":true,\"logsUploadEnabled\":true,\"name\":\"eth0\",\"type\":\"Ethernet\"}]},\"beacons\":null,\"location\":{\"gpsLatitude\":37.4152,\"gpsLongitude\":-122.1224,\"placeId\":null,\"country\":\"US\",\"countryLongName\":\"United States\",\"adminAreaLevel1\":\"CA\",\"adminAreaLevel1LongName\":\"California\",\"adminAreaLevel2\":\"Santa Clara County\",\"adminAreaLevel2LongName\":\"Santa Clara County\",\"locality\":\"Palo Alto\",\"localityLongName\":\"Palo Alto\",\"path\":\"/US/CA/Santa Clara County/Palo Alto/\",\"pathLongName\":\"/United States/California/Santa Clara County/Palo Alto/\"},\"screenshots\":null,\"logging\":{\"enableDiagnosticLog\":false,\"enableEventLog\":false,\"enablePlaybackLog\":false,\"enableStateLog\":false,\"enableVariableLog\":<...>\n[   33.083] \"uploadAtBoot\":false,\"uploadTime\":null},\"lws\":{\"enableUpdateNotifications\":true,\"username\":\"\",\"password\":\"\"},\"ldws\":null},\"error\":null}},\"token\":\"gdUKFoegOu4tAUArHECsiU1tKpmHMhRLHco2R8QXDSU4JH3UUBgCEyRSv4AvRdC3CBnpeQKMR18yHG50r7QMrhBeWRtGSFezxV8QtemTh9lcPwjCKPl0rRcK253tShfs\",\"msgId\":\"py4YmCr7M\",\"version\":null}\n[   33.084] JS.Settings : INFO Response from BSN, regarding the latest settings retrieval, has been received\n[   33.085] JS.Channel-BSN: INFO Received message: ws.registration.response.send\n[   33.092] JS.Settings : INFO Send settings GET response received.\n[   33.101] JS.websocket-player : INFO { 2024-01-30T18:57:52.021Z} sync.device.settings.retrieval.response sending response to bsn.cloud-py4YmCr7M with id py4YmCr7M \n[   33.121] JS.Settings : INFO The Last-Modified header value has not changed; supervisor will not apply settings from GET.\n[   33.218] JS.websocket-player : INFO { 2024-01-30T18:57:52.138Z} sync.device.settings.retrieval.response message received from : BSN with id py4YmCr7M \n[   33.219] JS.websocket-player : INFO sync.device.settings.retrieval.response : {\"source\":{\"type\":\"app\",\"name\":\"BSN\"},\"destination\":{\"type\":\"player\",\"name\":\"RE433D006644\"},\"type\":\"sync.device.settings.retrieval.response\",\"payload\":{\"data\":{\"statusCode\":202,\"result\":{\"message\":\"Accepted\"}}},\"token\":\"TDZwzMzZeSrKJpTEmkmEhcgi3EzShVvcPR124GQZDTca65m7quYaWM4wyaU2LdQ5nvQiT38umo4dy32vYCHA1GztjKFmsXYAKk33zwMxKfEMXBDDXVDSO9vtQdmPUkyw\",\"msgId\":\"py4YmCr7M\"}\n[   33.219] JS.Settings : INFO Response from BSN, regarding the latest settings retrieval, has been received\n[   33.220] JS.Channel-BSN: INFO Received message: ws.registration.response.send\n[   33.232] JS.websocket-player : INFO { 2024-01-30T18:57:52.151Z} sync.device.settings.retrieval.response sending response to BSN with id py4YmCr7M \n[   34.031] JS.Configure-connection : INFO No payload processing required\n[   82.170] + 2024/01/30 10:58:41.090\n[   82.171] + msg received - type=roControlCloudMessageEvent\n[   82.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[   82.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[  142.170] + 2024/01/30 10:59:41.090\n[  142.170] + msg received - type=roControlCloudMessageEvent\n[  142.170] + supervisor / bootstrap roControlCloudMessageEvent received\n[  142.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[  202.170] + 2024/01/30 11:00:41.090\n[  202.171] + msg received - type=roControlCloudMessageEvent\n[  202.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[  202.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[  262.171] + 2024/01/30 11:01:41.091\n[  262.171] + msg received - type=roControlCloudMessageEvent\n[  262.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[  262.172] + supervisor / bootstrap roControlCloudMessageEvent received\n[  322.172] + 2024/01/30 11:02:41.092\n[  322.172] + msg received - type=roControlCloudMessageEvent\n[  322.172] + supervisor / bootstrap roControlCloudMessageEvent received\n[  322.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  324.134] Autorun.status : INFO Sending status request.\n[  324.226] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[  324.411] JS.websocket-player : INFO { 2024-01-30T19:02:43.331Z} sync.status.response message received from : BSN with id UrI9sFx6h \n[  382.172] + 2024/01/30 11:03:41.092\n[  382.172] + msg received - type=roControlCloudMessageEvent\n[  382.172] + supervisor / bootstrap roControlCloudMessageEvent received\n[  382.172] + supervisor / bootstrap roControlCloudMessageEvent received\n[  442.172] + 2024/01/30 11:04:41.092\n[  442.172] + msg received - type=roControlCloudMessageEvent\n[  442.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  442.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  502.173] + 2024/01/30 11:05:41.093\n[  502.173] + msg received - type=roControlCloudMessageEvent\n[  502.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  502.174] + supervisor / bootstrap roControlCloudMessageEvent received\n[  562.173] + 2024/01/30 11:06:41.093\n[  562.173] + msg received - type=roControlCloudMessageEvent\n[  562.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  562.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  622.176] + 2024/01/30 11:07:41.096\n[  622.176] + msg received - type=roControlCloudMessageEvent\n[  622.176] + supervisor / bootstrap roControlCloudMessageEvent received\n[  622.177] + supervisor / bootstrap roControlCloudMessageEvent received\n[  624.135] Autorun.status : INFO Sending status request.\n[  624.216] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[  624.388] JS.websocket-player : INFO { 2024-01-30T19:07:43.307Z} sync.status.response message received from : BSN with id rMAgtKZ0Y \n[  682.177] + 2024/01/30 11:08:41.097\n[  682.177] + msg received - type=roControlCloudMessageEvent\n[  682.177] + supervisor / bootstrap roControlCloudMessageEvent received\n[  682.177] + supervisor / bootstrap roControlCloudMessageEvent received\n[  742.177] + 2024/01/30 11:09:41.097\n[  742.177] + msg received - type=roControlCloudMessageEvent\n[  742.177] + supervisor / bootstrap roControlCloudMessageEvent received\n[  742.178] + supervisor / bootstrap roControlCloudMessageEvent received\n[  802.178] + 2024/01/30 11:10:41.098\n[  802.178] + msg received - type=roControlCloudMessageEvent\n[  802.179] + supervisor / bootstrap roControlCloudMessageEvent received\n[  802.179] + supervisor / bootstrap roControlCloudMessageEvent received\n[  862.178] + 2024/01/30 11:11:41.098\n[  862.178] + msg received - type=roControlCloudMessageEvent\n[  862.179] + supervisor / bootstrap roControlCloudMessageEvent received\n[  862.179] + supervisor / bootstrap roControlCloudMessageEvent received\n[  922.179] + 2024/01/30 11:12:41.099\n[  922.179] + msg received - type=roControlCloudMessageEvent\n[  922.180] + supervisor / bootstrap roControlCloudMessageEvent received\n[  922.180] + supervisor / bootstrap roControlCloudMessageEvent received\n[  924.136] Autorun.status : INFO Sending status request.\n[  924.222] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[  924.383] JS.websocket-player : INFO { 2024-01-30T19:12:43.303Z} sync.status.response message received from : BSN with id -Ix9gW61s \n[  982.180] + 2024/01/30 11:13:41.100\n[  982.180] + msg received - type=roControlCloudMessageEvent\n[  982.180] + supervisor / bootstrap roControlCloudMessageEvent received\n[  982.180] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1042.180] + 2024/01/30 11:14:41.100\n[ 1042.180] + msg received - type=roControlCloudMessageEvent\n[ 1042.180] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1042.181] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1102.181] + 2024/01/30 11:15:41.101\n[ 1102.181] + msg received - type=roControlCloudMessageEvent\n[ 1102.181] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1102.181] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1162.181] + 2024/01/30 11:16:41.101\n[ 1162.181] + msg received - type=roControlCloudMessageEvent\n[ 1162.182] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1162.182] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1222.181] + 2024/01/30 11:17:41.101\n[ 1222.181] + msg received - type=roControlCloudMessageEvent\n[ 1222.181] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1222.182] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1224.137] Autorun.status : INFO Sending status request.\n[ 1224.221] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 1224.385] JS.websocket-player : INFO { 2024-01-30T19:17:43.304Z} sync.status.response message received from : BSN with id xg1HvYoAc \n[ 1282.182] + 2024/01/30 11:18:41.102\n[ 1282.183] + msg received - type=roControlCloudMessageEvent\n[ 1282.183] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1282.183] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1342.182] + 2024/01/30 11:19:41.102\n[ 1342.182] + msg received - type=roControlCloudMessageEvent\n[ 1342.183] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1342.183] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1402.183] + 2024/01/30 11:20:41.103\n[ 1402.183] + msg received - type=roControlCloudMessageEvent\n[ 1402.183] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1402.184] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1462.184] + 2024/01/30 11:21:41.104\n[ 1462.184] + msg received - type=roControlCloudMessageEvent\n[ 1462.184] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1462.185] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1522.185] + 2024/01/30 11:22:41.105\n[ 1522.185] + msg received - type=roControlCloudMessageEvent\n[ 1522.185] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1522.186] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1524.137] Autorun.status : INFO Sending status request.\n[ 1524.218] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 1524.411] JS.websocket-player : INFO { 2024-01-30T19:22:43.331Z} sync.status.response message received from : BSN with id W4XXOQQof \n[ 1582.185] + 2024/01/30 11:23:41.105\n[ 1582.185] + msg received - type=roControlCloudMessageEvent\n[ 1582.186] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1582.186] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1642.186] + 2024/01/30 11:24:41.106\n[ 1642.186] + msg received - type=roControlCloudMessageEvent\n[ 1642.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1642.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1702.187] + 2024/01/30 11:25:41.107\n[ 1702.187] + msg received - type=roControlCloudMessageEvent\n[ 1702.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1702.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1762.186] + 2024/01/30 11:26:41.106\n[ 1762.186] + msg received - type=roControlCloudMessageEvent\n[ 1762.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1762.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1822.186] + 2024/01/30 11:27:41.106\n[ 1822.187] + msg received - type=roControlCloudMessageEvent\n[ 1822.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1822.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1824.139] Autorun.status : INFO Sending status request.\n[ 1824.224] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 1824.389] JS.websocket-player : INFO { 2024-01-30T19:27:43.308Z} sync.status.response message received from : BSN with id HzQREFwFp \n[ 1826.783] IP:eth0 RENEW6 ip=2600:1700:dac0:2060::23 dns=\n[ 1832.819] JS.websocket-player : INFO { 2024-01-30T19:27:51.739Z} RestRequest message received from : ws-rest-server-b80f6345-5b81-47b1-8268-c140a8b8f5a0 with id b80f6345-5b81-47b1-8268-c140a8b8f5a0 for /v1/info\n[ 1832.838] JS.Supervisor : INFO API GET request \"/v1/info\"\n[ 1832.914] Failed to find volume: filesystem error: directory iterator cannot open directory: No such file or directory [/sys/class/ubi/ubi0/]\n[ 1832.933] JS.Supervisor : INFO API response to \"/v1/info\" => {\"serial\":\"RE433D006644\",\"upTime\":\"30 minutes\",\"upTimeSeconds\":1832,\"model\":\"XD1035\",\"FWVersion\":\"9.0.97\",\"bootVersion\":\"9.0.85\",\"family\":\"cobra\",\"isPlayer\":true,\"power\":{\"result\":{\"battery\":\"absent\",\"source\":\"AC\",\"switch_mode\":\"hard\"}},\"poe\":{\"result\":{\"s... [truncated]\n[ 1832.947] JS.websocket-player : INFO received rest response : 200\n[ 1832.961] JS.websocket-player : INFO { 2024-01-30T19:27:51.881Z} RestResponse sending response to ws-rest-server-b80f6345-5b81-47b1-8268-c140a8b8f5a0 with id b80f6345-5b81-47b1-8268-c140a8b8f5a0 for /v1/info\n[ 1882.187] + 2024/01/30 11:28:41.107\n[ 1882.187] + msg received - type=roControlCloudMessageEvent\n[ 1882.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1882.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1927.384] JS.websocket-player : INFO { 2024-01-30T19:29:26.304Z} RestRequest message received from : ws-rest-server-18392ce1-9381-46e8-afc5-f10911b7d242 with id 18392ce1-9381-46e8-afc5-f10911b7d242 for /v1/video-mode\n[ 1927.395] JS.Supervisor : INFO API GET request \"/v1/video-mode\"\n[ 1927.414] JS.Supervisor : INFO API response to \"/v1/video-mode\" => {\"isAutoMode\":false,\"name\":\"1920x1080x60p\",\"width\":\"1920\",\"height\":\"1080\",\"frames\":\"60\",\"scan\":\"p\",\"mode\":{\"colorDepth\":\"8bit\",\"colorSpace\":\"rgb\",\"dropFrame\":false,\"frequency\":60,\"graphicsPlaneHeight\":1080,\"graphicsPlaneWidth\":1920,\"height\":1080,\"interlace... [truncated]\n[ 1927.421] JS.websocket-player : INFO received rest response : 200\n[ 1927.430] JS.websocket-player : INFO { 2024-01-30T19:29:26.350Z} RestResponse sending response to ws-rest-server-18392ce1-9381-46e8-afc5-f10911b7d242 with id 18392ce1-9381-46e8-afc5-f10911b7d242 for /v1/video-mode\n[ 1942.188] + 2024/01/30 11:29:41.108\n[ 1942.188] + msg received - type=roControlCloudMessageEvent\n[ 1942.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1942.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2002.188] + 2024/01/30 11:30:41.108\n[ 2002.188] + msg received - type=roControlCloudMessageEvent\n[ 2002.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2002.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2062.188] + 2024/01/30 11:31:41.108\n[ 2062.188] + msg received - type=roControlCloudMessageEvent\n[ 2062.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2062.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2122.189] + 2024/01/30 11:32:41.109\n[ 2122.189] + msg received - type=roControlCloudMessageEvent\n[ 2122.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2122.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2124.140] Autorun.status : INFO Sending status request.\n[ 2124.217] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 2124.390] JS.websocket-player : INFO { 2024-01-30T19:32:43.310Z} sync.status.response message received from : BSN with id S6n0c13Z6 \n[ 2182.188] + 2024/01/30 11:33:41.108\n[ 2182.188] + msg received - type=roControlCloudMessageEvent\n[ 2182.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2182.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2242.189] + 2024/01/30 11:34:41.109\n[ 2242.189] + msg received - type=roControlCloudMessageEvent\n[ 2242.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2242.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2302.189] + 2024/01/30 11:35:41.109\n[ 2302.189] + msg received - type=roControlCloudMessageEvent\n[ 2302.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2302.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2362.190] + 2024/01/30 11:36:41.110\n[ 2362.190] + msg received - type=roControlCloudMessageEvent\n[ 2362.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2362.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2422.190] + 2024/01/30 11:37:41.110\n[ 2422.190] + msg received - type=roControlCloudMessageEvent\n[ 2422.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2422.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2424.140] Autorun.status : INFO Sending status request.\n[ 2424.214] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 2424.475] JS.websocket-player : INFO { 2024-01-30T19:37:43.395Z} sync.status.response message received from : BSN with id IWiOCSenD \n[ 2482.190] + 2024/01/30 11:38:41.110\n[ 2482.190] + msg received - type=roControlCloudMessageEvent\n[ 2482.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2482.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2542.189] + 2024/01/30 11:39:41.110\n[ 2542.190] + msg received - type=roControlCloudMessageEvent\n[ 2542.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2542.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2602.189] + 2024/01/30 11:40:41.110\n[ 2602.189] + msg received - type=roControlCloudMessageEvent\n[ 2602.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2602.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2662.190] + 2024/01/30 11:41:41.110\n[ 2662.190] + msg received - type=roControlCloudMessageEvent\n[ 2662.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2662.191] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2722.191] + 2024/01/30 11:42:41.111\n[ 2722.191] + msg received - type=roControlCloudMessageEvent\n[ 2722.191] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2722.192] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2724.141] Autorun.status : INFO Sending status request.\n[ 2724.223] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 2724.422] JS.websocket-player : INFO { 2024-01-30T19:42:43.342Z} sync.status.response message received from : BSN with id 0Tf-kpexl \n[ 2782.192] + 2024/01/30 11:43:41.112\n[ 2782.192] + msg received - type=roControlCloudMessageEvent\n[ 2782.192] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2782.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2842.192] + 2024/01/30 11:44:41.113\n[ 2842.193] + msg received - type=roControlCloudMessageEvent\n[ 2842.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2842.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2902.192] + 2024/01/30 11:45:41.113\n[ 2902.193] + msg received - type=roControlCloudMessageEvent\n[ 2902.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2902.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2962.192] + 2024/01/30 11:46:41.112\n[ 2962.192] + msg received - type=roControlCloudMessageEvent\n[ 2962.192] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2962.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3022.193] + 2024/01/30 11:47:41.113\n[ 3022.193] + msg received - type=roControlCloudMessageEvent\n[ 3022.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3022.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3024.141] Autorun.status : INFO Sending status request.\n[ 3024.223] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 3024.402] JS.websocket-player : INFO { 2024-01-30T19:47:43.322Z} sync.status.response message received from : BSN with id hxndYuC9z \n[ 3082.194] + 2024/01/30 11:48:41.114\n[ 3082.194] + msg received - type=roControlCloudMessageEvent\n[ 3082.194] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3082.195] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3142.194] + 2024/01/30 11:49:41.114\n[ 3142.194] + msg received - type=roControlCloudMessageEvent\n[ 3142.194] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3142.195] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3202.195] + 2024/01/30 11:50:41.115\n[ 3202.195] + msg received - type=roControlCloudMessageEvent\n[ 3202.195] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3202.196] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3262.196] + 2024/01/30 11:51:41.116\n[ 3262.196] + msg received - type=roControlCloudMessageEvent\n[ 3262.196] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3262.197] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3322.197] + 2024/01/30 11:52:41.117\n[ 3322.197] + msg received - type=roControlCloudMessageEvent\n[ 3322.197] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3322.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3324.142] Autorun.status : INFO Sending status request.\n[ 3324.216] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 3324.505] JS.websocket-player : INFO { 2024-01-30T19:52:43.425Z} sync.status.response message received from : BSN with id wyhDiXtuW \n[ 3382.198] + 2024/01/30 11:53:41.118\n[ 3382.198] + msg received - type=roControlCloudMessageEvent\n[ 3382.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3382.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3442.197] + 2024/01/30 11:54:41.117\n[ 3442.197] + msg received - type=roControlCloudMessageEvent\n[ 3442.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3442.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3502.197] + 2024/01/30 11:55:41.117\n[ 3502.197] + msg received - type=roControlCloudMessageEvent\n[ 3502.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3502.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3562.198] + 2024/01/30 11:56:41.118\n[ 3562.198] + msg received - type=roControlCloudMessageEvent\n[ 3562.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3562.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3622.198] + 2024/01/30 11:57:41.118\n[ 3622.198] + msg received - type=roControlCloudMessageEvent\n[ 3622.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3622.199] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3624.144] Autorun.status : INFO Sending status request.\n[ 3624.228] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 3624.405] JS.websocket-player : INFO { 2024-01-30T19:57:43.325Z} sync.status.response message received from : BSN with id bvx1CZgZs \n[ 3626.808] IP:eth0 RENEW6 ip=2600:1700:dac0:2060::23 dns=\n[ 3682.199] + 2024/01/30 11:58:41.119\n[ 3682.199] + msg received - type=roControlCloudMessageEvent\n[ 3682.199] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3682.199] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3742.199] + 2024/01/30 11:59:41.119\n[ 3742.199] + msg received - type=roControlCloudMessageEvent\n[ 3742.199] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3742.199] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3802.199] + 2024/01/30 12:00:41.120\n[ 3802.199] + msg received - type=roControlCloudMessageEvent\n[ 3802.200] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3802.200] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3862.200] + 2024/01/30 12:01:41.120\n[ 3862.200] + msg received - type=roControlCloudMessageEvent\n[ 3862.200] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3862.200] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3922.200] + 2024/01/30 12:02:41.120\n[ 3922.200] + msg received - type=roControlCloudMessageEvent\n[ 3922.201] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3922.201] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3924.144] Autorun.status : INFO Sending status request.\n[ 3924.221] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 3924.396] JS.websocket-player : INFO { 2024-01-30T20:02:43.316Z} sync.status.response message received from : BSN with id DyR2szE_x \n[ 3982.200] + 2024/01/30 12:03:41.120\n[ 3982.200] + msg received - type=roControlCloudMessageEvent\n[ 3982.200] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3982.201] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4042.201] + 2024/01/30 12:04:41.121\n[ 4042.201] + msg received - type=roControlCloudMessageEvent\n[ 4042.201] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4042.202] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4102.202] + 2024/01/30 12:05:41.122\n[ 4102.202] + msg received - type=roControlCloudMessageEvent\n[ 4102.202] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4102.202] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4162.203] + 2024/01/30 12:06:41.123\n[ 4162.203] + msg received - type=roControlCloudMessageEvent\n[ 4162.203] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4162.203] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4222.203] + 2024/01/30 12:07:41.124\n[ 4222.204] + msg received - type=roControlCloudMessageEvent\n[ 4222.204] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4222.204] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4224.145] Autorun.status : INFO Sending status request.\n[ 4224.221] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 4224.409] JS.websocket-player : INFO { 2024-01-30T20:07:43.329Z} sync.status.response message received from : BSN with id t6EH5eEYa \n[ 4282.204] + 2024/01/30 12:08:41.124\n[ 4282.204] + msg received - type=roControlCloudMessageEvent\n[ 4282.204] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4282.204] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4342.204] + 2024/01/30 12:09:41.125\n[ 4342.204] + msg received - type=roControlCloudMessageEvent\n[ 4342.205] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4342.205] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4402.205] + 2024/01/30 12:10:41.125\n[ 4402.205] + msg received - type=roControlCloudMessageEvent\n[ 4402.205] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4402.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4462.206] + 2024/01/30 12:11:41.126\n[ 4462.206] + msg received - type=roControlCloudMessageEvent\n[ 4462.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4462.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4522.206] + 2024/01/30 12:12:41.126\n[ 4522.206] + msg received - type=roControlCloudMessageEvent\n[ 4522.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4522.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4524.147] Autorun.status : INFO Sending status request.\n[ 4524.235] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 4524.411] JS.websocket-player : INFO { 2024-01-30T20:12:43.332Z} sync.status.response message received from : BSN with id qnQKAJMph \n[ 4582.206] + 2024/01/30 12:13:41.126\n[ 4582.206] + msg received - type=roControlCloudMessageEvent\n[ 4582.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4582.207] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4642.206] + 2024/01/30 12:14:41.126\n[ 4642.206] + msg received - type=roControlCloudMessageEvent\n[ 4642.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4642.207] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4702.207] + 2024/01/30 12:15:41.127\n[ 4702.207] + msg received - type=roControlCloudMessageEvent\n[ 4702.207] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4702.208] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4762.208] + 2024/01/30 12:16:41.128\n[ 4762.208] + msg received - type=roControlCloudMessageEvent\n[ 4762.208] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4762.208] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4822.209] + 2024/01/30 12:17:41.129\n[ 4822.209] + msg received - type=roControlCloudMessageEvent\n[ 4822.209] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4822.209] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4824.147] Autorun.status : INFO Sending status request.\n[ 4824.228] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 4824.411] JS.websocket-player : INFO { 2024-01-30T20:17:43.331Z} sync.status.response message received from : BSN with id JqX7bWMq_ \n[ 4882.210] + 2024/01/30 12:18:41.130\n[ 4882.210] + msg received - type=roControlCloudMessageEvent\n[ 4882.210] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4882.210] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4942.211] + 2024/01/30 12:19:41.131\n[ 4942.211] + msg received - type=roControlCloudMessageEvent\n[ 4942.211] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4942.211] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5002.212] + 2024/01/30 12:20:41.132\n[ 5002.212] + msg received - type=roControlCloudMessageEvent\n[ 5002.212] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5002.212] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5062.213] + 2024/01/30 12:21:41.133\n[ 5062.213] + msg received - type=roControlCloudMessageEvent\n[ 5062.213] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5062.213] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5122.213] + 2024/01/30 12:22:41.134\n[ 5122.213] + msg received - type=roControlCloudMessageEvent\n[ 5122.213] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5122.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5124.149] Autorun.status : INFO Sending status request.\n[ 5124.222] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 5124.480] JS.websocket-player : INFO { 2024-01-30T20:22:43.400Z} sync.status.response message received from : BSN with id JV5LuEB1W \n[ 5182.213] + 2024/01/30 12:23:41.134\n[ 5182.213] + msg received - type=roControlCloudMessageEvent\n[ 5182.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5182.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5242.213] + 2024/01/30 12:24:41.134\n[ 5242.213] + msg received - type=roControlCloudMessageEvent\n[ 5242.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5242.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5302.213] + 2024/01/30 12:25:41.134\n[ 5302.213] + msg received - type=roControlCloudMessageEvent\n[ 5302.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5302.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5362.213] + 2024/01/30 12:26:41.134\n[ 5362.213] + msg received - type=roControlCloudMessageEvent\n[ 5362.213] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5362.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5422.214] + 2024/01/30 12:27:41.134\n[ 5422.214] + msg received - type=roControlCloudMessageEvent\n[ 5422.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5422.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5424.150] Autorun.status : INFO Sending status request.\n[ 5424.232] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 5424.390] JS.websocket-player : INFO { 2024-01-30T20:27:43.310Z} sync.status.response message received from : BSN with id 3wquNZz3F \n[ 5426.828] IP:eth0 RENEW6 ip=2600:1700:dac0:2060::23 dns=\n[ 5482.215] + 2024/01/30 12:28:41.135\n[ 5482.215] + msg received - type=roControlCloudMessageEvent\n[ 5482.215] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5482.215] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5542.215] + 2024/01/30 12:29:41.136\n[ 5542.215] + msg received - type=roControlCloudMessageEvent\n[ 5542.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5542.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5602.216] + 2024/01/30 12:30:41.136\n[ 5602.216] + msg received - type=roControlCloudMessageEvent\n[ 5602.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5602.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5662.216] + 2024/01/30 12:31:41.137\n[ 5662.216] + msg received - type=roControlCloudMessageEvent\n[ 5662.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5662.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5722.216] + 2024/01/30 12:32:41.136\n[ 5722.216] + msg received - type=roControlCloudMessageEvent\n[ 5722.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5722.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5724.149] Autorun.status : INFO Sending status request.\n[ 5724.223] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 5724.376] JS.websocket-player : INFO { 2024-01-30T20:32:43.296Z} sync.status.response message received from : BSN with id IlkmBD5w7 \n[ 5782.216] + 2024/01/30 12:33:41.137\n[ 5782.216] + msg received - type=roControlCloudMessageEvent\n[ 5782.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5782.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5842.217] + 2024/01/30 12:34:41.137\n[ 5842.217] + msg received - type=roControlCloudMessageEvent\n[ 5842.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5842.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5902.217] + 2024/01/30 12:35:41.137\n[ 5902.217] + msg received - type=roControlCloudMessageEvent\n[ 5902.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5902.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5962.217] + 2024/01/30 12:36:41.138\n[ 5962.218] + msg received - type=roControlCloudMessageEvent\n[ 5962.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5962.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6022.218] + 2024/01/30 12:37:41.138\n[ 6022.218] + msg received - type=roControlCloudMessageEvent\n[ 6022.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6022.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6024.151] Autorun.status : INFO Sending status request.\n[ 6024.222] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 6024.381] JS.websocket-player : INFO { 2024-01-30T20:37:43.302Z} sync.status.response message received from : BSN with id ItLZRehlv \n[ 6082.218] + 2024/01/30 12:38:41.139\n[ 6082.218] + msg received - type=roControlCloudMessageEvent\n[ 6082.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6082.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6142.218] + 2024/01/30 12:39:41.138\n[ 6142.218] + msg received - type=roControlCloudMessageEvent\n[ 6142.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6142.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6202.218] + 2024/01/30 12:40:41.139\n[ 6202.218] + msg received - type=roControlCloudMessageEvent\n[ 6202.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6202.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6262.218] + 2024/01/30 12:41:41.138\n[ 6262.218] + msg received - type=roControlCloudMessageEvent\n[ 6262.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6262.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6322.218] + 2024/01/30 12:42:41.139\n[ 6322.218] + msg received - type=roControlCloudMessageEvent\n[ 6322.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6322.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6324.152] Autorun.status : INFO Sending status request.\n[ 6324.234] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 6324.460] JS.websocket-player : INFO { 2024-01-30T20:42:43.380Z} sync.status.response message received from : BSN with id L-yzvZBZL \n[ 6382.218] + 2024/01/30 12:43:41.138\n[ 6382.218] + msg received - type=roControlCloudMessageEvent\n[ 6382.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6382.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6442.218] + 2024/01/30 12:44:41.138\n[ 6442.218] + msg received - type=roControlCloudMessageEvent\n[ 6442.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6442.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6502.218] + 2024/01/30 12:45:41.139\n[ 6502.218] + msg received - type=roControlCloudMessageEvent\n[ 6502.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6502.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6562.218] + 2024/01/30 12:46:41.139\n[ 6562.218] + msg received - type=roControlCloudMessageEvent\n[ 6562.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6562.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6622.218] + 2024/01/30 12:47:41.139\n[ 6622.218] + msg received - type=roControlCloudMessageEvent\n[ 6622.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6622.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6624.153] Autorun.status : INFO Sending status request.\n[ 6624.225] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 6624.388] JS.websocket-player : INFO { 2024-01-30T20:47:43.309Z} sync.status.response message received from : BSN with id ooDgOUxu0 \n[ 6682.219] + 2024/01/30 12:48:41.139\n[ 6682.219] + msg received - type=roControlCloudMessageEvent\n[ 6682.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6682.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6742.219] + 2024/01/30 12:49:41.139\n[ 6742.219] + msg received - type=roControlCloudMessageEvent\n[ 6742.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6742.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6802.220] + 2024/01/30 12:50:41.140\n[ 6802.220] + msg received - type=roControlCloudMessageEvent\n[ 6802.220] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6802.220] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6862.220] + 2024/01/30 12:51:41.141\n[ 6862.220] + msg received - type=roControlCloudMessageEvent\n[ 6862.220] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6862.221] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6922.220] + 2024/01/30 12:52:41.141\n[ 6922.220] + msg received - type=roControlCloudMessageEvent\n[ 6922.220] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6922.221] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6924.155] Autorun.status : INFO Sending status request.\n[ 6924.234] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 6924.413] JS.websocket-player : INFO { 2024-01-30T20:52:43.334Z} sync.status.response message received from : BSN with id mz4Z0TYJX \n[ 6982.220] + 2024/01/30 12:53:41.141\n[ 6982.220] + msg received - type=roControlCloudMessageEvent\n[ 6982.220] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6982.221] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7042.221] + 2024/01/30 12:54:41.141\n[ 7042.221] + msg received - type=roControlCloudMessageEvent\n[ 7042.221] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7042.221] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7102.222] + 2024/01/30 12:55:41.142\n[ 7102.222] + msg received - type=roControlCloudMessageEvent\n[ 7102.222] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7102.222] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7162.222] + 2024/01/30 12:56:41.143\n[ 7162.222] + msg received - type=roControlCloudMessageEvent\n[ 7162.223] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7162.223] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7222.222] + 2024/01/30 12:57:41.142\n[ 7222.222] + msg received - type=roControlCloudMessageEvent\n[ 7222.222] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7222.222] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7222.701] Looking for recovery script at 'https://handlers.bsn.cloud//recovery/recovery.ashx'\n[ 7223.257] Recovery server response code: 204\n[ 7224.155] Autorun.status : INFO Sending status request.\n[ 7224.236] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 7224.530] JS.websocket-player : INFO { 2024-01-30T20:57:43.450Z} sync.status.response message received from : BSN with id l_tS57W_9 \n[ 7226.840] IP:eth0 RENEW6 ip=2600:1700:dac0:2060::23 dns=\n[ 7282.223] + 2024/01/30 12:58:41.143\n[ 7282.223] + msg received - type=roControlCloudMessageEvent\n[ 7282.223] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7282.223] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7342.223] + 2024/01/30 12:59:41.144\n[ 7342.224] + msg received - type=roControlCloudMessageEvent\n[ 7342.224] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7342.224] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7402.224] + 2024/01/30 13:00:41.145\n[ 7402.225] + msg received - type=roControlCloudMessageEvent\n[ 7402.225] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7402.225] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7462.225] + 2024/01/30 13:01:41.146\n[ 7462.225] + msg received - type=roControlCloudMessageEvent\n[ 7462.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7462.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7522.226] + 2024/01/30 13:02:41.147\n[ 7522.226] + msg received - type=roControlCloudMessageEvent\n[ 7522.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7522.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7524.155] Autorun.status : INFO Sending status request.\n[ 7524.228] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 7524.394] JS.websocket-player : INFO { 2024-01-30T21:02:43.315Z} sync.status.response message received from : BSN with id 9ED8KuHc8 \n[ 7582.226] + 2024/01/30 13:03:41.147\n[ 7582.226] + msg received - type=roControlCloudMessageEvent\n[ 7582.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7582.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7642.226] + 2024/01/30 13:04:41.147\n[ 7642.226] + msg received - type=roControlCloudMessageEvent\n[ 7642.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7642.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7702.226] + 2024/01/30 13:05:41.146\n[ 7702.226] + msg received - type=roControlCloudMessageEvent\n[ 7702.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7702.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7762.226] + 2024/01/30 13:06:41.147\n[ 7762.226] + msg received - type=roControlCloudMessageEvent\n[ 7762.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7762.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7822.226] + 2024/01/30 13:07:41.146\n[ 7822.226] + msg received - type=roControlCloudMessageEvent\n[ 7822.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7822.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7824.156] Autorun.status : INFO Sending status request.\n[ 7824.228] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 7824.403] JS.websocket-player : INFO { 2024-01-30T21:07:43.324Z} sync.status.response message received from : BSN with id n0c2crjUe \n[ 7882.226] + 2024/01/30 13:08:41.147\n[ 7882.226] + msg received - type=roControlCloudMessageEvent\n[ 7882.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7882.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7942.226] + 2024/01/30 13:09:41.147\n[ 7942.226] + msg received - type=roControlCloudMessageEvent\n[ 7942.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7942.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8002.227] + 2024/01/30 13:10:41.148\n[ 8002.227] + msg received - type=roControlCloudMessageEvent\n[ 8002.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8002.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8062.227] + 2024/01/30 13:11:41.148\n[ 8062.227] + msg received - type=roControlCloudMessageEvent\n[ 8062.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8062.228] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8122.228] + 2024/01/30 13:12:41.148\n[ 8122.228] + msg received - type=roControlCloudMessageEvent\n[ 8122.228] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8122.228] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8124.156] Autorun.status : INFO Sending status request.\n[ 8124.242] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 8124.403] JS.websocket-player : INFO { 2024-01-30T21:12:43.323Z} sync.status.response message received from : BSN with id -ug-wSq34 \n[ 8182.228] + 2024/01/30 13:13:41.148\n[ 8182.228] + msg received - type=roControlCloudMessageEvent\n[ 8182.228] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8182.228] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8242.228] + 2024/01/30 13:14:41.149\n[ 8242.228] + msg received - type=roControlCloudMessageEvent\n[ 8242.229] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8242.229] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8302.228] + 2024/01/30 13:15:41.149\n[ 8302.228] + msg received - type=roControlCloudMessageEvent\n[ 8302.229] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8302.229] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8362.229] + 2024/01/30 13:16:41.150\n[ 8362.230] + msg received - type=roControlCloudMessageEvent\n[ 8362.230] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8362.230] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8422.230] + 2024/01/30 13:17:41.151\n[ 8422.231] + msg received - type=roControlCloudMessageEvent\n[ 8422.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8422.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8424.157] Autorun.status : INFO Sending status request.\n[ 8424.232] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 8424.382] JS.websocket-player : INFO { 2024-01-30T21:17:43.302Z} sync.status.response message received from : BSN with id D6O8fa1kH \n[ 8482.231] + 2024/01/30 13:18:41.151\n[ 8482.231] + msg received - type=roControlCloudMessageEvent\n[ 8482.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8482.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8542.231] + 2024/01/30 13:19:41.151\n[ 8542.231] + msg received - type=roControlCloudMessageEvent\n[ 8542.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8542.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8548.004] JS.websocket-player : INFO { 2024-01-30T21:19:46.924Z} RestRequest message received from : ws-rest-server-4403a96c-2fb4-4a4c-bf1e-e56a88b853b5 with id 4403a96c-2fb4-4a4c-bf1e-e56a88b853b5 for /v1/video/hdmi/output/0/edid\n[ 8548.021] JS.Supervisor : INFO API GET request \"/v1/video/hdmi/output/0/edid\"\n[ 8548.043] JS.Supervisor : INFO API response to \"/v1/video/hdmi/output/0/edid\" => \"00ffffffffffff004c2d0d050100000030120103801009780aee91a3544c99260f5054bdef80714f8100814081809500950fb3000101023a801871382d40582c4500a05a0000001e662150b051001b3040703600a05a0000001e000000fd00184b1a5117000a202020202020000000fc0053414d53554e470a2020202020016... [truncated]\n[ 8548.055] JS.websocket-player : INFO received rest response : 200\n[ 8548.069] JS.websocket-player : INFO { 2024-01-30T21:19:46.990Z} RestResponse sending response to ws-rest-server-4403a96c-2fb4-4a4c-bf1e-e56a88b853b5 with id 4403a96c-2fb4-4a4c-bf1e-e56a88b853b5 for /v1/video/hdmi/output/0/edid\n[ 8602.231] + 2024/01/30 13:20:41.152\n[ 8602.231] + msg received - type=roControlCloudMessageEvent\n[ 8602.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8602.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8662.231] + 2024/01/30 13:21:41.152\n[ 8662.231] + msg received - type=roControlCloudMessageEvent\n[ 8662.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8662.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8722.231] + 2024/01/30 13:22:41.152\n[ 8722.231] + msg received - type=roControlCloudMessageEvent\n[ 8722.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8722.232] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8724.158] Autorun.status : INFO Sending status request.\n[ 8724.230] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 8724.422] JS.websocket-player : INFO { 2024-01-30T21:22:43.342Z} sync.status.response message received from : BSN with id CK7se1dIO \n[ 8741.382] JS.websocket-player : INFO { 2024-01-30T21:23:00.303Z} RestRequest message received from : ws-rest-server-fff9eb81-7bb3-40e8-b575-73e50d5ad751 with id fff9eb81-7bb3-40e8-b575-73e50d5ad751 for /v1/logs\n[ 8741.392] JS.Supervisor : INFO API GET request \"/v1/logs\"\n"
    }
}
```

## GET /v1/download-log-package/ 

Directly downloads the player’s serial log as a zip file

**Request Example**

```text
GET /api/v1/download-log-package/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response**

The response is a zip file containing the player’s serial log which can be downloaded directly from your browser.

[title] rDWS Advanced Endpoints
[path] Diagnostic Web Server APIs/Remote DWS APIs/

Base URL for these endpoints:  ***https\://ws.bsn.cloud/rest/v1/***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /advanced/property-lock/

Returns the [property-lock](docId\:a6Ali6u-szxHuansk6T3-) setting and if the registry has been set to override the property-lock value.

**Request Example**

```text
GET /rest/v1/advanced/property-lock/ HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

The server will return a success or error message. A successful response will include:

- `settingsHandlerEnabled` <font color="#704ae0">bool</font>: Whether the [settings handler](docId\:pz4pkahLR3dsSpr-w1sX9) is enabled&#x20;
- `forceRegistrySettings` <font color="#704ae0">bool</font>: Whether registry settings should take priority
- `registryEnableSettings` <font color="#704ae0">bool</font>: The registry value for enable settings handler
- `bsnce` <font color="#704ae0">bool</font>: Whether BSN.cloud is enabled

**Response Example** 

```json
{
    "data": {
        "result": {
            "settingsHandlerEnabled": true,
            "forceRegistrySettings": false,
            "registryEnableSettings": true,
            "bsnce": true
        }
    }
}
```



## PUT /advanced/property-lock/

Lets users override the current [property-lock](docId\:a6Ali6u-szxHuansk6T3-) setting

**Request Body**

- `forceRegistrySettings` <font color="#704ae0">bool</font>: Whether registry settings should take priority
- `registryEnableSettings` <font color="#704ae0">bool</font>: Registry value for enable settings handler

**Request Example**

```text
PUT /rest/v1/advanced/property-lock/ HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

This is an example of the request body:

```json
{
  "data": {
    "forceRegistrySettings": true,
    "registryEnableSettings": true
  }
}
```

**Response Body**

The server will return a success or error message. A successful response will almost always cause a reboot which will be indicated in the response.

- `result` <font color="#704ae0">object</font>: The response object
  - `success` <font color="#704ae0">bool</font>: Whether or not the operation was successful
  - `reboot` <font color="#704ae0">bool</font>: Whether or not the player is rebooting

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": true
        }
    }
}
```


[title] BrightSign Cloud
[path] BSN.Cloud for Partners/

BrightSign Cloud (BSN.Cloud) allows partners to automate new player set up through Device Provisioning (also known as B-Deploy), monitor networks through BrightSign Author, and examine problems through a remote diagnostic web server. This page will go over the basics on how to use these features to manage BrightSign players in your network. BrightSign Author can be accessed through the desktop app or at [app.bsn.cloud](https://app.bsn.cloud/), and BrightSign Control can be accessed through [control.bsn.cloud](http://control.bsn.cloud).

# Device Provisioning (B-Deploy)

Device Provisioning is a service that allows for automated provisioning of BrightSign players over the Internet. In order to use Device Provisioning, CMS partners need to provide and maintain an application URL on an accessible HTTP file server host. The package should be contained in an *autorun.zip* file containing presentation files along with an *autozip.brs* boilerplate script. In most cases, the script will not need to be modified.

Once the package has been hosted, player Setup Files made through BrightSign Author can point players directly to the application URL. Open BrightSign Author and sign into BSN.Cloud to select the cloud network desired. Under **Device Setup**, two options make use of externally hosted applications. The **Custom Application URL** option requires the link to be manually input into the field. The **Partner Application** option provides a drop down menu of applications that have been officially registered with Device Provisioning servers. To get an application URL added to the drop down, contact the Partner Integration team. Add the setup file to the library when done.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/UpWDq7NJNfAH6CFcKNfz1_setupfigure.png)

Go to **Device Provisioning&#x20;**&#x69;n the **Admin** tab. Select **Add Device** and enter the serial number of all players desired. This process will register the player to currently selected BSN.Cloud network. From here, check mark the boxes of all players and apply the setup. Alternatively, clicking **Download Template** will download a Microsoft Excel file that contains columns for Serial Number, Device Name, Setup File, Application URL, and Description. The Excel sheet can be used to help expedite the process by adding multiple serial numbers simultaneously and automatically assigning them setup files and application URLs.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/kDORFW8wrE2ADmN7NSjZ8_provisioningfigure.png)

When everything is entered correctly, the player should automatically query the Device Provisioning servers when connected to the internet and powered on. The Device Provisioning servers will then assign the players the corresponding setup files and point to any application URLs entered, and the player will automatically configure itself and play any presentation files contained in the *autorun.zip*. 

# Re-provisioning vs. Factory Resetting a Player

Cloud-connected players should be re-provisioned rather than factory reset, if they must be refreshed.

:::hint{type="warning"}
If the player to be re-provisioned is currently configured on a network which requires a specification configuration (security, certificates, etc.) or is a Wi-Fi player, choose **Use Current Device Settings** in **Device Setup > Network Configuration** on the bottom left to maintain your player's current network configuration.
:::

Factory reset should only be used if you have local access to the player since it deletes all registry sections and clears network interfaces. The factory reset may leave a remote player in an inaccessible state (it would only be possible to factory reset a player and reconnect to BSN.Cloud if the user has a "Device Provisioning" entry in BrightSign Author, and their network allows a rogue device to retrieve an active ip address for a B-Deploy connection).

# Diagnostic Web Server

For internet-connected players, BrightSign Cloud offers remote access to the Diagnostic Web Server (DWS). The DWS provides the ability to view key info about players, access to diagnostic tools for troubleshooting, the ability to modify player settings and apply OS updates, and much more.

To access the DWS, open BrightSign Author (either the desktop app or the web app at control.bsn.cloud). The **Network** tab provides a list of all registered players on the network. Enter the player's DWS by clicking the gear icon to the right of the desired player.

For complete details about the DWS, see [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM).

[title] HTML Video
[path] HTML Development/

:::hint{type="info"}
The documentation below applies to firmware versions 7.1.x and later.
:::

You can use `<video>` elements to play streaming video (HLS, UDP, RTP, RTSP) and local video files. You can also display HDMI® input on any BrightSign player that has HDMI input (see [this section](docId\:UYYJYeJ6qoJy1HKSbRlPu)).&#x20;

# Streaming Video

Streaming video playback is achieved using the standard HTML \<video> element with an appropriate *src* attribute.  These URL schemes can be used for playback:

- http/https
- udp
- rtp
- rtsp

Note that pause/resume commands currently work for HLS streams only.

## Controlling video elements with JavaScript

The events and controls associated with a HTML5 Video Element are described [here](https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement). It is important to note that the behaviour of the API is *asynchronous*, so application developers should set up the relevant event handlers and create a sensible state machine for their application. In particular note the following.

- Calling `load()` resets a video element to its initial state and begins the process of probing the video source. The `loadedmetadata` event will be raised when the probe is sufficiently complete. For BrightSign players, the behaviour of `load()` is equivalent to setting `{Resume : False}`, in `roVideoPlayer`, i.e. starting the playback in a paused state.
- Setting or resetting the `src` attribute on a video element is equivalent to calling `load()`. However, setting the `src` attribute on and embedded `<source>` tag is not, and `load()` must be explicitly invoked.
- The `play()` method starts the playing process, but returns a `Promise` that is resolved once playing is under way, or rejected if it is not possible to play for some reason.
- Application developers should create handlers for (at least) the `ended` and `error` events.

Failure to account for the asynchrony in the API can lead to surprises. Consider the following:

```javascript
videoElement.load()
videoElement.play()
```

Here, the intention is presumably to initialise and play the video. However, a compliant implementation of the HTML5 specification may schedule the load call to happen some time after control is returned to JavaScript, and the order of calls could flip to `play` followed by `load` resulting in a video that is started in the paused state. Instead, create a `loadedmetadata` handler and invoke `play()` there.

The following is a very basic example for streaming a video over UDP. Note that the error handler is catching error code 4. This can happen when attempting to play a streaming video while the stream is not available. The play attempt times out after six seconds.

```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Video Test</title>
</head>
<body>
    <div id="video_container">
        <video id="test_video"></video>
    </div>

    <script src="video.js"></script>
</body>
</html>
```

```javascript
var url = "udp://239.127.86.1:1234";
var video = document.getElementById('test_video');

function ReloadVideo() {
  // This causes a loadedmetadata event
  video.setAttribute('src', url);
}

video.addEventListener('ended', function() {
  ReloadVideo();
});

video.addEventListener('error', function(e) {
  if (!video.error) {
    return;
  }
    
  switch (video.error.code) {
    case 4:  // MEDIA_ERR_SRC_NOT_SUPPORTED
      ReloadVideo();
      break;
    default:
      break;
  }
});

video.addEventListener('loadedmetadata', async function() {
  try {
    await video.play();
  } catch (err) {
	  // play failed
  }
});

ReloadVideo();
```

## Streaming Parameters

You can configure streaming video using a number of unique BrightSign attributes.  These attributes can be overridden by parameters that are included in the [streaming URL](docId:0Tioy9PJdGG4G25yGBnib).

**Example (HTML)**

```text
<video src="udp://239.192.1.1:5004" x-bs-stream-timeout="0">
```

**Example (JavaScript)**

```javascript
videoPlayer.setAttribute("x-bs-stream-low-latency", "1"); 
```

The following streaming parameters are supported:

- `[int] x-bs-stream-timeout`: The length of time (in milliseconds) to wait for a stream to start before abandoning playback. Passing zero indicates that the video player should wait indefinitely. The default timeout value is 5000ms for HTTP streams and 3000ms for all other streams.
- `[int] x-bs-stream-latency`: The amount of deviation (in milliseconds) from the default latency value: For example, a value of -500 will reduce the latency by half a second; a 500 value will increase the latency by half a second; and a 0 value will specify the default latency. Specifying a negative value will not change the buffer size; instead, it will give the buffer less time to fill up before playback begins. Usable values extend to approximately -750, though this value may differ depending on the network environment. Reducing the latency too much will result in obvious playback stutter.
- `[int] x-bs-stream-fade-in`: The fade-in length (in milliseconds) for streams. By default, non-HTTP streams have a fade value of 1500ms if they contain video and 4000ms if they contain audio only. HTTP streams have a default fade value of 0ms.
- `[int or boolean] x-bs-stream-low-latency`: Low-latency mode for RTSP streams. Setting this parameter to `true` (1) will achieve the lowest possible latency for a stream, but at a reduced maximum bitrate–which is often useful for IP camera streams. This parameter is set to `false` (0) by default.
- `[int] x-bs-intrinsic-width`: The intrinsic width of the source video
- `[int] x-bs-intrinsic-height`: The intrinsic height of the source video.

### Achieving Low Latency

There are three options to reduce latency on Series 3 and 4 BrightSign players:

**x-bs-stream-latency**

The `x-bs-stream-latency` flag (buffer) described above under "Streaming Parameters". In this example, the latency is reduced by half a second (500 milliseconds):

```text
<video src="udp://239.192.1.1:5004" x-bs-stream-latency="-500">
```

**x-bs-no-force-capture**

If the `x-bs-no-force-capture` flag is set to `true`, video capture will bypass frame-rate conversion and introduce the following limitations:

- Transform values other than "identity" will not work.
- Screenshots may not be correct
- The encoded video frame rate and the video mode output must match

For example:

```text
<video src="udp://239.192.1.1:5004" x-bs-no-force-capture="1">
```

**x-bs-no-reordering**

If the `x-bs-no-reordering` flag is set, it will Improve latency but disable playback of B-slices. For example:

```text
<video src="udp://239.192.1.1:5004" x-bs-no-reordering="1">
```

See [this page](docId:0Tioy9PJdGG4G25yGBnib) for more information about modifying the latency of audio or video streams.

### Native Chrome Media Player

Series 5 players support selecting native Chrome for video playback with hardware acceleration or using the default BrightSign Media Player for video playback. You can pick which option is best for your use case (see [HTML Playback Options on Series 5 Players](docId\:Wx7RHJmrG74EQxGXRwqtD)).

**WebRTC**

For WebRTC, BrightSign OS always uses native Chrome video playback.

Series 5 players, running OS 9.0.115 and later, will automatically use hardware-accelerated decode in this case.

Series 4 and older players do not support hardware-accelerated decode with native Chrome video playback. As such, the decode will be done in software, and we only recommend trying this approach with XT4 players.

### Intrinsic Video Size

The following order of precedence is used to determine the intrinsic size of a video:

1. The `x-bs-intrinsic-width` and `x-bs-intrinsic-height` attributes
2. The size of the image specified by the `poster` attribute
3. The `width` and `height` attributes of the `<video>` element
4. The size as reported by the WebMediaPlayer
5. The CSS default size, as defined by [W3C](https://www.w3.org/TR/2011/WD-html5-20110113/video.html): 300x150

If only the `width` and `height` attributes of a `<video>` element are specified, the rendering engine assumes that the intrinsic size of the source video is the same as the `<video>` element size, so it will scale the video to fill the video element, ignoring the aspect ratio of the source video if necessary. Additionally, if the `width` and `height` attributes of a `<video>` are not specified and the size is not available from the sources (for example, if the stream is still loading), the video will initially default to a resolution of 300x150.

If you know the size or aspect ratio of a source video beforehand, you can use the `x-bs-intrinsic-width`/`x-bs-intrinsic-height` attributes to ensure the aspect ratio of the source video is maintained when scaled to fit a `<video>` element: For example, if the video window is oriented as portrait HD (`width=1080, height=1920`), specifying an intrinsic width and height of 1920x1080 ensures that landscape HD videos will scale to fit while maintaining their aspect ratio and letter-boxing appropriately. Likewise, videos will scale to the intrinsic width/height immediately if the `<video>` element lacks `width` and `height` parameters, rather than possibly defaulting to 300x150 for a short time

## YouTube

BrightSign players support YouTube videos and playlists.

## Media Source Extensions

As of OS 8.3, Media Source Extension (MSE) is enabled automatically on Series 4 players. However, it can still be disabled by setting the mse-support flag to 0 in the registry.

MSE support is available for series 3 but it must be specifically enabled. To do this, enter the following code at the BrightSign prompt:

```text
registry write html mse-support 1
```

## HLS Live Streaming

BrightSign players support HLS live streaming, but large playlists (which usually result from the server delivering a DVR playlist rather than a LIVE playlist) will cause performance issues.

# HDMI Input

You must input the video source using the following URI: “tv\:brightsign.biz/hdmi”. Note that you *cannot* substitute another host URL for “brightsign.biz”.

**Example**

```text
<video width="320" height="240" autoplay>
       <source src="tv:brightsign.biz/hdmi">
</video>
```

# Multiple Video Elements

By default, XT, 4K, and XD players support a maximum of two active `<video>` elements at any time (HD/LS models only support one). You can have more than this amount of `<video>` elements on a page as long as additional `<video>` elements have their `src` attribute set to an empty string. By modifying the `src` string, you can enable and disable `<video>` elements on the page.

You can enable Mosiac Mode (using the [BSVideoMode](docId\:chWN7k3a18M3yEUkIs7qN) JavaScript method) to increase the minimum allowed number of `<video>` elements.

# Small Videos

BrightSign players do not support videos that are less than 64 pixels in width or height. However, a video can be scaled down beyond this limit by making the `<video>` element smaller than 64x64. To get the desired downscaling behavior, ensure that the `<video>` element does not have the `viewmode="scale-to-fill-and-crop"` attribute.

# View Mode

In firmware versions 7.0.x and later, HWZ video scales to fit the aspect ratio of a `<video>` element (i.e. `"scale-to-fill"`). In earlier versions of firmware, `<video>` elements maintain the aspect ratio of the source video (i.e. `"scale-to-fit"`). This default behavior can be modified using the `viewmode` attribute; however, we now recommend using standard CSS methods (e.g. `object-fit`) to modify the view mode behavior of a `<video>` element.

- `viewmode="scale-to-fill"`: Scales the video to fill the window. The aspect ratio of the source video is ignored, so the video may appear stretched.
- `viewmode="scale-to-fit"`: Letterboxes the video.
- `viewmode="scale-to-fill-and-crop"`: Scales the video to fill the window. The aspect ratio of the source video is maintained, so the video may be cropped.

# HWZ Video

HTML `<video>` elements can have an optional “hwz” attribute, which is disabled by default. With hwz disabled, video frames are decoded by the dedicated hardware but are routed to the GPU for display. With hwz enabled, video frames are instead routed directly to the hardware compositor, bypassing the GPU. The choice of whether to enable hwz or not depends on the application and there is no single and obviously right answer. Some considerations are:

- The GPU is limited to 8-bit color depth. If 10-bit video is in use, it must be routed to the hardware video plane in order to retain the full color depth.
- In most cases, the GPU is limited to full-HD resolutions. If 4K video is in use, it must be routed to the hardware video plane to avoid loss of resolution. (Even on platforms which can be configured to support 4K graphics, it is unlikely that the GPU will achieve a high enough frame rate for full-motion video playback.)
- The hardware video compositor can perform simple scaling and alpha-blending but does not support arbitrary CSS transforms. Video with complex CSS styling must be routed through the GPU in order to display correctly.  Likewise, any video which needs to be captured as a canvas for WebGL processing must be routed to the GPU. If you want to use CSS transforms on video, player performance will decrease, since it is based on using HWZ rather than the GPU. We recommend testing a manipulated hwz video thoroughly before using it in a production environment.
- If video is routed to the GPU, a graphics repaint is required for every frame. This consumes a large amount of system bandwidth and may result in stuttery playback if the GPU is not able to keep up with the required frame rate at all times.

In general, we recommend routing video to the hardware compositor unless there is a specific need for processing by the GPU. For most applications, routing video to the hardware compositor can be achieved by setting hwz="z-index:-1" on the video element in question.  This causes the compositor to stack the video and graphics layers according to the CSS z-index property.&#x20;

You can also enable hwz for all videos in an HTML widget using one of the following methods:

- *BrightSign Author*: Select the **Enable native video playback** box in the [HTML5 State](docId\:AkrM58NDS_BN6AyhWZRax).
- *BrightAuthor Classic*: Check the **Enable native video plane playback** box in the [HTML5](docId:4TgGPySGfv2i18DiT81BJ) state.
- *BrightScript*: Call `SetHWZDefault("on")` on the [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) instance.

## Z-Ordering HWZ Video

If two video elements are to be routed to the hardware compositor, one of them should be given hwz="z-index:-2".  The one with the lower (more negative) z-index will be stacked behind the other. (Note that in this specific instance the CSS stacking order is overridden.)  Alternatively, it is possible to pass a positive z-index value in the hwz attribute. If this is done, the video elements will be stacked in front of the graphics layer, again overriding the CSS stacking order, and the one with the higher positive value z-index will be in front.

To route video playback to the GPU, pass hwz="off" or hwz="z-index:0" (these are equivalent). The legacy value hwz="on" is equivalent to hwz="z-index:1" and should be avoided.

You can use the CSS z-index property to layer the elements without enabling hwz. The layer order shown below is text on top → video in the middle→ image in the back:

```text
<body style="background-color:blue">
  <div style="position:absolute;color:red;font-size:100px;z-index:-1" > Hello BrightSign </div>
  <img src="poster.png" style="position:absolute;left:0px;top:0px;width:800px;height:800px;z-index:-3"></img>
  <video src="coffee2.mp4" style="position:absolute;left:0px;top:0px;width:480px;height:320px;z-index: -2;" autoplay loop muted></video>
</body>
```

If hwz is enabled, your CSS z-index property (`style="z-index:-1")` will be overridden. Add a z-index value in the hwz attribute to maintain the correct z-ordering positions for all elements:

```text
<body style="background-color:blue">
  <div style="position:absolute;z-index:-1;color: red;font-size: 100px;" hwz="z-index:-1"> Hello World </div>
  <img src="poster.png" style="position:absolute;left:0px;top:0px;width:800px;height:800px;z-index:-3" hwz="z-index:-3"></img>
  <video src="coffee2.mp4" style="position:absolute;left:0px;top:0px;width:480px;height:320px;z-index: -2;" hwz="z-index:-2" autoplay loop muted></video>
</body>
```

## Transforming HWZ Video

You can add the optional "transform" parameter to the "hwz" attribute to rotate or mirror the `<video>` element. The `z-index:` parameter must also be specified for the transform to work. The "transform" parameter can be assigned the following values:

- `identity`: No transformation (default behavior)
- `rot90`: 90 degree clockwise rotation
- `rot180`: 180 degree rotation
- `rot270`: 270 degree clockwise rotation
- `mirror`: Horizontal mirror transformation
- `mirror_rot90`: Mirrored 90 degree clockwise rotation
- `mirror_rot180`: Mirrored 180 degree clockwise rotation
- `mirror_rot270`: Mirrored 270 degree clockwise rotation

:::hint{type="info"}
Multiple HWZ video tag extensions are separated with a semicolon. A semicolon should also be appended to the final parameter.
:::

**Example**

```text
 // Video rotated 180 degrees and behind graphics layer.
<video src="example_movie.mp4" hwz="z-index:-1; transform:rot180;">
```

## Fading HWZ Video Streams

The "fade" parameter allows you to control the fading behavior between streaming videos in a `<video>` element (this setting does not apply to local video). The "fade" parameter allows you to control the fading behavior between decoded videos in a \<video> element (this setting does not apply to HDMI in). It does not affect audio and will operate independently of [StreamFadeIn](docId\:zTUZ0LdazCmL2kQmdBKCn).

The "fade" parameter accepts the following values:

- `auto`: If the video player is currently not showing anything (i.e. it hasn't played anything yet or the previous loaded video was cleared), the next video will fade in. If the video player is currently playing video, is paused, or is stopped without being cleared, the next video will not fade in. This is the default behavior.
- `always` : When a video ends, the video window will go black. The new video will then fade in.
- `never`: Videos transition without fade effects. 

## HWZ Video Transparency Extensions

If hwz is enabled for a \<video> element, the video window can also support luma and chroma keys for video transparency. This is BrightSign’s alternative video transparency implementation when using the native BrightSign MPV.

**Key Value Encoding**

The z-index: parameter must also be specified for transparency to work. The luma and chroma keys are specified as follows: 

- luma-key:\[VALUE]
- cr-key:\[VALUE]
- cb-key:\[VALUE]

Each VALUE is a packed 3-byte range behind the #:

:::BlockQuote
\#\[8 bits mask]\[8 bits high-end of range]\[8 bits low-end of range]
:::

- \# is required, and dropping it invalidates the hwz attribute. 
- Mask is almost always FF to enable the key.&#x20;
- High-end/low-end of range is the inclusive 0–255 range of pixel values to key transparent. For example, for luma-key:#FF2000:
  - mask is FF
  - high 0x20 (32), low 0x00 (0) means make luma 0–32 transparent.&#x20;

The mask is applied as a bitwise AND between the luma/Cb/Cr component (sample) and the mask value. In practice, the typical values used would be either 0x00 or 0xFF. A mask of 0x00, with a min value of 0x00, completely disables that particular component’s contribution to the key. For example, if both the Cb mask and min values are set to 0x00, the Cb component plays no part in the keying. A mask of 0xFF means that the unmasked sample value must fall within the range min \<= sample\_val \<= max to be keyed.

On Series 5+ players, keying behavior is currently undefined if a luma key of #000000 is used. As a workaround, specify the max value as 1 (i.e. use a luma key of #000001), coupled with the appropriate Cr-key/Cb-key values for chroma keying.

**Example**

This is an example of a video on video layer, in front of graphics layer, with luma-keyed video:

:::BlockQuote
\<video src="example\_movie.mp4" hwz="z-index:1; luma-key:#ff0020;">
:::

See *BrightAuthor ChromaLuma-Key-Editor plugin* for a plugin example.

## How Video Decoders are Selected for Playback

The system software selects which video decoder to use based on the resolution probed from the video file. In standard mode, it will attempt to select the decoder that has the closest maximum supported resolution (i.e. 1920x1080 for the HD decoder and 3840x2160 for the 4K decoder), without exceeding that maximum resolution. If a decoder has been configured for Mosaic mode, it will match the video resolution against the specified `timeslice_mode` instead. If both decoders support the same maximum resolution, you can select a decoder by matching the z-order of the *roVideoPlayer* instance (set using the `ToFront()` and `ToBack()` methods) with the z-order of the decoder (set using the *roVideoMode.SetDecoderMode()* method).

You can also select the decoder manually. First, configure the decoder(s) using the *roVideoMode.SetDecoderMode()* method. Then, use the `friendly_name` specified when calling the method to designate a decoder to use for video playback.

To select a decoder in BrightScript, pass an associative array to the *roVideoPlayer.PlayFile()* method containing the `decoder:[friendly_name]` parameter:

`PlayFile({filename:"text_1.mov", decoder:"main-video"})`

To select a decoder for HTML video, include the `decoder:[friendly_name]` property with the `hwz` attribute:

`<video` `hwz="decoder:main-video;"> </video>`
`<video` `hwz="decoder:sd-video;"> </video>`

The `max_usage` of a decoder determines how many video players can be assigned to the decoder using the system software algorithm described above—video players beyond the  `max_usage` limit may be assigned to another decoder or not displayed at all. On the other hand, if you manually assign video players using the `friendly_name` of the decoder, you can assign more video players to the decoder than the `max_usage` limit, but this may cause unpredictable video-display behavior.

# Video Decryption

The HTML `<video>` tag can be used to decrypt video files and IP streams. Streaming decryption is currently only supported with the UDP protocol and the HTTP protocol (when HTTP is paired with an MPEG2 transport stream). If using a UDP multicast MPEG2 transport stream, one of the elemental streams should provide the PCR to the player.

The `<video>` tag supports the `EncryptionAlgorithm` and `EncryptionKey` methods:

- `EncryptionAlgorithm`: The file-encryption algorithm. The following are the current options:
  - "AesCtr": The AES algorithm in CTR mode
  - "AesCtrHmac": The AES algorithm in CTR mode with HMAC
  - "TsAesEcb": The AES algorithm in ECB mode (e.g. with a Harmonic Prostream) with front residual termination. This algorithm is used for streaming encryption/decryption.
  - "TsAesEcbRrt": The AES algorithm in ECB mode (e.g. with a Harmonic Prostream) with rear residual termination. This algorithm is used for streaming encryption/decryption. Available from 9.1.164 on all players except LS3, HD3, HS3, HO3, XD3, XT3, LS4, HS4 and HD4.
  - "TsAesCbcRbt": The AES algorithm in CBC mode with residual block termination. This algorithm is used for streaming encryption/decryption.
  - "TsAesCbcCbt": The AES algorithm in CBC mode with clear block termination. This algorithm is used for streaming encryption/decryption.
- `EncryptionKey`: A byte array consisting of 128 bits of key. If the encryption algorithm is AES-CTR or AES-CTR-HMAC, this is followed by 128 bits of IV.

**Example (HTML)**

```text
<video src="udp://239.192.1.59:5000" EncryptionAlgorithm="TsAesEcb" EncryptionKey="01030507090b0d0f00020406080a0c0e">
```

:::hint{type="info"}
The video player no longer accepts "\{A|A}" AES encryption keys (i.e. where the top and bottom 64 bits of the key are identical).
:::

**Example (JavaScript)**

```javascript
var player = document.getElementById("my_video_player");
player.setAttribute("EncryptionAlgorithm", "TsAesEcb");
player.setAttribute("EncryptionKey", "01030507090b0d0f00020406080a0c0e");
```

# Stream Parsing & Closed Captions

The following optional attributes can be included in an HTML `<video>` tag: "preferredvideo", "preferredaudio", and "preferredcaptions". If multiple video, audio, or data streams are encapsulated in the video input, these attributes allow you to determine which stream to use. For example, if a video may contain English and Spanish audio tracks, you can use the "preferredaudio" attribute to specify that the Spanish track should be played if it exists, with the video defaulting to English otherwise.

Preferred streams are chosen by matching the supplied text patterns against the textual description of the stream:

1. Each attribute ("preferredvideo", "preferredaudio", or "preferredcaptions") is a semicolon-separated list of templates.
2. Each template is a comma-separated list of patterns.
3. Each pattern is a `[field_name]=[field_value]` pair that is matched directly against the stream description.

## Video Streams

Each template in a "preferredvideo" attribute can contain the following patterns:

- `pid=[integer]`: The packet identifier (PID) of the video stream you wish to display
- `program=[integer]`: The program number of the video stream
- `codec=[video_codec]`: The preferred video codec, which can be any of the following:
  - `MPEG1`
  - `MPEG2`
  - `MPEG4Part2`
  - `H263`
  - `H264`
  - `VC1`
  - `H265`
- `width=[integer]`: The preferred video width
- `height=[integer]`: The preferred video height
- `aspect=[float(x.yy)]`: The preferred aspect ratio of the video stream as a floating-point number with two fractional digits.
- `colordepth=[integer]`: The preferred color depth of the video.

**Example**

```text
preferredvideo="pid=7680, codec=H264, width=1280, height=720, aspect=1.78, colordepth=8;;"
```

## Audio Streams

Each template in a "preferredaudio" attribute can contain the following patterns:

- `pid=[integer]`: The packet identifier (PID) of the audio stream you wish to play
- `program=[integer]`: The program number of the audio stream
- `codec=[audio_codec]`: The preferred audio codec, which can be any of the following:
  - `MPEG`
  - `MP3`
  - `AAC`
  - `AAC-PLUS`
  - `AC3`
  - `AC3-PLUS`
  - `DTS`
  - `PCM`
  - `FLAC`
  - `Vorbis`
- `channels=[integer]`: The preferred number of audio channels (from 1 to 8)
- `freq=[frequency]`: The preferred sample frequency of the audio track, which can be any of the following:
  - `32000`
  - `44100`
  - `48000`
- `lang=[language]`: A code that determines the preferred language of the audio track (e.g. `eng`, `spa`). The language codes are specified in the ISO 639-2 standard.
- `type=[audio_type]`: The preferred audio type, which can be one of the following:
  - `Main audio`
  - `Clean effects`
  - `Hearing impaired`
  - `Visual impaired commentary`

**Example**

```text
preferredaudio="pid=4192, codec=AC3, channels=5, freq=48000, lang=eng, type=Main audio;;"
```

## Subtitle and Caption Streams

:::hint{type="info"}
The terms "caption," "closed captions," and "closed captioning" are used interchangeably in these documents.
:::

Each template in a "preferredcaption" attribute can contain the following patterns:

- `pid=[integer]`: The packet identifier (PID) of the caption stream you wish to play
- `type=[subtitle_type]`: The encoding standard of the subtitles. This value can be one of the following:
  - `CEA708`: If the CEA-708 standard is not present, the subtitle\_type will default to CEA-608 (if it is present).
  - `CEA608`
  - `DVB`
- `lang=[language]`: A code that determines the preferred language of the subtitles (e.g. `eng`, `spa`). The language codes are specified in the ISO 639-2 standard.
- `service=[integer]`: The preferred service number of the caption stream

**Example**

```text
preferredcaptions="pid=0, type=Cea708, lang=eng service=1;;"
```

:::hint{type="info"}
Subtitles and captions are rendered on the graphics layer, and `hwz` must be set to `z-index -1` or `z-index -2` to place the video behind the graphics. Otherwise the subtitles and/or captions will be covered by the video.
:::

## Pattern Matching Behavior

Note the following when matching templates to stream descriptions:

- For a template to match a stream description, every pattern within the template must match.
- The first listed template to match the stream description (if any) will be used.
- An empty template string will match any stream description.
- All value comparisons are case-insensitive.
- Numerical values must match the stream description exactly (without leading zeroes). For example, the pattern `pid=016` will never match the stream PID value of 16.
- To indicate logical negation, apply the "!" exclamation mark to the beginning of a pattern. For example, specifying `preferredvideo="!codec=H265"` will match only streams that are not encoded using H.265.
- Apply the ">" greater-than symbol before an integer to indicate that, for a successful match, the value in the stream description must be *greater than* the value following the symbol. For example, specifying `preferredvideo="width=<1921,height=<1081"` will match only videos that are no larger than full-HD.
- Apply the "\<" less-than symbol before an integer to indicate that, for a successful match, the value in the stream description must be *less than* the value following the symbol.

## Further Examples

The following template list contains three patterns: `lang=eng`, `lang=spa`, and an empty string. The first pattern specifies an English language channel; if the English channel does not exist, the second pattern specifies a Spanish language channel. The third pattern specifies any other channel if the first two don't exist (the empty string matches anything).

```text
preferredaudio="lang=eng;lang=spa;;"
```

Since the following template list is empty, no captions are specified. This can be used to disable captions altogether.

```text
preferredcaptions=""
```

The following template list contains an empty string template. Since an empty template matches anything, the first video stream encountered will be played. This is the default behavior of all attributes.

```text
preferredvideo=";"
```

The following template list specifies a 48KHz audio stream if there is one; otherwise, no audio stream will be played. Observe that the list is not terminated with a semicolon; in this case, the semi-colon is implicitly supplied.

```text
preferredaudio="freq=48000"
```

The following template list contains two templates. Note that all patterns within a template must match the stream description for the entire template to match. In this example, an AAC-encoded English track is preferred; an MP3-encoded English track is designated as the second option; and any track will be chosen if neither template is matched.

```text
preferredaudio="codec=aac,lang=eng;codec=mp3,lang=eng;;"
```

# Video Track Switching

The BrightSign media playback framework does not support dynamic switching among tracks via HTML5 video/audio. However, it does support querying track information using the [Tracklist API](https://www.w3.org/TR/html5/embedded-content-0.html#audiotracklist-and-videotracklist-objects). The following steps outline how to select tracks using this API.

1. Create a video element in JavaScript that is not attached to the DOM (i.e. that is invisible).
2. Set the `onloadedmetadata` event listener.
3. Set the `src` of the media URL.
4. Call `load()` on the HTML5 video element. This will trigger the `loadedmetadata` event.
5. Read the track information from the event.
6. Create a new HTML5 video player and use the track information to set the `preferredAudio`, `preferredVideo`, and `preferredSubtitle` parameters (described above).
7. Call `load()`/`play()` on the video element.
8. Append the video element to the DOM.

:::hint{type="info"}
When switching from one video to another, it is important to set the video source to be blank to release the video element, otherwise the first video(s) will continue to use memory while subsequent videos are playing. See line 12 in the code example below.
:::

**Example**

```text
<!DOCTYPE html>
<head>
  <script>
var video;

function playTrackNext()
{
  // Switch to audio/video 1
  var pid = video.videoTracks[1].id;
  var audiopid = video.audioTracks[1].id;
  // release the video element
  video.src = "";                            
  // create a new video element
  video = document.createElement('video');   
  video.src = "http://brightsign.biz/example.ts";
  video.hwz = "on";
  video.preferredvideo = "pid=" + pid;       
  // use the params we gathered from previous video load
  video.preferredaudio = "pid=" + audiopid;
  video.load();
  video.play();
  document.getElementById("videoarea").appendChild(video);
}


function runTest()
{
  // Initialize testing bs/javascript bridge.
  bs.start();
  // Initial load of media to gather track information
  video = document.createElement('video');
  video.onloadedmetadata = playTrackNext; // play track 0
  video.src = "http://brightsign.biz/example.ts";
  video.hwz = "on";
  video.load(); // will trigger loadedmetadata event once the video is loaded.
}
  </script>
</head>
<html>
  <body bgcolor="#E6E6FA" onload="runTest()">
    <h1>Video Audio Tracks Test Page</h1>
    <div id="videoarea"></div>
</html>
```

# Audio Routing \<audio>/\<video> Elements

BrightSign players have unique audio attributes for `<audio>/<video>` elements. These allow you to control how the audio is routed through the player outputs:

- `Pcmaudio`: PCM audio
- `Compaudio`: Compressed audio
- `Multiaudio`: Multi-channel audio

Each attribute can be passed the following values, which determine where the audio will be routed:

- `“none”`
- `"hdmi”` or `"hdmi-1"`, `"hdmi-2"`, `"hdmi-3"`, or `"hdmi-4`" for Series 5 players with multiple outputs
- `“usb”`
- `“spdif”`
- `"analog"`
- `“analog:N”` (N specifies the port enumeration, which is useful for models with multiple analog-audio ports; you can also use `"analog:1"` to specify the analog output on a model with a single analog-audio port)

:::hint{type="info"}
If you don’t assign any audio attributes to an `<audio>/<video>` element, then the audio will be routed to all audio outputs, along with any other audio that is currently playing.
:::

**Example 1**

```text
<video src="example_movie.mp4" width="512" height="400" pcmaudio="hdmi" autoplay>
  Your browser does not support the video tag.
</video>
```

**Example 2**

```text
<video src="example_movie.mp4" width="512" height="400" compaudio="hdmi;usb" autoplay>
  Your browser does not support the video tag.
</video>
```

# HTML Video Timecode Playback

BrightSign precision for HTML video timecode playback is 200ms.

# Chroma Keying

BrightSign chroma key settings consist of a mask, and a minimum and maximum value. The minimum and maximum are the most important values since the mask is really only useful for “special effects”. Each pixel of every frame is checked to see if it is between the minimum and maximum values and if it is, the pixel is set to fully transparent. If it is outside the range, the pixel is fully opaque. This means you will have a hard edge, not a gradual fade, where the video goes from opaque to transparent.

## Chroma Key Tips

- To get better chroma keying, do not anti-alias any pixels that should be transparent. You will then be able to target a single transparency color rather than a range.
- If your video is compressed, the chroma is sub-sampled, so there will be edges where the chroma will end up as an intermediate value between green and the frame color. CGI animations with green holes often have anti-aliasing which will result in a fade of green around edges. You may be able to chroma keyed out these edges with the values shown in the examples below (in these examples, v is an [roVideoPlayer](docId\:e6uJleH69Q0JmMv8kyTrp) object).
- The easiest color to remove from content is black which has a luma value of 0, because the video has sub-sampled chroma (4:2:0 rather than 4:4:4). Using luma keying means that every pixel can be accurately keyed.
- White is luma 240 (it's not quite a full range 8 bit value), but the chroma can mean that it contains many other bright colors, so it's hard to just remove white.
- Arbitrary colors are hard to deal with, as they involve specifying a small range of chroma values which must be calculated. The color to be removed has to be calculated in YCbCr, and the Cb and Cr values are used for the chroma keying. If the source is CGI then the range used can be very tight since a single color is made transparent. If the video source was live footage shot against a green screen, then the range needs to be much wider to accommodate the range of green colors in the video.

## Examples

**Lower Chroma Key Values**

Here the Cr range is 0-32 and the Cb range is 0-48. This may leave a green halo around areas that were blended to give a smoother look since chroma keying can't do smooth transitions.

```text
v.SetKeyingValue({cr:&hff2000, cb:&hff3000})
```

**Higher Chroma Key Values**

This example covers a much larger range of colors:

```text
v.SetKeyingValue({cr:&hff7000, cb:&hff7000})  
```

# Other Settings

**Show/Drop Frames**

This setting lets you configure whether to show frames with errors or drop them (which can cause pauses). It is available as of BOS 9.1.137.&#x20;

```none
<video id="myVideo" src="stream.ts" x-bs-drop-error-frames="false" autoplay></video>
```




[title] BrightSign Control Integration
[path] BrightSign Partner Packet/Integrating with BrightSign/

Partners are highly encouraged to take advantage of the free, yet powerful, tools offered by BrightSign Control. The two most common ways for partners to use BrightSign Control are:

- The “Swivel” approach
- API integration between the partner CMS and BrightSign Control

# “Swivel” Approach

One of the easiest ways for a partner to get up and running is with the “Swivel Chair” approach. With this method, end users use BrightSign Control *alongside* the partner CMS.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/KkbOdHKHGRjSNLMX7oyiP_screenshot-2026-08-06-at-15544-pm.png)

With this approach, end users have full access to the capabilities of BrightSign Control via the unbranded web interface at *control.bsn.cloud*. By having one browser tab for the CMS and another browser tab for BrightSign Control, users can quickly “swivel” back and forth between the CMS and BrightSign Control.

![image-20230215-213716-20240404-194936.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/AoumrJd1v3PqRy4oTPbt__image-20230215-213716-20240404-194936.png)

# API Integration

Using BrightSign’s APIs, partners are able to design their own custom user interfaces to access the underlying functions of BrightSign Control. End users will then interact with a single UI for authoring, publishing, content management, and player management.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/mvX1klkFKZWLgFw5o9ZAd_screenshot-2026-08-06-at-15713-pm.png)

Next, let’s take a look at one of the ways BrightSign Control can used to remotely provision players.

[Next - App URL/CMS URL >](docId\:iuUye5z0AJS1MuEqSrRhW)

[title] How to Efficiently Restart Applications on a Player
[path] HTML Development/

To debug or restart your application on a BrightSign player:

1. Connect to the player using SSH or Telnet:
   1. Enable SSH or Telnet from the DWS. See [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM).
   2. Enable SSH programmatically. See [Useful Telnet and SSH flags](docId\:FXXyu9jmocUtC6XE2p7l2).
   3. Access SSH. See [Accessing Telnet](docId\:FXXyu9jmocUtC6XE2p7l2).
2. Access the BrightSign shell (see [Accessing the BrightSign Shell](docId\:FXXyu9jmocUtC6XE2p7l2)). Once connected, you will see the `BrightSign>` command prompt. To access the shell from the BrightScript debugger, type `exit`.
3. Insert an SD card.
4. Enter `cd sd:` at the prompt to switch to the SD card directory.
5. On a new line, run `script autorun.brs` to start your application. This will reload the *autorun.brs* file, effectively breaking down and rebuilding your HTML/Chromium application.

:::hint{type="info"}
For more information about the command line interface and shell commands, see [BrightSign Shell](docId\:FXXyu9jmocUtC6XE2p7l2) and [BrightScript Debugger](docId\:NWBQJWdO43dYsqmHzYSCL).
:::

## Additional Notes

- Ensure that your network settings allow SSH and Telnet access. Port access should be open for ports 22 and 23 (respectively) unless the port defined by the user is different.
- SSH and Telnet must be enabled on the network.
- If you encounter problems, try power cycling the player or checking the network configurations.


[title] Considerations
[path] BrightSign Partner Packet/Example (Manual Setup)/

While BrightSign players are highly versatile in the content sources they are able to utilize, there are some important factors that should be considered when making decisions about content sources.

Displaying web and streaming content hosted on an external website requires a persistent internet connection and performance is subject to the whims of network connectivity - if there are internet issues, the players will not be able to reliably display content.

Further, a common use case for digital signage is for players to loop the same content over and over. Having to repeatedly retrieve the same content from a server, particularly if there are multiple players where each player requires an individual stream, is a highly inefficient, and potentially expensive, use of bandwidth and server resources.

Content that resides locally on the player is much preferred. Quality of service can be much more tightly controlled as it is not dependent on a persistent network connection. BrightSign offers tools that enable remote content delivery directly to players as well as solutions for caching external web content (refer to the [Resources](docId\:iseOFjABJZNe2mgyDelKS) section of this guide) on the player.

BrightSign players also have the capability of directly running Node.js applications, and if streaming content is desired, players have the ability to run a streaming server.

For most use cases, the preferred content source(s) will be Local Content, cached Web Content, or a mixture of both.

[Next - Integrating with BrightSign >](docId\:t5v4SKdff1knZn7UELgVy)

[title] Animations and Add-on Libraries
[path] HTML Development/HTML Best Practices/

This page outlines support for animations and add-on libraries for the Chromium engine on BrightSign players.

:::hint{type="success"}
Limit file directory depth to prevent issues caused by overly complex folder structures.
:::

## JavaScript Animations

Animations that use JavaScript timers, including the jQuery® .animate() library, do not make efficient use of GPU resources and are not accurate enough to achieve smooth animations. For this reason, we recommend using CSS animations whenever possible. The jQuery® [Transit library](https://github.com/rstacruz/jquery.transit) uses CSS animations and provides an API similar to the .animate() library.

:::hint{type="info"}
For best results when animating images, we recommend using images at their original size instead of scaling them first. For example, a 480x270 icon will rotate more smoothly if you use an image that is originally 480x270, rather than scaling down a 1280x720 image and then attempting to rotate it.
:::

## WebGL

BrightSign players support the OpenGL API for JavaScript (i.e. WebGL). 

:::hint{type="info"}
Textures will sometimes fail to load in WebGL because they exceed the allowed [image size](docId\:gZcaQrOoR8-ZaRNrEPKN1) on BrightSign Players. In these cases, you can use [roVideoMode.SetImageSizeThreshold()](docId\:QQ734nQz0hCwNI0uNSdMP) BrightScript method to increase the maximum size for textures.
:::

## Vector Animations

The SVG protocol should be used to specify vector animations.

## Canvas Animations

Bitmap animations display smoothly when they are 1/3 or less of a 1080p HTML canvas. Setting the canvas size to 720p allows for larger high-quality animations to occupy the screen.

## Push Technology

The long polling technique has been tested and proven to work on BrightSign players.

The Websocket protocol is fully supported via the [Node.js](docId\:vlSKfVzeQu04pD58rvXam) implementation on the BrightSign Chromium instance. In production environments, we recommend using HTTPS to initiate Websocket connections with a server (i.e using a WSS connection rather than a WS connection).

An example Websocket application is available on the [BrightSign Github](https://github.com/brightsign/websocket-test) page.

## File Storage

BrightSign players support several file storage/indexing technologies, including Web SQL, IndexedDB, the HTML Filesystem API, and the JavaScript *storage* class. The location and size of the web storage database should be set during initialization of [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK).

## File Downloads

If you're using JavaScript to download files, we reccomend using the Fetch API and Node.js® File System module to perform downloads. See [this page](docId\:vlSKfVzeQu04pD58rvXam) for more details

## CSS Transforms

All CSS transforms should be specified as WebKit transforms. When performing a transform on a  or graphics element, you should not specify the transform in-line.

:::Iframe{code="<div>"}

:::

The following code shows an example of an effective CSS transform for a BrightSign player:

**Example:**

```text
<style>
 
                .flipme{
                -webkit-animation-name:flipon;
                -webkit-animation-fill-mode:forwards;
                -webkit-animation-iteration-count:1;
                -webkit-animation-duration:2s;
                }
 
 
@-webkit-keyframes flipon
{
0% {-webkit-transform:rotateY(0deg);}
30% {-webkit-transform:rotateY(-90deg);}
100% {-webkit-transform: rotateY(360deg);}
}
 
</style>
```


[title] rDWS Remoteview Endpoints
[path] Diagnostic Web Server APIs/Remote DWS APIs/

These APIs are exposed on the WebSocket server but are a separate set of APIs. Using Remoteview, you can control the player remotely through the WebSocket channel. This is a route between each configured player and the BSN network.

To use these APIs, you must have confirmed access to a WebRTC signaling server, and access to that server through a browser so you can use the necessary URL endpoints. You must also be authenticated with the necessary BSN server and the player must be registered with that same network.

:::hint{type="info"}
The web server must provide its content over an HTTPS connection (this is part of the WebRTC specification). If you do not have access to such a service, you can proxy a local (non-HTTPS) server through a remote service. This service is not part of BSN.Cloud.
:::

## Establishing a Remoteview Player Connection

1. Acquire an accessURL for a rendezvous service to use with Remoteview.
2. Add the accessURL to the player configuration in BSN.Cloud:
   - &#x20;`PUT /remoteview/config`&#x20;
3. Confirm the setting:
   - &#x20;`GET /remoteview/config endpoint`.
4. Start a session:
   - `POST /remoteview/{:source}/view`
5. Go to a Chrome browser and enter the rendezvous forwarding address and add webrtc\_client.html to the end of the address (for example: 7a24dceefaa4.ngrok.io/webrtc\_client.html)
6. Enter the player serial number that you wish to view.
7. Make sure everything is working. The following command should return a session id:
   - `GET /remoteview/{:source}/view`
8. Remove a session:
   - `DELETE /remoteview/{:source}/view/{:id}`&#x20;

## GET  /remoteview/config/ 

Use the PUT endpoint to configure the player with an access URL. You can then use this endpoint to check that the configuration is correct.

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#15803D">200</font>: This will return the access URL

**Example**

```json
{“accessURL”: “http://test-server-url/”}
```

**Failure Response**

<font color="#B91C1C">400</font>: The request is malformed and therefore invalid

<font color="#B91C1C">401</font>: The access token is invalid or not specified

<font color="#B91C1C">5XX</font>: Any 500 code is an internal server error

## PUT  /remoteview/config/ 

Configures the player with the access URL

**Request Body**

- `accessURL` <font color="#704ae0">string: </font>The remote view server URL

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Request Example**

```text
{"data": {“accessURL”: “http://test-server-url/”}}
```

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#15803D">200</font>: This returns the access URL - the same value that you passed in the request body to the player

**Failure Response**

<font color="#B91C1C">400</font>: Either the request or request body is malformed and therefore invalid

<font color="#B91C1C">401</font>: The access token is invalid or not specified

<font color="#B91C1C">5XX</font>: Any 500 code is an internal server error

## GET  /remoteview/\{:source}/view/ 

Returns the information about all the active remote view sessions.

**Request Body**

- `source` <font color="#704ae0">string: </font>This value will always be `"desktop"`

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#15803D">200</font>: Returns an array of session objects. Each object contains the following parameters:

- `id` <font color="#704ae0">string</font>: The session id
- `mediaSource` <font color="#704ae0">string</font>: The value is always `"desktop"`
- `available` <font color="#704ae0">bool</font>: This value is always `true` when the session is active.
- `viewing` <font color="#704ae0">bool</font>: This indicates that the session is active. The value will always be `true`.

**Example**

```json
{
      id: "9e61ac20-2014-11ee-a14d-73a9c31db7cd", 
      mediaSource: "desktop", 
      available: true,
      viewing: true
}
```

**Failure Response**

<font color="#B91C1C">400</font>: The request is malformed and therefore invalid

<font color="#B91C1C">401</font>: The access token is invalid or not specified

<font color="#B91C1C">5XX</font>: Any 500 code is an internal server error

## GET  /remoteview/\{:source}/view/\:id/ 

Returns information about the specified remote view session using its session id

**Request Body**

- `source` <font color="#704ae0">string: </font>This value will always be `"desktop"`
- `id` <font color="#704ae0">string: </font>The unique identifier for the session

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#15803D">200</font>: Returns the following specified session object:

- `id` <font color="#704ae0">string</font>: The session id
- `mediaSource` <font color="#704ae0">string</font>: This value is always `"desktop"`
- `available` <font color="#704ae0">bool</font>: This value is always `true` when the session is active.
- `viewing` <font color="#704ae0">bool</font>: This indicates that the session is active. The value will always be `true`.

**Example**

```json
{
      id: "9e61ac20-2014-11ee-a14d-73a9c31db7cd", 
      mediaSource: "desktop", 
      available: true,
      viewing: true
}
```

**Failure Response**

<font color="#B91C1C">400</font>: The request is malformed and therefore invalid

<font color="#B91C1C">401</font>: The access token is invalid or not specified

<font color="#B91C1C">404</font>: The specified session id was not found

<font color="#B91C1C">5XX</font>: Any 500 code is an internal server error

## POST  /remoteview/\{:source}/view/ 

Starts a new session and returns an id for the session (at this point, the signaling server has been initialized and has made a WebSocket connection to the player)

**Request Body**

- `source` <font color="#704ae0">string: </font>This value will always be `"desktop"`

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#15803D">200</font>: A successful response returns the session id.

**Example**

```json
{sessionID: "9e61ac20-2014-11ee-a14d-73a9c31db7cd"}
```

**Failure Response**

<font color="#B91C1C">400</font>: The request or request body is malformed and therefore invalid

<font color="#B91C1C">401</font>: The access token is invalid or not specified

<font color="#B91C1C">5XX</font>: Any 500 code is an internal server error

## DELETE  /remoteview/\{:source}/view/\:id/ 

Stops the specified remote view session using its session id

**Request Body**

- `source` <font color="#704ae0">string: </font>This value will always be `"desktop"`
- `id` <font color="#704ae0">string: </font>The unique identifier for the session you want to stop

\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

**Success Response Body**

<font color="#15803D">200</font>: The specified session was stopped

**Example**

```json
{ stopped : true }
```

**Failure Response**

<font color="#B91C1C">400</font>: The request is malformed and therefore invalid

<font color="#B91C1C">401</font>: The access token is invalid or not specified

<font color="#B91C1C">404</font>: The specified session id was not found

<font color="#B91C1C">5XX</font>: Any 500 code is an internal server error

[title] rDWS Storage Endpoints
[path] Diagnostic Web Server APIs/Remote DWS APIs/

Base URL for these endpoints:  ***https\://ws.bsn.cloud/rest/v1/***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /files/\{:path}/ 

Lists the directories and/or files in a path

**Segment**

- `path` <font color="#704ae0">string</font>: The path to the directories or files

**Query String Parameter**

- `raw` <font color="#01a0af">optional</font>: Returns the raw contents of a directory
- `contents` <font color="#01a0af">optional</font>: If a file is specified, this will return the contents of that file

**Request Example**

```text
GET /rest/v1/files/sd/autorun.brs/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `type` <font color="#704ae0">string</font>: Either a directory or file
- `path` <font color="#704ae0">string</font>: The path, for example, "sd"
- `stat` <font color="#704ae0">object</font>: Directory stats from the "fs" module
- `files` <font color="#704ae0">object[ ]</font>: 
  - `name` <font color="#704ae0">string</font>:  Name of the file or directory
  - `type` <font color="#704ae0">string</font>:  Either "file" or "dir"
  - `path` <font color="#704ae0">string</font>: The relative path of the file or directory
  - `stat` <font color="#704ae0">object</font>: File stats from the “fs” module
  - `mime` <font color="#704ae0">string</font>: mime type (available only for type "file")
- `storageInfo` <font color="#704ae0">object</font>: If the path in the URL is a storage device, this returns information about the storage device. For more information, see [storageinfo](docId\:RoZ3o77EuxtyZvj_dSPin). 
- `fileSystemType` <font color="#704ae0">string</font>: The type of filesystem (for example, "fat32")
- `stats` <font color="#704ae0">object</font>:
  - `blockSize` <font color="#704ae0">int</font>: The size of a native block
  - `bytesFree` <font color="#704ae0">int</font>: The amount of free space
  - `filesFree` <font color="#704ae0">int</font>: The number of used inodes
  - `filesUsed` <font color="#704ae0">int</font>: The number of free inodes
  - `isReadOnly` <font color="#704ae0">bool</font>: A flag indicating whether the filesystem is read only
  - `sizeBytes` <font color="#704ae0">int</font>: The amount of total space
- `mountedOn` <font color="#704ae0">string</font>: The location where the file system is mounted (for example, "/storage/sd")
- `contents` <font color="#704ae0">object[ ]</font>:
  - `name` <font color="#704ae0">string</font>: The name of the file or directory
  - `type` <font color="#704ae0">string</font>: Either "file" or "dir"
  - `path` <font color="#704ae0">string</font>: The absolute path of the file or directory
  - `stat` <font color="#704ae0">object</font>: The statistics from the "fs" module 
  - `mime` <font color="#704ae0">string</font>: mime type (available only for type "file")
  - `children` <font color="#704ae0">object[ ]</font>: This is available only for directory types and will have the same format as "contents

**Response Body if Returning Contents**

- `name` <font color="#704ae0">string</font>: The name of the file
- `mimeType` <font color="#704ae0">string</font>: Mime type of the file
- `contents` <font color="#704ae0">string</font>: The contents of the file

**Response Examples**

```json
{
    "route": "/v1/files/sd/autorun.brs",
    "method": "GET",
    "data": {
        "result": {
            "name": "sd/autorun.brs",
            "type": "file",
            "path": "sd/autorun.brs",
            "mime": "application/octet-stream",
            "stat": {
                "dev": 45921,
                "mode": 33277,
                "nlink": 1,
                "uid": 0,
                "gid": 1003,
                "rdev": 0,
                "blksize": 32768,
                "ino": 40,
                "size": 1144340,
                "blocks": 2240,
                "atimeMs": 1699401600000,
                "mtimeMs": 1699423824000,
                "ctimeMs": 1699423824440,
                "birthtimeMs": 0,
                "atime": "2023-11-08T00:00:00.000Z",
                "mtime": "2023-11-08T06:10:24.000Z",
                "ctime": "2023-11-08T06:10:24.440Z",
                "birthtime": "1970-01-01T00:00:00.000Z"
            },
            "fileSize": 1144340,
            "streamable": true
        }
    }
}
```

If you passed in a `contents` query paramter in your request, you should expect a response like the one below. Note that once you have the data string, you will have to decode it (for example, with the `atob` method in JavaScript).

```json
{
    "route": "/v1/files/sd/autorun.brs",
    "method": "GET",
    "data": {
        "result": {
            "mimeType": null,
            "name": "autorun.brs",
            "contents": "TGlicmFyeSAiYXV0b3B....<very-large-data-string>..."
        }
    }
}
```

## PUT /files/\{:path}

Uploads a new file or folder to the player storage

:::hint{type="info"}
If you are uploading zip and media files, you should use BOS version 8.5.44 or 9.0.101 or later.
:::

**Segment**

- `path` <font color="#704ae0">string</font>: The path is the folder in which you want to upload the file (for example: `"/sd"`).

**Request Body**

- `files` <font color="#704ae0">object[]</font>:
  - `fileName` <font color="#704ae0">string</font>: The name of the file
  - `fileContents` <font color="#704ae0">string</font>: The content of the file. It can be provided as plain text or as Data URL.
  - `fileType` <font color="#704ae0">string</font>: Mime type

**Request Example (File)**

The following request example would be used with one of the two request body examples (Plain Text or Data URL) below:

```text
PUT /rest/v1/files/sd/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 196
```

In the request body examples below, use the [FileReader's readAsText()](https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsText) or [readAsDataURL()](https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL) method to derive the `fileContents` value.

**Plain Text Request Body**: Any file with mime type "text/\*", or any “brs”, “json”, “js”, “xml”, “rtf” extension, can be sent as plain text using [FileReader's readAsText()](https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsText) method:

```json
{
    "data": {
        "fileUploadPath": "/sd",
        "files": [
            {
                "fileName": "test.txt",
                "fileContents": "Lorem Ipsum",
                "fileType": "text/plain"
            }
        ]
    }
}
```

**Data URL Request Body**: For all other file types, including zip and media files, use the data URL format using [FileReader's readAsDataURL()](https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL) method:

```json
{
    "data": {
        "fileUploadPath": "/sd",
        "files": [
            {
                "fileName": "image.png",
                "fileContents": "data:image/png;base64,DQpJbnRlcmZh.....",
                "fileType": "image/png"
            }
        ]
    }
}
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag that indicates if the operation succeeded or not
- `results` <font color="#704ae0">string[]</font>: The names of the files that were successfully created

**Response Example (Plain Text File)**

```json
{
    "data": {
        "result": {
            "success": true,
            "results": [
                "test.txt"
            ]
        }
    },
    "route": "/v1/files/sd",
    "method": "PUT"
}
```

**Request Example (Folder)**

```text
PUT /rest/v1/files/sd/testfolder/?destinationType=player&destinationName={{deviceSerial}}
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Example (Folder)**

```json
{
    "route": "/v1/files/sd/testfolder/",
    "method": "PUT",
    "data": {
        "result": {
            "success": true
        }
    }
}
```

## POST /files/\{:path}/ 

Renames a file in the path (which should include the file name)

**Segment**

- `path` <font color="#704ae0">string</font>: The path to the file (for example, `/sd`)

**Request Example**

```text
POST /rest/v1/files/sd/test.txt/?destinationType=player&destinationName={{deviceSerial} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 57
```

This is the example request body:

```json
{
    "data": {
        "name": "newname.txt"
    }
}
```

**Response Body**

The player will return a success or error message.

## DELETE /files/\{:path}/ 

Deletes a file from the player storage

**Segment**

- `path` <font color="#704ae0">string</font>: The path to the file (for example,`/sd`)

**Request Example**

```text
DELETE /rest/v1/files/sd/test.txt/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

The player will return a success or error message.

[title] Option 43
[path] BrightSign Partner Packet/Untitled/Untitled/

A BrightSign player can download its autorun script and other presentation assets from a URL value stored in its registry. This feature can be used to provision a player in the field. It also allows a player to automatically recover from run-time or load errors associated with the autorun script.

The URL value in the registry can be overridden using DHCP Option 43, meaning that, with properly configured network infrastructure, players can set themselves up and begin playing content without manual on-site configuration.

This page outlines how to set up a provisioning system that uses DHCP Option 43.

:::hint{type="info"}
The B-Deploy Appliance may also use DHCP Option 43. The solution outlined on this page makes use of a third-party provisioning server (i.e. one you set up yourself) rather than the B-Deploy Appliance.
:::

# Overview

## Recovery / Bootstraping

When a BrightSign player boots (and at periodic intervals while running), it will direct an HTTP GET request at the provisioning/recovery URL stored in the player registry, which is blank as a factory default. The header of the HTTP GET request includes the following parameters:

| **Parameter**     | **Example Value**                                          | **Description**                                                                                                                                                                                                                                                                                                   |
| ----------------- | ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Account`         | `bsaccount`                                                | The `a` registry value                                                                                                                                                                                                                                                                                            |
| `User`            | `bsuser`                                                   | The `u` registry value                                                                                                                                                                                                                                                                                            |
| `Group`           | `bsgroup`                                                  | The `g` registry value                                                                                                                                                                                                                                                                                            |
| `Password`        | `bspassword`                                               | The `p` registry value                                                                                                                                                                                                                                                                                            |
| `DeviceModel`     | `XD1230`                                                   | The model designation of the BrightSign player                                                                                                                                                                                                                                                                    |
| `DeviceFamily`    | `cheetah`                                                  | The family designation of the BrightSign player                                                                                                                                                                                                                                                                   |
| `DeviceId`        | `X2F2CU0000065`                                            | The serial number of the player                                                                                                                                                                                                                                                                                   |
| `DeviceFwVersion` | `4.7.146`                                                  | The version of firmware currently installed on the player                                                                                                                                                                                                                                                         |
| `DeviceUpTime`\*  | `240`                                                      | The amount of time (in seconds) since the player booted up                                                                                                                                                                                                                                                        |
| `RecoveryMode`\*  | `override`                                                 | The mode of the current URL request:<br /><br />- `override`: The initial HTTP GET request of a player with a valid autorun script<br />- `periodic`: Subsequent HTTP GET requests of a player with a valid autorun script<br />- `last-resort`:  The HTTP GET request of a player without a valid autorun script |
| `CrashDump`\*     | `yes`                                                      | A flag indicating that the current boot was initiated by a forced reboot due to a crash (this header is only present if true)                                                                                                                                                                                     |
| `StorageStatus`   | `usb1=none;sd=autorun;`<br /><br />`sd2=storage;ssd=none;` | The current autorun and file-system status of each storage device.                                                                                                                                                                                                                                                |

If the HTTP GET request is successful, the player will attempt to utilize whatever content was downloaded as an autorun script. Note that the player does not make any checks to determine if the content is actually a *.brs* autorun file before attempting to run it.

## Provisioning Setup Overview

The following infrastructure is required to provision players using DHCP Option 43:

- **DHCP server**: Located on the local network and configured for Option 43 communication
- **Provisioning script URL**: A URL that returns the *.brs* provisioning script
- **Provisioning package URL**: A URL that returns the *.zip* provisioning package
- **Firmware update URL**:(optional) A URL that returns a firmware update file if needed

# DHCP Server Configuration

## Request / Response String Formats 

When a BrightSign player requests information from a DHCP server, the query will include an Option 60 string containing the vendor identity of the player: \[BS\_OEM\_ID] +  “ “ + \[BS\_OEM\_MODEL] (e.g. “BrightSign XD1230”). The DHCP server can use this string to match the correct Option 43 response for the vendor and model number of the device. Alternatively, the correct response can be determined using other information available to a DHCP server, including subscriber ID where port-based IP allocation is used.

The response should be an Option 43 string consisting of TLV (type-length-value) encoded data, and the provisioning/recovery URL should be defined using Tag 85 (0x55 or ASCII “U”). The tag and length are 1 byte each. The length should also be encoded using hex or ASCII.

While the formatted response value can be straightforwardly set on a Linux server, configuring Microsoft servers requires [additional steps](https://blogs.technet.microsoft.com/troubleshooting_walk_through/2013/11/01/what-comes-with-option-43-and-configuring-in-dhcp/).

## Player Configuration

When the player receives the Option 43 response, it will override the default URL in the registry with the value in the response string. The value supplied by the DHCP server is not saved in persistent storage; the registry override remains in effect only as long as the DHCP lease remains active. If necessary, the recovery/provisioning script can permanently change the registry value using BrightScript functions.

The player can store a different URL for each network interface. When multiple DHCP responses are received from different network interfaces, the player will choose to recover or bootstrap using the first non-empty URL value in the following interface order:

1. Ethernet
2. WiFi
3. 3G

## Verify Option 43 Configuration

To verify that the player is responding correctly to the DHCP server, access the BrightSign shell via the serial port (see the [BrightScript Debug Console](docId\:YWkSi6X-2hez1BwztfHMP) page for more details). At the BrightSign prompt, type "ifconfig": If the Option 43 action has been successful, the new provisioning/recovery URL will be returned; if the action was unsuccessful, the default BrightSign Network URL will be returned.

To verify that the player actually sends provision/recovery requests to the URL, you can look at the logs from the web server delivering the recovery script. You can also use tcpdump or Wireshark on the local network to view the HTTP GET request from the player.

## Encoder Example

The following simple webpage script can be used to convert a URL into the proper hexadecimal format for use with Option 43 strings:

```html
<html>
<head>
<title>BrightSign Option 43 Recovery URL encoding</title>
<script>
function convertUrl()
{
    url = document.getElementById("url").value;
    out = document.getElementById("out");
 
    // First construct the required TLV as a byte array
    data = [];
    data.push(0x55);         // Tag
    data.push(url.length);
// Length
// Value
    for(var i = 0; i < url.length; i++)
    {
        data.push(url.charCodeAt(i));
// ASCII only, please.
    }
 
    // Now convert to a hex string.
    // (Other formats could also be produced)
    hex = ""
    for(var i = 0; i < data.length; i++)
    {
        b = (data[i] + 256).toString(16).substr(-2).toUpperCase();
        hex = hex.concat(b)
    }
 
    out.value = "option 43 hex " + hex;
 
    return false;  // Prevent submit/reload
}
</script>
</head>
<body>
<h1>BrightSign Option 43 Recovery URL encoding</h1>
<p>Enter the required Recovery URL below:
<form onsubmit="return convertUrl()">
<input type="text" size="100" id="url">
<input type="submit" value="Convert">
</form>
<textarea id="out" rows=4 cols=120 readOnly="true"></textarea>
</body>
</html>
```

# Provisioning Server Configuration

## Provisioning Script

Once the player receives the Option 43 response, it will make an HTTP GET request to the URL contained in the response. The provisioning server should examine the StorageStatus header in the request. If "autorun" is present in the string, it should return code 204; otherwise, it should return code 200 with the *.brs* provisioning script in the response body. 

The provisioning script should, in turn, overwrite the recovery URL in the registry and download the provisioning package from a separate URL.

:::hint{type="info"}
By default, IIS servers do not allow *.brs* files because they are not a registered MIME type. If you're using an IIS server to distribute the *.brs* provisioning script, make sure to register *.brs* as a "text/plain" MIME type.
:::

The BrightSign [provisingScript.brs](https://github.com/brightsign/general-tools/blob/main/brightscript/option43-provision-script/provisioningScript.brs) in GitHub provides a template to download a presentation package and/or firmware file. To use this script, you will need to replace the following values in the script with values that are specific to your application:

- `##fileName1##`: The name of the file after it is downloaded to local storage (e.g. "autorun.zip")
- `##fileType1##`: The file type, which can be either "presentation" or "firmware"
- `##url1##`: The download URL for the file
- `##addBsHeaders1##`: A flag indicating whether to add headers to the HTTP request, including device values such as the serial number and firmware version. This value can be true or false.
- `##optionalHeaders##`: A set of one or more optional headers to add to the HTTP request. These headers are only added if `##addBsHeaders1##` is replaced with `true`. The following example shows how to format an optional header in the script:

```text
"xfer.AddHeader(\"Authorization\", \"Bearer " + authToken + "\")"
```

There are a second set of values in the script (`##fileName2##`, `##fileType2##`, etc.). If you want to download both a presentation package and firmware file, replace these with appropriate values. If you want the script to download a single file only, set the string values to invalid and the Boolean value to false.

The script also contains a `##recoveryUrl##` field, which is the new recovery URL that will be written to the player registry. This value is likely the same as the URL specified in the Option 43 response, which will otherwise revert to default when the DHCP lease expires.

## Provisioning Package

The provisioning script should call additional URLs to download the presentation package and/or firmware update files. The presentation package should be a *.zip* file containing necessary files. 

If provisioning is carried out with the included *provisioningScript.brs* script, the player will automatically unpack a downloaded *.zip* file without requiring any additional script or naming conventions. If you're using your own provisioning script (or as an extra precaution), name the presentation package *autorun.zip* and include the *autozip.brs* script, which is also included with this document.

[title] Chromium, Node.js, & BOS Versions
[path] HTML Development/

As of BrightSignOS (BOS) 8.2, two versions of Node are shipped with the player:

- A Node.js version that is integrated into Chromium
- The standalone Node.js that is used by [roNodeJs](docId\:x9c4JHn6rnqgryflY1wdQ) and similar objects

The version numbers of these are not identical although BrightSign tries to ensure that they are at least the same major version.

Note that the embedded Node.js is associated with [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) and standalone Node.js is associated with [roNodeJs](docId\:x9c4JHn6rnqgryflY1wdQ).

## Determining Version Numbers

Inspecting `process.version` in each environment is the most reliable way to determine the exact version number for any given version of the BOS. For standalone Node.js, enter `process.version` at the prompt:

```text
BrightSign> node
> process.version
'v10.15.3'
> 
BrightSign>
```

For embedded Node.js, run a script to print the version number to the log and inspect the output (there is no way to type directly in the console):

```text
BrightSign> htmlplay data:text/html,<script>console.log(process.version);</script>
BrightSign> log
[...]
<12>[173535.688] [INFO]   [source data:text/html,%3Cscript%3Econsole.log(process.version);%3C/script%3E:1]: v10.11.0 
BrightSign>
```

## BOS & Chromium/Node.js Version Compatibility

This table describes the web-rendering engine and Node.js version used in each BOS version:

| **BOS version**            | **Chromium version** | **Embedded Node.js version** | **Standalone Node.js version** |
| -------------------------- | -------------------- | ---------------------------- | ------------------------------ |
| 9.1x                       | Chromium 120         | 18.18.2                      | 18.18.2                        |
| 8.5.x, 9.0.x               | Chromium 87          | 14.17.6                      | 14.17.6                        |
| 8.1.x, 8.2.x, 8.3.x        | Chromium 69          | 10.11.0                      | 10.15.3                        |
| 8.0.x                      | Chromium 65          | 10.0.0                       | 8.9.4                          |
| 7.1.x, 7.0.x, 6.2x         | Chromium 45          | 5.1.1                        | 5.1.1                          |
| 6.1.x, 6.0.x               | Chromium 37          |                              |                                |
| 5.1.x, 5.0.x, 4.8.x, 4.7.x | WebKit               |                              |                                |

See [this page](docId\:YGi_yIWT6pZ2BtU-GrfuP) to download any of the listed Chromium versions. Use [this page](http://caniuse.com/) to determine if specific function calls and extensions are supported in a corresponding version of Chrome.

:::hint{type="info"}
Chromium version 69 or later will refuse SHA-1 certificates. See [this page](https://www.chromium.org/Home/chromium-security/education/tls/sha-1/) for more information.
:::




[title] HTML Best Practices
[path] HTML Development/

Select the links below to see information about content requirements, abilities, and restrictions of the HTML rendering engine on BrightSign players:

[Animations and Add-on Libraries](docId\:pA1jGkla28QqI25Nqf-WE)&#x20;

[BrightSign Extensions](docId:0p1XyLLK5LyTHfLQGml2W)&#x20;

[Chromium, Node.js, & BOS Versions](docId\:jxMrSYlnKOxoBHOfmHTyd)&#x20;

[Creating HTML Pages](docId\:U0dk6TsZYKUUcG8lQTGr9)&#x20;

[Debugging Webpages](docId:4qlK1krr1cnx7xypWXRY5)&#x20;

[Disabling Staged ES6 Features](docId\:rDkZacK9KKlVpBjtTWR5t)&#x20;

[HTML Caching](docId\:klnl87Z9zBZpxm3f6cgy8)&#x20;

[HTML Content Restrictions](docId\:XleiD0O22LAz9SpXtbd8V)&#x20;

[HTML Storage](docId\:RALvpEudEblvgwdJo6AtL)&#x20;

[HTML Video](docId\:e6uJleH69Q0JmMv8kyTrp)&#x20;

[Touchscreen Support](docId\:PUYpO2ejFRG0KPfqGVbPI)&#x20;

[Using HTML Websites that Require Logins](docId\:bemK_wvHwhpFNloh2iPc0)&#x20;




[title] Disabling Staged ES6 Features
[path] HTML Development/HTML Best Practices/

Some ES6 features have not been finalized and may still contain bugs in the Chromium version(s) used by BrightSign. A crash may occur if your JavaScript application (or the framework code used to build the application) uses one of these features: For example, [this](https://bugs.chromium.org/p/v8/issues/detail?id=3923) is a known issue in Chromium version 45 that will cause a crash on BrightSign XTx44 and XDx34 players. 

To bypass such issues, you can disable all staged (i.e. experimental) ES6 features using the `disable-javascript-harmony-shipping` registry flag (which requires firmware version 7.1.49 or later). The following example shows how to set this registry flag using the [registry](docId\:tXWoOMbD2-u12dfegX7gA) JavaScript module (you can also use the [roRegistry](docId\:YTpSfntswYFMXx8PCqJLf) BrightScript object).

```text
var registryClass = require("@brightsign/registry");
var registry = new registryClass();


var systemClass = require("@brightsign/system");
var system = new systemClass();


registry.write("html", {js-disable-harmony-shipping:"1"}).then(
    function(){console.log("Write Successful");});


system.reboot()
```

Enabling this registry flag will limit the available JavaScript syntax. However, for ES6 features to be available, an application must be written to be compatible with both ES5 and ES6, so enabling this flag should not cause syntax errors or similar issues.

[title] Known Issues
[path] HTML Development/

BrightSign’s HTML5 rendering engine is a constant work-in-progress. The following are known issues that we are working to resolve in future versions of player firmware.

## Rotated 4K Output

Displaying an HTML page and rotated video while using a 4K output mode will cause the video to glitch. This is the case even if the video is not part of the HTML page (i.e. it's displayed and rotated using BrightScript).

## Localized JavaScript Time

The JavaScript `toLocaleTimeString()` call does not retrieve localized time formats (i.e. 24-hour vs. 12-hour clock): Instead, the hour/minute clock defaults to 24-hour time on the BrightSign player. The below code provides a workaround in JavaScript if you would like to display time using a 12-hour clock:

```text
function format12Hour(date)
{
    var zero = '0';

    hh = date.getHours();
    mm = date.getMinutes();
    ss = date.getSeconds()

    if((hh % 12) == 0)
        hh = 12;

    else
        hh %= 12;

    // Pad zero values to 00
    hh = (zero+hh).slice(-2);
    mm = (zero+mm).slice(-2);
    ss = (zero+ss).slice(-2);

    return hh + ':' + mm + ':' + ss + ' ' + ((date.getHours() < 12) ? 'AM' : 'PM');
}
```

If you would prefer not to display seconds information, you can replace the above “return” line with the following:

```text
return hh + ':' + mm + ' ' + ((date.getHours() < 12) ? 'AM' : 'PM');
```

Implement the function in the HTML script as follows:

```text
var dateString = (startJSDate.getMonth() + 1) + "/" +
startJSDate.getDate();
    if (!startDateTime.isDateOnly()) {
      dateString += " -- " + format12Hour(startJSDate);
    }
```


[title] rDWS Registry Endpoints
[path] Diagnostic Web Server APIs/Remote DWS APIs/

Base URL for these endpoints:  ***https\://ws.bsn.cloud/rest/v1/***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /registry/ 

Returns the player registry dump

**Request Example**

```text
GET /rest/v1/registry/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: If the operation is successful
- `value` <font color="#704ae0">object</font>: The keys are the names of the registry sections. These are some examples:
  - `brightscript` <font color="#704ae0">object</font>: The BrightScript key-value pairs
  - `networking` <font color="#704ae0">object</font>: The networking key-value pairs

**Response Example**

```json
{
    "route": "/v1/registry",
    "method": "GET",
    "data": {
        "result": {
            "success": true,
            "value": {
                "autorun": {
                    "bootchecks": "",
                    "bootstrap": "",
                    "knowngood": "",
                    "lasttried": ""
                },
                "brightscript": {
                    "createdby": "Supervisor 2.1.10"
                },
                "networking": {
                    "a": "JaneDoeTesting",
                    "access_token": "JcqVLXY3Ttpgpc5IiWL7wMHibKKcLDJkuRaLgWBQyvcjdI2JYRjHDdjaHQrnGkm9b9wAbdb2kTqqCC02oKjA7EJZMfP1jyllrbdFrscXbXePr4WtV3TRYoiWtv8tRGVB",
                    "access_token_expiration": "86400",
                    "access_token_expires_at": "Thu Feb 08 2024 07:47:26 GMT-0800 (Pacific Standard Time)",
                    "bbhf": "true",
                    "bph": "[]",
                    "brightwallname": "",
                    "brightwallscreennumber": "",
                    "bs": "/bs/batteryCharger.ashx",
                    "bsn_settings_last_modified": "Tue, 30 Jan 2024 22:01:45 GMT",
                    "bsnapiversion": "2022/06",
                    "cdr": "no",
                    "createdby": "Supervisor 2.1.10",
                    "cwr": "True",
                    "dd": "/bs/devicedownload.ashx",
                    "de": "/bs/deviceerror.ashx",
                    "dhcp": "yes",
                    "dle": "no",
                    "dp": "/bs/devicedownloadprogress.ashx",
                    "dwse": "true",
                    "dwsp": "",
                    "ele": "no",
                    "enableremotesnapshot": "no",
                    "enablewpaenterpriseauthentication": "False",
                    "endpoints_blessings_installer_url": "https://certs.bsn.cloud/install-blessing/v1/",
                    "endpoints_blessings_server_bp3": "https://certs.bsn.cloud/blessings/",
                    "endpoints_bsn_classic_api_server": "http://api.brightsignnetwork.com",
                    "endpoints_bsn_classic_server": "https://services.brightsignnetwork.com",
                    "endpoints_bsnapiserver": "https://api.bsn.cloud",
                    "endpoints_bsnserver": "https://handlers.bsn.cloud",
                    "endpoints_certsserver": "https://certs.bsn.cloud",
                    "endpoints_echotest": "https://certs.bsn.cloud/echo/ping",
                    "endpoints_failsafecheck": "https://certs.bsn.cloud/features/api/v1/failsafe",
                    "endpoints_featuresavailable": "https://certs.bsn.cloud/features/api/v1/features",
                    "endpoints_provisionserver": "provision.bsn.cloud",
                    "endpoints_remote_storage_notifications": "https://certs.bsn.cloud/files/api/v1/notify",
                    "endpoints_remote_storage_server": "https://certs.bsn.cloud/files/api/v1/verify",
                    "endpoints_s3_classic_url": "http://bsnm.s3.amazonaws.com/public/",
                    "endpoints_s3url": "https://bsncloud.s3.amazonaws.com/public/",
                    "endpoints_supervisorupgrade": "https://certs.bsn.cloud/features/api/v1/supervisors",
                    "endpoints_websocketsdws": "wss://ws.bsn.cloud/",
                    "eu": "/bs/error.ashx",
                    "g": "Default",
                    "hh": "/bs/heartbeat.ashx",
                    "hr": "no",
                    "hwr": "True",
                    "internalcapackages": "",
                    "isc": "FF702896",
                    "last_modified_autorun_settings_at": "2024-01-30T22:01:45.000Z",
                    "lastbsnconnectiontime": "2024/01/30 10:57:50.864",
                    "lwr": "True",
                    "mwr": "True",
                    "ncp": "0",
                    "networkjson": "{\"hostname\":\"BrightSign-RE433D006644\",\"proxyServer\":null,\"proxyBypass\":[],\"timeServers\":[\"http://time.brightsignnetwork.com\"],\"interfaces\":[{\"enabled\":true,\"proto\":\"DHCP\",\"ip\":null,\"gateway\":null,\"dns\":null,\"rateLimitDuringInitialDownloads\":0,\"rateLimitInsideContentDownloadWindow\":0,\"rateLimitOutsideContentDownloadWindow\":null,\"contentDownloadEnabled\":true,\"textFeedsDownloadEnabled\":true,\"mediaFeedsDownloadEnabled\":true,\"healthReportingEnabled\":true,\"logsUploadEnabled\":true,\"name\":\"eth0\",\"type\":\"Ethernet\",\"metric\":100}]}",
                    "nlws": "s",
                    "nlwseun": "yes",
                    "nlwsp": "",
                    "nlwsu": "",
                    "nu": "/bs/checkforcontent.ashx",
                    "p": "",
                    "ple": "no",
                    "rdwse": "yes",
                    "refresh_token": "LUi0ZRpbz1BWJ3JuBCwMPtRxEMQ9vMwyTRokUSENNCRckFOuVTUshtfb7Lk5H3Ji8kTyBsqVlwo9SZjzwkHv6V9XKKX4mtwbvGWWlYgUslOK7UbURW3zeMGKWhxbIghx",
                    "refresh_token_expires_at": "Fri Feb 06 2026 07:47:26 GMT-0800 (Pacific Standard Time)",
                    "registered_with_bsn": "yes",
                    "rlmid": "unlimited",
                    "rlmiw": "unlimited",
                    "rlmow": "default",
                    "rlrid": "0",
                    "rlriw": "0",
                    "rlrow": "0",
                    "rs": "/recovery/recovery_runsetup_ba.brs",
                    "ru": "/recovery/recovery.ashx",
                    "schedule_handler_duration": "21600",
                    "settings_handler_duration": "21600",
                    "sle": "no",
                    "status_handler_duration": "300",
                    "sut": "BSN",
                    "tbh": " 300",
                    "tbnc": " 21600",
                    "td": "/bs/trafficdownload.ashx",
                    "ts": "http://time.brightsignnetwork.com",
                    "twr": "True",
                    "tz": "PST",
                    "u": "",
                    "uab": "no",
                    "uat": "no",
                    "ub": "https://handlers.bsn.cloud/",
                    "ud": "Trying again",
                    "ul": "/bs/uploadlogs.ashx",
                    "un": "XD5",
                    "unm": "appendUnitIDToUnitName",
                    "up": "no",
                    "ut": " 0",
                    "v": "1",
                    "version": "3.0.0",
                    "vle": "no",
                    "vu": "/bs/events.ashx",
                    "wifi": "no"
                },
                "newsection": {
                    "newkey": "newvalue"
                }
            }
        }
    }
}
```

## GET /registry/\:section/\:key/

Returns a particular registry section or key value

**Segment**

- `section` <font color="#704ae0">string</font>: The name of the registry section (for example, "html" or "networking")
- `key` <font color="#704ae0">string</font>: The name of the registry key

**Request Example**

This example gets the `telnet` port number from the `networking` section:

```text
GET /rest/v1/registry/networking/telnet?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
```

**Response Example**

```json
{
    "route": "/v1/registry/brightscript/g",
    "method": "GET",
    "data": {
        "result": {
            "success": true,
            "section": "brightscript",
            "key": "g",
            "value": ""
        }
    }
}
```

## PUT /registry/\:section/\:key/

Sets a value in the specified section of the registry. Do a GET first to see which keys are available.

:::hint{type="warning"}
Applications rely on the values they have set in the registry. Please be mindful of what you type to avoid putting the player in an unstable state.
:::

**Segment**

- `section` <font color="#704ae0">string</font>: The name of the registry section (for example, "html" or "networking")
- `key` <font color="#704ae0">string</font>: The name of the registry key

**Request Example**

This example sets the `telnet` port number in the `networking` section of registry:

```text
PUT /rest/v1/registry/networking/telnet?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Content-Type: application/json
Content-Length: 47
```

This is the example request body:

```json
{
    "data": {
        "value": 23
    }
}
```

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "section": "networking",
            "key": "telnet",
            "value": "23"
        }
    },
    "route": "/v1/registry/networking/telnet",
    "method": "PUT"
}
```

## DELETE /registry/\:section/\:key/

Deletes a key-value pair from the specified registry section, or the whole section.

:::hint{type="warning"}
Applications rely on the values they have set in the registry. Please be mindful of what you type to avoid putting the player in an unstable state.
:::

**Segment**

- `section` <font color="#704ae0">string</font>: The name of the registry section (for example, "html" or "networking")
- `key` <font color="#704ae0">string</font>: The name of the registry key

**Request Example**

This example deletes the `telnet` key from the `networking` section of registry:

```text
DELETE /rest/v1/registry/networking/telnet?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
```

**Response Example**

```json
{
    "route": "/v1/registry/networking/telnet",
    "method": "DELETE",
    "data": {
        "result": {
            "success": true,
            "section": "networking",
            "key": "telnet"
        }
    }
}
```

## PUT /registry/flush/

Flush the registry immediately to disk. This is available as of BOS 9.0.110 and 8.5.47. If you are on an earlier OS, you can reboot the player to flush the registry.

**Request Example**

```text
PUT /rest/v1/registry/flush?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
```

**Response Example**

```json
{
    "route": "/v1/registry/flush",
    "method": "PUT",
    "data": {
        "result": {
            "success": true
        }
    }
}
```

## GET /registry/recovery\_url/ 

Retrieves the recovery URL stored in the player registry

**Request Example**

```text
GET /rest/v1/registry/recovery_url/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the request was successfully read
- `value` <font color="#704ae0">string</font>: The recovery URL

**Response Example**

```json
{
    "route": "/v1/registry/recovery_url",
    "method": "GET",
    "data": {
        "result": {
            "success": true,
            "value": "https://handlers.bsn.cloud//recovery/recovery.ashx"
        }
    }
}
```

## PUT /registry/recovery\_url/ 

Writes a new recovery URL to the player registry

**Request Body**

- `url` <font color="#704ae0">string</font>: The new recovery URL

**Request Example**

```text
PUT /rest/v1/registry/recovery_url/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 61
```

This is the example request body:

```json
{
    "data": {
        "url": "https://test.com"
    }
}
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the write was successful

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true
        }
    },
    "route": "/v1/registry/recovery_url",
    "method": "PUT"
}
```


[title] Developer Setup
[path] BrightSign Partner Packet/Integrating with BrightSign/

As a new developer in the BrightSign ecosystem, there are several items that will help get you up and running as efficiently as possible. Mandatory items include everything listed in the earlier hands-on examples, listed again here for convenience:

- BrightSign player and associated power supply
- microSD or other storage device
- If using a microSD card as the storage device, you will also likely need microSD card adapter (computers with standard SD card readers typically require an adapter to access microSD cards)
- Mac or PC
- Display
- HDMI cable (connects the player to the display)

In addition, it is very useful to connect the player to the local network via an Ethernet cable or, if the player has the appropriate hardware, WiFi.

# BrightSign Shell and BrightScript Debugger

Partners may also find the BrightSign Shell and BrightScript Debugger to be very useful for development purposes. The BrightSign Shell is a command-line interface (CLI) that enables interaction with the BrightSignOS (BOS), the operating system that powers all BrightSign players. The BrightScript Debugger is a CLI which enables interaction with the BrightScript Interpreter.

The [BrightSign Shell page](docId\:FXXyu9jmocUtC6XE2p7l2) contains info about the various ways to access the Shell, specifics on the type of cable to use if you prefer a physical connection to the player, commands, troubleshooting, and more.

The [BrightScript Debugger](docId\:NWBQJWdO43dYsqmHzYSCL) page contains info about how to enable and access the Debugger, commands, troubleshooting, and more.

# Local Access to the DWS

:::hint{type="danger"}
Local access (i.e., access over the local network) of the Diagnostic Web Server (DWS) is **disabled** by default as of BrightSignOS **9.0.218** (on the 9.0 branch) and BrightSignOS **9.1.75** (on the 9.1 branch). In BrightSignOS versions prior to these, local access to the DWS was enabled by default. To enable local access to the DWS, see [DWS: Local Access](docId\:IAFCHERlJfjDJTWTtKpk5).

Note that some specially configured players have the external microSD card port and USB storage disabled at the factory (SKU: SVC-internal-storage-only). For these players, local access to the DWS remains enabled by default.
:::

The Diagnostic Web Server (DWS) is a powerful tool that enables inspection of various player settings and diagnostic details. Both a Local Diagnostic Web Server (Local DWS, accessible over the local network via the player’s IP address) and Remote Diagnostic Web Server (Remote DWS, accessible via BrightSign Author) are available. General info about the DWS can be found [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM).

[Local DWS APIs](docId:2Zmel07w011h1267dt-59) also exist to enable direct access to DWS functionality.

# VSCode

Visual Studio Code is a popular coding environment for BrightSign development. The [BrightScript Language](https://marketplace.visualstudio.com/items?itemName=RokuCommunity.brightscript) extension facilitates coding in BrightScript and is used by thousands of developers around the world.

[Next - Partner Resources >](docId\:iseOFjABJZNe2mgyDelKS)&#x20;

[title] BrightSign Shell
[path] /

This page serves as a guide for accessing the **BrightSign Shell** of BrightSign players. The BrightSign Shell can be accessed via a physical serial connection or over the network via SSH or Telnet. For the physical serial connection, certain cables are recommended as described below.

## What is the BrightSign Shell?

The BrightSign Shell is a command-line interface (CLI) that enables interaction with the BrightSignOS (BOS), the operating system that powers all BrightSign players. The BrightSign Shell is denoted by the command-line prompt `BrightSign>` and can be used to troubleshoot and debug issues with the player as well as accessing things like network settings, display details, the BrightScript Interpreter, the BrightScript Debugger, a Node.js runtime, and player logs.

## What is the BrightSign Console?

The BrightSign Console (or more simply, Console) enables access to the BrightSign Shell, BrightScript Debugger, and logs over the 3.5mm serial port.

## Serial Cable vs. Telnet or SSH

Immunity from network connectivity issues is one of the primary advantages of a serial cable connection over Telnet or SSH connections. Additionally, in situations where the player is stuck in a boot loop and neither the Shell nor BrightScript Debugger are accessible, a serial port connection can provide access to Console messages.

## Serial Cable Hardware

The Shell can be accessed over the 3.5mm serial port that is present on *Extended I/O* player models when the BrightSign Console is turned on as described below.

Serial cable assemblies compatible with all Series 3, Series 4, and Series 5 Extended I/O players are described below. LS models require another adapter cable that is also described below.

### Cable Assembly 1 (Recommended)

This cable assembly has been verified to work and is the simplest and most straightforward option for a physical serial connection. As long as the individual cables required can be procured, this is the recommended cable assembly to use.

![image-20240417-220412.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/_6W65nsRYYam1J9xTcx8w_image-20240417-220412.png)

- [Cable A (cablestogo.com)](https://www.cablestogo.com/usb-and-pc/computer-cables/serial-rs232/1-5ft-0-46m-velocity-db9-female-to-3-5mm-male-adapter-cable/p/cg-02445) - 3.5mm Male to DB-9 *Female*
- [Cable B (plugable.com)](https://plugable.com/products/pl2303-db9) - DB-9 Male to USB (Prolific PL2303GT chipset)
- [Cable B (Amazon)](https://www.amazon.com/gp/product/B00425S1H8/ref=oh_aui_detailpage_o01_s01?ie=UTF8\&psc=1) - DB-9 Male to USB (Prolific PL2303GT chipset)
- [Cable B (Walmart)](https://www.walmart.com/ip/Plugable-USB-to-Serial-Adapter-Compatible-with-Windows-Mac-Linux-RS-232-DB9-DTE-Male-Connector-Prolific-PL2303HX-Rev-D-Chipset/47500195) - DB-9 Male to USB (Prolific PL2303GT chipset)
- [Cable B (Amazon)](https://www.amazon.com/dp/B0759HSLP1?psc=1\&ref=ppx_yo2ov_dt_b_product_details) - DB-9 Male to USB (FTDI FT232RL chipset)

### Cable Assembly 2

This cable configuration uses a 3.5mm Male to DB-9 *Male* cable which in some cases may be more readily available than the 3.5mm Male to DB-9 *Female* cable of Cable Assembly 1. However, this configuration necessitates an additional gender changer part which results in a more complex cable assembly.

![image-20240417-220458.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/x8mDQoyJvWZ0p6O_IEKUH_image-20240417-220458.png)

- [Cable C (cablestogo.com)](https://www.cablestogo.com/cables/pc/serial-rs232-cables/1-5ft-0-46m-velocity-db9-male-to-3-5mm-male-serial-rs232-adapter-cable/p/cg-02444) - 3.5mm Male to DB-9 *Male*
- [Gender Changer (Amazon)](https://www.amazon.com/C2G-Cables-Serial-Changer-Coupler/dp/B00005111M/ref=sr_1_4?s=pc\&ie=UTF8\&qid=1467322225\&sr=1-4\&keywords=gender%2Bchanger\&th=1) - DB-9 Female/Female Gender Changer
- [Gender Changer (Walmart)](https://www.walmart.com/ip/Gender-Changer-SUB-9-Pin-Pack-of-2-Socket-To-9-Pin-Female-To-9-Pin-Serial-RS232-Gender-Changer-Converter-Adaptor/2249966965?wmlspartner=wlpa\&selectedSellerId=101294820\&adid=22222222227000000000\&wl0=\&wl1=g\&wl2=c\&wl3=42423897272\&wl4=pla-51320962143\&wl5=9032144\&wl6=\&wl7=\&wl8=\&wl9=pla\&wl10=736876983\&wl11=online\&wl12=2249966965\&veh=sem\&gclid=CjwKCAjww7KmBhAyEiwA5-PUSiDg83bmbfSQa6_B5qIiBCOCGEAviTkWhr7miadhBbfguOYX3mgBMhoC4XYQAvD_BwE) - DB-9 Female/Female Gender Changer
- [Cable B (plugable.com)](https://plugable.com/products/pl2303-db9) - DB-9 Male to USB (Prolific PL2303GT chipset)
- [Cable B (Amazon)](https://www.amazon.com/gp/product/B00425S1H8/ref=oh_aui_detailpage_o01_s01?ie=UTF8\&psc=1) - DB-9 Male to USB (Prolific PL2303GT chipset)
- [Cable B (Walmart)](https://www.walmart.com/ip/Plugable-USB-to-Serial-Adapter-Compatible-with-Windows-Mac-Linux-RS-232-DB9-DTE-Male-Connector-Prolific-PL2303HX-Rev-D-Chipset/47500195) - DB-9 Male to USB (Prolific PL2303GT chipset)
- [Cable B (Amazon)](https://www.amazon.com/dp/B0759HSLP1?psc=1\&ref=ppx_yo2ov_dt_b_product_details) - DB-9 Male to USB (FTDI FT232RL chipset)

### Additional Cable for LS Models

For LS players (e.g., LS425, LS445, LS424, LS423), you will need an additional cable, Cable D, as shown below. This can be procured from the [BrightSign Store](https://store.brightsign.biz/).

::Image[]{src="https://api.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/oW3Rhzq1CljdRc60-w-Zg_image-20240415-185336.png" size="60" width="1140" height="688" darkWidth="1140" darkHeight="688" position="center" alt="image-20240415-185336.png" showCaption="false"}

## Serial Cable Considerations

### USB-to-Serial Chipsets and Drivers

BrightSign has tested and verified the cable assemblies described above and have found that USB-to-Serial cables with one of the following chipsets work best:

- [FTDI FT232RL](https://ftdichip.com/products/ft232rl/)
- [Prolific PL2303GT](https://www.prolific.com.tw/US/ShowProduct.aspx?p_id=382\&pcid=41)
- [Prolific PL2303HXD](https://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225\&pcid=41)

When using these cables, associated drivers may need to be installed:

- [FTDI FT232RL drivers](https://ftdichip.com/drivers/vcp-drivers/)
- [Prolific PL2303GT drivers](https://www.prolific.com.tw/US/ShowProduct.aspx?pcid=41\&showlevel=0017-0037-0041)
- [Prolific PL2303HXD drivers](https://www.prolific.com.tw/US/ShowProduct.aspx?pcid=41\&showlevel=0017-0037-0041)

When qualifying cable assemblies, be aware that your computer’s OS, OS Version, and general setup (this includes computer settings as well as any installed security software) can all affect whether or not your computer is able to detect the player. BrightSign has seen largely positive results from both the FTDI Chipsets as well as the Prolific Chipsets. However, if you are unsure about compatibility with your computers, it may be best to acquire and test cable assemblies with both chipsets prior to making larger purchases.

### Counterfeit Cables

There is a wide variance in USB-to-Serial cables, and many cables contain chipsets which may not be compatible with our players. In addition, counterfeit and/or low-quality cables are prevalent (see [Prolific’s message](https://www.prolific.com.tw/US/ShowProduct.aspx?p_id=155\&pcid=41) regarding counterfeits of their products). For this reason, we recommend that cables be procured directly from the sources provided or from a manufacturer-authorized reseller.

If deviating from the provided sources, we recommend confirming the pinout and chipset with the manufacturer prior to purchase and to qualify any cables thoroughly before making larger purchases.

### Pinout and Null Modems

When designing systems that use the serial connection, careful consideration must be paid to the pinouts of all connections involved. This includes pinouts for any cables as well as any hardware devices that the cable(s) will connect to.

Whether a Null Modem is needed or not depends upon the specified pinout of the cable. Refer to the [this page](docId\:Zen3QyWtjoHOeOTkbRX2a) for details on how the tip, ring, and sleeve of the 3.5mm pin are mapped to the DB-9 pins. To determine the pinout of the 3.5mm to DB-9 or DB-9 to USB, refer to the manufacturer’s specification to ensure the cable meets the specifications of BrightSign’s 3.5mm serial port.

### Connector Genders

Be sure to confirm that the connector genders, both on the cables themselves as well as on the device(s) the cables are connecting to, are compatible. Validate that all cables meet your system requirements before making larger purchases.

### Using the 3.5mm Port in Production

If the 3.5mm serial port is intended to be used as part of the end experience (e.g., connecting the player to a serial controller), it is recommended to use Telnet or SSH when connecting to the player during development. Developing and testing with the intended serial device attached to the player will provide a better representation of the final production configuration.

The Console output emitted from the 3.5mm serial port is intended for development purposes and is not intended for production use.

## Connecting Player to Computer

A terminal app on your computer is required to interface with the Shell. Terminal apps can either be command-line based or GUI (Graphical User Interface) based. Popular terminal apps include:

- Mac
  - [iTerm2](https://iterm2.com/)
  - [Serial](https://www.decisivetactics.com/products/serial/)
  - macOS Terminal App
- Windows
  - [PuTTY](https://www.putty.org/)
  - [miniCom](https://salsa.debian.org/minicom-team/minicom)
- Linux
  - [tio](https://github.com/tio/tio)

Here are details on the [Configure the Serial Port](docId\:Zen3QyWtjoHOeOTkbRX2a).

From your terminal app, the first step is to confirm that the USB-to-Serial cable (Cable B above) is detected by your computer. Note that the computer should be able to detect the USB-to-Serial cable even without a serial device (e.g., the player) connected on the other end. Simply attaching this cable to the computer is the quickest and easiest way to verify that the cable’s connection is detected by the computer.

After attaching the cable assembly to the player, the player can be found by running the following command:

```text
ls /dev/tty*
```

The player should be named along the lines of `/dev/tty.usbserial` on macOS or `/dev/ttyUSB0` on Linux.

The `screen` command can be used to establish a connection. The command to establish a connection is as follows:

```text
screen /dev/tty.usbserial 115200
```

From here, a blank screen in the terminal app should appear. If your session reported any errors, please refer to the [Troubleshooting](docId\:FXXyu9jmocUtC6XE2p7l2) section. Refer to [Accessing the BrightSign Shell](docId\:FXXyu9jmocUtC6XE2p7l2) section to access the BrightSign Shell.

The following was set up using the details outlined in [Configure the Serial Port](docId\:Zen3QyWtjoHOeOTkbRX2a) with the following settings:

- **Baud rate:** 115200
- **Data:** 8 bit
- **Parity:** none
- **Stop:** 1 bit
- **Flow control:** Hardware flow control is available on the 4Kx42, XDx32, and HDx22 models. Software flow control is not supported on any model.
- **Return Key:** CR + LF
- **Send Mode:** Interactive (line buffered may also work)

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/5nsKEtCobnpNegUGLxQdV_image-20240415-193812.png" size="80" width="900" height="678" position="center" alt="image-20240415-193812.png" showCaption="false"}

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/jsgtxcCtZLn-WgfKMd661_image-20240415-193824.png" size="80" width="906" height="680" position="center" alt="image-20240415-193824.png" showCaption="false"}

If it’s unclear which `tty` device is the player, unplug the cable and run the command again. The device that disappears is the player.

## Enabling the BrightSign Console

Follow these steps to enable/turn on the BrightSign Console:

1. Connect the aforementioned cable assembly from the player to your computer. The 3.5mm connector should be plugged into the player’s 3.5mm serial port and the USB connector plugged into the computer.
2. Once the cables are connected, open a terminal app to establish a connection.The player should be named along the lines of `/dev/tty.usbserial` on macOS or `/dev/ttyUSB0` on Linux:

```text
ls /dev/tty.usb*
```

The player can be found by running the following command:

```text
screen /dev/tty.usbserial 115200
```

From here, a blank screen in the terminal app should appear. Note that the player’s name may be different depending on the type of computer and serial cable used. If your session reported any errors, please refer to the [Troubleshooting](docId\:FXXyu9jmocUtC6XE2p7l2) section.

3\. From here, we will enable the BrightSign Console.

1. Power down the player. For the next few steps, pay close attention to the terminal app and watch the logs during the boot process. Specifically, watch for a message along the lines of “*Press CTRL-C to stop automatic startup”.*
2. Press and hold down the SVC button while applying power to the player. This instructs the player to emit logs through the 3.5mm serial port.
3. After \~3-5 seconds, the terminal app will ask you to press CTRL-C to stop automatic startup and will present a 3-second countdown. To stop automatic startup, press CTRL-C on your computer’s keyboard within the countdown window.
4. Depending on the version of BrightSignOS installed on the player, you will see one of the following boot loader prompts: `BOLT>`, `SECURE>`, `INSECURE>` Enter the following at the boot loader prompt:

```text
console on
reboot
```

Example:

```text
SECURE> console on
*** command status = 0
SECURE> reboot
```

This reboots the player with the Console enabled/on which results in the player displaying a continuous scroll of logs emitted from the 3.5mm serial port. You can pause the scrolling of logs at any time using the keyboard (different terminals have different setups for how to do this).

:::hint{type="info"}
The Console will continue to emit logs, even after a reboot, until either the Console is explicitly disabled (entering `console off` and `reboot` from the boot loader prompt) or a Factory Reset is performed on the player.
:::

## Accessing the BrightSign Shell

The BrightSign Shell is accessible through a serial cable, Telnet, or SSH. It is denoted by the `BrightSign>` prompt.

Navigate to the BrightSign Shell through one of the methods described below.

### Shell Access Methods

The bulleted items shown below are *not* steps, i.e., each item shown is an *independent* method for accessing the Shell.

- With the player off, remove any storage device connected to the player. Power on the player and wait for the splash screen to appear over HDMI, and then press either the SVC button on the player or CTRL-C on your computer.
- Place an autorun.brs file containing only the word “end” (without the quotes) on the storage device. The script will execute and bring you to the BrightSign Shell.

:::hint{type="info"}
Note: If a storage device is present and it does not contain an autorun.brs file, the SVC button event will *not* be registered. If no storage device is present, the SVC button event *will* be registered.
:::

## Shell Commands

The following commands are currently available in the BrightSign Shell.

| **Command**                              | **Description**                                                                                                                                                  |
| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `?`                                      | Display the list of available commands.                                                                                                                          |
| `help`                                   | Provide more information about a command.                                                                                                                        |
| `clear`                                  | Clear the terminal window.                                                                                                                                       |
| `exit`                                   | Exit the shell.                                                                                                                                                  |
| `dir` or `dir <directory>`               | List the contents of the current directory or the specified directory.                                                                                           |
| `readperf`                               | Measure the performance of file reading.                                                                                                                         |
| `writeperf`                              | Measure the performance of file writing.                                                                                                                         |
| `rwperf`                                 | Measure simultaneus file read/write performance.                                                                                                                 |
| `audioplay`                              | Play an audio snippet.                                                                                                                                           |
| `script`                                 | Start the BrightScript Debugger. Can also be used to run a script from a file if passed the filename.                                                            |
| `mfg`                                    | Perform a manufacturing test.                                                                                                                                    |
| `serialbaud`                             | Set the serial baud rate.                                                                                                                                        |
| `reboot`                                 | Reboot the system.                                                                                                                                               |
| `shutdown`                               | Shut down the system.                                                                                                                                            |
| `date`                                   | Display the date and time.                                                                                                                                       |
| `date <YYYY/MM/DD hh:mm:ss>`             | Set the date and time.                                                                                                                                           |
| `timezone`                               | Display the time zone.                                                                                                                                           |
| `timezone list`                          | Display a list of accepted time zones.                                                                                                                           |
| `timezone <zone>`                        | Set the time zone.                                                                                                                                               |
| `chdir <path>` or `cd <path>`            | Change the current directory.                                                                                                                                    |
| `delete <filename>`                      | Delete files or or directories recursively.                                                                                                                      |
| `version`                                | Display software versions.                                                                                                                                       |
| `licenses`                               | Display license information.                                                                                                                                     |
| `registry`                               | Access the device registry.                                                                                                                                      |
| `uptime`                                 | Display device uptime.                                                                                                                                           |
| `writebootfile`                          | Write a boot file to flash.                                                                                                                                      |
| `erasebootfile`                          | Erase a boot file in flash.                                                                                                                                      |
| `id`                                     | Display device identification information.                                                                                                                       |
| `file <filename>`                        | Determine a file type.                                                                                                                                           |
| `hash`                                   | Cryptographically hash a file.                                                                                                                                   |
| `factoryreset`                           | Reset the system to factory defaults.                                                                                                                            |
| `format <drive> [<filesystem>]`          | Format a drive using one of the following file systems: `vfat`, `ext3`, `ext4`.                                                                                  |
| `eject <drive>`                          | Eject a drive.                                                                                                                                                   |
| `log`                                    | Display the system log.                                                                                                                                          |
| `unsetrtc`                               | Clear the real time clock (RTC). Note that this action does not modify the system clock.                                                                         |
| `probe`                                  | Probe a file.                                                                                                                                                    |
| `analyze`                                | Analyze a file.                                                                                                                                                  |
| `ptpstatus`                              | Display the PTP status.                                                                                                                                          |
| `usblist`                                | Display a list of discovered USB devices.                                                                                                                        |
| `bvn`                                    | Dump BVN status for debugging.                                                                                                                                   |
| `avsinfo`                                | SoC AVS Information.                                                                                                                                             |
| `node`                                   | Invoke Node.js Interpreter.                                                                                                                                      |
| `cursor`                                 | Turn mouse cursor on or off.                                                                                                                                     |
| `mmchealth`                              | Report MMC Health.                                                                                                                                               |
| `ping`                                   | Send echo request to remote host and wait for reply.                                                                                                             |
| `ifconfig`                               | Configure the network interface. Type `help ifconfig` for a full list of configuration options. Also see [Default Routing Metrics](docId:0jDtAGrV4AlBWLYFJNj45)  |
| `wifiscan`                               | Scan for WiFi networks.                                                                                                                                          |
| `httpgetperf <url> [<destination_file>]` | Measure the download performance from the specified URL. If a destination file is not specified, the contents are discarded.                                     |
| `nslookup <hostname>`                    | Look up the hostname in the DNS.                                                                                                                                 |
| `flushdns`                               | Flush DNS cache.                                                                                                                                                 |
| `videoplay`                              | Play a video snippet.                                                                                                                                            |
| `imageplay`                              | Display an image.                                                                                                                                                |
| `htmlplay`                               | Display an HTML Site.                                                                                                                                            |
| `videomode`                              | Change the current [video mode](docId\:QpML112mBhEK7LBDGUxnv)                                                                                                    |
| `edid hdmi`                              | Read the EDID from the attached monitor.                                                                                                                         |
| `powersave`                              | Set the VGA power saving mode.                                                                                                                                   |

## Telnet

:::hint{type="warning"}
For security reasons, it is recommended to use SSH over Telnet.
:::

Telnet can be used to access both the BrightSign Shell and the BrightScript Debugger, if enabled. While it is sometimes preferred to use a serial cable instead of Telnet for reliability reasons (e.g., network stability or when an application has forced the player into a reboot loop), Telnet access can be useful when the 3.5mm serial port (the default interface for the BrightSign Shell) is inaccessible.

### Enabling Telnet

Telnet is enabled by writing a registry key to player’s registry. The player must be rebooted for Telnet to take effect.

From the BrightSign Shell:

```text
registry write networking telnet 23
reboot
```

Alternatively, the following lines can either be entered at the BrightScript Debugger prompt or included as part of an autorun.brs file:

```text
reg = CreateObject("roRegistrySection", "networking")
reg.write("telnet","23")
RebootSystem()
```

Further info regarding Telnet can be found [here](docId\:L0L_gyiHAvtdBci9FFcQh)

### Accessing Telnet

Once Telnet has been enabled, it can be accessed through a terminal app:

```text
telnet <IP_ADDRESS>
```

Further info regarding Telnet can be found [here](docId\:L0L_gyiHAvtdBci9FFcQh)

## SSH

SSH can be used to access both the BrightSign Shell and the BrightScript Debugger, if enabled. While it is sometimes preferred to use a serial cable instead of SSH for reliability reasons (e.g., network stability or when an application has forced the player into a reboot loop), SSH access can be useful when the 3.5mm serial port (the default interface for the BrightSign Shell) is inaccessible.

Authorized public keys can be provided for SSH. Public key authentication can be mixed with password authentication. To disable password authentication do not set a login password.

### Enabling SSH

SSH is enabled by writing a registry key to player’s registry and a BrightScript Object, `roNetworkConfiguration`. The player must be rebooted for SSH to take effect.

The following lines can either be entered at the BrightScript Debugger prompt or included as part of an autorun.brs file:

```text
reg = CreateObject("roRegistrySection", "networking")
reg.write("ssh","22")
 
n=CreateObject("roNetworkConfiguration", 0)
 
n.SetLoginPassword("password")
n.Apply()
reg.flush()
RebootSystem()
```

Further info regarding SSH can be found [here](docId\:L0L_gyiHAvtdBci9FFcQh).

### Accessing SSH

Once SSH has been enabled, the following SSH commands can be used:

```text
ssh brightsign@<IP_ADDRESS>
```

```text
ssh brightsign@brightsign-<SERIAL_NUMBER>.local
```

## Useful Telnet and SSH flags

Here are some tips for enabling serial output for various circumstances.

Refer [here](docId\:L0L_gyiHAvtdBci9FFcQh) for info on Telnet.

- `[networking]telnet 22` - enables SSH ([roNetworkConfiguration SetLoginPassword()](docId\:U6ZceYQddlz9xdAKtTmJs) must be set)
- `[networking]telnet 23` - enables Telnet
- `[networking]telnet_log_level 7` - sets the Linux log output to the same level as what we see with the 3.5mm serial connector, allowing the Linux log output to be sent to Telnet.
- `[networking]serial_with_telnet 1` - allows communication with the player through both the 3.5mm serial connector and Telnet.
- `[brightscript]debug 1` - (value is any truthy/positive value) can be used to enable the Debugger.

### Using SSH or Telnet with a Connected Serial Device

By default, enabling debugging output via Telnet or SSH will disable such output over serial. The 3.5mm serial port can still be used for interaction with serial devices via the roSerialPort object.

It is possible to enable debugging output over both Telnet/SSH and serial. However, interaction with serial devices via the roSerialPort object will become highly unreliable. To enable debugging output over serial as well, run a script containing the following code after Telnet/SSH has been enabled:

```text
reg = CreateObject("roRegistrySection", "networking")
 
print "Trying to enable serial with Telnet/SSH"
print reg.write("serial_with_telnet", "1")
reg.flush()
```

:::hint{type="info"}
Although the registry key is labeled “serial\_with\_telnet”, it applies to both Telnet and SSH configurations.
:::

Additional info [here](docId\:L0L_gyiHAvtdBci9FFcQh).

## Accessing Logs

This section covers the accessing of logs from the player.

There are several methods for accessing player logs:

- A physical serial connection
- SSH /Telnet
- [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM) which can be accessed either locally (over the local network) or remotely (over the internet)
- syslog server
- Local HTTP REST APIs
- BSN.cloud HTTP REST APIs

Player logs can be useful for analytics, troubleshooting, and debugging issues with the player. They can also be useful for accessing things like the network settings, display details, the BrightScript Interpreter and Debugger, and connected peripherals. Information from your application or presentations can also be logged.

### Logs from BrightSign Shell

Enable the BrightSign Shell through using a physical set of cables to establish a serial connection with the player. Refer to the [Accessing the BrightSign Shell](docId\:FXXyu9jmocUtC6XE2p7l2) section for information on the required cables and how to enable the BrightSign Shell.

Logs accessed from the BrightSign Shell will be captured by your terminal application. The logs can be redirected to a file or saved to a file through the terminal app.

### Logs from Telnet or SSH

Enable Telnet or SSH through BrightScript to establish a Telnet or SSH connection in order to access the logs. See the [Telnet](docId\:FXXyu9jmocUtC6XE2p7l2) or [SSH](docId\:FXXyu9jmocUtC6XE2p7l2) sections above for information on how to enable Telnet or SSH.

Logs accessed from Telnet or SSH will be captured by your terminal application. The logs can be redirected to a file or saved to a file through the terminal application.

### Logs from the Diagnostic Web Server (DWS)

The [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM) is a web server that runs on the BrightSign player and can be used to access player logs, network settings, and much more.

When enabled, the player's DWS can be accessed over the local network. If the player has been registered with BSN.Cloud, the DWS can also be accessed remotely over the internet when the player is connected to the internet.

The DWS can also be accessed vis REST APIs, either locally or remotely. Local access requires authentication using Basic or Digest Authentication. See [LDWS API Logs Endpoints](docId\:GVrlTps3CLNqwBF6nMEpM) for more info. Authorization for remote API access utilizes an OAuth token. See [Remote DWS APIs](docId\:Kku9e7f7CHC5LwofXs9E0) for more info.

### Logs from syslog server

When enabled, the BrightSign player can send logs to a syslog server using the standard syslog protocol (RFC 3164) running on a pre-configured machine the BrightSign has access to. It can be accessed through a syslog client. The syslog server can be used to access logs.

To enable the syslog server, the following BrightScript code can be used:

```text
registry = CreateObject("roRegistrySection", "networking")
registry.Write("syslog", "my-syslog-server")
registry.Flush()
```

The syslog server can either be referenced by its IP address or its hostname.

## Troubleshooting

If you’re encountering difficulties connecting your terminal application to the BrightSign player, below are some steps you can take to troubleshoot.

### Verify the tty Profile is Correct

Refer to the [Connecting Player to Computer](docId\:FXXyu9jmocUtC6XE2p7l2) section for establishing a serial connection between the player and your computer. If the profile is incorrect, the terminal app will not be able to connect to the player.

Serial port details can be found [here](docId\:Zen3QyWtjoHOeOTkbRX2a).

### Is the Terminal App Configured Properly?

If the profile appears correct, determine if the terminal app is configured properly by connecting to the Serial Device cable or SSH/Telnet. If the terminal app is configured properly, and the player either has Shell enabled by holding the SVC and applying power for this boot cycle, or if Shell has been enabled, the terminal app should display the BrightSign Shell output.

### Is the BrightSign Shell Enabled?

If the profile appears correct, determine if the Shell is on by rebooting the player. Assuming power is properly applied to the player, and your computer is properly reading from the Serial Device or SSH/Telnet, Shell output from the player should be seen within \~2-5 seconds.

If there is no output, unplug the power cable, hold down the SVC button on the player and apply power. Within 2-5 seconds, the Shell should output something like `Hit CTRL-C to stop...` or `Automatic startup in 3 seconds, press Ctrl-C to interrupt.."` Note that this approach enables Shell output for this boot only.

To persistently enable the Shell, at the boot loader prompt, type `console on` and then `reboot`.

More information found [here](docId\:FXXyu9jmocUtC6XE2p7l2).

### The BrightSign Shell is Not Displaying

If the BrightSign Shell is inaccessible yet it has been activated for this boot cycle or enabled persistently across boot cycles, try to access it through one of the following means:

- Press SVC
- Press CTRL-C
- Remove microSD, reboot, after \~45-60 seconds press SVC without the microSD card inserted

If these steps don’t work, the Shell may not be enabled. Please refer to the section about the [BrightSign Shell](docId\:FXXyu9jmocUtC6XE2p7l2) to enable it.

### Resetting your Mac Serial Terminal Connection

In some situations, the computer may think it’s connected to another serial device when physically it is not; in others, the terminal connection may not be properly associated with the existing serial connection. When this occurs and the computer tries to connect to the device, an error may occur along the lines of:

“Cannot open line ’tty.usbserial’ resource for R/W, resource busy”

This can mean that a process on the computer is already allocated to listening on the same serial connection. Here are a couple of ways to fix this problem:

Kill the process and re-open a new process:

`lsof | grep 'usbserial'`

`sudo kill -9 <pid>`

Alternatively, you can attach to the existing process ID:

`lsof | grep 'usbserial'`

`screen -x <pid>`

Additional info can be found [here](https://discussions.apple.com/thread/6078814?answerId=6078814021#6078814021).

### Still Having Issues?

If you’ve tried the above steps and are still have issues, you may need to [factory reset the player](docId\:ynCF7P2PYZo2qedF1JYim). If troubles persist, please contact [support@brightsign.biz](mailto\:support@brightsign.biz).

## Additional Serial Topics

Here are some additional topics that may be useful during troubleshooting.

- For Console access, the SVC button should only be held down long enough to see Console output. If the SVC button is held down too long after Console output appears, the player will go into “rescue mode” which is most likely not the intended mode if you’re reading this document. Rescue mode may be initiated if the SVC button is held for 15 seconds or more while power was applied. While in rescue mode, the error LED will continue flashing for about fifteen minutes before rebooting. During that time, if an OS update is present on an attached storage device (or if a storage device is subsequently attached), the OS update will be applied.
- The SVC and Reset buttons are physically close to each other on most players. Make sure that it’s the SVC button being pressed and not the Reset button.
- Make sure that neither the SVC button nor the Reset button are stuck in the pressed down state. While this is rare, it has been known to occur.

If the Console is still inaccessible, it may be best to perform a [factory reset](docId\:ynCF7P2PYZo2qedF1JYim). Without access to the BrightSign prompt and without the use of a script, the player can be factory reset by performing the following steps:

1. Hold both SVC and Reset while applying power.
2. Hold these 2 buttons until the ERR light flashes repeatedly red.
3. Release these buttons which will cause the player to boot up again. The player should be left untouched for \~2 minutes while it factory resets itself.
4. The player will be factory reset.
5. Next, power down the player.
6. Hold SVC while applying power.
7. If your computer’s serial physical connection and application are properly configured to associate with the Serial Device, you should now have Shell output at which point hit CTRL-C when the message “Hit CTRL-C to stop …” appears.

:::hint{type="info"}
During an OS update, both the BrightSign Shell and “Debug Mode” (script debug) are reset to disabled.
:::


[title] Integrating with BrightSign
[path] BrightSign Partner Packet/

As was shown in the hands-on example, BrightSign players can be provisioned by manually copying the necessary files to each player’s storage device. While this approach may be feasible for small numbers of easily accessible players requiring infrequent content updates, the manual approach quickly becomes untenable with larger networks of players that may be difficult to access and/or situations in which regular content updates are desired.

To fully take advantage of BrightSign offerings, partners are encouraged to utilize the many powerful tools BrightSign offers that help streamline the deployment and management of players.

[Next - bsn.Control Integration >](docId\:PhuUw_iHOXpaTIRCK8nbr)&#x20;

[title] Preparations
[path] BrightSign Partner Packet/Example (Manual Setup)/

First, you will need to gather the necessary materials in order to follow along with this example.

# What You Will Need

- BrightSign player and associated power supply
- microSD (µSD) or other storage device (a microSD card will be assumed for this guide)
- microSD card adapter (computers with standard SD card readers typically require an adapter to access microSD cards)
- Mac or PC
- Display
- HDMI cable (connects the player to the display)

# Storage Preparation

Make sure the card is properly formatted as described [here](docId\:o4YzospNpFaGbgLdUleee).

# Player Preparation

If your player is brand new, your player should be ready to proceed.

:::hint{type="warning"}
If you have previously set up your player, it may have some residual settings that need to be reset. In particular, if your player was previously configured for use with the BrightSign Author Plus (perhaps to evaluate the service using our free trial), the player will attempt to connect to and set itself up with BrightSign Author Plus. Refer [here](docId\:Cyl9kPm02CO5rgcB9WQQv) for instructions on how to delete the player’s provisioning record and then return here to proceed.
:::

[Next - Copy to Player >](docId\:QMkhVLqLbvdwmt5SFThKm)

[title] Debugging Webpages
[path] HTML Development/HTML Best Practices/

## Web Inspector

You can use the [Web Inspector](https://trac.webkit.org/wiki/WebInspector) to debug webpages over the local network.

:::hint{type="info"}
The JavaScript console should only be used in non-production presentations and it should be disabled before you publish in a production environment because it uses more memory, which can lead to frequent reboots, and it compromises security.
:::

### Enabling/Disabling the Web Inspector

As of BOS version 8.5.31 and later, *both* a presentation setting and a registry setting (`enable_web_inspector` registry key in the `html` section) are required to enable the Web Inspector. The various methods you can use to enable these settings are described below.

**Through the Presentation Setting:**

- *BrightSign Author*: In your BrightSign Author presentation, go to  **Presentation tab > State Properties > Options&#x20;**&#x61;nd selec&#x74;**&#x20;Enable Javascript console**.
- *BrightAuthor Classic*: In your BrightAuthor Classic presentation, go to **File > Presentation Properties > HTML** and check the **Enable Javascript console** box. See the "inspector\_server" in [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) for more information.
- *BrightScript*: When creating the *roHtmlWidget* instance, include the **inspector\_server** initialization parameter and specify a port number. 

**Through the Registry Setting:**

These settings are only required as of BOS version 8.5.31 and later.

- *Local/Remote DWS*: Select **Allow JavaScript console** in the [Chromium Debugging](docId\:qXt4YHey7IEj_M9dH73wM) section of the DWS.&#x20;
- *Local DWS APIs*: Set `PUT /v1/diagnostics/chromium-debug/` to `true` to enable the Web Inspector. See [this page](docId\:SAYOK1v5MYNJRFjDyJO5K) for more information.
- *BrightScript*: Set the `enable_web_inspector` registry key to “1” to enable the Web Inspector for Chromium on the player (if it is set to “0” or nothing, the Web Inspector is disabled). For example:

```text
reg = CreateObject("roRegistrySection","html")
reg.Write("enable_web_inspector", "1")
reg.Flush()
```

To disable the Web Inspector, disable either the presentation or registry setting you used to enable it.

If you want to change the Web Inspector port, you must edit the configuration of *roHtmlWidget*. See the "inspector\_server" in [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) for more information.

:::hint{type="info"}
Enabling the Web Inspector creates a security vulnerability on BrightSign players. See [this page](docId\:Ecb_HWEI2wJVvCqlxPD1x) for more details.
:::

### Inspecting a Webpage

Once HTML content is running on a BrightSign player, follow these steps to inspect it:

1. Open Chrome on a desktop computer connected to the same local network.
2. Enter the following URL into the address bar: chrome://inspect/devices
3. In the **Devices** section, click **Configure**.
4. Enter the player IP address and Web Inspector port in the field (see the image below). The page(s) being run on the BrightSign player will be displayed at the bottom of the page.
   - If you don't know the player IP address, power on the player with the microSD card (and other storage devices) removed. After a few moments, the IP address will be displayed on screen.
   - If you enabled the Web Inspector in BrightAuthor, use port 2999 (e.g. http\://192.168.1.62:2999/).
5. Click the **Inspect** button next to a page. A debugging session will be launched in a new window. Unlike local pages, the page contents are not displayed in the left pane, but the inspector window on the right can be used to debug the page.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/jdYWwI4Jz54K-8DauY6rC_inspector.png" size="70" width="1563" height="881" position="center" darkWidth="1563" darkHeight="881" showCaption="false"}

:::hint{type="info"}
Adding more than one device in your list can cause performance issues, especially if the devices are not online, because the Chrome client will continue to search for any offline devices.
:::

### Chromium Version Compatibility

Because BrightSign players use an older version of Chromium than recent desktop versions, newer desktop Chrome releases may not work with the Web Inspector. If you're having trouble using the Web Inspector with your version of Chrome, download and install one of these versions:

- Linux: [https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Linux\_x64/576753/chrome-linux.zip?generation=1532051976706023\&alt=media](https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Linux_x64%2F576753%2Fchrome-linux.zip?generation=1532051976706023\&alt=media)
- OS&#x58;**:** [https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Mac/576753/chrome-mac.zip?generation=1532055270387578\&alt=media](https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Mac%2F576753%2Fchrome-mac.zip?generation=1532055270387578\&alt=media)
- Windows 64-bit: [https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Win\_x64/576753/chrome-win32.zip?generation=1532053193483102\&alt=media](https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Win_x64%2F576753%2Fchrome-win32.zip?generation=1532053193483102\&alt=media)

:::hint{type="info"}
If you're using the Web Inspector to manually step through JavaScript code, encountering an uncaught error in the debugger may cause the player to crash. This is a known bug with the Web Inspector.
:::

A larger collection of supported Chromium downloads can be found [here](docId\:YGi_yIWT6pZ2BtU-GrfuP).

## Trace Events

The Chromium TraceEvent system allows you to debug JavaScript memory leaks, performance issues, and rendering problems. This feature is available in firmware versions 7.0.82 and later. Unlike PCs, where the trace/debugger is run in the same browser as the content, BrightSign players write JSON trace files to the local storage, which you can then import to Chrome on your PC.

When trace events are enabled on a BrightSign player, Chromium captures trace messages to a circular buffer. The player takes regular snapshots of this buffer and writes them to the root directory of the microSD card or SSD as JSON files. 

:::hint{type="info"}
The TraceEvent system can easily generate gigabytes of log data on local storage, so we recommend disabling it in production environments.
:::

:::hint{type="info"}
See this StackOverflow [page](https://stackoverflow.com/questions/12996129/memory-leak-when-logging-complex-objects) for more information about memory leaks when using console.log to log complex objects.
:::

### Creating a TraceEvent Directory

Before enabling the TraceEvent system, create a directory named "brightsign-webinspector" in the root directory of the microSD card or SSD on the player. If this directory is missing, the player will not record trace events when they are enabled in the registry. Conversely, you can disable trace events by deleting the "brightsign-webinspector" directory from the storage device.

### Enabling the TraceEvent System

The TraceEvent system is enabled and configured by writing to the BrightSign player registry (via [BrightScript](docId\:YTpSfntswYFMXx8PCqJLf) or [JavaScript](docId\:tXWoOMbD2-u12dfegX7gA)). To enable the TraceEvent system, write the following keys to the `html` section of the registry:

- `tracecategories` <font color="#704ae0">string</font>: A comma-separated list of trace event categories to enable. The category names are documented in the link below.
- `tracemaxsnapshots` <font color="#704ae0">int</font>: The maximum number of JSON-trace snapshot files in the "brightsign-webinspector" directory. When the limit is reached, the counter wraps around and begins writing over the oldest trace file.
- `tracemonitorinterval` <font color="#704ae0">int</font>: The frequency (in seconds) with which the player will take snapshots of the TraceEvent buffer. We recommend 60 seconds as a default value.

**Example (JavaScript):**

```text
var registryClass = require("@brightsign/registry");
var registry = new registryClass();
registry.write("html", {
    "tracecategories": "toplevel,blink_gc,disabled-by-default-memory-infra,disabled-by-default-blink_gc,disabled-by-default.skia.gpu.cache",
    "tracemaxsnapshots": "25",
    "tracemonitorinterval": "60"
}).then(
    function() {
        console.log("Write Successful");
    });
```

### Viewing Trace Events

Follow these steps to view the trace events:

1. Transfer the JSON trace files from the "brightsign-webinspector" directory to your PC.
2. Open *chrome://tracing* on your PC Chromium instance.
3. Import the JSON trace files.

You can merge multiple trace files; however, in a long trace capture, there will be too many trace events to view at once (you'll likely need to write a script to process them).

### Additional Documentation

See the following links for further explanation of trace events:

- [https://www.chromium.org/developers/how-tos/trace-event-profiling-tool](https://www.chromium.org/developers/how-tos/trace-event-profiling-tool)
- [https://chromium.googlesource.com/chromium/src/+/lkcr/docs/memory-infra/README.md](https://chromium.googlesource.com/chromium/src/+/lkcr/docs/memory-infra/README.md)
- [https://developers.google.com/web/tools/chrome-devtools/memory-problems/](https://developers.google.com/web/tools/chrome-devtools/memory-problems/)


[title] HTML Caching
[path] HTML Development/HTML Best Practices/

This page covers how to use caching techniques to display HTML content. BrightSign players offer novel solutions through BrightSign Author, BrightAuthor Classic, and BrightScript, as well as support for common Node.js® and JavaScript caching solutions.

## Storage and Memory

Before discussing HTML caching techniques, it is important to understand the storage and memory limitations of the players. All BrightSign players run HTML content on a Chromium engine. By default, Chromium reserves 1GB plus 10% of the total size of the player's storage device for memory. Players also have limited memory to run HTML graphics and JavaScript. This amount varies between player models; consult [this list](docId\:XleiD0O22LAz9SpXtbd8V) for more detail.

To change the storage values through BrightSign Author:

1. Go to the **Admin** tab
2. Open **Preferences > Storage**
3. Check **Enable** **Storage** **Limit**
4. Now space can be allocated for both HTML graphics and JavaScript. Make sure that:
   - When using **Absolute**, the specified segments should be neither larger nor smaller than the absolute size of your storage device
   - When using **Percent**, the percentages must add up to 100%.

To change the storage values through BrightAuthor Classic:

1. Go to **Edit > Preferences > Storage**
2. Check **Limit Storage Space by Function**
3. Now space can be allocated for both HTML graphics and JavaScript. Make sure that:
   - When using **Specify absolute size**, the specified segments should be neither larger nor smaller than the absolute size of your storage device
   - When using **Specify percentages**, the percentages must add up to 100%.

These limitations are shared across all roHtmlWidget instances, where [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) is the BrightScript object that handles all HTML processes.

## Caching Capabilities

BrightSign players offer a flexible toolset for caching HTML content. The sections below discuss novel BrightSign solutions and how to enable and use more common methods through Node.js and JavaScript.

### BrightSign solutions

BrightSign players offer two HTML caching solutions:

- **Local Storage**: The SD card for each player can store HTML content for playback. This method eliminates any connectivity or latency issues that may arise from networked solutions, but it must be done on a player by player basis. This can make local storage unattractive when dealing with a large fleet of devices.
- **The AssetPool BrightScript object:** The AssetPool is a sharded hash directory and is recommended for large file count applications. The AssetPool is filled by AssetFetcher objects that can acquire content online and store it for later playback in either sha1, besha1, or MD5 hash protocols. Consult [this page](docId\:V2kNK8YS07KIpGDqq5X8i) for more information about AssetPool.

### Node.js and JavaScript solutions

BrightSign players also support Node.js and JavaScript caching techniques. To use Node.js:

- If you are using BrightSign Author, Node.js can be initialized through the [State Properties](docId:2eh0-u7XsTxqw_emIiign) user interface.
- If you are using BrightAuthor Classic, Node.js must first be enabled through the BrightScript [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) object. &#x20;

Once Node.js is running on the player, users can use any JavaScript API or caching method to cache content. Recommended content acquisition methods are XmlHttpRequest and Fetch with Service Worker. Keep the memory limitations in mind - for example, XmlHttpRequest will cause some player models to crash if it is used to download files larger than 100-200MB. If XmlHttpRequest's storage reservation will exceed your memory limitation, we recommend using the Fetch API. 

You cannot use Service Workers to cache video content. BrightSign players use our media player infrastructure for later video playback, not the Chromium network. BrightSign recommends [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB) for storage: use it to cache content playback according to [these instructions](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Client-side_web_APIs/Client-side_storage#storing_complex_data_via_indexeddb). 

See an HTML/JavaScript test download example on [this page](docId\:vlSKfVzeQu04pD58rvXam).

:::hint{type="info"}
Our HTML widget cannot cache videos listed in the AppCache manifest because of differences between the Chrome desktop and BrightSign device video playback architecture. Please use Service Worker and IndexedDB to cache content instead of AppCache, which is now deprecated.
:::

### Using Blobs

BrightSign video players can play blob URLs referring to items in IndexedDB and Html5 FileSystem API. However it cannot play blob URLs referring to JavaScript objects in memory.

See this video-browser-storage.html example:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/IytljRFUHH3ruHv-xuDDJ_indexdb-playback-example.zip" label="indexdb_playback_example.zip" isUploading="false"}


[title] Displaying HTML with BrightSign Author
[path] HTML Development/

This page covers how to integrate HTML pages into BrightSign Author presentations. To add an HTML page to a presentation, select the HTML5 widget in the bottom of the **Content** window and drag it into the content panel above. [This page](docId\:AkrM58NDS_BN6AyhWZRax) describes how to use that widget.

## HTML Guidelines

### Zones

- You can have multiple zones containing HTML content in a BrightSign Author presentation.
- HTML content can be inserted into a **Video or Image** zone or an **Image** zone.

### Z-Ordering

- HTML content will show at the highest Z-level of graphics zones, meaning that an HTML zone will cover all other zones that contain images and text. This behavior does not extend to touch screens.
- HTML content can be placed in front of or behind zones containing video content, if you drag the **Graphics** zone(s) before or after the **Video** zone(s) (under the Zone menu in the **Zone Properties** panel). See Image 1 below.
- If the HTML page contains video and the **Enable native video playback** option is enabled in the HTML5 state, the HTML page will *always* display over other video zones.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/-DdpFgSyGkB1qXkLTKVnm_screenshot-2023-09-07-at-104742-am.png" size="62" width="792" height="647" position="center" darkWidth="792" darkHeight="647" showCaption="false"}

### Content Sourcing

HTML content can originate from a remote server, a local server, or the local storage (SD card) of the player. Presentations containing HTML content can also be downloaded onto the local storage from the BrightSign Network.

### Using Custom Fonts

To use custom fonts, specify the font in your script. If the font file is in the same directory as your JS and CSS files, it will be used in BrightSign Author. 

### Exporting an HTML5 Presentation

Exporting a presentation that contains multiple HTML pages also exports in full all asset folders associated with those pages. If your pages share common asset folders, the entire contents will be duplicated multiple times. This can become problematic if your asset folders contain large content files, so you may need to prune and/or rearrange asset folders that are duplicated after export.

### Chromium Video Playback

The HTML5 widget has an **Enable Native Chromium video playback** option in versions 1.19.2 and later of BrightSign Author. This feature is only available for XC5 players and is explained on [this page](docId\:AkrM58NDS_BN6AyhWZRax).

:::hint{type="info"}
Partners using a custom CMS can use [HTML Playback by Player Series](docId\:Wx7RHJmrG74EQxGXRwqtD) for more guidance on setting this option in their CMS.
:::

## Caching and Storage

BrightSign Author allows you to configure common browser caching and storage functions on the player. To enable these functions in your BrightSign Author presentation, select **Enable Limit Storage** under **Admin > Application Preferences**, allocate the space as you wish, and select **Apply**. You can allocate space for the following functions:

- **HTML Data**: The amount of space dedicated to the HTML application cache
- **HTML Local Storage**: The amount of space dedicated to JavaScript variables and data
- **HTML Indexed DB**: The amount of space dedicated to IndexedDB content

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/MDV7nRyJ55A0DDEbluBbz_htmllimitoptions.png" size="72" width="2022" height="1533" position="center" darkWidth="2022" darkHeight="1533" showCaption="false"}

## Using HTML with Portrait Orientation

To create a digital-signage canvas that is portrait oriented, simply create a portrait presentation and then insert an HTML5 widget.

## Integrating Touchscreen Content

You can enable touch-screen events for an HTML page by checking the **Enable mouse and touch events** box when creating an HTML5 state .

## Disguising Network Latency

When the BrightSign player loads HTML content from a URL, there may be a delay based on network latency. You can add a preload image to sidestep this issue. Note that this solution is not necessary if all HTML assets are located on the local storage of the player.

1. Set BrightSign Author to **Interactive**
2. Drag and drop an image file into the main panel
3. Set the **Initial State** box while editing the [Image State](docId\:aC3srsjbmpI1w2gN0Y3El).
4. Specify the timeout for three seconds (or more if desired) in a [Timeout Event](docId\:p2IAPuAXjbsLp4yNaqlet)**.**
5. Set the **Timeout** **Event** to transition to the HTML5 state.

## Displaying Scrollbars

The scrollbar behavior will be the same as it is in the current version of Chromium.

To display scrollbars, reference this simple CSS file from your HTML page:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/hS5XNhD9KKx90CPYxZmBD_forcescrollbars.css" label="ForceScrollbars.css" isUploading="false"}

## Debugging Webpages

See [this page](docId:4qlK1krr1cnx7xypWXRY5).


[title] Copy to Player
[path] BrightSign Partner Packet/Example (Manual Setup)/

In this example, we will maintain the player’s default Setup (the BrightSign Default Setup) and manually copy an *autorun.zip* file to the player’s storage device. The *autorun.zip* file will install the Player App.

# autorun.zip

At a minimum, the *autorun.zip* file should include the following files:

- *autorun.brs*
- *autozip.brs*

While not required, *autorun.zip* files can also include the presentation/content (e.g., an HTML file and associated media files that the player will display) that the *autorun.brs* file invokes. In this way, everything the player needs is contained in a single package for delivery. We will utilize this approach in this example, and we will use an HTML file as our sample presentation.

The *autorun.zip* file will include the following files:

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
- *autorun.brs* (this is the script [shown](docId:7ViTOacfAsnMPNOZL0ZBq) in the previous section; recall that this file instructs the player to render *index.html*)
- *autozip.brs* (this is the script [shown](docId:7ViTOacfAsnMPNOZL0ZBq) in the previous section which instructs the player to unzip the *autorun.zip* file)
- *index.html* (this is our HTML presentation)
- *snowy\_river.mp4* (this is a sample video that is displayed by the index.html presentation)
:::

:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/it7eTmsL9O1v2uMFngik0_image-20230327-234103.png" size="70" width="188" height="292" position="center" showCaption="false"}


:::
::::

You can create your own versions of the files above and compress them into an *autorun.zip* file, or you can use the *autorun.zip* file attached here:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/5gQQsO2AE77gN8GTbkre3_autorun.zip" label="autorun.zip" isUploading="false"}

# Local + Remote Content

Although we are including a video file in the *autorun.zip* file, our presentation will also display the following:

- A streaming video from YouTube.
- A picture slideshow where the pictures are retrieved from an external web server.
- The local weather displayed by a weather widget that retrieves data from an external URL.

BrightSign players are capable of displaying any combination of local and remote content.

# Copy to Card

Next, we will manually copy the *autorun.zip* to an empty microSD card and insert the card into a player.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/xXnByLWuvtP-BRrNcm6xX_image-20230623-164334.png)

1. Copy the *autorun.zip* file to the *root* directory of a blank, properly formatted microSD card.
2. Insert the microSD card into the player.
3. Power up the player.

Shortly after the player boots up, you should see something like this on your display:

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/tn485tCoxPAb2N5JCoSMD_image-20230328-161412.png)

# Folders

::::VerticalSplit{layout="right"}
:::VerticalSplitItem
When the *autorun.zip* file is unpacked, the *autozip.brs* file instructs the player to create several folders in the root directory of the microSD card. These folders and their functions are as follows:

## brightsign-dumps

If a player crashes, dumps are created and stored in this folder. Dumps are numbered incrementally and can be useful for troubleshooting. They may be requested by BrightSign Support when diagnosing problems. Note that only the 10 most recent crash dumps are retained.
:::

:::VerticalSplitItem
::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/JcFPJgKZfLyP6AHmvYBOL_image-20230526-015203.png" size="70" width="220" height="400" position="center" showCaption="false"}


:::
::::

## pool

Media files, especially video files, can be quite large. To help players better manage such large files, players apply a cryptographic [hash function](https://en.wikipedia.org/wiki/Cryptographic_hash_function) to each media file. Hash functions are well beyond the scope of this document, but at a high-level, when a hash algorithm is applied to any file, a unique hash, or alphanumerical representation, of that file can be generated. If that file is changed in any way, the new file will result in a completely different hash.

Hashes are typically many times smaller in size compared with the original file. Whereas a large video file can easily run into the gigabytes, a hash of that video will only be at most a few dozen bytes (the exact size of the hash depends on the algorithm used).

Hashes are therefore much more manageable representations of the actual media files, and the pool (more formally, the Asset Pool) is where these hashes are stored. System efficiency is greatly improved through the use of hashes. The system can, for example, quickly determine if a file has changed simply based on whether the hash has changed instead of having to compare two large files. More detail about the Asset Pool can be found [here](docId:1PwrkHCrG58LdHTSImJ-g).

## feedPool

The feedPool contains transient / non-static assets like RSS feeds and [dynamic playlists](docId\:gPjwF1LNjhau_EQZJMfUq), both of which can be used with BrightSign presentations.

## feed\_cache

The feed\_cache stores the metadata for the transient assets in the feedPool. For example, the feed\_cache would store the URL for an RSS feed, identifiers for particular items in the feed, and which items have been read and which ones are new.

[Next - Considerations >](docId:28x7V2W9aOIz9icuIDmPi)

[title] HTML Playback by Player Series
[path] HTML Development/

There are two ways to playback HTML audio and video from Series 5 and later players:

- On Series 5 and older players, video decode is handed off by default to the BrightSign application which deals with decode and display.
- On Series 5 and later players, there is now an option to set a registry value (`use-brightsign-media-player`) to enable the built-in Chromium video player. The resulting Chromium plays back video similarly to desktop Chromium. Series 5 players will automatically use hardware-accelerated decode if the Chromium video player is enabled. This option is not available on Series 4 and earlier players, regardless of OS version. 

BrightSign video and audio features are only provided by the BrightSign video player, so if you chose to use Chrome, BrightSign [HTML video](docId\:e6uJleH69Q0JmMv8kyTrp) features will not be supported (it is like running Chrome in a browser on a PC). Chromium has much poorer streaming support than our application, and fewer hardware accelerated video decode levels and profiles are supported.

Only customers who do not want to take advantage of our unique capabilities should use native Chrome in their CMS.

To switch from the BrightSign video player to the Chrome Media Player:

```text
registrySection = CreateObject("roRegistrySection", "html")
registrySection.Write("use-brightsign-media-player", "0") ' to switch to Chromium for media playback
```

To switch from the Chrome Media Player to the BrightSign video player:

```text
registrySection = CreateObject("roRegistrySection", "html")
registrySection.Delete("use-brightsign-media-player") ' to switch to back to the default (BrightSign) for media playback
```

or:

```text
registrySection = CreateObject("roRegistrySection", "html")
registrySection.Write("use-brightsign-media-player", "1") ' to switch to back to BrightSign for media playback
```


[title] Remote DWS APIs
[path] Diagnostic Web Server APIs/

The Remote DWS allows you to view and modify settings on a BrightSign player over the Internet. The Remote DWS API is a REST framework that allows a client application to integrate with Remote DWS functionality.

The client application makes REST calls to the BrightSign WebSockets server, which in turn sends WebSockets messages to BrightSign players. Depending on the operation, the BrightSign player may return information to the BrightSign Websockets server, which will be relayed in the server REST response to the client application.

## REST URLs

The base URL of the remote DWS API is [https://ws.bsn.cloud/rest/v1/](https://ws.bsn.cloud/rest/v1/).&#x20;

Please note that the REST section is case sensitive and the server may return code 404 if the case is not matched exactly.

## Authentication

All Remote DWS API calls require a valid OAuth2 access token which maybe issued either to a user or to the client application. The target player must belong to the same network for which the token has been granted.&#x20;

Please follow the [Authentication](docId\:HbYHyV8svQ0u6bZhuV50-) to register your applications and obtain access tokens which grant access to the Remote DWS API.

### Request Headers

You should include the following request headers in your request. The Content-Type header is only needed when content is being sent in POST or PUT API calls.

```text
headers: {
	'Accept': 'application/json, application/vnd.bsn.error+json',
	'Authorization': 'Bearer {{UserAccessToken}}',
	'Content-Type': 'application/json',
}
```

## Request Message Format

HTTP requests to Remote DWS resources must be JSON formatted and contain the following URL parameters:

- `destinationType`  <font color="#704ae0">string</font>: The device type. The only currently accepted value is "player".
- `destinationName`  <font color="#704ae0">string</font>: The device serial number

Requests that require a JSON body need to have an outer data object. For instance, if a route expects `enabled` <font color="#704ae0">bool</font> then the full JSON body would look like:

```json
{
  "data": {
    "enabled": false
  }
}
```

Some requests also require resource-specific properties in the URL or request body, as detailed in the **URL Parameters** and **Request Body** sections below.

## Response Message Format

The server will respond to a REST request with a success or error message, which may also contain resource-specific properties, as detailed in the **Response Body** sections below.

Returned JSON objects will have an outer object containing the methods below, where data is an error or a result object containing the returned values:

- `route` <font color="#704ae0">string</font>: The route the request was sent to
- `method` <font color="#704ae0">string</font>: The request method
- `data` <font color="#704ae0">object</font>: The returned data

For example:

```json
{
  "route": "/v1/info",
  "method": "GET",
  "data": {
    "result": {
      "model": "LS424"
      ...
    }
  }
}
```


[title] LDWS General Endpoints
[path] Diagnostic Web Server APIs/Untitled/

## GET /v1/ 

Returns a list of all available APIs. 

**Request Example**

```text
GET /api/v1/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
```

**Response Example**

:::ExpandableHeading
Expand

```json
{
  "data": {
    "result": {
      "routes": [
        {
          "method": "GET",
          "route": "/api/v1/health",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/download-firmware",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/fw-manifest-url",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/info",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/time",
          "securityLevel": "Informational"
        },
        {
          "method": "PUT",
          "route": "/api/v1/time",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/video-mode",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/logs",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/download-log-package",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/crash-dump/*",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/logs/crash-dumps",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/logs/crash-dumps/*",
          "securityLevel": "Informational"
        },
        {
          "method": "PUT",
          "route": "/api/v1/control/reboot",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "PUT",
          "route": "/api/v1/control/dws-password",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/control/dws-password",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/control/local-dws",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "PUT",
          "route": "/api/v1/control/local-dws",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/files/*",
          "securityLevel": "ContentUpload"
        },
        {
          "method": "DELETE",
          "route": "/api/v1/files/*",
          "securityLevel": "ContentUpload"
        },
        {
          "method": "POST",
          "route": "/api/v1/files/*",
          "securityLevel": "ContentUpload"
        },
        {
          "method": "PUT",
          "route": "/api/v1/files/*",
          "securityLevel": "ContentUpload"
        },
        {
          "method": "GET",
          "route": "/api/v1/stored-supervisors",
          "securityLevel": "ContentUpload"
        },
        {
          "method": "PUT",
          "route": "/api/v1/remove-supervisors",
          "securityLevel": "ContentUpload"
        },
        {
          "method": "DELETE",
          "route": "/api/v1/clear-supervisors",
          "securityLevel": "ContentUpload"
        },
        {
          "method": "DELETE",
          "route": "/api/v1/storage/:device",
          "securityLevel": "ContentUpload"
        },
        {
          "method": "GET",
          "route": "/api/v1/diagnostics",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/diagnostics/dns-lookup/*",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/diagnostics/ping/*",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/diagnostics/trace-route/*",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/diagnostics/network-neighborhood",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/diagnostics/network-configuration/*",
          "securityLevel": "Informational"
        },
        {
          "method": "PUT",
          "route": "/api/v1/diagnostics/network-configuration/*",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/diagnostics/interfaces",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/diagnostics/chromium-debug",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "PUT",
          "route": "/api/v1/diagnostics/chromium-debug",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/diagnostics/packet-capture",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "POST",
          "route": "/api/v1/diagnostics/packet-capture",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "DELETE",
          "route": "/api/v1/diagnostics/packet-capture",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "PUT",
          "route": "/api/v1/diagnostics/telnet",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/diagnostics/telnet",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "PUT",
          "route": "/api/v1/diagnostics/ssh",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/diagnostics/ssh",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "PUT",
          "route": "/api/v1/registry/recovery_url",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/registry",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/registry/:section",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/registry/:section/:key",
          "securityLevel": "Informational"
        },
        {
          "method": "PUT",
          "route": "/api/v1/registry/:section/:key",
          "securityLevel": "Informational"
        },
        {
          "method": "DELETE",
          "route": "/api/v1/registry/:section/:key",
          "securityLevel": "Informational"
        },
        {
          "method": "DELETE",
          "route": "/api/v1/registry/:section",
          "securityLevel": "Informational"
        },
        {
          "method": "PUT",
          "route": "/api/v1/registry/flush",
          "securityLevel": "Informational"
        },
        {
          "method": "POST",
          "route": "/api/v1/snapshot",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/video/:connector/output/:device",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/video/:connector/output/:device/edid",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/video/:connector/output/:device/power-save",
          "securityLevel": "Informational"
        },
        {
          "method": "PUT",
          "route": "/api/v1/video/:connector/output/:device/power-save",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/video/:connector/output/:device/modes",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/video/:connector/output/:device/mode",
          "securityLevel": "Informational"
        },
        {
          "method": "PUT",
          "route": "/api/v1/video/:connector/output/:device/mode",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/video/screen/modes",
          "securityLevel": "Informational"
        },
        {
          "method": "PUT",
          "route": "/api/v1/video/screen/modes",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/advanced/property-lock",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "PUT",
          "route": "/api/v1/advanced/property-lock",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/advanced/property-lock",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "PUT",
          "route": "/api/v1/advanced/property-lock",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/remoteview/config",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "PUT",
          "route": "/api/v1/remoteview/config",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "POST",
          "route": "/api/v1/remoteview/:source/view",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/remoteview/:source/view",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/remoteview/:source/view/:id",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "DELETE",
          "route": "/api/v1/remoteview/:source/view/:id",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/system",
          "securityLevel": "Internal"
        },
        {
          "method": "GET",
          "route": "/api/v1/system/service/:id/*",
          "securityLevel": "Informational"
        },
        {
          "method": "PUT",
          "route": "/api/v1/system/service/:id/*",
          "securityLevel": "Informational"
        },
        {
          "method": "DELETE",
          "route": "/api/v1/system/service/:id/*",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/system/supervisor/logging",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "PUT",
          "route": "/api/v1/system/supervisor/logging",
          "securityLevel": "ControlManagement"
        },
        {
          "method": "GET",
          "route": "/api/v1/system/supervisor/registration",
          "securityLevel": "Internal"
        },
        {
          "method": "PUT",
          "route": "/api/v1/system/supervisor/registration",
          "securityLevel": "Internal"
        },
        {
          "method": "PUT",
          "route": "/api/v1/system/supervisor/autorun-settings-update",
          "securityLevel": "Internal"
        },
        {
          "method": "GET",
          "route": "/api/v1/system/supervisor/autorun-config",
          "securityLevel": "Internal"
        },
        {
          "method": "POST",
          "route": "/api/v1/system/supervisor/capabilities",
          "securityLevel": "Internal"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/lldp",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/debug",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/messages",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/dmesg",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/processes",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/smart_report",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/ifconfig",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/lastring",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/lastkmsg",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/usb",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/network",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/netconfig",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/ptp",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/edid",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/script_debug",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/network_diagnostics",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/ping",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/dns_lookup",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/traceroute",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/tcp_connections",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/network_statistics",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/registry_dump",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/device_data",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/avs",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/secure_boot",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/extensions",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/crash_dump_present",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/dhcp-server",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/contents",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/powersave",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/storage_info",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/map",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/fd",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/block",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/zoneinfo",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/slabinfo",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/loadavg",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/meminfo",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/stat",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/vmstat",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/interrupts",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/version",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/boardid",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/packet_capture",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/bvn",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/bvnall",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/edid_raw",
          "securityLevel": "Informational"
        },
        {
          "method": "GET",
          "route": "/api/v1/legacy/ca_certificates",
          "securityLevel": "Informational"
        }
      ]
    }
  }
}
```
:::

## GET /v1/health/ 

Returns information about the health of a player

**Request Example**

```text
GET /api/v1/health/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `status` <font color="#704ae0">string</font>: The player status. The only possible value is "active".
- `statusTime` <font color="#704ae0">string</font>: The date and time the player responded to the status request. The date/time is formatted as `"yyyy-mm-dd hh:mm:ss <timezone>"`.

**Response Example**

```json
{
  "data": {
    "result": {
      "status": "active",
      "statusTime": "2024-01-30 07:38:05 PST"
    }
  }
}
```

## GET /v1/download-firmware

Downloads the OS from the remote URL to the player and then reboots the player to update the OS.

**Query String Parameter**

- `url` <font color="#704ae0">string</font>: The public URL for downloading the firmware-update file for your player model

**Request Example**

```text
GET /api/v1/download-firmware/?url=https://bsncloud.s3.amazonaws.com/public/cobra-9.0.110-update.bsfw HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the download was successful
- `reboot` <font color="#704ae0">bool</font>: A flag indicating whether the player will reboot when applying a firmware update

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "reboot": true
    }
  }
}
```


[title] rDWS Video Endpoints
[path] Diagnostic Web Server APIs/Remote DWS APIs/

Base URL for these endpoints:  ***https\://ws.bsn.cloud/rest/v1/***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /video-mode/ 

Retrieves the currently active video mode on the player

**Request Example**

```text
GET /rest/v1/video-mode/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `width` <font color="#704ae0">int</font>: The screen width
- `height` <font color="#704ae0">int</font>: The screen height
- `frames` <font color="#704ae0">int</font>: The framerate
- `scan` <font color="#704ae0">string</font>: The scan method of the video signal, which can be either progressive ("p") or interlaced ("i")
- `name` <font color="#704ae0">string</font>: The full name of the video mode (a full list of modes can be found on [this page](docId\:QpML112mBhEK7LBDGUxnv))
- `isAutoMode` <font color="#704ae0">bool</font>: A flag indicating whether the video mode was set using auto mode
- `mode` <font color="#704ae0">mode{ }</font>: A Mode object that gives additional information about the video output. This object can contain the following properties:
  - `preferred` <font color="#704ae0">bool</font>: A flag indicating whether the video mode is the preferred mode
  - `overscan` <font color="#704ae0">bool</font>: A flag indicating whether the video output is using an overscan setting or not
  - `modeName` <font color="#704ae0">string</font>: The full name of the video mode (a full list of modes can be found on [this page](docId\:QpML112mBhEK7LBDGUxnv))
  - `interlaced` <font color="#704ae0">bool</font>: A flag indicating whether the video output is interlaced (`true`) or progressive (`false`)
  - `width` <font color="#704ae0">int</font>: The width of the video output
  - `height` <font color="#704ae0">int</font>: The height of the video output
  - `graphicsPlaneWidth` <font color="#704ae0">int</font>: The width of the graphics plane 
  - `graphicsPlaneHeight` <font color="#704ae0">int</font>: The height of the graphics plane
  - `frequency` <font color="#704ae0">int</font>: The frame rate of the video output
  - `dropFrame` <font color="#704ae0">bool</font>: A flag indicating whether the video timecode utilizes drop frames
  - `colorSpace` <font color="#704ae0">string</font>: The color space of the video signal ("rgb", "yuv420", or "yuv422")
  - `colorDepth` <font color="#704ae0">string</font>: The color depth of the video signal ("8bit", "10bit", or "12bit")

**Response Example**

```json
{
    "route": "/v1/video-mode",
    "method": "GET",
    "data": {
        "result": {
            "isAutoMode": false,
            "name": "640x480x60p",
            "width": "640",
            "height": "480",
            "frames": "60",
            "scan": "p",
            "mode": {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 640,
                "height": 480,
                "interlaced": false,
                "modeName": "640x480x60p",
                "overscan": false,
                "preferred": false,
                "width": 640
            }
        }
    }
}
```

## GET /video/\{:connector}/output/\{:device}/ 

Retrieves information about the specified video output

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value in /video/ URLs is currently `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Example**

```text
GET /rest/v1/video/hdmi/output/0/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

The following fields will be present in the response:

- `activeMode`: Information about the active video mode on the player
- `attached` <font color="#704ae0">bool</font>: Indicates if the HDMI® output is attached or not
- `bestMode` <font color="#704ae0">string</font>: The best video mode for the player. The HDMI connector must be attached because it gets details from EDID result.
- `configuredMode`: The configured video mode on the player. This can be different than activeMode.
- `edid` <font color="#704ae0">string</font>: Returns the EDID read string of the display connected to the player. If power save is on, zeroes will be returned
- `edid_identity`: Parses the above string in a JSON format for readability. Requires an HDMI output connected to the player and a display.
- `modes`: List of all available video modes on the player.
- `powerSaveStatus` <font color="#704ae0">bool</font>: Indicates the power save status of the display connected to the player.
- `resolutions` <font color="#704ae0">resolutions[ ]</font>: An array of information about the graphics, output, video resolution. Returns result values for height and width.
- `status`:
  - `audioBitsPerSample` <font color="#704ae0">int</font>: The number of bits per audio sample
  - `audioChannelCount` <font color="#704ae0">int</font>: The number of audio channels in the output
  - `audioFormat` <font color="#704ae0">string</font>: The format of the audio output. A "PCM" value indicates that the player is sending decoded output.
  - `audioSampleRate` <font color="#704ae0">int</font>: The audio sample rate (in hertz)
  - `eotf` <font color="#704ae0">string</font>: The current electro-optical transfer function (EOTF) used by the display. The following are possible values:
    - "HDR (GAMMA)"
    - "SDR (GAMMA)"
    - "SMPTE 2084 (PQ)"
    - "Future (BBC/NHK)"
    - "unspecified"
  - `outputPowered` <font color="#704ae0">bool</font>: Indicates if the display device is on (i.e. RX powered) 
  - `outputPresent` <font color="#704ae0">bool</font>: Indicates if the HDMI output is connected to a display device or not.
  - `unstable` <font color="#704ae0">bool</font>: Indicates if the display signal is unstable or stable

**Response Example**

:::ExpandableHeading
Expand

```json
{
    "route": "/v1/video/hdmi/output/0/",
    "method": "GET",
    "data": {
        "result": {
            "resolutions": {
                "video": {
                    "result": {
                        "height": 1080,
                        "width": 1920
                    }
                },
                "graphics": {
                    "result": {
                        "height": 1080,
                        "width": 1920
                    }
                },
                "output": {
                    "result": {
                        "height": 1080,
                        "width": 1920
                    }
                }
            },
            "edid_identity": {
                "result": {
                    "bt2020RgbSupport": false,
                    "bt2020YccSupport": false,
                    "hdrEotfSupport": false,
                    "hdrSt2084Support": false,
                    "manufacturer": "SAM",
                    "monitorName": "SAMSUNG",
                    "product": 1293,
                    "sdrEotfSupport": false,
                    "serialNumber": 1,
                    "serialNumberString": "",
                    "textString": "",
                    "weekOfManufacture": 48,
                    "yearOfManufacture": 2008
                }
            },
            "edid": {
                "result": "00ffffffffffff004c2d0d050100000030120103801009780aee91a3544c99260f5054bdef80714f8100814081809500950fb3000101023a801871382d40582c4500a05a0000001e662150b051001b3040703600a05a0000001e000000fd00184b1a5117000a202020202020000000fc0053414d53554e470a2020202020016b020322f1469004050320222309070783010000e2000fe305030167030c001000b82d011d007251d01e206e285500a05a0000001e011d8018711c1620582c2500a05a0000009e8c0ad08a20e02d10103e9600a05a00000018000000000000000000000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
            },
            "attached": {
                "result": true
            },
            "status": {
                "result": {
                    "audioBitsPerSample": 0,
                    "audioChannelCount": 0,
                    "audioFormat": "Unknown",
                    "audioSampleRate": 0,
                    "outputPowered": true,
                    "outputPresent": true
                }
            },
            "TxHdcpStatus": {
                "result": {
                    "state": "not-required"
                }
            },
            "modes": {
                "result": [
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 480,
                        "graphicsPlaneWidth": 640,
                        "height": 480,
                        "interlaced": false,
                        "modeName": "640x480x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 640
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 30,
                        "graphicsPlaneHeight": 480,
                        "graphicsPlaneWidth": 720,
                        "height": 480,
                        "interlaced": true,
                        "modeName": "720x480x60i",
                        "overscan": true,
                        "preferred": false,
                        "width": 720
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 25,
                        "graphicsPlaneHeight": 576,
                        "graphicsPlaneWidth": 720,
                        "height": 576,
                        "interlaced": true,
                        "modeName": "720x576x50i",
                        "overscan": true,
                        "preferred": false,
                        "width": 720
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 480,
                        "graphicsPlaneWidth": 848,
                        "height": 480,
                        "interlaced": false,
                        "modeName": "848x480x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 848
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 600,
                        "graphicsPlaneWidth": 800,
                        "height": 600,
                        "interlaced": false,
                        "modeName": "800x600x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 800
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 75,
                        "graphicsPlaneHeight": 600,
                        "graphicsPlaneWidth": 800,
                        "height": 600,
                        "interlaced": false,
                        "modeName": "800x600x75p",
                        "overscan": false,
                        "preferred": false,
                        "width": 800
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 960,
                        "graphicsPlaneWidth": 960,
                        "height": 960,
                        "interlaced": false,
                        "modeName": "960x960x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 960
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 768,
                        "graphicsPlaneWidth": 1024,
                        "height": 768,
                        "interlaced": false,
                        "modeName": "1024x768x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1024
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 75,
                        "graphicsPlaneHeight": 768,
                        "graphicsPlaneWidth": 1024,
                        "height": 768,
                        "interlaced": false,
                        "modeName": "1024x768x75p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1024
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 768,
                        "graphicsPlaneWidth": 1280,
                        "height": 768,
                        "interlaced": false,
                        "modeName": "1280x768x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 800,
                        "graphicsPlaneWidth": 1280,
                        "height": 800,
                        "interlaced": false,
                        "modeName": "1280x800x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 75,
                        "graphicsPlaneHeight": 800,
                        "graphicsPlaneWidth": 1280,
                        "height": 800,
                        "interlaced": false,
                        "modeName": "1280x800x75p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 768,
                        "graphicsPlaneWidth": 1360,
                        "height": 768,
                        "interlaced": false,
                        "modeName": "1360x768x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1360
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1280,
                        "graphicsPlaneWidth": 800,
                        "height": 1280,
                        "interlaced": false,
                        "modeName": "800x1280x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 800
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1920,
                        "graphicsPlaneWidth": 1200,
                        "height": 1920,
                        "interlaced": false,
                        "modeName": "1200x1920x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1200
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 768,
                        "graphicsPlaneWidth": 1366,
                        "height": 768,
                        "interlaced": false,
                        "modeName": "1366x768x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1366
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 960,
                        "graphicsPlaneWidth": 1280,
                        "height": 960,
                        "interlaced": false,
                        "modeName": "1280x960x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1024,
                        "graphicsPlaneWidth": 1280,
                        "height": 1024,
                        "interlaced": false,
                        "modeName": "1280x1024x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 75,
                        "graphicsPlaneHeight": 1024,
                        "graphicsPlaneWidth": 1280,
                        "height": 1024,
                        "interlaced": false,
                        "modeName": "1280x1024x75p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 900,
                        "graphicsPlaneWidth": 1440,
                        "height": 900,
                        "interlaced": false,
                        "modeName": "1440x900x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1440
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 75,
                        "graphicsPlaneHeight": 900,
                        "graphicsPlaneWidth": 1440,
                        "height": 900,
                        "interlaced": false,
                        "modeName": "1440x900x75p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1440
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1050,
                        "graphicsPlaneWidth": 1400,
                        "height": 1050,
                        "interlaced": false,
                        "modeName": "1400x1050x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1400
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 75,
                        "graphicsPlaneHeight": 1050,
                        "graphicsPlaneWidth": 1400,
                        "height": 1050,
                        "interlaced": false,
                        "modeName": "1400x1050x75p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1400
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1440,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "1440x1080x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1440
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1088,
                        "graphicsPlaneWidth": 1440,
                        "height": 1088,
                        "interlaced": false,
                        "modeName": "1440x1088x57p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1440
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 30,
                        "graphicsPlaneHeight": 1024,
                        "graphicsPlaneWidth": 768,
                        "height": 2048,
                        "interlaced": false,
                        "modeName": "1536x2048x30p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1536
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 900,
                        "graphicsPlaneWidth": 1600,
                        "height": 900,
                        "interlaced": false,
                        "modeName": "1600x900x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1600
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1200,
                        "graphicsPlaneWidth": 1600,
                        "height": 1200,
                        "interlaced": false,
                        "modeName": "1600x1200x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1600
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1050,
                        "graphicsPlaneWidth": 1680,
                        "height": 1050,
                        "interlaced": false,
                        "modeName": "1680x1050x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1680
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1296,
                        "graphicsPlaneWidth": 1728,
                        "height": 1296,
                        "interlaced": false,
                        "modeName": "1728x1296x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1728
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 540,
                        "graphicsPlaneWidth": 1920,
                        "height": 540,
                        "interlaced": false,
                        "modeName": "1920x540x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 50,
                        "graphicsPlaneHeight": 1200,
                        "graphicsPlaneWidth": 1920,
                        "height": 1200,
                        "interlaced": false,
                        "modeName": "1920x1200x50p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1200,
                        "graphicsPlaneWidth": 1920,
                        "height": 1200,
                        "interlaced": false,
                        "modeName": "1920x1200x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 672,
                        "graphicsPlaneWidth": 896,
                        "height": 1344,
                        "interlaced": false,
                        "modeName": "1792x1344x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1792
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 960,
                        "graphicsPlaneWidth": 960,
                        "height": 1920,
                        "interlaced": false,
                        "modeName": "1920x1920x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 50,
                        "graphicsPlaneHeight": 576,
                        "graphicsPlaneWidth": 1024,
                        "height": 1152,
                        "interlaced": false,
                        "modeName": "2048x1152x50p",
                        "overscan": false,
                        "preferred": false,
                        "width": 2048
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 576,
                        "graphicsPlaneWidth": 1024,
                        "height": 1152,
                        "interlaced": false,
                        "modeName": "2048x1152x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 2048
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 288,
                        "graphicsPlaneWidth": 2376,
                        "height": 288,
                        "interlaced": false,
                        "modeName": "2376x288x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 2376
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 800,
                        "graphicsPlaneWidth": 2560,
                        "height": 800,
                        "interlaced": false,
                        "modeName": "2560x800x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 2560
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 480,
                        "graphicsPlaneWidth": 1280,
                        "height": 960,
                        "interlaced": false,
                        "modeName": "2560x960x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 2560
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 540,
                        "graphicsPlaneWidth": 1280,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "2560x1080x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 2560
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 30,
                        "graphicsPlaneHeight": 720,
                        "graphicsPlaneWidth": 1280,
                        "height": 1440,
                        "interlaced": false,
                        "modeName": "2560x1440x30p",
                        "overscan": false,
                        "preferred": false,
                        "width": 2560
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 720,
                        "graphicsPlaneWidth": 1280,
                        "height": 1440,
                        "interlaced": false,
                        "modeName": "2560x1440x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 2560
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 800,
                        "graphicsPlaneWidth": 1280,
                        "height": 1600,
                        "interlaced": false,
                        "modeName": "2560x1600x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 2560
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 30,
                        "graphicsPlaneHeight": 1024,
                        "graphicsPlaneWidth": 1536,
                        "height": 2048,
                        "interlaced": false,
                        "modeName": "3072x2048x30p",
                        "overscan": false,
                        "preferred": false,
                        "width": 3072
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 30,
                        "graphicsPlaneHeight": 720,
                        "graphicsPlaneWidth": 1720,
                        "height": 1440,
                        "interlaced": false,
                        "modeName": "3440x1440x30p",
                        "overscan": false,
                        "preferred": false,
                        "width": 3440
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 50,
                        "graphicsPlaneHeight": 720,
                        "graphicsPlaneWidth": 1720,
                        "height": 1440,
                        "interlaced": false,
                        "modeName": "3440x1440x50p",
                        "overscan": false,
                        "preferred": false,
                        "width": 3440
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 720,
                        "graphicsPlaneWidth": 1720,
                        "height": 1440,
                        "interlaced": false,
                        "modeName": "3440x1440x60p",
                        "overscan": false,
                        "preferred": false,
                        "width": 3440
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 50,
                        "graphicsPlaneHeight": 576,
                        "graphicsPlaneWidth": 720,
                        "height": 576,
                        "interlaced": false,
                        "modeName": "720x576x50p",
                        "overscan": true,
                        "preferred": false,
                        "width": 720
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 60,
                        "graphicsPlaneHeight": 480,
                        "graphicsPlaneWidth": 720,
                        "height": 480,
                        "interlaced": false,
                        "modeName": "720x480x59.94p",
                        "overscan": true,
                        "preferred": false,
                        "width": 720
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 480,
                        "graphicsPlaneWidth": 720,
                        "height": 480,
                        "interlaced": false,
                        "modeName": "720x480x60p",
                        "overscan": true,
                        "preferred": false,
                        "width": 720
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 24,
                        "graphicsPlaneHeight": 720,
                        "graphicsPlaneWidth": 1280,
                        "height": 720,
                        "interlaced": false,
                        "modeName": "1280x720x24p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 24,
                        "graphicsPlaneHeight": 720,
                        "graphicsPlaneWidth": 1280,
                        "height": 720,
                        "interlaced": false,
                        "modeName": "1280x720x23.976p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 25,
                        "graphicsPlaneHeight": 720,
                        "graphicsPlaneWidth": 1280,
                        "height": 720,
                        "interlaced": false,
                        "modeName": "1280x720x25p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 50,
                        "graphicsPlaneHeight": 720,
                        "graphicsPlaneWidth": 1280,
                        "height": 720,
                        "interlaced": false,
                        "modeName": "1280x720x50p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 60,
                        "graphicsPlaneHeight": 720,
                        "graphicsPlaneWidth": 1280,
                        "height": 720,
                        "interlaced": false,
                        "modeName": "1280x720x59.94p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 720,
                        "graphicsPlaneWidth": 1280,
                        "height": 720,
                        "interlaced": false,
                        "modeName": "1280x720x60p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1280
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 25,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": true,
                        "modeName": "1920x1080x50i",
                        "overscan": true,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 30,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": true,
                        "modeName": "1920x1080x59.94i",
                        "overscan": true,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 30,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": true,
                        "modeName": "1920x1080x60i",
                        "overscan": true,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 24,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "1920x1080x24p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 24,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "1920x1080x23.976p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 25,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "1920x1080x25p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 30,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "1920x1080x29.97p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 30,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "1920x1080x30p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 50,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "1920x1080x50p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "1920x1080x59.94p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "1920x1080x60p",
                        "overscan": true,
                        "preferred": false,
                        "width": 1920
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 360,
                        "graphicsPlaneWidth": 1440,
                        "height": 720,
                        "interlaced": false,
                        "modeName": "2880x720x60p",
                        "overscan": true,
                        "preferred": false,
                        "width": 2880
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 300,
                        "graphicsPlaneWidth": 1920,
                        "height": 600,
                        "interlaced": false,
                        "modeName": "3840x600x60p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 25,
                        "graphicsPlaneHeight": 540,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "3840x1080x25p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 30,
                        "graphicsPlaneHeight": 540,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "3840x1080x30p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 30,
                        "graphicsPlaneHeight": 600,
                        "graphicsPlaneWidth": 1920,
                        "height": 1200,
                        "interlaced": false,
                        "modeName": "3840x1200x30p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 24,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "3840x2160x23.976p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 24,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "3840x2160x24p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 25,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "3840x2160x25p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 30,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "3840x2160x29.97p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 30,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "3840x2160x30p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 50,
                        "graphicsPlaneHeight": 540,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "3840x1080x50p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 540,
                        "graphicsPlaneWidth": 1920,
                        "height": 1080,
                        "interlaced": false,
                        "modeName": "3840x1080x60p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 600,
                        "graphicsPlaneWidth": 1920,
                        "height": 1200,
                        "interlaced": false,
                        "modeName": "3840x1200x60p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "yuv420",
                        "dropFrame": false,
                        "frequency": 50,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "3840x2160x50p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "yuv420",
                        "dropFrame": true,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "3840x2160x59.94p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "yuv420",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 1920,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "3840x2160x60p",
                        "overscan": true,
                        "preferred": false,
                        "width": 3840
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 24,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 2048,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "4096x2160x23.976p",
                        "overscan": true,
                        "preferred": false,
                        "width": 4096
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 24,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 2048,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "4096x2160x24p",
                        "overscan": true,
                        "preferred": false,
                        "width": 4096
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 25,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 2048,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "4096x2160x25p",
                        "overscan": true,
                        "preferred": false,
                        "width": 4096
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": true,
                        "frequency": 30,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 2048,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "4096x2160x29.97p",
                        "overscan": true,
                        "preferred": false,
                        "width": 4096
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "rgb",
                        "dropFrame": false,
                        "frequency": 30,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 2048,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "4096x2160x30p",
                        "overscan": true,
                        "preferred": false,
                        "width": 4096
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "yuv420",
                        "dropFrame": false,
                        "frequency": 50,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 2048,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "4096x2160x50p",
                        "overscan": true,
                        "preferred": false,
                        "width": 4096
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "yuv420",
                        "dropFrame": true,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 2048,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "4096x2160x59.94p",
                        "overscan": true,
                        "preferred": false,
                        "width": 4096
                    },
                    {
                        "colorDepth": "8bit",
                        "colorSpace": "yuv420",
                        "dropFrame": false,
                        "frequency": 60,
                        "graphicsPlaneHeight": 1080,
                        "graphicsPlaneWidth": 2048,
                        "height": 2160,
                        "interlaced": false,
                        "modeName": "4096x2160x60p",
                        "overscan": true,
                        "preferred": false,
                        "width": 4096
                    }
                ]
            },
            "activeMode": {
                "result": {
                    "colorDepth": "8bit",
                    "colorSpace": "rgb",
                    "dropFrame": false,
                    "frequency": 60,
                    "graphicsPlaneHeight": 1080,
                    "graphicsPlaneWidth": 1920,
                    "height": 1080,
                    "interlaced": false,
                    "modeName": "1920x1080x60p",
                    "overscan": true,
                    "preferred": false,
                    "width": 1920
                }
            },
            "configuredMode": {
                "result": null
            },
            "bestMode": {
                "result": "1920x1080x60p"
            },
            "powerSaveStatus": {
                "result": false
            }
        }
    }
}
```
:::

## GET /video/\{:connector}/output/\{:device}/edid/ 

Returns the EDID information from a compatible monitor/television connected to the video output

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value in /video/ URLs is currently `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Example**

```text
GET /rest/v1/video/hdmi/output/0/edid/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `result` <font color="#704ae0">string</font>: The EDID string result

**Response Example**

```json
{
    "route": "/v1/video/hdmi/output/0/edid",
    "method": "GET",
    "data": {
        "result": "00ffffffffffff004c2d0d050100000030120103801009780aee91a3544c99260f5054bdef80714f8111214081809500950fb3000101023a801871382d40582c4500a05a0000001e662150b051001b3040703600a05a0000001e000000fd00184b1a5117000a202020202020000000fc0053414d53554e470a2020202020016b020322f1469004050320222309070783010000e2000fe305030167030c001000b82d011d007251d01e206e285500a05a0000001e011d8018711c1620582c2500a05a0000009e8c0ad08a20e02d10103e9600a05a00000018000000000000000000000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
    }
}
```

## GET /video/\{:connector}/output/\{:device}/power-save/ 

Retrieves the power status of the monitor connected to the player (as reported over EDID)

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value in /video/ URLs is currently `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Example**

```text
GET /rest/v1/video/hdmi/output/0/power-save/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `is_connected` <font color="#704ae0">bool</font>: Indicates whether the monitor is connected to the HDMI output on the player
- `is_powered` <font color="#704ae0">bool</font>: Indicates whether the monitor is on (for example, RX powered) 
- `enabled` <font color="#704ae0">bool</font>: Indicates whether power-save mode has been enabled on the HDMI/VGA output

**Response Example**

```json
{
    "route": "/v1/video/hdmi/output/0/power-save/",
    "method": "GET",
    "data": {
        "result": {
            "is_connected": true,
            "is_powered": true,
            "enabled": false
        }
    }
}
```

## PUT /video/\{:connector}/output/\{:device}/power-save/ 

Enables or disables power-save mode on the monitor connected to the player (via HDMI, VGA, or Component)

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value in /video/ URLs is currently `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Body Parameters**

- `enabled` <font color="#704ae0">bool</font>:  Whether or not power save is enabled 

**Request Example**

```text
PUT /rest/v1/video/hdmi/output/0/power-save/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 51
```

This is the example request body:

```json
{
    "data": {
        "enabled": true
    }
}
```

**Response Body**

The server will return a success or error message

**Response Example**

```json
{
    "data": {
        "result": true
    },
    "route": "/v1/video/hdmi/output/0/power-save",
    "method": "PUT"
}
```

## GET  /video/\{:connector}/output/\{:device}/modes/ 

Retrieves all available video modes on the specified video output

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value in /video/ URLs is currently `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Example**

```text
GET /rest/v1/video/hdmi/output/0/modes/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

Returns an array of video mode objects, each of which contain the following parameters:

- `modeName` <font color="#704ae0">string</font>: The mode (for example, “1920x1080x60p”)
- `colorDepth` <font color="#704ae0">string</font>: The color depth of the video signal
- `colorSpace` <font color="#704ae0">string</font>: The color space of the video signal ("rgb", "yuv420", or "yuv422")
- `dropFrame` <font color="#704ae0">bool</font>: Whether or not the video timecode uses drop frame
- `frequency` <font color="#704ae0">int</font>: The frame rate of the video output
- `width` <font color="#704ae0">int</font>: The width of the video output
- `height` <font color="#704ae0">int</font>: The height of the video output
- `graphicsPlaneWidth` <font color="#704ae0">int</font>: The width of the graphics plane
- `graphicsPlaneHeight` <font color="#704ae0">int</font>: The height of the graphics plane
- `interlaced` <font color="#704ae0">bool</font>:  Whether or not the video output is interlaced
- `overscan` <font color="#704ae0">bool</font>: Whether or not the video output is using an overscan setting or not
- `preferred` <font color="#704ae0">bool</font>: Whether or not video is the preferred mode

**Response Example**

:::ExpandableHeading
Expand

```text
{
    "route": "/v1/video/hdmi/output/0/modes/",
    "method": "GET",
    "data": {
        "result": [
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 640,
                "height": 480,
                "interlaced": false,
                "modeName": "640x480x60p",
                "overscan": false,
                "preferred": false,
                "width": 640
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 30,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 720,
                "height": 480,
                "interlaced": true,
                "modeName": "720x480x60i",
                "overscan": true,
                "preferred": false,
                "width": 720
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 576,
                "graphicsPlaneWidth": 720,
                "height": 576,
                "interlaced": true,
                "modeName": "720x576x50i",
                "overscan": true,
                "preferred": false,
                "width": 720
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 848,
                "height": 480,
                "interlaced": false,
                "modeName": "848x480x60p",
                "overscan": false,
                "preferred": false,
                "width": 848
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 600,
                "graphicsPlaneWidth": 800,
                "height": 600,
                "interlaced": false,
                "modeName": "800x600x60p",
                "overscan": false,
                "preferred": false,
                "width": 800
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 600,
                "graphicsPlaneWidth": 800,
                "height": 600,
                "interlaced": false,
                "modeName": "800x600x75p",
                "overscan": false,
                "preferred": false,
                "width": 800
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 960,
                "graphicsPlaneWidth": 960,
                "height": 960,
                "interlaced": false,
                "modeName": "960x960x60p",
                "overscan": false,
                "preferred": false,
                "width": 960
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 768,
                "graphicsPlaneWidth": 1024,
                "height": 768,
                "interlaced": false,
                "modeName": "1024x768x60p",
                "overscan": false,
                "preferred": false,
                "width": 1024
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 768,
                "graphicsPlaneWidth": 1024,
                "height": 768,
                "interlaced": false,
                "modeName": "1024x768x75p",
                "overscan": false,
                "preferred": false,
                "width": 1024
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 768,
                "graphicsPlaneWidth": 1280,
                "height": 768,
                "interlaced": false,
                "modeName": "1280x768x60p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 800,
                "graphicsPlaneWidth": 1280,
                "height": 800,
                "interlaced": false,
                "modeName": "1280x800x60p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 800,
                "graphicsPlaneWidth": 1280,
                "height": 800,
                "interlaced": false,
                "modeName": "1280x800x75p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 768,
                "graphicsPlaneWidth": 1360,
                "height": 768,
                "interlaced": false,
                "modeName": "1360x768x60p",
                "overscan": false,
                "preferred": false,
                "width": 1360
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1280,
                "graphicsPlaneWidth": 800,
                "height": 1280,
                "interlaced": false,
                "modeName": "800x1280x60p",
                "overscan": false,
                "preferred": false,
                "width": 800
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1920,
                "graphicsPlaneWidth": 1200,
                "height": 1920,
                "interlaced": false,
                "modeName": "1200x1920x60p",
                "overscan": false,
                "preferred": false,
                "width": 1200
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 768,
                "graphicsPlaneWidth": 1366,
                "height": 768,
                "interlaced": false,
                "modeName": "1366x768x60p",
                "overscan": false,
                "preferred": false,
                "width": 1366
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 960,
                "graphicsPlaneWidth": 1280,
                "height": 960,
                "interlaced": false,
                "modeName": "1280x960x60p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1024,
                "graphicsPlaneWidth": 1280,
                "height": 1024,
                "interlaced": false,
                "modeName": "1280x1024x60p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 1024,
                "graphicsPlaneWidth": 1280,
                "height": 1024,
                "interlaced": false,
                "modeName": "1280x1024x75p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 900,
                "graphicsPlaneWidth": 1440,
                "height": 900,
                "interlaced": false,
                "modeName": "1440x900x60p",
                "overscan": false,
                "preferred": false,
                "width": 1440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 900,
                "graphicsPlaneWidth": 1440,
                "height": 900,
                "interlaced": false,
                "modeName": "1440x900x75p",
                "overscan": false,
                "preferred": false,
                "width": 1440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1050,
                "graphicsPlaneWidth": 1400,
                "height": 1050,
                "interlaced": false,
                "modeName": "1400x1050x60p",
                "overscan": false,
                "preferred": false,
                "width": 1400
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 1050,
                "graphicsPlaneWidth": 1400,
                "height": 1050,
                "interlaced": false,
                "modeName": "1400x1050x75p",
                "overscan": false,
                "preferred": false,
                "width": 1400
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1440,
                "height": 1080,
                "interlaced": false,
                "modeName": "1440x1080x60p",
                "overscan": false,
                "preferred": false,
                "width": 1440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1088,
                "graphicsPlaneWidth": 1440,
                "height": 1088,
                "interlaced": false,
                "modeName": "1440x1088x57p",
                "overscan": false,
                "preferred": false,
                "width": 1440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1024,
                "graphicsPlaneWidth": 768,
                "height": 2048,
                "interlaced": false,
                "modeName": "1536x2048x30p",
                "overscan": false,
                "preferred": false,
                "width": 1536
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 900,
                "graphicsPlaneWidth": 1600,
                "height": 900,
                "interlaced": false,
                "modeName": "1600x900x60p",
                "overscan": false,
                "preferred": false,
                "width": 1600
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1200,
                "graphicsPlaneWidth": 1600,
                "height": 1200,
                "interlaced": false,
                "modeName": "1600x1200x60p",
                "overscan": false,
                "preferred": false,
                "width": 1600
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1050,
                "graphicsPlaneWidth": 1680,
                "height": 1050,
                "interlaced": false,
                "modeName": "1680x1050x60p",
                "overscan": false,
                "preferred": false,
                "width": 1680
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1296,
                "graphicsPlaneWidth": 1728,
                "height": 1296,
                "interlaced": false,
                "modeName": "1728x1296x60p",
                "overscan": false,
                "preferred": false,
                "width": 1728
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1920,
                "height": 540,
                "interlaced": false,
                "modeName": "1920x540x60p",
                "overscan": false,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 1200,
                "graphicsPlaneWidth": 1920,
                "height": 1200,
                "interlaced": false,
                "modeName": "1920x1200x50p",
                "overscan": false,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1200,
                "graphicsPlaneWidth": 1920,
                "height": 1200,
                "interlaced": false,
                "modeName": "1920x1200x60p",
                "overscan": false,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 672,
                "graphicsPlaneWidth": 896,
                "height": 1344,
                "interlaced": false,
                "modeName": "1792x1344x60p",
                "overscan": false,
                "preferred": false,
                "width": 1792
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 960,
                "graphicsPlaneWidth": 960,
                "height": 1920,
                "interlaced": false,
                "modeName": "1920x1920x60p",
                "overscan": false,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 576,
                "graphicsPlaneWidth": 1024,
                "height": 1152,
                "interlaced": false,
                "modeName": "2048x1152x50p",
                "overscan": false,
                "preferred": false,
                "width": 2048
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 576,
                "graphicsPlaneWidth": 1024,
                "height": 1152,
                "interlaced": false,
                "modeName": "2048x1152x60p",
                "overscan": false,
                "preferred": false,
                "width": 2048
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 288,
                "graphicsPlaneWidth": 2376,
                "height": 288,
                "interlaced": false,
                "modeName": "2376x288x60p",
                "overscan": false,
                "preferred": false,
                "width": 2376
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 800,
                "graphicsPlaneWidth": 2560,
                "height": 800,
                "interlaced": false,
                "modeName": "2560x800x60p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 1280,
                "height": 960,
                "interlaced": false,
                "modeName": "2560x960x60p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1280,
                "height": 1080,
                "interlaced": false,
                "modeName": "2560x1080x60p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 1440,
                "interlaced": false,
                "modeName": "2560x1440x30p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 1440,
                "interlaced": false,
                "modeName": "2560x1440x60p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 800,
                "graphicsPlaneWidth": 1280,
                "height": 1600,
                "interlaced": false,
                "modeName": "2560x1600x60p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1024,
                "graphicsPlaneWidth": 1536,
                "height": 2048,
                "interlaced": false,
                "modeName": "3072x2048x30p",
                "overscan": false,
                "preferred": false,
                "width": 3072
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1720,
                "height": 1440,
                "interlaced": false,
                "modeName": "3440x1440x30p",
                "overscan": false,
                "preferred": false,
                "width": 3440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1720,
                "height": 1440,
                "interlaced": false,
                "modeName": "3440x1440x50p",
                "overscan": false,
                "preferred": false,
                "width": 3440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1720,
                "height": 1440,
                "interlaced": false,
                "modeName": "3440x1440x60p",
                "overscan": false,
                "preferred": false,
                "width": 3440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 576,
                "graphicsPlaneWidth": 720,
                "height": 576,
                "interlaced": false,
                "modeName": "720x576x50p",
                "overscan": true,
                "preferred": false,
                "width": 720
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 720,
                "height": 480,
                "interlaced": false,
                "modeName": "720x480x59.94p",
                "overscan": true,
                "preferred": false,
                "width": 720
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 720,
                "height": 480,
                "interlaced": false,
                "modeName": "720x480x60p",
                "overscan": true,
                "preferred": false,
                "width": 720
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 24,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x24p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 24,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x23.976p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x25p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x50p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 60,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x59.94p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x60p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": true,
                "modeName": "1920x1080x50i",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": true,
                "modeName": "1920x1080x59.94i",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": true,
                "modeName": "1920x1080x60i",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x24p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x23.976p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x25p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x29.97p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x30p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x50p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x59.94p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x60p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 360,
                "graphicsPlaneWidth": 1440,
                "height": 720,
                "interlaced": false,
                "modeName": "2880x720x60p",
                "overscan": true,
                "preferred": false,
                "width": 2880
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 300,
                "graphicsPlaneWidth": 1920,
                "height": 600,
                "interlaced": false,
                "modeName": "3840x600x60p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "3840x1080x25p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "3840x1080x30p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 600,
                "graphicsPlaneWidth": 1920,
                "height": 1200,
                "interlaced": false,
                "modeName": "3840x1200x30p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x23.976p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x24p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x25p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x29.97p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x30p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "3840x1080x50p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "3840x1080x60p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 600,
                "graphicsPlaneWidth": 1920,
                "height": 1200,
                "interlaced": false,
                "modeName": "3840x1200x60p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x50p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": true,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x59.94p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x60p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x23.976p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x24p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x25p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x29.97p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x30p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x50p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": true,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x59.94p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x60p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            }
        ]
    }
}
```
:::

## GET /video/\{:connector}/output/\{:device}/mode/ 

Retrieves the current video mode on the specified video output

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value in /video/ URLs is currently `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Query String Parameters**

Each of these parameters delivers a different mode value:

- `best` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: If set to 1, this returns the best mode
- `active` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: If set to 1, this returns the active mode
- `configured` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: If set to 1, this returns the configured mode

**Request Examples**

```text
GET /rest/v1/video/hdmi/output/0/mode/?best=1&destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `isAutoMode` <font color="#704ae0">bool</font>: Whether the mode is set to “auto”
- `name` <font color="#704ae0">string</font>: The name of the video mode. Same as `mode.modeName` below.
- `width` <font color="#704ae0">string</font>: The width value of the video mode.
- `height` <font color="#704ae0">string</font>: The height value of the video mode.
- `frames` <font color="#704ae0">string</font>: The frame rate value of the video mode.
- `scan` <font color="#704ae0">string</font>: The scan character value of the video mode.
- `mode` <font color="#704ae0">object</font>: The currently configured video mode on the video output with following parameters -
  - `modeName` <font color="#704ae0">string</font>: The mode (for example, “1920x1080x60p”)
  - `colorDepth` <font color="#704ae0">string</font>: The color depth of the video signal
  - `colorSpace` <font color="#704ae0">string</font>: The color space of the video signal ("rgb", "yuv420", or "yuv422")
  - `dropFrame` <font color="#704ae0">bool</font>: Whether or not the video timecode uses drop frame
  - `frequency` <font color="#704ae0">int</font>: The frame rate of the video output
  - `width` <font color="#704ae0">int</font>: The width of the video output
  - `height` <font color="#704ae0">int</font>: The height of the video output
  - `graphicsPlaneWidth` <font color="#704ae0">int</font>: The width of the graphics plane
  - `graphicsPlaneHeight` <font color="#704ae0">int</font>: The height of the graphics plane
  - `interlaced` <font color="#704ae0">bool</font>:  Whether or not the video output is interlaced
  - `overscan` <font color="#704ae0">bool</font>: Whether or not the video output is using an overscan setting or not
  - `preferred` <font color="#704ae0">bool</font>: Whether or not video is the preferred mode

**Response Example**

```json
{
    "route": "/v1/video/hdmi/output/0/mode/",
    "method": "GET",
    "data": {
        "result": {
            "isAutoMode": false,
            "name": "1920x1080x60p",
            "width": "1920",
            "height": "1080",
            "frames": "60",
            "scan": "p",
            "mode": {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x60p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            }
        }
    }
}
```

## PUT /video/\{:connector}/output/\{:device}/mode/ 

Changes the [video mode](docId\:QpML112mBhEK7LBDGUxnv) on the player

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value in /video/ URLs is currently `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Body Parameters**

A video mode object containing the following value(s):

- `modeName` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The mode (for example, “1920x1080x60p”)
- `colorDepth` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The color depth of the video signal
- `colorSpace` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The color space of the video signal ("rgb", "yuv420", or "yuv422")
- `dropFrame` <font color="#704ae0">bool</font>: Whether or not the video timecode uses drop frame
- `frequency` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The frame rate of the video output
- `width` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The width of the video output
- `height` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The height of the video output
- `graphicsPlaneWidth` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The width of the graphics plane
- `graphicsPlaneHeight` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The height of the graphics plane
- `interlaced` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>:  Whether or not the video output is interlaced
- `overscan` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Whether or not the video output is using an overscan setting or not
- `preferred` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Whether or not video is the preferred mode

**Request Example**

```text
PUT /rest/v1/video/hdmi/output/0/mode/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 95
```

This is the example request body:

```json
{
    "data": {
        "name": {
            "modeName": "640x480x60p"
        }
    }
}
```

**Response Body**

The server will return a success or error message. A successful response will almost always cause a reboot which will be indicated in the response.

- `result` <font color="#704ae0">object</font>: The response object.
- `success` <font color="#704ae0">bool</font>: Whether or not the operation was successful
- `reboot` <font color="#704ae0">bool</font>: Whether or not the player is rebooting

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": true
        }
    },
    "route": "/v1/video/hdmi/output/0/mode",
    "method": "PUT"
}
```


[title] LDWS Video Endpoints
[path] Diagnostic Web Server APIs/Untitled/

## GET /v1/video/\:connector/output/\:device/ 

Retrieves information about the specified video output.

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value is `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Example**

The example request parameters and headers are set as follows:

- `:connector` is set to `hdmi`
- `:device` is set to `0`

```text
GET /api/v1/video/hdmi/output/0/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `resolutions` <font color="#704ae0">resolutions[ ]</font>: An array of information about the graphics, output, video resolution. Returns result values for height and width.
- `edid_identity`: Parses the above string in a JSON format for readability. Requires an HDMI output connected to the player and a display.
- `edid` <font color="#704ae0">string</font>: Returns the EDID read string of the display connected to the player. If power save is on, zeroes will be returned
- `status`:
  - `audioBitsPerSample` <font color="#704ae0">int</font>: The number of bits per audio sample
  - `audioChannelCount` <font color="#704ae0">int</font>: The number of audio channels in the output
  - `audioFormat` <font color="#704ae0">string</font>: The format of the audio output. A "PCM" value indicates that the player is sending decoded output.
  - `audioSampleRate` <font color="#704ae0">int</font>: The audio sample rate (in hertz)
  - `eotf` <font color="#704ae0">string</font>: The current electro-optical transfer function (EOTF) used by the display. The following are possible values:
    - "HDR (GAMMA)"
    - "SDR (GAMMA)"
    - "SMPTE 2084 (PQ)"
    - "Future (BBC/NHK)"
    - "unspecified"
  - `outputPowered` <font color="#704ae0">bool</font>: Whether the display device is on (i.e. RX powered) 
  - `outputPresent` <font color="#704ae0">bool</font>: Whether the HDMI output is connected to a display device or not.
  - `unstable` <font color="#704ae0">bool</font>: Whether the display signal is unstable or stable
- `modes`: List of all available video modes on the player.
- `activeMode`: Information about the active video mode on the player
- `bestMode` <font color="#704ae0">string</font>: The best video mode for the player. The HDMI connector must be attached because it gets details from EDID result.
- `configuredMode`: The configured video mode on the player. This can be different than `activeMode`.
- `powerSaveStatus` <font color="#704ae0">bool</font>: This value indicates the power save status of the display connected to the player.

**Response Example**

:::ExpandableHeading
Expand

```json
{
  "data": {
    "result": {
      "resolutions": {
        "video": {
          "result": {
            "height": 1080,
            "width": 1920
          }
        },
        "graphics": {
          "result": {
            "height": 1080,
            "width": 1920
          }
        },
        "output": {
          "result": {
            "height": 1080,
            "width": 1920
          }
        }
      },
      "edid_identity": {
        "result": {
          "bt2020RgbSupport": false,
          "bt2020YccSupport": false,
          "hdrEotfSupport": false,
          "hdrSt2084Support": false,
          "manufacturer": "SAM",
          "monitorName": "SAMSUNG",
          "product": 1293,
          "sdrEotfSupport": false,
          "serialNumber": 1,
          "serialNumberString": "",
          "textString": "",
          "weekOfManufacture": 48,
          "yearOfManufacture": 2008
        }
      },
      "edid": {
        "result": "00ffffffffffff004c2d0d050100000030120103801009780aee91a3544c99260f5054bdef80714f8100814081809500950fb3000101023a801871382d40582c4500a05a0000001e662150b051001b3040703600a05a0000001e000000fd00184b1a5117000a202020202020000000fc0053414d53554e470a2020202020016b020322f1469004050320222309070783010000e2000fe305030167030c001000b82d011d007251d01e206e285500a05a0000001e011d8018711c1620582c2500a05a0000009e8c0ad08a20e02d10103e9600a05a00000018000000000000000000000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
      },
      "attached": {
        "result": true
      },
      "status": {
        "result": {
          "audioBitsPerSample": 0,
          "audioChannelCount": 0,
          "audioFormat": "Unknown",
          "audioSampleRate": 0,
          "outputPowered": true,
          "outputPresent": true
        }
      },
      "TxHdcpStatus": {
        "result": {
          "state": "not-required"
        }
      },
      "modes": {
        "result": [
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 480,
            "graphicsPlaneWidth": 640,
            "height": 480,
            "interlaced": false,
            "modeName": "640x480x60p",
            "overscan": false,
            "preferred": false,
            "width": 640
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 30,
            "graphicsPlaneHeight": 480,
            "graphicsPlaneWidth": 720,
            "height": 480,
            "interlaced": true,
            "modeName": "720x480x60i",
            "overscan": true,
            "preferred": false,
            "width": 720
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 25,
            "graphicsPlaneHeight": 576,
            "graphicsPlaneWidth": 720,
            "height": 576,
            "interlaced": true,
            "modeName": "720x576x50i",
            "overscan": true,
            "preferred": false,
            "width": 720
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 480,
            "graphicsPlaneWidth": 848,
            "height": 480,
            "interlaced": false,
            "modeName": "848x480x60p",
            "overscan": false,
            "preferred": false,
            "width": 848
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 600,
            "graphicsPlaneWidth": 800,
            "height": 600,
            "interlaced": false,
            "modeName": "800x600x60p",
            "overscan": false,
            "preferred": false,
            "width": 800
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 75,
            "graphicsPlaneHeight": 600,
            "graphicsPlaneWidth": 800,
            "height": 600,
            "interlaced": false,
            "modeName": "800x600x75p",
            "overscan": false,
            "preferred": false,
            "width": 800
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 960,
            "graphicsPlaneWidth": 960,
            "height": 960,
            "interlaced": false,
            "modeName": "960x960x60p",
            "overscan": false,
            "preferred": false,
            "width": 960
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 768,
            "graphicsPlaneWidth": 1024,
            "height": 768,
            "interlaced": false,
            "modeName": "1024x768x60p",
            "overscan": false,
            "preferred": false,
            "width": 1024
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 75,
            "graphicsPlaneHeight": 768,
            "graphicsPlaneWidth": 1024,
            "height": 768,
            "interlaced": false,
            "modeName": "1024x768x75p",
            "overscan": false,
            "preferred": false,
            "width": 1024
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 768,
            "graphicsPlaneWidth": 1280,
            "height": 768,
            "interlaced": false,
            "modeName": "1280x768x60p",
            "overscan": false,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 800,
            "graphicsPlaneWidth": 1280,
            "height": 800,
            "interlaced": false,
            "modeName": "1280x800x60p",
            "overscan": false,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 75,
            "graphicsPlaneHeight": 800,
            "graphicsPlaneWidth": 1280,
            "height": 800,
            "interlaced": false,
            "modeName": "1280x800x75p",
            "overscan": false,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 768,
            "graphicsPlaneWidth": 1360,
            "height": 768,
            "interlaced": false,
            "modeName": "1360x768x60p",
            "overscan": false,
            "preferred": false,
            "width": 1360
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1280,
            "graphicsPlaneWidth": 800,
            "height": 1280,
            "interlaced": false,
            "modeName": "800x1280x60p",
            "overscan": false,
            "preferred": false,
            "width": 800
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1920,
            "graphicsPlaneWidth": 1200,
            "height": 1920,
            "interlaced": false,
            "modeName": "1200x1920x60p",
            "overscan": false,
            "preferred": false,
            "width": 1200
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 768,
            "graphicsPlaneWidth": 1366,
            "height": 768,
            "interlaced": false,
            "modeName": "1366x768x60p",
            "overscan": false,
            "preferred": false,
            "width": 1366
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 960,
            "graphicsPlaneWidth": 1280,
            "height": 960,
            "interlaced": false,
            "modeName": "1280x960x60p",
            "overscan": false,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1024,
            "graphicsPlaneWidth": 1280,
            "height": 1024,
            "interlaced": false,
            "modeName": "1280x1024x60p",
            "overscan": false,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 75,
            "graphicsPlaneHeight": 1024,
            "graphicsPlaneWidth": 1280,
            "height": 1024,
            "interlaced": false,
            "modeName": "1280x1024x75p",
            "overscan": false,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 900,
            "graphicsPlaneWidth": 1440,
            "height": 900,
            "interlaced": false,
            "modeName": "1440x900x60p",
            "overscan": false,
            "preferred": false,
            "width": 1440
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 75,
            "graphicsPlaneHeight": 900,
            "graphicsPlaneWidth": 1440,
            "height": 900,
            "interlaced": false,
            "modeName": "1440x900x75p",
            "overscan": false,
            "preferred": false,
            "width": 1440
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1050,
            "graphicsPlaneWidth": 1400,
            "height": 1050,
            "interlaced": false,
            "modeName": "1400x1050x60p",
            "overscan": false,
            "preferred": false,
            "width": 1400
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 75,
            "graphicsPlaneHeight": 1050,
            "graphicsPlaneWidth": 1400,
            "height": 1050,
            "interlaced": false,
            "modeName": "1400x1050x75p",
            "overscan": false,
            "preferred": false,
            "width": 1400
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1440,
            "height": 1080,
            "interlaced": false,
            "modeName": "1440x1080x60p",
            "overscan": false,
            "preferred": false,
            "width": 1440
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1088,
            "graphicsPlaneWidth": 1440,
            "height": 1088,
            "interlaced": false,
            "modeName": "1440x1088x57p",
            "overscan": false,
            "preferred": false,
            "width": 1440
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 30,
            "graphicsPlaneHeight": 1024,
            "graphicsPlaneWidth": 768,
            "height": 2048,
            "interlaced": false,
            "modeName": "1536x2048x30p",
            "overscan": false,
            "preferred": false,
            "width": 1536
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 900,
            "graphicsPlaneWidth": 1600,
            "height": 900,
            "interlaced": false,
            "modeName": "1600x900x60p",
            "overscan": false,
            "preferred": false,
            "width": 1600
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1200,
            "graphicsPlaneWidth": 1600,
            "height": 1200,
            "interlaced": false,
            "modeName": "1600x1200x60p",
            "overscan": false,
            "preferred": false,
            "width": 1600
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1050,
            "graphicsPlaneWidth": 1680,
            "height": 1050,
            "interlaced": false,
            "modeName": "1680x1050x60p",
            "overscan": false,
            "preferred": false,
            "width": 1680
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1296,
            "graphicsPlaneWidth": 1728,
            "height": 1296,
            "interlaced": false,
            "modeName": "1728x1296x60p",
            "overscan": false,
            "preferred": false,
            "width": 1728
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 540,
            "graphicsPlaneWidth": 1920,
            "height": 540,
            "interlaced": false,
            "modeName": "1920x540x60p",
            "overscan": false,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 50,
            "graphicsPlaneHeight": 1200,
            "graphicsPlaneWidth": 1920,
            "height": 1200,
            "interlaced": false,
            "modeName": "1920x1200x50p",
            "overscan": false,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1200,
            "graphicsPlaneWidth": 1920,
            "height": 1200,
            "interlaced": false,
            "modeName": "1920x1200x60p",
            "overscan": false,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 672,
            "graphicsPlaneWidth": 896,
            "height": 1344,
            "interlaced": false,
            "modeName": "1792x1344x60p",
            "overscan": false,
            "preferred": false,
            "width": 1792
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 960,
            "graphicsPlaneWidth": 960,
            "height": 1920,
            "interlaced": false,
            "modeName": "1920x1920x60p",
            "overscan": false,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 50,
            "graphicsPlaneHeight": 576,
            "graphicsPlaneWidth": 1024,
            "height": 1152,
            "interlaced": false,
            "modeName": "2048x1152x50p",
            "overscan": false,
            "preferred": false,
            "width": 2048
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 576,
            "graphicsPlaneWidth": 1024,
            "height": 1152,
            "interlaced": false,
            "modeName": "2048x1152x60p",
            "overscan": false,
            "preferred": false,
            "width": 2048
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 288,
            "graphicsPlaneWidth": 2376,
            "height": 288,
            "interlaced": false,
            "modeName": "2376x288x60p",
            "overscan": false,
            "preferred": false,
            "width": 2376
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 800,
            "graphicsPlaneWidth": 2560,
            "height": 800,
            "interlaced": false,
            "modeName": "2560x800x60p",
            "overscan": false,
            "preferred": false,
            "width": 2560
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 480,
            "graphicsPlaneWidth": 1280,
            "height": 960,
            "interlaced": false,
            "modeName": "2560x960x60p",
            "overscan": false,
            "preferred": false,
            "width": 2560
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 540,
            "graphicsPlaneWidth": 1280,
            "height": 1080,
            "interlaced": false,
            "modeName": "2560x1080x60p",
            "overscan": false,
            "preferred": false,
            "width": 2560
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 30,
            "graphicsPlaneHeight": 720,
            "graphicsPlaneWidth": 1280,
            "height": 1440,
            "interlaced": false,
            "modeName": "2560x1440x30p",
            "overscan": false,
            "preferred": false,
            "width": 2560
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 720,
            "graphicsPlaneWidth": 1280,
            "height": 1440,
            "interlaced": false,
            "modeName": "2560x1440x60p",
            "overscan": false,
            "preferred": false,
            "width": 2560
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 800,
            "graphicsPlaneWidth": 1280,
            "height": 1600,
            "interlaced": false,
            "modeName": "2560x1600x60p",
            "overscan": false,
            "preferred": false,
            "width": 2560
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 30,
            "graphicsPlaneHeight": 1024,
            "graphicsPlaneWidth": 1536,
            "height": 2048,
            "interlaced": false,
            "modeName": "3072x2048x30p",
            "overscan": false,
            "preferred": false,
            "width": 3072
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 30,
            "graphicsPlaneHeight": 720,
            "graphicsPlaneWidth": 1720,
            "height": 1440,
            "interlaced": false,
            "modeName": "3440x1440x30p",
            "overscan": false,
            "preferred": false,
            "width": 3440
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 50,
            "graphicsPlaneHeight": 720,
            "graphicsPlaneWidth": 1720,
            "height": 1440,
            "interlaced": false,
            "modeName": "3440x1440x50p",
            "overscan": false,
            "preferred": false,
            "width": 3440
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 720,
            "graphicsPlaneWidth": 1720,
            "height": 1440,
            "interlaced": false,
            "modeName": "3440x1440x60p",
            "overscan": false,
            "preferred": false,
            "width": 3440
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 50,
            "graphicsPlaneHeight": 576,
            "graphicsPlaneWidth": 720,
            "height": 576,
            "interlaced": false,
            "modeName": "720x576x50p",
            "overscan": true,
            "preferred": false,
            "width": 720
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 60,
            "graphicsPlaneHeight": 480,
            "graphicsPlaneWidth": 720,
            "height": 480,
            "interlaced": false,
            "modeName": "720x480x59.94p",
            "overscan": true,
            "preferred": false,
            "width": 720
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 480,
            "graphicsPlaneWidth": 720,
            "height": 480,
            "interlaced": false,
            "modeName": "720x480x60p",
            "overscan": true,
            "preferred": false,
            "width": 720
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 24,
            "graphicsPlaneHeight": 720,
            "graphicsPlaneWidth": 1280,
            "height": 720,
            "interlaced": false,
            "modeName": "1280x720x24p",
            "overscan": true,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 24,
            "graphicsPlaneHeight": 720,
            "graphicsPlaneWidth": 1280,
            "height": 720,
            "interlaced": false,
            "modeName": "1280x720x23.976p",
            "overscan": true,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 25,
            "graphicsPlaneHeight": 720,
            "graphicsPlaneWidth": 1280,
            "height": 720,
            "interlaced": false,
            "modeName": "1280x720x25p",
            "overscan": true,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 50,
            "graphicsPlaneHeight": 720,
            "graphicsPlaneWidth": 1280,
            "height": 720,
            "interlaced": false,
            "modeName": "1280x720x50p",
            "overscan": true,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 60,
            "graphicsPlaneHeight": 720,
            "graphicsPlaneWidth": 1280,
            "height": 720,
            "interlaced": false,
            "modeName": "1280x720x59.94p",
            "overscan": true,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 720,
            "graphicsPlaneWidth": 1280,
            "height": 720,
            "interlaced": false,
            "modeName": "1280x720x60p",
            "overscan": true,
            "preferred": false,
            "width": 1280
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 25,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": true,
            "modeName": "1920x1080x50i",
            "overscan": true,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 30,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": true,
            "modeName": "1920x1080x59.94i",
            "overscan": true,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 30,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": true,
            "modeName": "1920x1080x60i",
            "overscan": true,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 24,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "1920x1080x24p",
            "overscan": true,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 24,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "1920x1080x23.976p",
            "overscan": true,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 25,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "1920x1080x25p",
            "overscan": true,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 30,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "1920x1080x29.97p",
            "overscan": true,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 30,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "1920x1080x30p",
            "overscan": true,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 50,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "1920x1080x50p",
            "overscan": true,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 60,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "1920x1080x59.94p",
            "overscan": true,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "1920x1080x60p",
            "overscan": true,
            "preferred": false,
            "width": 1920
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 360,
            "graphicsPlaneWidth": 1440,
            "height": 720,
            "interlaced": false,
            "modeName": "2880x720x60p",
            "overscan": true,
            "preferred": false,
            "width": 2880
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 300,
            "graphicsPlaneWidth": 1920,
            "height": 600,
            "interlaced": false,
            "modeName": "3840x600x60p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 25,
            "graphicsPlaneHeight": 540,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "3840x1080x25p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 30,
            "graphicsPlaneHeight": 540,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "3840x1080x30p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 30,
            "graphicsPlaneHeight": 600,
            "graphicsPlaneWidth": 1920,
            "height": 1200,
            "interlaced": false,
            "modeName": "3840x1200x30p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 24,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 2160,
            "interlaced": false,
            "modeName": "3840x2160x23.976p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 24,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 2160,
            "interlaced": false,
            "modeName": "3840x2160x24p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 25,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 2160,
            "interlaced": false,
            "modeName": "3840x2160x25p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 30,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 2160,
            "interlaced": false,
            "modeName": "3840x2160x29.97p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 30,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 2160,
            "interlaced": false,
            "modeName": "3840x2160x30p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 50,
            "graphicsPlaneHeight": 540,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "3840x1080x50p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 540,
            "graphicsPlaneWidth": 1920,
            "height": 1080,
            "interlaced": false,
            "modeName": "3840x1080x60p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 600,
            "graphicsPlaneWidth": 1920,
            "height": 1200,
            "interlaced": false,
            "modeName": "3840x1200x60p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "yuv420",
            "dropFrame": false,
            "frequency": 50,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 2160,
            "interlaced": false,
            "modeName": "3840x2160x50p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "yuv420",
            "dropFrame": true,
            "frequency": 60,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 2160,
            "interlaced": false,
            "modeName": "3840x2160x59.94p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "yuv420",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 1920,
            "height": 2160,
            "interlaced": false,
            "modeName": "3840x2160x60p",
            "overscan": true,
            "preferred": false,
            "width": 3840
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 24,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 2048,
            "height": 2160,
            "interlaced": false,
            "modeName": "4096x2160x23.976p",
            "overscan": true,
            "preferred": false,
            "width": 4096
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 24,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 2048,
            "height": 2160,
            "interlaced": false,
            "modeName": "4096x2160x24p",
            "overscan": true,
            "preferred": false,
            "width": 4096
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 25,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 2048,
            "height": 2160,
            "interlaced": false,
            "modeName": "4096x2160x25p",
            "overscan": true,
            "preferred": false,
            "width": 4096
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": true,
            "frequency": 30,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 2048,
            "height": 2160,
            "interlaced": false,
            "modeName": "4096x2160x29.97p",
            "overscan": true,
            "preferred": false,
            "width": 4096
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "rgb",
            "dropFrame": false,
            "frequency": 30,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 2048,
            "height": 2160,
            "interlaced": false,
            "modeName": "4096x2160x30p",
            "overscan": true,
            "preferred": false,
            "width": 4096
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "yuv420",
            "dropFrame": false,
            "frequency": 50,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 2048,
            "height": 2160,
            "interlaced": false,
            "modeName": "4096x2160x50p",
            "overscan": true,
            "preferred": false,
            "width": 4096
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "yuv420",
            "dropFrame": true,
            "frequency": 60,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 2048,
            "height": 2160,
            "interlaced": false,
            "modeName": "4096x2160x59.94p",
            "overscan": true,
            "preferred": false,
            "width": 4096
          },
          {
            "colorDepth": "8bit",
            "colorSpace": "yuv420",
            "dropFrame": false,
            "frequency": 60,
            "graphicsPlaneHeight": 1080,
            "graphicsPlaneWidth": 2048,
            "height": 2160,
            "interlaced": false,
            "modeName": "4096x2160x60p",
            "overscan": true,
            "preferred": false,
            "width": 4096
          }
        ]
      },
      "activeMode": {
        "result": {
          "colorDepth": "8bit",
          "colorSpace": "rgb",
          "dropFrame": false,
          "frequency": 60,
          "graphicsPlaneHeight": 1080,
          "graphicsPlaneWidth": 1920,
          "height": 1080,
          "interlaced": false,
          "modeName": "1920x1080x60p",
          "overscan": true,
          "preferred": false,
          "width": 1920
        }
      },
      "configuredMode": {
        "result": null
      },
      "bestMode": {
        "result": "1920x1080x60p"
      },
      "powerSaveStatus": {
        "result": false
      }
    }
  }
}
```
:::

## GET /v1/video/\:connector/output/\:device/edid/ 

Returns the EDID information from a compatible monitor/television connected to the video output.

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value is `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Example**

The example request parameters and headers are set as follows:

- `:connector` is set to `hdmi`
- `:device` is set to `0`

```text
GET /api/v1/video/hdmi/output/0/edid/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Example**

`result` is the EDID string result

```json
{
    "data": {
        "result": "00ffffffffffff004c2d0d050100000030120103801009780aee91a3544c99260f5054bdef80714f8111214081809500950fb3000101023a801871382d40582c4500a05a0000001e662150b051001b3040703600a05a0000001e000000fd00184b1a5117000a202020202020000000fc0053414d53554e470a2020202020016b020322f1469004050320222309070783010000e2000fe305030167030c001000b82d011d007251d01e206e285500a05a0000001e011d8018711c1620582c2500a05a0000009e8c0ad08a20e02d10103e9600a05a00000018000000000000000000000000000000000000000000000000000000000000000000000000000000ef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
    }
}
```

## GET /v1/video/\:connector/output/\:device/power-save/ 

Retrieves the power status of the monitor connected to the player. 

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value is `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Example**

The example request parameters and headers are set as follows:

- `:connector` is set to `hdmi`
- `:device` is set to `0`

```text
GET /api/v1/video/hdmi/output/0/power-save/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `is_connected` <font color="#704ae0">bool</font>: Whether the monitor is connected to the HDMI output on the player
- `is_powered` <font color="#704ae0">bool</font>: Whether the monitor is on (for example, RX powered) 
- `enabled` <font color="#704ae0">bool</font>: Whether power-save mode has been enabled on the HDMI/VGA output

**Response Example**

```json
{
  "data": {
    "result": {
      "is_connected": true,
      "is_powered": true,
      "enabled": false
    }
  }
}
```

## PUT /v1/video/\:connector/output/\:device/power-save/ 

Enables or disables power-save mode on the monitor connected to the player.

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value is `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Example**

The example request parameters and headers are set as follows:

- `:connector` is set to `hdmi`
- `:device` is set to `0`

```text
PUT /api/v1/video/hdmi/output/0/power-save/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 51
```

This is an example request body that enables the power-save mode:

```json
{
  "enabled": true
}
```

**Response Example**

```json
{
  "data": {
    "result": true
  }
}
```

## GET /v1/video/\:connector/output/\:device/modes/ 

Returns a list of all available video modes on the specified video output.

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value is `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Example**

The example request parameters and headers are set as follows:

- `:connector` is set to `hdmi`
- `:device` is set to `0`

```text
GET /api/v1/video/hdmi/output/0/modes/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

Returns an array of video mode objects, each of which contain the following parameters:

- `modeName` <font color="#704ae0">string</font>: The mode (for example, “1920x1080x60p”)
- `colorDepth` <font color="#704ae0">string</font>: The color depth of the video signal
- `colorSpace` <font color="#704ae0">string</font>: The color space of the video signal (“rgb”, "yuv420", or "yuv422")
- `dropFrame` <font color="#704ae0">bool</font>: Whether or not the video timecode uses drop frame
- `frequency` <font color="#704ae0">int</font>: The frame rate of the video output
- `width` <font color="#704ae0">int</font>: The width of the video output
- `height` <font color="#704ae0">int</font>: The height of the video output
- `graphicsPlaneWidth` <font color="#704ae0">int</font>: The width of the graphics plane
- `graphicsPlaneHeight` <font color="#704ae0">int</font>: The height of the graphics plane
- `interlaced` <font color="#704ae0">bool</font>:  Whether or not the video output is interlaced
- `overscan` <font color="#704ae0">bool</font>: Whether or not the video output is using an overscan setting or not
- `preferred` <font color="#704ae0">bool</font>: Whether or not video is the preferred mode

**Response Example**

:::ExpandableHeading
Expand

```json
{
    "data": {
        "result": [
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 640,
                "height": 480,
                "interlaced": false,
                "modeName": "640x480x60p",
                "overscan": false,
                "preferred": false,
                "width": 640
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 30,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 720,
                "height": 480,
                "interlaced": true,
                "modeName": "720x480x60i",
                "overscan": true,
                "preferred": false,
                "width": 720
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 576,
                "graphicsPlaneWidth": 720,
                "height": 576,
                "interlaced": true,
                "modeName": "720x576x50i",
                "overscan": true,
                "preferred": false,
                "width": 720
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 848,
                "height": 480,
                "interlaced": false,
                "modeName": "848x480x60p",
                "overscan": false,
                "preferred": false,
                "width": 848
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 600,
                "graphicsPlaneWidth": 800,
                "height": 600,
                "interlaced": false,
                "modeName": "800x600x60p",
                "overscan": false,
                "preferred": false,
                "width": 800
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 600,
                "graphicsPlaneWidth": 800,
                "height": 600,
                "interlaced": false,
                "modeName": "800x600x75p",
                "overscan": false,
                "preferred": false,
                "width": 800
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 960,
                "graphicsPlaneWidth": 960,
                "height": 960,
                "interlaced": false,
                "modeName": "960x960x60p",
                "overscan": false,
                "preferred": false,
                "width": 960
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 768,
                "graphicsPlaneWidth": 1024,
                "height": 768,
                "interlaced": false,
                "modeName": "1024x768x60p",
                "overscan": false,
                "preferred": false,
                "width": 1024
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 768,
                "graphicsPlaneWidth": 1024,
                "height": 768,
                "interlaced": false,
                "modeName": "1024x768x75p",
                "overscan": false,
                "preferred": false,
                "width": 1024
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 768,
                "graphicsPlaneWidth": 1280,
                "height": 768,
                "interlaced": false,
                "modeName": "1280x768x60p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 800,
                "graphicsPlaneWidth": 1280,
                "height": 800,
                "interlaced": false,
                "modeName": "1280x800x60p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 800,
                "graphicsPlaneWidth": 1280,
                "height": 800,
                "interlaced": false,
                "modeName": "1280x800x75p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 768,
                "graphicsPlaneWidth": 1360,
                "height": 768,
                "interlaced": false,
                "modeName": "1360x768x60p",
                "overscan": false,
                "preferred": false,
                "width": 1360
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1280,
                "graphicsPlaneWidth": 800,
                "height": 1280,
                "interlaced": false,
                "modeName": "800x1280x60p",
                "overscan": false,
                "preferred": false,
                "width": 800
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1920,
                "graphicsPlaneWidth": 1200,
                "height": 1920,
                "interlaced": false,
                "modeName": "1200x1920x60p",
                "overscan": false,
                "preferred": false,
                "width": 1200
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 768,
                "graphicsPlaneWidth": 1366,
                "height": 768,
                "interlaced": false,
                "modeName": "1366x768x60p",
                "overscan": false,
                "preferred": false,
                "width": 1366
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 960,
                "graphicsPlaneWidth": 1280,
                "height": 960,
                "interlaced": false,
                "modeName": "1280x960x60p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1024,
                "graphicsPlaneWidth": 1280,
                "height": 1024,
                "interlaced": false,
                "modeName": "1280x1024x60p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 1024,
                "graphicsPlaneWidth": 1280,
                "height": 1024,
                "interlaced": false,
                "modeName": "1280x1024x75p",
                "overscan": false,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 900,
                "graphicsPlaneWidth": 1440,
                "height": 900,
                "interlaced": false,
                "modeName": "1440x900x60p",
                "overscan": false,
                "preferred": false,
                "width": 1440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 900,
                "graphicsPlaneWidth": 1440,
                "height": 900,
                "interlaced": false,
                "modeName": "1440x900x75p",
                "overscan": false,
                "preferred": false,
                "width": 1440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1050,
                "graphicsPlaneWidth": 1400,
                "height": 1050,
                "interlaced": false,
                "modeName": "1400x1050x60p",
                "overscan": false,
                "preferred": false,
                "width": 1400
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 75,
                "graphicsPlaneHeight": 1050,
                "graphicsPlaneWidth": 1400,
                "height": 1050,
                "interlaced": false,
                "modeName": "1400x1050x75p",
                "overscan": false,
                "preferred": false,
                "width": 1400
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1440,
                "height": 1080,
                "interlaced": false,
                "modeName": "1440x1080x60p",
                "overscan": false,
                "preferred": false,
                "width": 1440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1088,
                "graphicsPlaneWidth": 1440,
                "height": 1088,
                "interlaced": false,
                "modeName": "1440x1088x57p",
                "overscan": false,
                "preferred": false,
                "width": 1440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1024,
                "graphicsPlaneWidth": 768,
                "height": 2048,
                "interlaced": false,
                "modeName": "1536x2048x30p",
                "overscan": false,
                "preferred": false,
                "width": 1536
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 900,
                "graphicsPlaneWidth": 1600,
                "height": 900,
                "interlaced": false,
                "modeName": "1600x900x60p",
                "overscan": false,
                "preferred": false,
                "width": 1600
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1200,
                "graphicsPlaneWidth": 1600,
                "height": 1200,
                "interlaced": false,
                "modeName": "1600x1200x60p",
                "overscan": false,
                "preferred": false,
                "width": 1600
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1050,
                "graphicsPlaneWidth": 1680,
                "height": 1050,
                "interlaced": false,
                "modeName": "1680x1050x60p",
                "overscan": false,
                "preferred": false,
                "width": 1680
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1296,
                "graphicsPlaneWidth": 1728,
                "height": 1296,
                "interlaced": false,
                "modeName": "1728x1296x60p",
                "overscan": false,
                "preferred": false,
                "width": 1728
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1920,
                "height": 540,
                "interlaced": false,
                "modeName": "1920x540x60p",
                "overscan": false,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 1200,
                "graphicsPlaneWidth": 1920,
                "height": 1200,
                "interlaced": false,
                "modeName": "1920x1200x50p",
                "overscan": false,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1200,
                "graphicsPlaneWidth": 1920,
                "height": 1200,
                "interlaced": false,
                "modeName": "1920x1200x60p",
                "overscan": false,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 672,
                "graphicsPlaneWidth": 896,
                "height": 1344,
                "interlaced": false,
                "modeName": "1792x1344x60p",
                "overscan": false,
                "preferred": false,
                "width": 1792
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 960,
                "graphicsPlaneWidth": 960,
                "height": 1920,
                "interlaced": false,
                "modeName": "1920x1920x60p",
                "overscan": false,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 576,
                "graphicsPlaneWidth": 1024,
                "height": 1152,
                "interlaced": false,
                "modeName": "2048x1152x50p",
                "overscan": false,
                "preferred": false,
                "width": 2048
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 576,
                "graphicsPlaneWidth": 1024,
                "height": 1152,
                "interlaced": false,
                "modeName": "2048x1152x60p",
                "overscan": false,
                "preferred": false,
                "width": 2048
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 288,
                "graphicsPlaneWidth": 2376,
                "height": 288,
                "interlaced": false,
                "modeName": "2376x288x60p",
                "overscan": false,
                "preferred": false,
                "width": 2376
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 800,
                "graphicsPlaneWidth": 2560,
                "height": 800,
                "interlaced": false,
                "modeName": "2560x800x60p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 1280,
                "height": 960,
                "interlaced": false,
                "modeName": "2560x960x60p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1280,
                "height": 1080,
                "interlaced": false,
                "modeName": "2560x1080x60p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 1440,
                "interlaced": false,
                "modeName": "2560x1440x30p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 1440,
                "interlaced": false,
                "modeName": "2560x1440x60p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 800,
                "graphicsPlaneWidth": 1280,
                "height": 1600,
                "interlaced": false,
                "modeName": "2560x1600x60p",
                "overscan": false,
                "preferred": false,
                "width": 2560
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1024,
                "graphicsPlaneWidth": 1536,
                "height": 2048,
                "interlaced": false,
                "modeName": "3072x2048x30p",
                "overscan": false,
                "preferred": false,
                "width": 3072
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1720,
                "height": 1440,
                "interlaced": false,
                "modeName": "3440x1440x30p",
                "overscan": false,
                "preferred": false,
                "width": 3440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1720,
                "height": 1440,
                "interlaced": false,
                "modeName": "3440x1440x50p",
                "overscan": false,
                "preferred": false,
                "width": 3440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1720,
                "height": 1440,
                "interlaced": false,
                "modeName": "3440x1440x60p",
                "overscan": false,
                "preferred": false,
                "width": 3440
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 576,
                "graphicsPlaneWidth": 720,
                "height": 576,
                "interlaced": false,
                "modeName": "720x576x50p",
                "overscan": true,
                "preferred": false,
                "width": 720
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 720,
                "height": 480,
                "interlaced": false,
                "modeName": "720x480x59.94p",
                "overscan": true,
                "preferred": false,
                "width": 720
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 720,
                "height": 480,
                "interlaced": false,
                "modeName": "720x480x60p",
                "overscan": true,
                "preferred": false,
                "width": 720
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 24,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x24p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 24,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x23.976p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x25p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x50p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 60,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x59.94p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 720,
                "graphicsPlaneWidth": 1280,
                "height": 720,
                "interlaced": false,
                "modeName": "1280x720x60p",
                "overscan": true,
                "preferred": false,
                "width": 1280
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": true,
                "modeName": "1920x1080x50i",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": true,
                "modeName": "1920x1080x59.94i",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": true,
                "modeName": "1920x1080x60i",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x24p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x23.976p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x25p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x29.97p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x30p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x50p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x59.94p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x60p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 360,
                "graphicsPlaneWidth": 1440,
                "height": 720,
                "interlaced": false,
                "modeName": "2880x720x60p",
                "overscan": true,
                "preferred": false,
                "width": 2880
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 300,
                "graphicsPlaneWidth": 1920,
                "height": 600,
                "interlaced": false,
                "modeName": "3840x600x60p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "3840x1080x25p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "3840x1080x30p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 600,
                "graphicsPlaneWidth": 1920,
                "height": 1200,
                "interlaced": false,
                "modeName": "3840x1200x30p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x23.976p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x24p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x25p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x29.97p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x30p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "3840x1080x50p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 540,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "3840x1080x60p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 600,
                "graphicsPlaneWidth": 1920,
                "height": 1200,
                "interlaced": false,
                "modeName": "3840x1200x60p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x50p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": true,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x59.94p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 2160,
                "interlaced": false,
                "modeName": "3840x2160x60p",
                "overscan": true,
                "preferred": false,
                "width": 3840
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x23.976p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 24,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x24p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 25,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x25p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": true,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x29.97p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 30,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x30p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": false,
                "frequency": 50,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x50p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": true,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x59.94p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            },
            {
                "colorDepth": "8bit",
                "colorSpace": "yuv420",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 2048,
                "height": 2160,
                "interlaced": false,
                "modeName": "4096x2160x60p",
                "overscan": true,
                "preferred": false,
                "width": 4096
            }
        ]
    }
}
```
:::

## GET /v1/video/\:connector/output/\:device/mode/ 

Retrieves the current video mode on the specified video output. 

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value is `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Query String Parameters**

Each of these parameters delivers a different mode value:

- `best` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: If set to 1, this returns the best mode
- `active` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: If set to 1, this returns the active mode
- `configured` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: If set to 1, this returns the configured mode

**Request Example**

The example request parameters and headers are set as follows:

- `:connector` is set to `hdmi`
- `:device` is set to `0`
- `best` is set to `1`

```text
GET /api/v1/video/hdmi/output/0/mode/?best=1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `isAutoMode` <font color="#704ae0">bool</font>: Whether the mode is set to “auto”
- `name` <font color="#704ae0">string</font>: The name of the video mode. Same as `mode.modeName` below.
- `width` <font color="#704ae0">string</font>: The width value of the video mode.
- `height` <font color="#704ae0">string</font>: The height value of the video mode.
- `frames` <font color="#704ae0">string</font>: The frame rate value of the video mode.
- `scan` <font color="#704ae0">string</font>: The scan character value of the video mode.
- `mode` <font color="#704ae0">object</font>: The currently configured video mode on the video output with following parameters -
  - `modeName` <font color="#704ae0">string</font>: The mode (for example, “1920x1080x60p”)
  - `colorDepth` <font color="#704ae0">string</font>: The color depth of the video signal
  - `colorSpace` <font color="#704ae0">string</font>: The color space of the video signal ("rgb", "yuv420", or "yuv422")
  - `dropFrame` <font color="#704ae0">bool</font>: Whether or not the video timecode uses drop frame
  - `frequency` <font color="#704ae0">int</font>: The frame rate of the video output
  - `width` <font color="#704ae0">int</font>: The width of the video output
  - `height` <font color="#704ae0">int</font>: The height of the video output
  - `graphicsPlaneWidth` <font color="#704ae0">int</font>: The width of the graphics plane
  - `graphicsPlaneHeight` <font color="#704ae0">int</font>: The height of the graphics plane
  - `interlaced` <font color="#704ae0">bool</font>:  Whether or not the video output is interlaced
  - `overscan` <font color="#704ae0">bool</font>: Whether or not the video output is using an overscan setting or not
  - `preferred` <font color="#704ae0">bool</font>: Whether or not video is the preferred mode

**Response Example**

```json
{
    "data": {
        "result": {
            "isAutoMode": false,
            "name": "1920x1080x60p",
            "width": "1920",
            "height": "1080",
            "frames": "60",
            "scan": "p",
            "mode": {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 1080,
                "graphicsPlaneWidth": 1920,
                "height": 1080,
                "interlaced": false,
                "modeName": "1920x1080x60p",
                "overscan": true,
                "preferred": false,
                "width": 1920
            }
        }
    }
}
```

## PUT /v1/video/\:connector/output/\:device/mode/ 

Changes the video mode on the player. You should first send a GET request to find the body parameters of this API, but only the `modeName` parameter is required.

**Segments**

- `connector`: The current value is always `hdmi`
- `device`: This value is `0` for single-output Series 5 players and all Series 4 and older players. The value can be `0`-`3` for the XC4055, which has multiple outputs, and `0` or `1` for the XC2055 and XT2145.

**Request Body**

A video mode object containing the following value(s):

- `modeName` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The mode (for example, “1920x1080x60p”). See [Supported Video Modes](docId\:QpML112mBhEK7LBDGUxnv) for a list of the possible valid strings for your player
- `colorDepth` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The color depth of the video signal
- `colorSpace` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The color space of the video signal (“rgb”, "yuv420", or "yuv422")
- `dropFrame` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Whether or not the video timecode uses drop frame
- `frequency` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The frame rate of the video output
- `width` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The width of the video output
- `height` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The height of the video output
- `graphicsPlaneWidth` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The width of the graphics plane
- `graphicsPlaneHeight` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The height of the graphics plane
- `interlaced` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>:  Whether or not the video output is interlaced
- `overscan` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Whether or not the video output is using an overscan setting or not
- `preferred` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Whether or not video is the preferred mode

**Request Example**

```text
PUT /api/v1/video/hdmi/output/0/mode/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 95
```

This is the example request body:

```json
{
  "name": {
    "modeName": "640x480x60p"
  }
}
```

**Response Body**

The server will return a success or error message. A successful response will almost always cause a reboot which will be indicated in the response.

- `success` <font color="#704ae0">bool</font>: Whether or not the operation was successful
- `reboot` <font color="#704ae0">bool</font>: Whether or not the player is rebooting

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": true
        }
    }
}
```


[title] Example (CMS URL/App URL)
[path] BrightSign Partner Packet/Integrating with BrightSign/

In this example, we will be provisioning a player to use the CMS URL/App URL Publishing Mode and BrightSign Author. Players can also be provisioned in the BrightSign Control Player Setup section.

# Player Preparation

To better reflect the most likely experience of a real-world user, we will proceed as if the player is brand new.

If you had previously used the player to follow along with the Manual Setup Example, you can simply erase/reformat the storage device and reinsert into the player. Since the player was not explicitly provisioned with BSN.Cloud (the Default Setup was used), the player does not need to be reprovisioned.

If you had previously activated the player for use with BSN.Cloud, however, refer to the directions [here](docId\:Cyl9kPm02CO5rgcB9WQQv) on how to delete the player’s provisioning record and then return here.

:::hint{type="warning"}
In this example, we will be provisioning the player *prior* to booting up the player for the first time. If a new player does not already have a provisioning record with BSN.Cloud, powering up the player will take the user to the [Activate](docId\:OOf-RmqHqFVLhokXI8ypJ) screen. Activation provisions the player with the current Default Setup File. Unless another default Setup File has been created, the player will be provisioned with the BrightSign Default Setup File which uses BrightSign Author Plus (bsn.Content) as the Publishing Mode. Reprovisioning the player would then be required to apply a different Setup File. Provisioning the player prior to activating the player thus saves the step of having to reprovision the player.
:::

# Provision Player

1. Do *not* power up the player.
2. Write down the player’s Serial Number. The Serial Number can be found on the label on the bottom of the player itself or on a label on the box that the player was packaged in.
3. Go to **Admin** > **Provision** > **Add Player**. Enter the Serial Number you wrote down. If desired, you can also enter an optional Player Name and Player Description.
4. Select **Add Player**.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/K7P1A_8p-g8MbokouLkm__image-20230914-201123.png)

The player should now appear in the list of players. Note that it has been assigned the Default Setup File. If you have not explicitly created a new Default Setup File, this Default Setup File will be the BrightSign Default Setup File.

Next:

1. Select the player you wish to provision. This should be the player with the serial number you just added above.
2. Select **Apply App URL** from the drop-down menu.
3. In the pop-up window, select **App URL** and enter the URL where the desired *autorun.zip* file resides. If you like, you can use the example URL here: [https://www.brightsign.biz/examples/autorun.zip](https://brightsign.biz/examples/autorun.zip)
4. Select **Apply**.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/jw90F6bRz_8XD3brN2Udl_image-20230914-201639.png)

The player is now provisioned for the CMS URL/App URL publishing mode. All of the other player settings, since they have not been explicitly changed, remain per the BrightSign Default Setup.

# Power Up Player

Power up the player. Once the player has booted, it will search for a provisioning record on BSN.Cloud. If a record is found, the player will apply the settings according to its provisioning record. Since we created a provisioning record for this player in the previous steps, the player will apply those settings. In this case, the provisioning record instructs the player to go to the designated URL, download the *autorun.zip* file there, unzip that file, and then reboot to run the *autorun.brs* within the *autorun.zip* file. The *autorun.brs* file has been configured to display the HTML presentation contained in the *autorun.zip* file.

The same presentation that was previously displayed with the manual copy example should now be shown on the screen. Whereas with the previous example, the *autorun.zip* file was manually copied to the player’s storage device, the player now has been remotely provisioned to retrieve the *autorun.zip* file from a URL.

[Next - Developer Tools >](docId\:WFjRzUBBUvewOhJo-Tf3Q)

[title] Partner Setup and Recovery
[path] BSN.Cloud for Partners/

You can use the 1.6.52 or higher version of the BrightSign Author / BSN.Cloud autorun to download a partner setup to your local PC and place it on an SD card. This is useful for advanced network configurations that require the player to be able to reach the internet to download the partner application. You can also set up a recovery URL if, for example, your SD card was corrupted and needs either reformatting or replacement (the player is not automatically configured for recovery in this workflow, unlike the B-Deploy workflow).

:::hint{type="warning"}
You must disable the autorun before reformatting the SD card on your device.
To disable the autorun, use the PUT API /v1/control/reboot with body parameter `{“autorun”:”disable”}`, as described in [this page](docId\:YLXb9c8Us70n09hoOkdp_). This can also be done in the local DWS Diagnostics tab.
:::

To save your setup package to an SD card through BrightSign Author:

1. Choose the **Partner Application** setup type, and select any partner (see Image 1).
2. Select **Save Setup Files** so that the package can be saved to the SD card
3. Factory reset the player
4. Install the SD card
5. Reboot the player

Next, set up a recovery URL for your partner application: 

1. In BrightSign Author, go to **Admin > Device Provisioning > Add Device** 
2. Add your player serial number and check the box next to your player in the list
3. In the **Actions** dropdown, choose **Apply Application**
4. Choose **Partner Applications** and add the partner you previously selected.
5. Select **Apply**

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/5gzfeqRdEryjhSC8dbjfM_screen-shot-2022-06-14-at-35512-pm.png" size="86" width="1050" height="953" position="center" darkWidth="1050" darkHeight="953" showCaption="false"}


[title] HTML Storage
[path] HTML Development/HTML Best Practices/

The following [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK)  methods are used to configure HTML storage on the BrightSign player:

- `SetLocalStorageDir()`
- `SetLocalStorageQuota()`
- `SetWebDatabaseDir()`
- `SetWebStorageQuota()`
- `SetAppCacheDir()`
- `SetAppCacheQuota()`

:::hint{type="info"}
The behavior of *roHtmlWidget* storage methods has changed in OS8. The new behavior is described below. Updating a player to OS8 from 7.1.x or earlier will cause stored HTML data on the player to be reset.
:::

## Initialization

The above methods take effect when a new *roHtmlWidget* instance is created; they don't apply to the *roHtmlWidget* instance on which they are called (this is not the case for the the `storage_path` and `storage_quota` [initialization](docId\:xljq5_YhDmA2SSmpZimtK) parameters).

## Storage Path

The `SetLocalStorageDir()`, `SetWebDatabaseDir()`, and `SetAppCacheDir()` methods all configure the same storage path, so calling one of these methods will overwrite the storage path configured by the other methods.

Without a storage path (for example, when you are using an 'incognito' browser), nothing will persist when you are finished with the Chromium instance. If you want data to persist through reboot and widget creation, you must set a storage path. When non-persistent (incognito) mode is used, 10% of the total system memory is reserved for browser storage. This memory will be shared between multiple roHtmlWidget instances.

## Storage Quota

The `SetLocalStorageQuota()`, `SetWebStorageQuota()`, and `SetAppCacheQuota()`  methods all configure the same storage quota, which applies to all persistent HTML storage on the player. If the storage path is specified without a storage quota, Chromium defaults to reserving 1GB plus 10% of the total size of the storage device.

If there are multiple *roHtmlWidget* instances, the configured or default quota is shared among them.

[title] Adding a CMS to bsn.Cloud Partner Gallery
[path] BSN.Cloud for Partners/

The BrightSign Partner Gallery is a provisioning option that makes your CMS available to  select in BSN.Cloud. With the correct configuration (see the exact steps below), the user can view the CMS landing page directly after booting up the player.

![](https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/vtiBpsNbek-74QIPeU-wv-20260430-210209.png "The BrightAuthor\:connected Partner Gallery view")

To include your CMS in the Partner Gallery, email *support\@brightsign.biz* or *integrations\@brightsign.biz* with the following information:

1. Your company name, exactly as you want it displayed
2. The company logo as a PNG image
3. A persistent URL to an *autorun.zip* package with your application files:
   1. See [Create / Install an autorun.zip](docId\:xPGNxJQYwJkJNqL6fq1kL) for details on how to create an *autorun.zip* file:&#x20;
   2. Host that *autorun.zip* at a persistent URL on your servers, accessible by the player&#x73;**.&#x20;***HTTPS is required.*
   3. To test your URL, please set up a player via the [CMS URL Setup](docId\:G_Vesz3ul67ERD9UElEZx) option
4. A photo or screenshot that shows the screen on the player after your test of the URL setup
5. A contact email address in case we discover errors with the *autorun.zip* package

Once your app has been added to the gallery, users can set up their players with your CMS using [Partner CMS Setup](docId\:u9L_W0VjnyfYp9itZ6UrY).


[title] LDWS Control Endpoints
[path] Diagnostic Web Server APIs/Untitled/

## PUT /v1/control/reboot/ 

Reboots the player.

**Request Body**

- `crash_report` <font color="#704ae0">bool</font>: Setting this parameter to true reboots the player and saves a crash-report file to the brightsign-dumps folder. Only use this when directed by BrightSign customer service, which may request the crash report when helping you troubleshoot a player.
- `factory_reset` <font color="#704ae0">bool</font>**:** Setting this parameter to true resets the player to factory defaults, erasing all persistent registry settings for networking, security, and other applications.
- `autorun` <font color="#704ae0">string</font>**:** Set to “disable” to disable the current autorun script, which is helpful for debugging purposes.

**Request Example (Simple Reboot)**

This reboot has no body.

```text
PUT /api/v1/control/reboot HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
```

**Request Example (Crash Report)**

```text
PUT /api/v1/control/reboot/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 36
```

This is the example request body:

```json
{
  "crash_report": true
}
```

**Request Example (Factory Reset)**

```text
PUT /api/v1/control/reboot/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 39
```

This is the example request body:

```json
{
  "factory_reset": true
}
```

**Request Example (Disable Autorun)**

```text
PUT /api/v1/control/reboot/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 41
```

This is the example request body:

```json
{
  "autorun": "disable"
}
```

**Response Body**

The server will return a success or error message. A successful response will almost always cause a reboot which will be indicated in the response.

- `result` <font color="#704ae0">object</font>: The response object
  - `success` <font color="#704ae0">bool</font>: Whether or not the operation was successful
  - `reboot` <font color="#704ae0">bool</font>: Whether or not the player is rebooting

**Response Examples**

**Crash Report**

```json
{
    "data": {
        "result": {
            "success": true,
            "message": "A reboot has been initiated (with crash report)"
        }
    }
}
```

**Factory Reset**

```json
{
    "data": {
        "result": {
            "success": true,
            "message": "A reboot has been initiated (with factory reset)"
        }
    }
}
```

**Disable Autorun**

```json
{
    "data": {
        "result": {
            "success": true,
            "message": "A reboot has been initiated"
        }
    }
}
```

## GET /v1/control/dws-password/ 

Returns information about the current password of the local DWS (but not the password itself) such as whether the password is blank or invalid

**Request Example**

```text
GET /api/v1/control/dws-password/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the password was successfully read
- `password` <font color="#704ae0">Password{ }</font>: A Password object that describes the DWS password. The following are possible values:
  - `isResultValid` <font color="#704ae0">bool</font>: A flag indicating whether the DWS password is valid
  - `isBlank` <font color="#704ae0">bool</font>: A flag indicating whether the DWS password is blank (i.e. no password is required)

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "password": {
        "isResultValid": true,
        "isBlank": true
      }
    }
  }
}
```

## PUT /v1/control/dws-password/ 

Resets or changes the DWS password. 

**Request Body**

- `password` <font color="#704ae0">string</font>: The password value that you want to set.
- `previous_password` <font color="#704ae0">string</font>: This optional parameter is the old password value
- `obfuscated_password` <font color="#704ae0">string</font>: An obfuscated password for the LDWS.

**Request Example**

```text
PUT /api/v1/control/dws-password/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 106
```

This is the example request body:

```json
{
  "password": "newpassword",
  "previous_password": "oldpassword"
}
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the password was successfully set
- `reboot` <font color="#704ae0">bool</font>: A flag indicating whether the player will reboot to set the password

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": false
        }
    }
}
```



## GET /v1/control/local-dws/ 

Returns whether or not the local DWS is enabled.

**Request Example**

```text
GET /api/v1/control/local-dws/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: Whether the local DWS is enabled or disabled
- `value` <font color="#704ae0">bool</font>: When `true` means that the local DWS is enabled, `false` is disabled

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "value": true
        }
    }
}
```

## PUT /v1/control/local-dws/ 

Used to disable the local DWS. See [Access the Local DWS](docId\:IAFCHERlJfjDJTWTtKpk5) for information on enabling the local DWS using other methods.

**Request Body**

- `enable` <font color="#704ae0">bool</font>: Whether or not the local DWS is enabled&#x20;

**Request Example**

```text
PUT /api/v1/control/local-dws/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 47
```

This is the example request body:

```json
{
  "enable": false
}
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the local DWS was successfully disabled
- `reboot` <font color="#704ae0">bool</font>: A flag indicating whether the player will reboot to disable the local DWS

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": true
        }
    }
}
```



## PUT /v1/control/ssh-host-keys/reset/

Resets the SSH host keys by regenerating new host key pairs. This is useful for security purposes or when host keys have been compromised. The system will automatically determine if a reboot is required, unless overriden by the reboot parameter.

**Request Example**

```text
PUT /api/v1/control/ssh-host-keys/reset/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 56
```

**Request Body**

This is the optional example request body:

```json
{
  "reboot": "true"
}
```

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "value": true
        }
    }
}
```

## PUT /v1/control/dws-default-certs/reset/

Resets the DWS default certificates by regenerating new certificate pairs. This is useful for security purposes or when certificates have been compromised. The system will reboot to activate new certificates, unless overriden by the reboot parameter.

**Request Example**

```text
PUT /api/v1/control/dws-default-certs/reset/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 56
```

**Request Body**

This is the optional example request body:

```json
{
  "reboot": "true"
}
```

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "value": true
        }
    }
}
```


[title] rDWS Other Endpoints
[path] Diagnostic Web Server APIs/Remote DWS APIs/

Base URL for these endpoints:  ***https\://ws.bsn.cloud/rest/v1/***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## DELETE /storage/\{:device\_name}/ 

Reformats the specified storage device

You must disable the autorun before reformatting the SD card on your device. To disable the autorun, use the PUT /v1/control/reboot with body parameter \{ “autorun”:”disable” }, as described in [rDWS Control Endpoints](docId\:DJbUqHNmn5EOAcqTmrM78). This can also be done in the local DWS Diagnostics tab.

**Segment**

- `device_name` <font color="#704ae0">string</font>: The specified storage device (see [roStorageInfo](docId\:BczooenmOIfNRbeny6ZKI) for a list of available devices)

**Request Body**

- `fs` <font color="#704ae0">string</font>: The [file system](docId\:nSjXffR7OlFgDWgjFEbMe) to use when reformatting a storage device. The default value of fs is "exfat".

**Request Example**

```text
DELETE /rest/v1/storage/sd/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 49
```

This is the example request body:

```json
{
    "data": {
        "fs": "exfat"
    }
}
```

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "output": "Format completeted successfully.",
            "error": ""
        }
    },
    "route": "/v1/storage/sd",
    "method": "DELETE"
}
```

## GET /re-provision/ 

Calling this endpoint will re-provision the player (in other words, the B-Deploy/ Provisioning setup currently associated with the player will be downloaded, and the device will go through setup again). The BrightSign Author UI feature that uses this functionality is [Reprovision Player](docId\:qXt4YHey7IEj_M9dH73wM).

The re-provision process involves the following steps:

1. If the “networking” section of the player’s registry contains the access and refresh tokens, it is assumed that the player was previously set up for BSN.Cloud. So BrightSign keeps some setup-related keys in the Networking section (see "Setup-Related Keys", below) and deletes the rest of the registry entries. If the Networking section does not include access and refresh tokens, it will empty the whole Networking section, format the SD card, and reboot to try to provision the player.
2. BrightSign also sets the “deviceSetupComplete“ parameter in the “autorun” section to null, so that the player can set up again. This key is set to 1 only if the player was previously set up through the on-device setup option.
3. The code removes all files from the default storage device (this is almost always the SD card). You do not need to format the storage separately.
4. The player reboots, fetches the setup package from B-Deploy, and re-provisions itself.

**Setup-Related Keys**

```text
- inp (inherit network properties)
- networkjson (network settings in json format - setup version v3)
- modem_json (default settings for modem configuration in json format)

- wifi (use wireless)
- ss (wifi ssid)
- pp (wifi passphrase)

The first network interface, either ethernet or WiFi:
- dhcp (use dhcp)
- sip (static ip address)
- sm (subnet mask)
- gw (gateway)
- dns1 (first dns)
- dns2 (second dns)
- dns3 (third dns)

The second network interface, either ethernet or WiFi:
- dhcp2
- sip2
- sm2
- gw2
- dns12
- dns22
- dns32

- ncp (wired connection priority)
- ncp2 (wireless connection priority)

- up (use proxy)
- ps (proxy server url)
- bph (proxy bypass list)

- ts (time servers list)

Rate limits for the first network interface, ethernet or WiFi:
- rlmid (rate limit mode during initial downloads)
- rlrid (rate limit value during initial downloads)
- rlmow (rate limit mode outside download window)
- rlrow (rate limit value outside download window)
- rlmiw (rate limit mode inside download window)
- rlriw (rate limit value inside download window)

Rate limits for the second network interface, ethernet or WiFi:
- rlmid2
- rlrid2
- rlmow2
- rlrow2
- rlmiw2
- rlriw2

Enabled flag values for the ethernet interface:
- cwr (Content transfers enabled)
- twr (Text feed transfers enabled)
- mwr (Media feed transfers enabled)
- hwr (Health transfers enabled)
- lwr (Log upload transfers enabled)

Enabled flag values for the WiFi interface:
- cwf
- twf
- mwf
- hwf
- lwf

if vlanids = 25
- usedhcp_vlan_25
- staticipaddress_vlan_25
- subnetmask_vlan_25
- gateway_vlan_25
- dns1_vlan_25
- dns2_vlan_25
- dns3_vlan_25
```

**Request Example**

```text
GET /rest/v1/re-provision/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: `True` means that the operation succeeded and the player will reboot. `False` means that the operation failed.

**Response Example**

```json
{
    "route": "/v1/re-provision",
    "method": "GET",
    "data": {
        "result": {
            "success": true
        }
    }
}
```

## POST /snapshot/ 

Takes a screenshot of the current screen contents and saves it to storage. See [Request Message Format](docId\:Kku9e7f7CHC5LwofXs9E0) for the Query String Parameters.

**Request Example**

```text
POST /rest/v1/snapshot/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
```

**Response Body**

- `remoteSnapshotThumbnail` <font color="#704ae0">string</font>: A snapshot image thumbnail in Base64 format
- `filename` <font color="#704ae0">string</font>: The name and path of the snapshot image file. Call `GET /file/{:path}` to retrieve the full-resolution image.
- `timestamp` <font color="#704ae0">string</font>: The date and time the snapshot was taken. The date/time is formatted as "`yyyy-mm-dd hh:mm:ss <timezone>"`.

**Response Example**

```json
{
    "route": "/v1/snapshot",
    "method": "POST",
    "data": {
        "result": {
            "remoteSnapshotThumbnail": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4QDeRXhpZgAASUkqAAgAAAABAGmHBAABAAAAGgAAAAAAAAAKAA8BAgALAAAAtAAAABABAgAHAAAAwAAAADEBAgAIAAAArAAAADIBAgAUAAAAmAAAADsBAgANAAAAyAAAACqICAABAAAAgI8AAACQBwAEAAAAMDIxMAGgAwABAAAAAQAAAAKgBAABAAAAgAcAAAOgBAABAAAAOAQAAAAAAAAyMDI0OjAyOjA3IDExOjM2OjMwAHY5LjAuOTcAQnJpZ2h0U2lnbgAAWEQxMDM1AABNNEUzM0QwMDY4MjQAAP/bAIQAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB/8AAEQgAUAB4AwERAAIRAQMRAf/EAaIAAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKCxAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6AQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgsRAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/E+v9WD+4AoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKACgAoAKAP8A/9k=",
            "filename": "/sd/remote_snapshots/img-2024-02-07-11-36-30.jpg",
            "timestamp": "2024-02-07 11:36:33 PST",
            "devicename": "XD5-RE433D006644",
            "width": 1920,
            "height": 1080
        }
    }
}
```

## PUT /custom/ 

Sends custom data to the player. The player in turn sends the data as a message (in JSON string format) on UDP port 5000, which can then be captured by the *autorun.brs* or a JavaScript application on the player.

**Request Body**

- `command` <font color="#704ae0">string</font>: The custom data to send
- `returnImmediately` <font color="#704ae0">bool</font>: A flag specifying whether the server should respond to the PUT request immediately (`true`) or wait on a response to the UDP message from the BrightScript/JavaScript application (`false`).

**Request Example**

```none
PUT /rest/v1/custom/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 89
```

This is the example request body:

```json
{
    "data": {
        "command": "next",
        "returnImmediately": true
    }
}
```

**Response Body**

If the `returnImmediately` property is `true`, the server will return a success or error message. If the property is `false`, the server will wait for a response from UDP port 5000 on the player and send it as the response to the PUT request.

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true
        }
    },
    "route": "/v1/custom",
    "method": "PUT"
}
```

## GET /download-firmware/ 

Instructs the player to download and apply a firmware update.

**Query String Parameter**

- `url` <font color="#704ae0">string</font>: The public URL for downloading the firmware-update file.

**Request Example**

```text
GET /rest/v1/download-firmware/?url=https://bsncloud.s3.amazonaws.com/public/cobra-9.0.110-update.bsfw&destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the download was successful
- `reboot` <font color="#704ae0">bool</font>: A flag indicating whether the player will reboot when applying a firmware update

**Response Example**

```json
{
    "route": "/v1/download-firmware",
    "method": "GET",
    "data": {
        "result": {
            "success": true,
            "reboot": true
        }
    }
}
```


[title] Diagnostic Web Server APIs
[path] /

These APIs allow you to connect to individual BrightSign players. They are especially useful if there are many players on the network so you can more quickly find and access players.

# Local DWS APIs

:::hint{type="warning"}
Local access (i.e., access over the local network) of the Diagnostic Web Server (DWS) is *disabled* by default as of BrightSignOS 9.0.218 (on the 9.0 branch) and BrightSignOS 9.1.75 (on the 9.1 branch). In BrightSignOS versions prior to these, local access to the DWS was enabled by default. To enable local access to the DWS, see [DWS: Local Access](docId\:IAFCHERlJfjDJTWTtKpk5).

Note that some specially configured players have the external microSD card port and USB storage disabled at the factory (SKU: SVC-internal-storage-only). For these players, local access to the DWS remains enabled by default.

Remote access (i.e., access over the internet) of the DWS remains available for all internet-connected players registered with BrightSign Cloud.
:::

[Local DWS APIs](docId:2Zmel07w011h1267dt-59) let you access your players on a local network. These APIs give you information about the player, let you reboot the player, see the health of SD card, and access all of the functionality of the calls that underlie the DWS in the BrightSign Author UI. The local DWS APIs include Presentation Autorun Server APIs, which are hosted by the presentation autorun, and can be accessed with authentication from the local DWS. Only BrightScript objects in the presentation autorun know how to respond to these requests. Local DWS APIs are local player APIs and are authenticated through a username and password, not an OAuth bearer token.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/GkyV9XWLHK4pr032HpckF_screenshot-2023-03-17-at-91213-am.png" size="64" width="1284" height="663" position="center" alt="Screenshot 2023-03-17 at 9.12.13 AM.png" darkWidth="1284" darkHeight="663" showCaption="false"}

# Remote DWS APIs

The [Remote DWS APIs](docId\:Kku9e7f7CHC5LwofXs9E0) are contained in the [WebSockets](docId:2FoO6xeacVDG8em0fu6mq) APIs, which use the WebSocket connection to leverage legacy endpoints that would otherwise only be addressable via the local network. Once a connection is established, the BrightSign WebSockets server can send WebSockets messages to BrightSign players. Depending on the operation, the BrightSign player may return information to the BrightSign Websockets server, which will be relayed in the server REST response to the client application. The Remote DWS APIs allow you to access your player through BSN.Cloud (using the bearer token for bsn.cloud) as well as get information about the player, reboot the player, see the health of SD card, and access all of the functionality of the calls that underlie the DWS in the BrightSign Author UI.

![WSAPI\_v3.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/ABTIHvRQ-2nU_QdTkufem_wsapiv3.png)


[title] Content Sources
[path] BrightSign Partner Packet/

Thanks to the built-in Chromium engine, BrightSign players can generally display any HTML web page that is capable of being displayed in the Chrome browser. Typically, HTML presentations will consist of an HTML file that resides locally on the player’s storage device. Content displayed by the HTML file can be broadly categorized as follows:

1. **Local**
   - Content resides on the player’s storage device.
   - Since the content is local, it can begin playing immediately.
2. **Web**
   - Content is retrieved from an external web URL.
   - Unless the content has been previously cached, it must first be downloaded before it can be displayed.
3. **Streamed**
   - Content is streamed, either locally or from an external server.
   - Streamed content relies on dedicated streaming servers and various streaming protocols like HLS, UDP/RTP/RTSP, and HTTP.
   - Video and audio data are transported as a continuous flow that can be watched or listened to almost immediately without having to wait for the full download to complete.

These categories are not mutually exclusive, and as we will see, players can readily play content from a mixture of these content sources.

[Next - Example (Manual Setup) >](docId:3n83W8cEAAZhxwtq37l6U)&#x20;

[title] LDWS Remote Snapshot Endpoint
[path] Diagnostic Web Server APIs/Untitled/

## POST /v1/snapshot/ 

Captures a snapshot of the content that is currently playing on the player

**Request Body**

- `width` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The snapshot width
- `height` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The snapshot height
- `shouldCaptureFullResolution` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: This is `false` by default

**Request Example**

```text
POST /api/v1/snapshot/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

This is the example request body:

```json
{
  "width": 640,
  "height": 480
}
```

**Response Body**

- `remoteSnapshotThumbnail` <font color="#704ae0">string</font>: The data image URL for the thumbnail (the thumbnail file)
- `filename` <font color="#704ae0">string</font>: The path to the captured snapshot. This path can be used to get the image using [LDWS Storage Endpoints](docId:-NxNHjKhZyIJmLYmZrifA).
- `timestamp` <font color="#704ae0">string</font>: The time that the snapshot was captured
- `devicename` <font color="#704ae0">string</font>: The name of the player on which the snapshot was captured
- `width` <font color="#704ae0">int</font>: The snapshot width
- `height` <font color="#704ae0">int</font>: The snapshot height

**Response Example**

```json
{
    "data": {
        "result": {
            "remoteSnapshotThumbnail": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4QDgRXhpZgAASUkqAAgAAAABAGmHBAABAAAAGgAAAAAAAAAKAA8BAgALAAAAtgAAABABAgAHAAAAwgAAADEBAgAJAAAArAAAADIBAgAUAAAAmAAAADsBAgANAAAAygAAACqICAABAAAAsLkAAACQBwAEAAAAMDIxMAGgAwABAAAAAQAAAAKgBAABAAAAgAIAAAOgBAABAAAA4AEAAAAAAAAyMDI0OjA1OjE0IDExOjA3OjEzAHY5LjAuMTEwAABCcmlnaHRTaWduAABYRDEwMzUAAE00RTMzRDAwNjgyNAAA/9sAhAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCABQAHgDAREAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD83pvvj/cP/s1f9DlX+HL5f+lI/eDGuvuf8Bf+Qrhn8Ev8MvyYHL3nR/w/9BFeXX+Bf4l+TA5qfq/1/qK4av8ADl8v/SkZ1f4cvl/6UjDuej/75/ma8fF/8u/+3/8A204zmrv7n/bT+jV5tf4F/iX5MDnLn77/AEP9a8uv8a/wr82BzN51P+4f5V5c/jl/il+bOev9j/t79DCuP9WP90/+hVw1f4kvl/6SjnOXvOh/3V/9DrywOeuuv4p/OvPrf8vf+3/1Awb/AP8AZ1/9ANeeY1/gX+JfkzlZ+i/U/wAq8Or/AA5fL/0pHKc/d9T9ZP5iuGfwS/wy/Jgc/ffc/CvLr/Av8S/Jgfu9N98f7h/9mr/QKr/Dl8v/AEpH2BjXX3P+Av8AyFcM/gl/hl+TA0PAXw38b/F/x14c+Gfw38P3Pinx14y1OHRvDPh6znsra51bU5onkjtYrjUbmzsYWZIpHMl1dQQqqEtItfLcR55lPDWTY7Ps9x1PLcoyul9Zx+OqwrVKeGoKSpupKnhqVavNKU4q1KlUlrflsm1jiMRSwtGdetLkpU1zTla6iu78unqfQfxo/wCCbf7cHwD8Fat8R/ir+z14t8PeB9DMZ13xHp+peE/F9hoEcksUAuNePgvxD4im0S0WaaKGS91SK0tIpZYklmRpYw/5hw/43+FfF2Z0siyDjHAYrNcXpg8JicPmOVTxko2lyYR5tgsDDEVGlJxp05SnLllyp2POpZxlmMboYfF051mk40mpwnNJ3fLGcVeyi2+lk7N2Z8p/B/4N/ET9oP4n+Evg38J9Dj8S/EPx3qVxpvhnRJtW0fQ4r66tbC81W6Emq69f6bpFmkGnWF5cs93fQiQQ+TB5tzLDDJ9FxhxFlPCOR47iPPcTLC5TlVF18ZXhQr4mpCE6tGjBQw+Gp1a9Rzq1IQTjT5YuS9pKCabeIr0sNRqV60nGlSjz1JWb5Y80YuVldtLmTdk3a9kzy3x54S1/wD4r8UeBfFdiNL8UeDPE2teFPEmmrd2V+NP17w9qN3pOr2IvdOuLvT7wWmoWlxB9qsbq5tJ/L822nmhZJGnC4/CZrluBzPAVXWwWYYbDY3CVnTq0nVw2KoqtQqezrQp1Yc9OcZcs4Rkr7GkJxqQjUg24TipRbjKN4vVO0knZrVXWqs1oz034cfsmfGr4wfBX45ftC+BtC0u/+GH7PEGiT/FDVrvxBpWnX+kx+Innj0s2Gj3dxHqGsGZreXeNPhmMIXMm0Gvi8+42yDI+JeG+Fsxr16WbcUyq08ohDC1qmHqSoSSqe3xMIunh4pzirzdtVe3NG/PVxuHo4jD4WpJqtiW1SioSadmotuduRavZyvo9Nr/NXh7wb4u8fa9Z+FvAvhbxH408TamHTTfDvhPQ9T8R67qDqm5lstI0e1vdQumVeWEFvIVHJAHNd2Px2By2jWxmZY3B5dhaUn7TE47E0cNh6d+Z+9XqTjSWif23e3u3QYidOKjKpUhShaTc6j5Yr4bJuz1fRdbHoPwn/ZZ+Ovx2svFOo/DnwVbz6D4HurHTPGHi7xl4v8DfCzwN4b1fVXuV0vQ9Y8dfFLxL4M8H2Wv6l9ivGsNBl1tdYvEs7qS3spI7eVk+Yz/izIOH6uDhmeNlHE5lReIy/A4LCY3NcwxmGpqmquJoYHKsPjcVLD0nUSnX9kqSenO3Kmp8dbEUaDjGcm5SipxjCM6kpQavzxjCLk4bK9rJtLqcH8RP2c/jH8OfDPibxl4t8IxWXhTwh8TIfg3r/iHTvE/hDxHpFp8SJvDsni+Hw5bX3hrX9Xg1bzfDkb6pHrGkPf6C8WIV1Q3TLAeLAcR5NmWJw2DweLc8Vi8rlnNDD1MPisNXllscVHBvEzpYmjRqUf8AaZey9hXjSxMbOcqMabhKRDEUZzjTjKXPOk60Yyp1YN01NQu1KC5Hf7NTklZbaxv84XXX8U/nXZW/5e/9v/qbGDf/APs6/wDoBrzzGv8AAv8AEvyZys/Rfqf5V4dX+HL5f+lI5Tn7vqfrJ/MVwz+CX+GX5MDn777n4V5df4F/iX5MD93pvvj/AHD/AOzV/oFV/hy+X/pSPsDGuvuf8Bf+Qrhn8Ev8MvyYH23/AMEt/wDlId+yj/2VXTv/AE16lX4f9IH/AJMv4jf9k3iv/TlE8biD/kT47/r1/wC3RP6I/F/gfTb3wH/wV/07wv8AA34m/siXPiPWfF2t+Ov2gvivfax4q+Gv7Sel6dr3jSW90nwTpXjHS/DGl+G7Dx5DfahptrdeDrTxT9ls/GVklvrWo30Oi2038HYLNsVDMfo9VMfxPkviBDCYXK8vyvhHh7C0Mszrgys8PlmGpVcxxGV1K+IxNfL3RpYq+NrUJSq4CcpUqcJynL451akJ5FWeKo5gorkhhsPb6xhf3fLH2koSnF8nJGq0+VpKXuq8WeW/GHwh+y74Z/4K3fs6/sSeFP2Mf2aNE8BeKdQ0z4veNvEq/DjR5/EOu6pB8GPilZaf4SsbNoF8O6F4DgOmaTrl74dstJMWpeMLCPxTNImptLJL6eQ4vjTMPAPjDxMzDxE4yxeaYVVuH8vy7+18RDBUKU89yKpWxleblWxGLx844jEYWnWnVpyoYWaoU6roxhGndKpi5ZNi8wlmOJc17bDQpptJcuJh+85t+Zqc1/hm0t2zjfEH7LPw8+H3wi8L63+yz+wx8Ef2sNY+Mn7cvx7+G37Ruo+KvhtH8QLn4MeAtE+N3jjwxY+E/C1lpV9p158GdK0Hwtp+nwW3inTpdL0vw3DZWeuXildd0i4h1w/GmcZxneMp8a+JfEvBlDIfDThfOeEcNhM4r5ZTz/NK/DmBx8sZiKtahiaedzxeOqVJvDV41ald1pUaM1DAVoQuOMqVsTVWLzCpg4YbAYerhYQlyrE1pUV71mnzTU76XXu87vdWPoD4xaJ8KP2VvCP/AAWkT4c/Aj4PN8P/AAJ4I/ZN1/T/AIM3XhGHSvhNq+pXPguW9KeIvCnhOfw6uo6Xc61cR6rrOnQ3dmNcMUlpfztb3U4b5HJ6+ccY4vwGWacRZ7/aeZZpxfhKmfrMKuIzqjCOb0aMJYbG45YyVKpToRVGhJQkqCtOnGNRc55tCVbGz4f9tiKyq1q2OjOvGSda0q1pNOSau02rtdWP/ZOsvgtoP7Uv/BND42/Dv9nb9n74QeMP25v2Mfir4k+I1l8P/Adn4Z0vQPE3w98JfDvxdbSfCrTLK7gtPCs2vDxt4hsPFBjttR1HXfDGl6TaanfXE2lPqE3n8Yzz/EcKeKeQZpxPxJnOC8PuPcmweWPH5hLFzrYXM6+bYapLNsRUiquLVD+zcHUw0Wo06WIr4h0adNVpQdYr2zw2Y0amIr1YYPGUqdP2lTmuqkqqk5K2rajD0d7H84vxI+NHxH/4TD4+/AH9qz/gndqNl8F/HHx28L+Lrj4X/s/+BPGf7O2v/B/4yaF8OdL8H6d4p+F0raL438PzeIfGvw01rSfFOveDvGeh+I9H8X3PiHT/ABXpo0OPW4L+b+jcuyTK45fw9xFwl4mUv7dwPD2JwMM34hxmGz7C5vkuLx88XWwmY0/rmDxUcLl2b0a+HoYzAVVVwccL9VnTcoTivcoUaT+rVcLj1HEUqHs+etUhOnUpSlGc6NZSdJyhGoopKMlKKpqKTSbPrfwT/wAE4f2V/Aup6B8DPiOumeM9DT/gqB8L/Af/AAmvimy0rwV8TtU8GeMP2H/EXxt8Mfs3+Otf065a48ManqvxLuPDHw28caVpOrWkMHi03l5YppeoiCOy/Psy8SeKcdTr53l/tMFV/wCIZZlj/qODqVsZlUcdhOOcPkuI4iwFCpH/AGuhSy+GIx+CliKE5Sw0YwrU6qTUvPqZhiJt4imrS/s+s0otypyUcVGLxEO8VC9WD6qEW+qPE/2fPh9rfxs+Fn7YfiD9pr9hT4K/C69+FHxA/ZL8J/DvVtN/Zj0L4OP4PuPGn7Y3wj8K/EH4ZW622iaRF41kHhGVtJ1TXPFMfijx5YaJqd9per+K303xjPa6h08TY6hlOY8I4bh3jfN81hmWB4mxWYUa3E+JzhYqOE4Zx1bA5ld4uvDLlPFxjy4bBvC4OvOEZUcJKph7vXEy9lPCuhi6lfnp4p1HKuqqlJYWbjV5OaXsp3cpJJR1dnF8tlyur3Xwl8TftH/8FYfgJbfsvfsyeF/An7HHgr9pf4zfs/3Xhj4Q+H9L8beGPG/7M/xx8LWOgrrnxAiX/hMfGXhHxtp9zq1j4y8CeJdY1DwnDYX8Gm+ENK8LaZpWnWMPNKGZYbh7wzzqXEfEWKxvFuPyDJs+eIzXEvC4jCZ7leLnWVLBJ/VsNiMI6cJYbF4enSxMpQcsRWrud1UuaGFy+v7avevWoU616snFwqQqX5IfBGXOo2ajezle92z+cH4geL77x94s1zxjqen6HpV/4g1CTULvT/Delw6NoltNIiK62GmwM0dtGxTzHG93lmeSeWSSWV3b9ipYeOEwdPDQnVqQoQUIzr1JVq0lz816lWbc6krya5pNu1lskd8IqEIwjtFWV97eb6nml31P1k/mKwn8Ev8ADL8mUc/ffc/CvLr/AAL/ABL8mB+7033x/uH/ANmr/QKr/Dl8v/SkfYHsPg34LaJ468JWWt/8Lg+HHhDWLnVdSsJ9G8beIdA0C10+0s7cPFc3ck2vP4rlur6RhLbCw8E3mgGwiuN3iX+3ha+Hbv8AMOIuOMZkObYjAPhHiDNcJSwlCvTxOTYDH4+tiqldSTjRp0sD/Z0aEHFUaksTnWExlLEzVSWCllsvrtDirYupRqypfVK9SKjCUZ04yk5c6bdkoyjFK1k5uKlzdEnb06w/ZR8R+CtvxK8L/tW/APQF8O+NdE8N6B498LfFPV9GmTxFqFxY2sl34e8QW+l6bcQTaDbX02s6rPbXME1r4ftp9Wt3uICUHwOY+KOAzf23D2O8OOLcdLE5VXzLH5LmGQ0Mall1ChXxT+vYF1sTCrTrSw0aOHjOg4yxt8PKKlTjWlzSxyqqVCrgcY1KL56c6UJXjdaShDmfK7xav5d0dL8Qvht8TPiba65pnxK/4KOfDv4h6b4cuvB0Ojx+Nv2jNY8VaTqHiLVLrw02uXOm2fiXxPdXkXh7wbZarrl2fFNjpV5d6lc6HFY6fosM2oXMmj/LZVxBkmSww2KyXwOzXJ6+MhmNWtVyzgrC4StQwNHCY2eFjUxGCyqlTr184q0sHRWWzrUI06OKdepXxEFDD1+GnXwuHcalDK6lOM4TdWccJT9o6ShN8sZUaTSTknePNGTi5dzhtc+EHjO68dad8RT/AMFC/hJffEHR/C+k6ivxF1n48+IU8ZaQ9z4cuLm78O+H/Etnf654juX01bzUNBjgtrrT5J3lubWSysXvIrK5VPijLYZRXyp+EGd4XKq2Nrwnk+G4TwX9nVVDMKGGp4zMsurYbCZbRVSoqNdTlSrtOdBc2JjKbpqWJpKFSh/Zkvq7nJqgqVJRTTlac4uKcpSve01Llad731+m/wBlL4ofCr4GG58N/ET4b/D39oHxnqEPij49at8foP24PjT4I+GXizUtDTQvEmreCPi34P8ACPhnxD4e8Za74TuLqPULjTvGmnxDxZeXq6YbnV5fEOnabqH5nx/lubcSp4/KsxznhvAYaeB4SpcIz8M+Gcwz3LKNf65gKWPyPH5jjcHWwFLG3qUL5XjKbwMcPOpFU/qbr0uPF0quKj7WFapRpqMMP9W+p4SrWpym4qE6VVqLo6Wj+5cXabunJtnzz+154w+L/wC0D8WviT8Y/HX7aPwG0fTf2hvFfw/0Txt8Pvg58Y9Uu/DUGgW+qaR4A0Sz1vwZBqVlZ6rpPw88KwW2v6pqfiq7GnXFpbajqFvrEtxdSsvr8EUch4ZyPK8hy3w/4kr4nhXB5picBm+f8O4anjXi/Y1s0quji5xxH1fEZtjOfCYeOFw6rU5cs6mHtDkmYKnTw1KjTWDrzlSp1bTnGl7SLftajipxTahzN2s1dNp95ef6V+zj498TeLtD0/wd/wAFEfAmqRfArwhZ+M/AOtL8XNfhv/hn4JNrqKeKH8Cx6d4m1Sy8H6z4Yg8LWsuqaF4d1/T9Ph0abw9farrmkJc2VvWWJ4wy3DYCviMV4YYzBR4px1bL8yoVcrwtelm2a2wlfCU8ydfA4KriYYmljva4fF4nAyr1asa/sMMnGq3Xt4Knz/2c17duE5KnTUalTT3aui9pzubtz83N797Nu9a3s/jDpV94y8RaP/wVfubPxX4y0Dwr4l17XNG/aI8R6fN4zudV1DWPC1rpnjfWbv4q6N4ou/EHhrwZ4b8LXOq2cug+Jb7SLPVbDw4sYtNDe+bzcVjcrqLL8HW8HI1cHga2KwlGlWyLDTp4dR9nicRPL4LJMRgaVCeYYjG0YTboRq1KE61RwrVnTMZzilGU8rpNRThTi8PRagpPnkorksk5Lmbb3ba6J+U3/wCyV4x8K/GLwP8ABT4g/tO/BjxpoGteLJfi58S/BLfHfxToPhjTrjw94I8R+PtY174g6vPod1H4V8Ta14L8P6voMnjb+ytT1rRD4g0aaeY2OsW00nQuNcDi8jzHiDL+GMzwFShg45RluaRyHB4ipVw9XHYTLaeFy2jFpV8HhsXiPbU8HPE0cNWnhcVD2dKcak6lSxFOdKVZ4atGorQpNqDnOLajGdN6RdNSnLR2vyzSa0Z9ofFPVdA8R/BDx/8ADz4D/tJfDPwT4X+JOv8Aww0v4g/GD9oz9t/xT+0J8StC8OfDzxhe+Mvh34D8MX3hf4T+E/Dfwd0C48TeHrXx5bacn/CQ+Kdek8NWdpb69D/YOqWsP5ngJYjDZtgcdnvC+ZV8dl9HNZ4XKMg4NwXD+WTxGPwlGjjsyxtDFZli62bVoYSvPDTp+yw2Gwsa0/cnDEJLggqirQniKM5exjU5IUcPSoqdSceScq9nebqacz5rp8zWrsfjzrvwz8RabafHLxxYftifDLVfFZsfENp43GnfFjXoPEXxz0fXtN8BeJ/FGn6bqOoix1T4hpr+p+Kr621jSvEMEUOv6/4I10INWurZPK/SP7YpVKuQ4H/VLH08JVeHxOBlXyqjClkNahXxlDDLE0fZ4ihls8NQo0atKph6rnSpYunTVWCc4z7pVYuFCE8M6cKsn7KEoJxUk5rdy3bUn1+L7szxZ+xn4V8Labd3Vx+2J+yfr9+t54ft9M0zwf8AEO7143VrrnjT4eeFZdY1G7l0fTIdL03SNN8c3vi7U7aEan4is9D8G+JpLzw/bHS9WfSvMo8XV8ZVjCHCvElHDuNaVariMLTw/s50MNi8THD04e0xDrVK9TB/U1Uc6dOGIr0YStKdGOIyWIm5JfVqkIWk5Tk7tcsZS2vreyS83rY86+N37J1p8F/hh4V+IWr/AB/+BfjHVvHGmw6x4b8BfDTxjb+N/EJsF1u90DWbnV7nTSumWFtpOqabf2MV9ZXOsadq15pur29heMdLuXE4Hib+1MfXwFDJM4w1OhKrTxGLx+FlhaNNqhGvSjDnk5VZ1KdWhOUZQoyp061OpKPvKIUMT7d1EqcoRg1yyldc6fNZpa9En0+LS/T4evvufhXpV/gX+JfkzpP3em++P9w/+zV/oHUV4S1S0u23ZJR1bbeiSSbbbSS1bSTZ9gUrrTtQ+2Lpf2G8GpvKLZdONtN9ua5l2LFbra7PPaaRnVY41Qu5YBQSRXk1cVho0JV/rOHlh/Zzm8VGvSeFjThG9SpLE86oqlS95VKvP7OPs5vm5Y8zDk7m0u5BL5drcPtWR2IhkIVLeGOadyduAsEUkcszE4jjkSRyqMpPm1q9BpR9vRT9yXvVacV7yskpSkoyd3y2i3dp8rklcUpKCvK+9vna5y13DLC2JYpIjIiSxiRGQvE/KSJuA3RuBlXGVYcgkVxyqQqUpSpyjNJqLcXdJpxuvVXRlOSlSk1tdL8UYM6s+8KrMQXYhQSQqbmdiBn5VUFmPRVBJwAa8vEpydKMU25OSSW7bcUkvNs5Tmr5HjAWRHRi0bhXUqSksfmRuAwB2yRusiN0ZGVlJUg15dZpwVmnabTt3jzRkvVSTT80wMtNH1fUJrhNP0vUdQeCFJplsbK5ujDFL/qpJRDE5jSQHKO2FYcqSK8PFYvDUeSdavRoRleEXXrUaPPKN3KMPaVI87V1zRhzSitZJLUiVSMXZ3va+xyN9Z3aSCJ7W4SR5JLVY2hkDtcxiMSW4QruM8ZliDxAeYpkjBUb1zwupCXNUU4um06impJx5HeSmpJtOLWqkm01qmzGs7qDWzTf38pz1xBOWS3EUpnk2pHCI3812lK+UqR43s0m9fLABL7l25yM8dSUZSlKMoyjp7yemiSevk00/QwOa1O1ubYEXFvNB8xi/fRSRfvY/LeSL94qnzI0nhd0+8qyxlgA658tShLWE4TVk7wd1rt/mBzN3HIC2UcbFikf5T8kblNkjcfKj+ZHtY4VvMTBO9c8FX/l7/2/+oGPe2d4zxRraXRee6+ywKIJS090oVGtolClpLhXljQwqDIGkQFcsufMnUp04yk5puKvKC1mltdrtquvUxr/AAL/ABL8mclc29wjiJ4JllE725jaJxILhCFeDYV3ecrMqtHjeCQCMkV41Vr2ctVsn8rrX0OUxtQ03UIZbaGaxvIZr2GK6sopbaeOS8trz/j0ntEeMNcQ3X/LvLEHSfIMbMCK8ydanacVOEmuaMuScJcjWjU1GTcH5SSej00YHJX33Pwrgr/Av8S/Jgfu/KSJFKkqQuQVOCCNxBBHII7EcjqOa/0Cq/w5rT3ouLuk04z92Ss01rFtX3W8Wmk19gdZf/F74mzw6dDJ4213ydJubS/06BLhIbe1vNMvE1HTriOCGKOIyWV4kc9sZEfyjFCi4ihiRPilwXwpSeIq08hy6NTEUMVRxEnR9pKtRxdCpQxFKc6rnPkrUqk41OWUXJycm3Jtmbo0paunC7d27atvdvzfXuYN18avivHBDbx+PfEUUVol5HEIrzynZdSnN1fi5ljRZbw3js0Nw1287TWTPp8hawdrY+ZX4M4VvOo8hy2Uqs6Tkp4eM4p0aSpU3ThPmjR5YRWlFQi5/vZJ1XzmUsHh5O7pq+nfpocrd/GT4ozeUsvjjxBIloUFsj3rNHAEiuoEWKJgY0VIr69CqE2hrq4kA82V3PHPg7hWDq1YZBlsZ1I8k2qLvJSnSlLmbm5ScnRo8zlKTapU03aKRE8Lh4UpqNKNm03pfVuK3+RkzfGz4tRrIq/EHxPtL2+FfUpZFT7Ijw2vlrJvEfkQu0UYjChYyExtAA8jF8IcLaXyHLW5KpG7ou8VKdOpLlamt5Ri3e+xy/V6P/PuP3HKN8Y/ihaXa6lF411tr1by/vFnuJo7rF5qfh1/Ct7e+XcxSxfbZPD5OnRXez7RaqftFrJDeAXA46/DHD/1d0P7JwipSpU8M4RVSFsPTxDxkaCdOpGSpfWb1XC/K5SldWsk/YUf+fUH8u/o1/wDl5fi78TIpMx+NNcBSDyFJuQ5EazrdJgyI5DxXEcc0MoIlhkjjaF0MabfOxHDmRNuLyrB2lN1v4bVpzhOjUa97apTnKFRO6kpPuL6vQ/59x+4xV+NnxY013ksfHviG3la7/tOSZLtfOn1EXl5qJvriYxmW5unv9QvLySed5JJbm4knkZpDuHl1uHMiqe5LKsE4Qp1KEYujFqNKdGnhXGPNdw/2ehSopwcXyQiulzKrSpQ5bUoa33T6WffzOft/jR8VNKt4ItO8c65apb2OiadB5c0JeKw8NXV9e6HYrJJA8gtNPvNRuryK33+U90be4nSWaysnt+PE8PZHVnNVMqwclKpOrNOErTrVY0o1K07TV6ko0oQ5ukY2SV3fllRoylzOlC+nTsrdWzmbz41/FgyQzt4+8SNLbRXKW7Pfs4iF9dG6vWRWUoJLq4xLPNt82R1Qs52Jt8uXD+SSi4PK8Gotwfu03HWnFwp2tJW5IylGPZSYvq9D/n1D7vO/wCZh638dPjDq0SQal8SPF15FHNDOizaxcnbcR3drepPuDBmnF1Z20plYmRjEFZihZW898P5HRdV0crwVJtVYzcKEbzjNOM4y5ubScdJcvK+t7pNH1ahv7KH3HO6p8bfi3PDd283xC8US29/d2F3ewNqUvk3Vzp0Olx2M08a4WR7SPRNKWDIwgs0wMvKZOFZDk0XGUctwsZwjOFOcafv041FNTUG27X9pN7PWVzOpRpU43hCMW3ZtKztZu34IxR+0F8a7OC2t7T4l+K7S3tWBtbe11J7e3tcWMOnFbW3hCQ28b2MENrLHDGkc0KBJVcZz4dbIcmadSWXYWdS93OULylKVSVSU5O/vSc5yk31cnfRtPn9nS5lP2NO60Xuu27e17dTjoPjX8VdHsY9K0vxvrNhpsMENrHZWz26W4gsreK0tEaPyCsht7WJbaKSTfIsDSwh/LmmWTjr5LldaU6tTBUZzcpVZNxb5p2veV38tLafK0KhSUnLkTd7xv8AYd7+5tbp32SPDr77n4H+tFf4b9XO782+Zt/Nu5qfu9N98f7h/wDZq/0Cq/w5fL/0pH2BjXX3P+Av/IVwz+CX+GX5MDl7zo/4f+givLr/AAL/ABL8mBzU/V/r/UVw1f4cvl/6UjOr/Dl8v/SkYdz0f/fP8zXj4v8A5d/9v/8AtpxkWleKNY8L/wBrPo88EDa3pN54e1Lz7KzvRNpOoSQS3lsgvIJxbtcfZY4nuLcRXKwtLEkyJNIG8PMcFh8bToRxMJTjQxNPE0lGrWpWr04VFTnL2NSm6ig5uapzcqbnGEpQbhG0yipKz2vc9vvrj9oTU3tEl8J+CtQNxp+p67bW8Phz4UyGS0uXtNT1bVDY2aKIJEItr66kW3hltba9iYpFZ3Vop/MfYcH0p1K9PGZpQ9nXo4OVWeNzx/vUpYahSUpzqNQcIxo0+blhKSjBN1ec5Yww9Jb1Iq9+adWq1d2/mm15aq933s15fdaf8avDltLo0vh2wsLXxtrmo6QIrldBigvdX8Sx2miXFhBL9vSDTIw5tlEsTWUFmZGM9wtlPKkilU4YzGUsVSzGpiHluGp137Opi3UjhsBKriFUlCVHnxMn7zqJqrOrZJR5t4qKjJRnCakoNt2d7PRq/ryvy01JtXHx/wBTfT/tnhnw85s7XUfElmYIfBdgFtIr7wdr17e3d3YahaT3hE2keGgo1e5ub11+0WsIaZr9U8hx4Wg6iWMxsPa1YYW06uPnOpVVLGUIQheE7JxqYqShBwgnFOUFycq5ZSpN8z5ru21ulrW+S9bdj5M8W+KNa8Uvp82tXENzJpWmJpNi0VlZWbR2C6hfahHDK1nbwNdNFcajciKe7M9wlv5Nosotra3ii93DYTD4SNSOHg4RrVXXmuec06koQg3FTlJU48tOK5KahTTTko80pN7xioqy2vc8+uuv4p/OsK3/AC9/7f8A1KMG/wD/AGdf/QDXnmNf4F/iX5M5Wfov1P8AKvDq/wAOXy/9KRynP3fU/WT+Yrhn8Ev8MvyYHP333Pwry6/wL/EvyYH7vTffH+4f/Zq/0Cq/w5fL/wBKR9gY119z/gL/AMhXDP4Jf4ZfkwOXvOj/AIf+givLr/Av8S/Jgc1P1f6/1FcNX+HL5f8ApSM6v8OXy/8ASkYdz0f/AHz/ADNePi/+Xf8A2/8A+2nGdNaaL8LLnT9Om1jxx4j0rUZY5zqOn2vg6PVrW2uYIDNB5Wqf25p0jJqEubExrpc403P25rnUFX7I/wAfj8TxFTq4qGGyrL8Th05fU69TMp4epNydoqtRWFq8qpxcpNqo/aOCjy0+bmWcpVU2owi10bna+na2munXvfoY/wDYXwdnhtJrn4h+MdPuX0e1fULJfh7Zah5GuM0iahDb3g8ZWaT6ZboYrjT52gjuNQZZbS7h0kFL2vKxOL4kjOahk+V1Gq01TnLNa1OE8LzS9lJw+qSnGtsqi5pQ1XLrF8081b/n3D/wN/8AyPqcla6T8I11XVrbXvGXjOTSY59HTRtU0fwbpyXF5aS3Uia/NqOm33ib/QJbO0Ec2mpb3mofa2dvPWB08hvPxdfiF0qU8Jl+VrEuni3iaFfMa6p068YweFVCrDAzdaFSo6iqc6ockYw9588pQwr+2912j9q0b77aX/X8OgyPR/gS6XH9oeLvG1vtlmW2+xaRa3iyQC2RopHe4s7FwWufOLr5SMGFtZgeTNPrFp5VavxOprlwOVzfLealXrU0m2uVKaqVHK0Got+yilL94nUUPY1+Zuulfkg3/LzWS/7ea122t13OJ8V6T8F7awvX8OeLvGmp3y2sTafFf+HLKyjlu2gmkMN6FvWW3tVuBFDJdwXNzMjECKxuYZHubbjw1fPpVqaxWAy6nR9pFVXSxlac1S5o80qd6SvUs5PlmlFpWUlLeouq2nNQguqi3Lo7atLrZP7zwO76/in866qv/Ly+/v3t8zQwb/8A9nX/ANANeeY1/gX+JfkzlZ+i/U/yrw6v8OXy/wDSkcpz931P1k/mK4Z/BL/DL8mBz999z8K8uv8AAv8AEvyYH7vTffH+4f8A2av9Aqv8OXy/9KR9gY119z/gL/yFcM/gl/hl+TA5e86P+H/oIry6/wAC/wAS/Jgc1P1f6/1FcNX+HL5f+lIzq/w5fL/0pGHc9H/3z/M14+L/AOXf/b//ALacZzV39z/tp/Rq82v8C/xL8mBzlz99/of615df41/hX5sDmbzqf9w/yry5/HL/ABS/NnPX+x/29+hhXH+rH+6f/Qq4av8AEl8v/SUc5y950P8Aur/6HXlgc9ddfxT+defW/wCXv/b/AOoGDf8A/s6/+gGvPMa/wL/EvyZys/Rfqf5V4dX+HL5f+lI5Tn7vqfrJ/MVwz+CX+GX5MDn777n4V5df4F/iX5MD93pvvj/cP/s1f6BVf4cvl/6Uj7Axrr7n/AX/AJCuGfwS/wAMvyYHL3nR/wAP/QRXl1/gX+JfkwOan6v9f6iuGr/Dl8v/AEpGdX+HL5f+lIw7no/++f5mvHxf/Lv/ALf/APbTjOau/uf9tP6NXm1/gX+JfkwOcufvv9D/AFry6/xr/CvzYHM3nU/7h/lXlz+OX+KX5s56/wBj/t79DCuP9WP90/8AoVcNX+JL5f8ApKOc5e86H/dX/wBDrywOeuuv4p/OvPrf8vf+3/1Awb//ANnX/wBANeeY1/gX+JfkzlZ+i/U/yrw6v8OXy/8ASkcpz931P1k/mK4Z/BL/AAy/Jgc/ffc/CvLr/Av8S/Jgf//Z",
            "filename": "/sd/remote_snapshots/img-2024-05-14-11-07-13.jpg",
            "timestamp": "2024-05-14 11:07:15 EST",
            "devicename": "XD5-M4E44D006824",
            "width": 640,
            "height": 480
        }
    }
}
```


[title] LDWS Diagnostics Endpoints
[path] Diagnostic Web Server APIs/Untitled/

## DELETE /v1/storage/\:device/ 

Formats a storage device

:::hint{type="info"}
You must disable the autorun before reformatting the SD card on your device.
To disable the autorun, use the *PUT /v1/control/reboot* with body parameter *\{“autorun”:”disable”}*, as described in [this page](docId\:YLXb9c8Us70n09hoOkdp_).
:::

**Segment**

- `:device` <font color="#704ae0">string</font>: The specified storage device (see [this page](docId\:BczooenmOIfNRbeny6ZKI) for a list of available devices)

**Request Body**

- `fs` <font color="#704ae0">string</font>: The [file system](docId\:nSjXffR7OlFgDWgjFEbMe) to use when reformatting a storage device. The default value of fs is "exfat".

**Request Example**

```text
DELETE /api/v1/storage/sd/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 49
```

This is the example request body:

```json
{
  "fs": "exfat"
}
```

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "output": "Format completeted successfully.",
      "error": ""
    }
  }
}
```

## GET /v1/diagnostics/ 

Runs network diagnostics on the player and returns the result in JSON format.

**Request Example**

```text
GET /api/v1/diagnostics/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

For each of `ethernet`, `wifi`, `modem`, and `internet`:

- `diagnosis` <font color="#704ae0">string</font>: Indicates if this type of interface is present
- `log` <font color="#704ae0">object[ ]</font>: This contains the diagnostic results for the interface:
  - `name` <font color="#704ae0">string</font>:  The name of the diagnostic test
  - `pass` <font color="#704ae0">bool</font>: Indicates whether the test passed or not
  - `result` <font color="#704ae0">string</font>: The actual value for the diagnostic tests like checking type and ping.
- `ok` <font color="#704ae0">bool</font>: If diagnostics were run on the interface or not.

**Response Example**

```json
{
  "data": {
    "result": {
      "ethernet": {
        "diagnosis": "OK",
        "log": [
          {
            "name": "Checking model networking support",
            "pass": true,
            "result": ""
          },
          {
            "name": "Checking for Ethernet interface",
            "pass": true,
            "result": ""
          },
          {
            "name": "Checking interface type",
            "pass": true,
            "result": "Ethernet"
          },
          {
            "name": "Checking Ethernet link",
            "pass": true,
            "result": ""
          },
          {
            "name": "Checking Ethernet IP address",
            "pass": true,
            "result": ""
          },
          {
            "name": "Checking Ethernet netmask",
            "pass": true,
            "result": ""
          },
          {
            "name": "Checking Ethernet gateway",
            "pass": true,
            "result": "PING 10/10: 1375/1537/1623us"
          }
        ],
        "ok": true
      },
      "wifi": {
        "diagnosis": "WiFi interface not present",
        "log": [
          {
            "name": "Checking model networking support",
            "pass": true,
            "result": ""
          },
          {
            "name": "Checking for WiFi interface",
            "pass": false,
            "result": "WiFi interface not present"
          }
        ],
        "ok": false
      },
      "modem": {
        "diagnosis": "Modem interface not present",
        "log": [
          {
            "name": "Checking model networking support",
            "pass": true,
            "result": ""
          },
          {
            "name": "Checking for Modem interface",
            "pass": false,
            "result": "Modem interface not present"
          }
        ],
        "ok": false
      },
      "internet": {
        "diagnosis": "OK",
        "log": [
          {
            "info": [
              "DNS server 2600:1700:dac0:2060::1 is not a valid IPv4 address"
            ],
            "name": "Checking DNS servers",
            "pass": true,
            "result": "At least one DNS server is valid"
          },
          {
            "info": [
              "DNS pass/fail/timeout/mismatch UDP: 50/0/0/0 TCP 50/0/0/0"
            ],
            "name": "Checking DNS server (cached)",
            "pass": true,
            "result": "DNS servers responded to 100% of potentially cached requests"
          },
          {
            "info": [
              "DNS pass/fail/timeout/mismatch UDP: 5/0/0/0 TCP 5/0/0/0"
            ],
            "name": "Checking DNS server (hopefully not cached)",
            "pass": true,
            "result": "DNS servers responded to 100% of hopefully uncached requests"
          },
          {
            "name": "Checking Internet connectivity",
            "pass": true,
            "result": "PING 10/10: 87398/87760/88247us"
          },
          {
            "name": "Checking HTTP",
            "pass": true,
            "result": "External IP is 76.218.104.224"
          },
          {
            "name": "Checking time server",
            "pass": true,
            "result": ""
          }
        ],
        "ok": true
      }
    }
  }
}
```

## GET /v1/diagnostics/dns-lookup/\:address/ 

Runs a DNS lookup for an address, which can be a hostname or IP address.

**Segment**

- `:address`: The hostname (for example, *http\://google.com*) or IP address

**Request Example**

```text
GET /api/v1/diagnostics/dns-lookup/google.com/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

The player queries each DNS field separately, then collects returned data into the *records* object, the tcp and udp connection information is in the *server\_test* object, and returned errors into the *errorList* object.

- `records` <font color="#704ae0">object</font>:
  - `ipv4` <font color="#704ae0">string[ ]</font>: IPv4 addresses
  - `ipv6` <font color="#704ae0">string[ ]</font>: IPv6 addresses
  - `text` <font color="#704ae0">string[ ]</font>: Text records
  - `mx` <font color="#704ae0">object[ ]</font>: Mail exchange records
    - `exchange` <font color="#704ae0">string</font>
    - `priority` <font color="#704ae0">int</font>
- `server_test` <font color="#704ae0">object</font>:
  - `tcp` <font color="#704ae0">object</font>:
    - `made` <font color="#704ae0">int</font>:  The total number of DNS requests made
    - `pass` <font color="#704ae0">int</font>: The total number of requests that passed
    - `fail` <font color="#704ae0">int</font>: The total number of requests that failed.
    - `timeout` <font color="#704ae0">int</font>: The total number of requests that timed out
    - `mismatch` <font color="#704ae0">int</font>: The total number of mismatched requests between the host and pointer records
  - `udp` <font color="#704ae0">object</font>:
    - `made` <font color="#704ae0">int</font>:  The total number of DNS requests made
    - `pass` <font color="#704ae0">int</font>: The total number of requests that passed
    - `fail` <font color="#704ae0">int</font>: The total number of requests that failed.
    - `timeout` <font color="#704ae0">int</font>: The total number of requests that timed out.
    - `mismatch` <font color="#704ae0">int</font>: The total number of mismatched requests between the host and pointer records
- `errorList` <font color="#704ae0">object[ ]</font>
  - `field` <font color="#704ae0">string</font>: The field ('ipv4', 'ipv6', 'cname', 'mx',  'service', or 'text') the error came from
  - `err` <font color="#704ae0">object</font>:
    - `errno` <font color="#704ae0">string</font>: Error number (usually the same value as code)
    - `code` <font color="#704ae0">string</font>: Error code number (see [https://nodejs.org/docs/latest-v14.x/api/dns.html#dns\_error\_codes](https://nodejs.org/docs/latest-v14.x/api/dns.html#dns_error_codes))
    - `syscall` <font color="#704ae0">string</font>: Information about the system call stack
    - `hostname` <font color="#704ae0">string</font>: The value passed in the URL

**Response Example**

```json
{
  "data": {
    "result": {
      "records": {
        "ipv4": [
          "142.250.105.113",
          "142.250.105.102",
          "142.250.105.139",
          "142.250.105.101",
          "142.250.105.138",
          "142.250.105.100"
        ],
        "ipv6": [
          "2607:f8b0:4002:c0c::8a",
          "2607:f8b0:4002:c0c::8b",
          "2607:f8b0:4002:c0c::71",
          "2607:f8b0:4002:c0c::64"
        ],
        "mx": [
          {
            "exchange": "smtp.google.com",
            "priority": 10
          }
        ]
      },
      "server_test": {
        "tcp": {
          "made": 100,
          "pass": 100,
          "fail": 0,
          "timeout": 0,
          "mismatch": 0
        },
        "udp": {
          "made": 100,
          "pass": 100,
          "fail": 0,
          "timeout": 0,
          "mismatch": 0
        }
      },
      "errorList": [
        {
          "field": "cname",
          "err": {
            "code": "ENODATA",
            "syscall": "queryCname",
            "hostname": "google.com"
          }
        },
        {
          "field": "service",
          "err": {
            "code": "ENODATA",
            "syscall": "querySrv",
            "hostname": "google.com"
          }
        },
        {
          "field": "text",
          "err": {
            "code": "ETIMEOUT",
            "syscall": "queryTxt",
            "hostname": "google.com"
          }
        }
      ]
    }
  }
}
```

## GET /v1/diagnostics/ping/\:ipAddress/ 

Pings the address passed in the request. This does not work for hostnames, only for IP addresses.

**Segment**

- `:ipAddress`: The specified IP address

**Request Example**

```text
GET /api/v1/diagnostics/ping/0.0.0.0/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag that indicates if the operation succeeded or not
- `response` <font color="#704ae0">object</font>:
  - `hostname` <font color="#704ae0">string</font>: The value that you passed in the URL
  - `results` <font color="#704ae0">string</font>:
    - `ipv4` <font color="#704ae0">object[ ]</font>
      - `address` <font color="#704ae0">string</font>: The IPv4 address that is pinged
      - `results` <font color="#704ae0">object</font>:&#x20;
        - `received` <font color="#704ae0">int</font>: The number of packets received
        - `stats` <font color="#704ae0">object</font>:&#x20;
          - `average` <font color="#704ae0">int</font>: The average time for the packet to return
          - `quickest` <font color="#704ae0">int</font>: The quickest time for the packet to return
          - `slowest` <font color="#704ae0">int</font>: The slowest time for the packet to return
          - `units` <font color="#704ae0">int</font>: The time units (usually microseconds)
        - `transmitted` <font color="#704ae0">int</font>: The number of packets transmitted
    - `ipv6` <font color="#704ae0">object[ ]</font>: This will only be returned if IPv6 is present.
      - `interface` <font color="#704ae0">string</font>:&#x20;
      - `source` <font color="#704ae0">string</font>
      - `address` <font color="#704ae0">string</font>: The IPv6 address that is pinged
      - `results` <font color="#704ae0">object</font>:
        - `received` <font color="#704ae0">int</font>: The number of packets received
        - `transmitted` <font color="#704ae0">int</font>: The number of packets transmitted

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "response": {
        "hostname": "0.0.0.0",
        "results": {
          "ipv4": [
            {
              "address": "0.0.0.0",
              "results": {
                "received": 10,
                "stats": {
                  "average": 318,
                  "quickest": 223,
                  "slowest": 336,
                  "units": "us"
                },
                "transmitted": 10
              },
              "up": true
            }
          ]
        },
        "up": true
      }
    }
  }
}
```

## GET /v1/diagnostics/trace-route/\:address/ 

Runs trace-route on the player. You can optionally pass the boolean query parameter `?resolveAddress` to resolve IP addresses in the result.

**Segment**

- `:address`: The specified IP or hostname address

**Query String Parameter**

- `resolveAddress` bool optional: Specifies whether the IP or hostname address should be resolved or not in the result

**Request Example**

```text
GET /api/v1/diagnostics/trace-route/google.com/?resolveAddress%3Dtrue HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `address` <font color="#704ae0">string</font>: The IP address on which you are running the trace route
- `results` <font color="#704ae0">object</font>:
  - `output` <font color="#704ae0">string[ ]</font>: Returns the trace route output information in text format
  - `protocol` <font color="#704ae0">string</font>: The IP protocol (for example, `"ipv4"`)
  - `route` <font color="#704ae0">object[ ]</font>:
    - `hop` <font color="#704ae0">int</font>: How many times the data moves from one router to the next 
    - `servers` <font color="#704ae0">object</font>:
      - `address` <font color="#704ae0">string</font>: The address to which the trace route request is made
      - `hostname` <font color="#704ae0">string</font>: The server hostname
      - `stats` <font color="#704ae0">object[ ]</font>:&#x20;
        - `reachable` <font color="#704ae0">string</font>:
        - `time` <font color="#704ae0">string</font>: The time required for the trace route request to return
        - `units` <font color="#704ae0">string</font>: The time units (usually in milliseconds)

**Response Example**

```json
{
    "data": {
        "result": {
            "address": "123.456.7.890",
            "resolveAddress": "true",
            "results": {
                "152.101.32.76": {
                    "output": [
                        "traceroute to 152.101.32.76 (152.101.32.76), 30 hops max, 46 byte packets",
                        " 1  10.0.4.1  0.744 ms  0.458 ms  1.740 ms",
                        " 2  192.168.0.1  1.738 ms  1.387 ms  1.387 ms",
                        " 3  96.120.89.217  10.553 ms  11.250 ms  11.961 ms",
                        " 4  96.110.176.145  11.958 ms  11.250 ms  9.845 ms",
                        " 5  162.151.78.253  11.957 ms  13.366 ms  10.549 ms",
                        " 6  96.108.99.249  13.366 ms  14.072 ms  20.414 ms",
                        " 7  68.86.143.93  13.368 ms  11.960 ms  10.549 ms",
                        " 8  96.97.98.246  32.397 ms  96.112.146.22  11.954 ms  69.241.75.42  9.841 ms",
                        " 9  *  *  *",
                        "10  152.101.32.76  10.452 ms  152.101.32.76  13.302 ms  152.101.32.76  12.649 ms",
                        "11  192.178.105.102  11.948 ms  142.251.224.181  11.073 ms  192.178.46.198  17.759 ms",
                        "12  142.251.32.46  11.955 ms  12.649 ms  10.543 ms"
                    ],
                    "protocol": "ipv4",
                    "result": 0,
                    "route": [
                        {
                            "error": "timeout",
                            "hop": 9
                        }
                    ]
                }
            }
        }
    }
}
```

## GET /v1/diagnostics/network-neighborhood/ 

Retrieves information about the player’s current network neighborhood (the other players on the same network).

**Request Example**

```text
GET /api/v1/diagnostics/network-neighborhood/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag that indicates if the operation succeeded
- `response` <font color="#704ae0">object[ ]</font>: An array of information about players in your network neighborhood
  - `chassis-descr` <font color="#704ae0">string</font>: The model version, OS version, serial number, etc.
  - `chassis-id` <font color="#704ae0">string</font>: A unique identifier for the player
  - `chassis-name` <font color="#704ae0">string</font>: The name of the player
  - `mgmt-ip` <font color="#704ae0">string</font>:
  - `port-descr` <font color="#704ae0">string</font>: Which interface the player is using
  - `port-id` <font color="#704ae0">string</font>:
  - `vlan-pvid` <font color="#704ae0">string</font>:

If the diagnostic could not be performed, the response body may instead be an error message.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "response": [
        {
          "chassis-descr": "BrightSign XT1144 REVE 8.5.47 UHE015005214",
          "chassis-id": "90:ac:3f:28:fb:a4",
          "chassis-name": "BrightSign-UHE015005214",
          "mgmt-ip": "2601:647:4500:1e5e:92ac:3fff:fe28:fba4",
          "port-descr": "eth0",
          "port-id": "90:ac:3f:28:fb:a4",
          "vlan-pvid": "0"
        }
      ]
    }
  }
}
```

## GET /v1/diagnostics/network-configuration/\:interfaceName/ 

Gets the network configuration on the player. See [Local DWS APIs](docId:2Zmel07w011h1267dt-59) for more information about digest authentication.

**Segment**

- `:interfaceName`: The network interface. Possible names include `eth0`, `wlan0`, and `modem`.

**Request Example**

```text
GET /api/v1/diagnostics/network-configuration/eth0/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
```

**Response Body**

:::hint{type="info"}
Some entries (e.g. `caCertificates`, `clientIdentifier`) are identical for all interfaces.
:::

- `text` <font color="#704ae0">string</font>: The network configuration information in plain-text form
- `output` <font color="#704ae0">Output</font>: The network configuration information as a JSON object:
  - `interfaces` <font color="#704ae0">Interface[ ]</font>: An array of Interface objects representing network interfaces:
    - `name` <font color="#704ae0">string</font>: The interface name (for example, `"eth0"`)
    - `errors`  <font color="#704ae0">Error[ ]</font>: An array of error messages associated with the interface
    - `params` <font color="#704ae0">Param[ ]</font>: An array of Param objects representing parameters associated with the network interface. Each Param interface has the following entries:
      - `name` <font color="#704ae0">string</font>: The property name (e.g. `"MAC"`)
      - `value` <font color="#704ae0">string</font>: The property value (e.g. `"90:ac:3f:0b:d2:88"`)
  - `host` <font color="#704ae0">Info[ ]</font>: An array of Info objects providing network host information. Each object can have the following entries:
    - `errors` <font color="#704ae0">Error[ ]</font>: An array of error messages associated with the network host
    - `params` <font color="#704ae0">Param[ ]</font>: An array of Param objects representing parameters associated with the network host 
  - `bsn` <font color="#704ae0">Info[ ]</font>: An array of Info objects providing information about BSN communication. 
  - `other` <font color="#704ae0">Info[ ]</font>: An array of Info objects providing information miscellaneous network information.
- `caCertificate` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The contents of a CA certificate file in text form (i.e. a "pem" file).
- `clientCertificate` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: A flag indicating whether the player is using a client certificate
- `clientIdentifier` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The DHCP client identifier for the network interface
- `dnsServerList` <font color="#704ae0">string[ ]</font> <font color="#01a0af">optional</font>:  An IP address list of the DNS servers
- `domain` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The domain name for the network interface
- `eapTlsOptions` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: A string containing EAP-specific options
- `enabledProtocolList` <font color="#704ae0">string[ ]</font> <font color="#01a0af">optional</font>: An array of enabled IP protocols. Currently supported values are `"IPv4"` and "`IPv6"`.
- `identity` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The RADIUS identity
- `ipAddressList` <font color="#704ae0">string[ ]</font> <font color="#01a0af">optional</font>: The IP addresses assigned to the player
- `inboundShaperRate` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The bandwidth limit for inbound traffic in bits per second. A value of -1 specifies the default bandwidth limit, and a value of 0 specifies no bandwidth limit (these two settings are functionally the same).
- `metric` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>:  The routing metric for the default gateway on the interface. Routes with lower metrics are preferred over routes with higher metrics.
- `mtu` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The maximum transmission unit (MTU) for the network interface in bytes
- `privateKey` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The private key for authentication
- `vlanIdList` <font color="#704ae0">int[ ]</font> <font color="#01a0af">optional</font>: An array of VLAN IDs that are supported on the parent network interface
- `securityMode` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: Security mode for authentication

**Response Example**

```text
{
  "data": {
    "result": {
      "success": true,
      "response": [
        {
          "text": "\r\nInterface: eth0\r\nType: Wired\r\nLink: Yes\r\nConfiguration: DHCP\r\nClient ID: BrightSign:RE433D006644\r\nMAC: 90:ac:3f:2a:01:79\r\nCurrent IP: 192.168.1.174\r\nNetmask: 255.255.255.0\r\nBroadcast: 192.168.1.255\r\nGateway: 192.168.1.254\r\nIP6 Address: 2600:1700:dac0:2060::43/128\r\nIP6 Address: 2600:1700:dac0:2060:92ac:3fff:fe2a:179/64\r\nIP6 Address: fe80::92ac:3fff:fe2a:179/64\r\nMetric: 0\r\nDomains: attlocal.net\r\nDNS: 192.168.1.254\r\n 2600:1700:dac0:2060::1\r\nShape inbound: No\r\n\r\nHost \r\nHost Name: BrightSign-RE433D006644\r\nmDNS Host Name: BrightSign-RE433D006644.local\r\nTime server: http://time.brightsignnetwork.com\r\nProxy Bypass: <none>\r\n\r\nBSN \r\nCrash URL: https://crashes.brightsignnetwork.com/bs/crashdump\r\nError URL: https://handlers.bsn.cloud//bs/error.ashx\r\nRecovery URL: https://handlers.bsn.cloud//recovery/recovery.ashx\r\n\r\nOther \r\nHttp Port: \r\n\r\n\r\n",
          "output": {
            "interfaces": [
              {
                "name": "eth0",
                "errors": [],
                "params": [
                  {
                    "name": "Type",
                    "value": [
                      "Wired"
                    ]
                  },
                  {
                    "name": "Link",
                    "value": [
                      "Yes"
                    ]
                  },
                  {
                    "name": "Configuration",
                    "value": [
                      "DHCP"
                    ]
                  },
                  {
                    "name": "Client ID",
                    "value": [
                      "BrightSign:RE433D006644"
                    ]
                  },
                  {
                    "name": "MAC",
                    "value": [
                      "90:ac:3f:2a:01:79"
                    ]
                  },
                  {
                    "name": "Current IP",
                    "value": [
                      "192.168.1.174"
                    ]
                  },
                  {
                    "name": "Netmask",
                    "value": [
                      "255.255.255.0"
                    ]
                  },
                  {
                    "name": "Broadcast",
                    "value": [
                      "192.168.1.255"
                    ]
                  },
                  {
                    "name": "Gateway",
                    "value": [
                      "192.168.1.254"
                    ]
                  },
                  {
                    "name": "IP6 Address",
                    "value": [
                      "2600:1700:dac0:2060::43/128"
                    ]
                  },
                  {
                    "name": "IP6 Address",
                    "value": [
                      "2600:1700:dac0:2060:92ac:3fff:fe2a:179/64"
                    ]
                  },
                  {
                    "name": "IP6 Address",
                    "value": [
                      "fe80::92ac:3fff:fe2a:179/64"
                    ]
                  },
                  {
                    "name": "Metric",
                    "value": [
                      "0"
                    ]
                  },
                  {
                    "name": "Domains",
                    "value": [
                      "attlocal.net"
                    ]
                  },
                  {
                    "name": "DNS",
                    "value": [
                      "192.168.1.254",
                      "2600:1700:dac0:2060::1"
                    ]
                  },
                  {
                    "name": "Shape inbound",
                    "value": [
                      "No"
                    ]
                  }
                ]
              }
            ],
            "Host": [
              {
                "errors": [],
                "params": [
                  {
                    "name": "Host Name",
                    "value": [
                      "BrightSign-RE433D006644"
                    ]
                  },
                  {
                    "name": "mDNS Host Name",
                    "value": [
                      "BrightSign-RE433D006644.local"
                    ]
                  },
                  {
                    "name": "Time server",
                    "value": [
                      "http://time.brightsignnetwork.com"
                    ]
                  },
                  {
                    "name": "Proxy Bypass",
                    "value": [
                      "<none>"
                    ]
                  }
                ]
              }
            ],
            "BSN": [
              {
                "errors": [],
                "params": [
                  {
                    "name": "Crash URL",
                    "value": [
                      "https://crashes.brightsignnetwork.com/bs/crashdump"
                    ]
                  },
                  {
                    "name": "Error URL",
                    "value": [
                      "https://handlers.bsn.cloud//bs/error.ashx"
                    ]
                  },
                  {
                    "name": "Recovery URL",
                    "value": [
                      "https://handlers.bsn.cloud//recovery/recovery.ashx"
                    ]
                  }
                ]
              }
            ],
            "Other": [
              {
                "errors": [],
                "params": [
                  {
                    "name": "Http Port",
                    "value": [
                      ""
                    ]
                  }
                ]
              }
            ]
          }
        },
        {
          "caCertificates": "",
          "clientCertificate": false,
          "clientIdentifier": "BrightSign:RE433D006644",
          "dnsServerList": [],
          "domain": "",
          "eapTlsOptions": "",
          "enabledProtocolList": [
            "IPv4",
            "IPv6"
          ],
          "identity": "",
          "ipAddressList": [],
          "metric": 0,
          "privateKey": false,
          "securityMode": "",
          "vlanIdList": []
        }
      ]
    }
  }
}
```

## PUT /v1/diagnostics/network-configuration/\:interfaceName/ 

Applies a test network configuration on the player. You should use GET to get the configuration parameters before setting it using this API. The `text` and `output` parameters are NOT needed in PUT.

**Segment**

- `:interfaceName`: The network interface. Possible names include `eth0`, `wlan0`, and `modem`.

**Request Body**

- `caCertificate` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The contents of a CA certificate file in text form (i.e. a "pem" file).
- `clientCertificate` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: A flag indicating whether the player is using a client certificate
- `clientIdentifier` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The DHCP client identifier for the network interface
- `dnsServerList` <font color="#704ae0">string</font><font color="#704ae0">[ ]</font> <font color="#01a0af">optional</font>:  An IP address list of the DNS servers
- `domain` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The domain name for the network interface
- `eapTlsOptions` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: A string containing EAP-specific options
- `enabledProtocolList` <font color="#704ae0">string[ ]</font> <font color="#01a0af">optional</font>: An array of enabled IP protocols. Currently supported values are "IPv4" and "IPv6".
- `identity` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The RADIUS identity
- `ipAddressList` <font color="#704ae0">string[ ]</font> <font color="#01a0af">optional</font>: The IP addresses assigned to the player
- `inboundShaperRate` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The bandwidth limit for inbound traffic in bits per second. A value of -1 specifies the default bandwidth limit, and a value of 0 specifies no bandwidth limit (these two settings are functionally the same).
- `metric` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>:  The routing metric for the default gateway on the interface. Routes with lower metrics are preferred over routes with higher metrics.
- `mtu` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The maximum transmission unit (MTU) for the network interface in bytes
- `privateKey` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The private key for authentication
- `vlanIdList` <font color="#704ae0">int[ ] </font><font color="#01a0af">optional</font>: An array of VLAN IDs that are supported on the parent network interface
- `securityMode` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: Security mode for authentication

**Request Example**

The example request parameters and headers are set as follows:

```text
PUT /api/v1/diagnostics/network-configuration/eth0 HTTP/1.1
Host: {{PlayerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 75
```

This is the example request body:

```json
{
  "caCertificates": "",
  "clientCertificate": false,
  "clientIdentifier": "BrightSign:D7E8CV332141",
  "dnsServerList": ["192.168.86.1"],
  "domain": "lan",
  "eapTlsOptions": "",
  "enabledProtocolList": [
    "IPv4",
    "IPv6"
  ],
  "identity": "",
  "ipAddressList": [],
  "inboundShaperRate": 0, 
  "metric": 1002,
  "privateKey": false,
  "securityMode": "",
  "vlanIdList": []
}
```

**Response Example**

```json
{
    "success": true, 
    "reboot": true // Indicates whether the player will reboot 
}
```

## GET /v1/diagnostics/interfaces/ 

Returns list of applied network interfaces on the player.

**Request Body**

```text
GET /api/v1/diagnostics/interfaces/ HTTP/1.1
Host: {{PlayerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

```json
{
    "data": {
        "result": [
            "eth0",
            "ppp0"
        ]
    }
}
```

## GET /v1/diagnostics/packet-capture/ 

Returns the current status of packet capture operation. 

**Request Example**

```text
GET /api/v1/diagnostics/packet-capture/ HTTP/1.1
Host: {{PlayerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `statusCode` <font color="#704ae0">int</font>: The success or error code (200 is success)
- `is_running` <font color="#704ae0">bool</font>: Flag indicating if the packet capture operation is running

**Response Example**

```json
{
  "data": {
    "result": {
      "statusCode": 200,
      "is_running": false
    }
  }
}
```

## POST /v1/diagnostics/packet-capture/ 

Starts a packet capture operation

**Request Body**

- `filename` <font color="#704ae0">string</font>: The name of the packet capture file. If you don't pass this string, 'capture.pcap' is the default.
- `net_interface` <font color="#704ae0">string</font>: The name of the network interface for which we are performing packet capture. 'eth0' is the default.
- `duration` <font color="#704ae0">int</font>: The duration for which the packet capture runs in seconds. The default is 300 seconds (5 minutes).
- `maxpackets` <font color="#704ae0">int</font>: The maximum number of packets to capture before concluding the process. 0 is the default value.
- `snaplen` <font color="#704ae0">int</font>: The maximum size of each packet. Specifying 0 will instruct the function to capture the entire packet no matter the size.
- `filter` <font color="#704ae0">string</font>: A field for conditional filtering of packets. This operation uses standard pcap syntax. This string is empty by default

**Request Example**

```text
POST /api/v1/diagnostics/packet-capture/ HTTP/1.1
Host: {{PlayerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 190
```

This is the example request body:

```json
{
  "filename": "capture.pcap",
  "interface": "eth0",
  "duration": 300,
  "maxpackets": 0,
  "snaplen": 0,
  "filter": ""
}
```

**Response Example**

```json
{
  "data": {
    "result": {
      "statusCode": 200,
      "is_running": true
    }
  }
}
```

## DELETE /v1/diagnostics/packet-capture/ 

Stops a packet capture operation

**Request Example**

```text
DELETE /api/v1/diagnostics/packet-capture/ HTTP/1.1
Host: {{PlayerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Example**

```json
{
  "data": {
    "result": {
      "statusCode": 200,
      "is_running": false
    }
  }
}
```

## GET /v1/diagnostics/telnet/

Returns information about whether or not Telnet is enabled on the player, and the port number on which it is enabled if it is. This is only available in BOS 9.0.110 or 8.5.46 and above.

**Request Example**

```text
GET /api/v1/diagnostics/telnet/ HTTP/1.1
Host: {{PlayerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Example**

A successful response is a 200 and this response body:

```json
{
    "enabled": true,
    "portNumber": 23
}
```

## PUT /v1/diagnostics/telnet/

This is only available in BOS 9.0.110 or 8.5.46 and above.

**Request Body**

- `enabled` <font color="#704ae0">bool</font>: Enable or disable Telnet on the player
- `portNumber` <font color="#704ae0">int</font>: The port number on which to enable Telnet
- `reboot` <font color="#704ae0">bool</font>: This optional parameter reboots the player immediately after executing this operation. It is `true` by default.

**Request Example**

The example request parameters and headers are set as follows:

```text
PUT /api/v1/diagnostics/telnet/ HTTP/1.1
Host: {{PlayerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 75
```

This is the example request body:

```json
{
   "enabled": true
   "portNumber": "23"
}
```

**Response Example**

```json
{
    "success": true, 
    "reboot": true 
}
```

## GET /v1/diagnostics/ssh/

Returns information about whether or not SSH is enabled on the player, and the port number on which it is enabled if it is. This is only available in BOS 9.0.110 or 8.5.46 and above.

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /api/v1/diagnostics/ssh/ HTTP/1.1
Host: {{PlayerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Example**

A successful response is a 200 and this response body:

```json
{
    "enabled": true,
    "portNumber": 22,
    "password": true // Indicates that a value is set
}
```

## PUT /v1/diagnostics/ssh/

This is only available in BOS 9.0.110 or 8.5.46 and above.

**Request Body**

- `enabled` <font color="#704ae0">bool</font>: Enable or disable SSH on the player
- `portNumber` <font color="#704ae0">int</font>: The port number on which to enable SSH
- `password` <font color="#704ae0">string</font>: Sets the plain-text login password for the SSH connection
- `reboot` <font color="#704ae0">bool </font><font color="#01a0af">optional</font>: Reboots the player immediately after executing this operation. It is `true` by default.
- `obfuscatedPassword` <font color="#704ae0">string </font><font color="#01a0af">optional</font>: Sets the login password for the SSH connection. The password should previously have been obfuscated using a shared secret. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.

**Request Example**

The example request parameters and headers are set as follows:

```text
PUT /api/v1/diagnostics/ssh/ HTTP/1.1
Host: {{PlayerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 65
```

This is the example request body:

```json
{
    "enabled": true,
    "portNumber": 22,
    "password": {{password}}
}
```

**Response Example**

```json
{
    "success": true, 
    "reboot": true
}
```



## GET /v1/diagnostics/chromium-debug/

Returns whether the Chromium Web Inspector has been set. This API is only available as of BOS 8.5.31 and later (see [this page](docId:4qlK1krr1cnx7xypWXRY5) for more information).

**Request Example**

```text
GET /api/v1/diagnostics/chromium-debug/ HTTP/1.1
Host: {{PlayerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `enableWebInspector` <font color="#704ae0">bool</font>: Whether the Chromium Web Inspector is enabled for debugging HTML widgets

**Response Example**

A successful response is a 200 and this response body:

```json
{
  "data": {
    "result": {
      "enableWebInspector": false
    }
  }
}
```

## PUT /v1/diagnostics/chromium-debug/

Updates the Chromium Web Inspector setting. This API is only available as of BOS 8.5.31 and later (see [this page](docId:4qlK1krr1cnx7xypWXRY5) for more information).

**Request Body**

- `enableWebInspector` <font color="#704ae0">bool</font>: Enable or disable the Chromium Web Inspector for debugging HTML widgets. Requires a reboot to take effect.

**Request Example**

The example request parameters and headers are set as follows:

```text
PUT /api/v1/diagnostics/chromium-debug/ HTTP/1.1
Host: {{PlayerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 45
```

This is the example request body:

```json
{
   "enableWebInspector": true
}
```

**Response Body**

The server will return a success or error message. A successful response will almost always cause a reboot which will be indicated in the response.

- `result` <font color="#704ae0">object</font>: The response object
  - `success` <font color="#704ae0">bool</font>: Whether or not the operation was successful
  - `reboot` <font color="#704ae0">bool</font>: Whether or not the player is rebooting

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": true
        }
    }
}
```

##


[title] LDWS Registry Endpoints
[path] Diagnostic Web Server APIs/Untitled/

## GET /v1/registry/ 

Returns the entire registry dump. The hidden registry sections are not returned in this response.

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /api/v1/registry/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: If the operation is successful
- `value` <font color="#704ae0">object</font>: The keys are the names of the registry sections. These are some examples:
  - `brightscript` <font color="#704ae0">string</font>: The BrightScript key-value pairs
  - `networking` <font color="#704ae0">string</font>: The networking key-value pairs

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "value": {
        "autorun": {
          "bootchecks": "",
          "bootstrap": "",
          "knowngood": "",
          "lasttried": ""
        },
        "brightscript": {
          "createdby": "Supervisor 2.1.10"
        },
        "networking": {
          "a": "JaneDoeTesting",
          "access_token": "JcqVLXY3Ttpkpc5IiWL7wMHibKKcLDJkuRaLgWBQyvcjdI2JYRjHDdjaHQrnGkm9b9wAbdb2kTqqCC02oKjA7EJZMfP1jyllrbdFrscXbXePr4WtV3TRYoiWtv8tRGVB",
          "access_token_expiration": "86400",
          "access_token_expires_at": "Thu Feb 08 2024 07:47:26 GMT-0800 (Pacific Standard Time)",
          "bbhf": "true",
          "bph": "[]",
          "brightwallname": "",
          "brightwallscreennumber": "",
          "bs": "/bs/batteryCharger.ashx",
          "bsn_settings_last_modified": "Tue, 30 Jan 2024 22:01:45 GMT",
          "bsnapiversion": "2022/06",
          "cdr": "no",
          "createdby": "Supervisor 2.1.10",
          "cwr": "True",
          "dd": "/bs/devicedownload.ashx",
          "de": "/bs/deviceerror.ashx",
          "dhcp": "yes",
          "dle": "no",
          "dp": "/bs/devicedownloadprogress.ashx",
          "dwse": "true",
          "dwsp": "",
          "ele": "no",
          "enableremotesnapshot": "no",
          "enablewpaenterpriseauthentication": "False",
          "endpoints_blessings_installer_url": "https://certs.bsn.cloud/install-blessing/v1/",
          "endpoints_blessings_server_bp3": "https://certs.bsn.cloud/blessings/",
          "endpoints_bsn_classic_api_server": "http://api.brightsignnetwork.com",
          "endpoints_bsn_classic_server": "https://services.brightsignnetwork.com",
          "endpoints_bsnapiserver": "https://api.bsn.cloud",
          "endpoints_bsnserver": "https://handlers.bsn.cloud",
          "endpoints_certsserver": "https://certs.bsn.cloud",
          "endpoints_echotest": "https://certs.bsn.cloud/echo/ping",
          "endpoints_failsafecheck": "https://certs.bsn.cloud/features/api/v1/failsafe",
          "endpoints_featuresavailable": "https://certs.bsn.cloud/features/api/v1/features",
          "endpoints_provisionserver": "provision.bsn.cloud",
          "endpoints_remote_storage_notifications": "https://certs.bsn.cloud/files/api/v1/notify",
          "endpoints_remote_storage_server": "https://certs.bsn.cloud/files/api/v1/verify",
          "endpoints_s3_classic_url": "http://bsnm.s3.amazonaws.com/public/",
          "endpoints_s3url": "https://bsncloud.s3.amazonaws.com/public/",
          "endpoints_supervisorupgrade": "https://certs.bsn.cloud/features/api/v1/supervisors",
          "endpoints_websocketsdws": "wss://ws.bsn.cloud/",
          "eu": "/bs/error.ashx",
          "g": "Default",
          "hh": "/bs/heartbeat.ashx",
          "hr": "no",
          "hwr": "True",
          "internalcapackages": "",
          "isc": "FF702896",
          "last_modified_autorun_settings_at": "2024-01-30T22:01:45.000Z",
          "lastbsnconnectiontime": "2024/01/30 10:57:50.864",
          "lwr": "True",
          "mwr": "True",
          "ncp": "0",
          "networkjson": "{\"hostname\":\"BrightSign-RE433D006644\",\"proxyServer\":null,\"proxyBypass\":[],\"timeServers\":[\"http://time.brightsignnetwork.com\"],\"interfaces\":[{\"enabled\":true,\"proto\":\"DHCP\",\"ip\":null,\"gateway\":null,\"dns\":null,\"rateLimitDuringInitialDownloads\":0,\"rateLimitInsideContentDownloadWindow\":0,\"rateLimitOutsideContentDownloadWindow\":null,\"contentDownloadEnabled\":true,\"textFeedsDownloadEnabled\":true,\"mediaFeedsDownloadEnabled\":true,\"healthReportingEnabled\":true,\"logsUploadEnabled\":true,\"name\":\"eth0\",\"type\":\"Ethernet\",\"metric\":100}]}",
          "nlws": "s",
          "nlwseun": "yes",
          "nlwsp": "",
          "nlwsu": "",
          "nu": "/bs/checkforcontent.ashx",
          "p": "",
          "ple": "no",
          "rdwse": "yes",
          "refresh_token": "LUi0ZRpbz1BWJ3JuBCwMPtRxEMQ9vMwyTRokUSENNCRckFOuVTUshtfb7Lk5H3Ji8kTyBsqVlwo9SZjzwkHv6V9XKKX4mtwbvGWWlYgUslOK7UbURW3zeMGKWhxbIghx",
          "refresh_token_expires_at": "Fri Feb 06 2026 07:47:26 GMT-0800 (Pacific Standard Time)",
          "registered_with_bsn": "yes",
          "rlmid": "unlimited",
          "rlmiw": "unlimited",
          "rlmow": "default",
          "rlrid": "0",
          "rlriw": "0",
          "rlrow": "0",
          "rs": "/recovery/recovery_runsetup_ba.brs",
          "ru": "/recovery/recovery.ashx",
          "schedule_handler_duration": "21600",
          "settings_handler_duration": "21600",
          "sle": "no",
          "status_handler_duration": "300",
          "sut": "BSN",
          "tbh": " 300",
          "tbnc": " 21600",
          "td": "/bs/trafficdownload.ashx",
          "ts": "http://time.brightsignnetwork.com",
          "twr": "True",
          "tz": "PST",
          "u": "",
          "uab": "no",
          "uat": "no",
          "ub": "https://handlers.bsn.cloud/",
          "ud": "Trying again",
          "ul": "/bs/uploadlogs.ashx",
          "un": "XD5",
          "unm": "appendUnitIDToUnitName",
          "up": "no",
          "ut": " 0",
          "v": "1",
          "version": "3.0.0",
          "vle": "no",
          "vu": "/bs/events.ashx",
          "wifi": "no"
        },
        "newsection": {
          "newkey": "newvalue"
        }
      }
    }
  }
}
```

## GET /v1/registry/\:section/\:key/ 

Returns a particular key value for a specified section and key.

**Segment Values**

- `section` <font color="#704ae0">string</font>: The name of the registry section
- `key` <font color="#704ae0">string</font>: The name of the registry key

**Request Example**

The example request parameters and headers are set as follows:

- `section` is set to `html`
- `key` is set to `use-brightsign-media-player`

```text
GET /api/v1/registry/html/use-brightsign-media-player/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "section": "brightscript",
      "key": "g",
      "value": ""
    }
  }
}
```

## PUT /v1/registry/\:section/\:key/ 

Creates registry values. Do a GET first to see which keys are available.

:::hint{type="warning"}
Applications rely on the values they have set in the registry. Please be mindful of what registry keys you update to avoid putting the player in an unstable state.
:::

**Segment Values**

- `section` <font color="#704ae0">string</font>: The name of the registry section (for example, "html" or "networking")
- `key` <font color="#704ae0">string</font>: The name of the registry key

**Request Example**

The example request parameters and headers are set as follows:

- `section` is set to `html`
- `key` is set to `use-brightsign-media-player`

```text
PUT /api/v1/registry/html/use-brightsign-media-player/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Content-Type: application/json
Content-Length: 33
```

This is the example request body:

```json
{
   "value": "0"
}
```

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "section": "html",
      "key": "use-brightsign-media-player",
      "value": "23"
    }
  }
}
```

## DELETE /v1/registry/\:section/\:key/ 

Remove the specified registry values.

:::hint{type="warning"}
Applications rely on the values they have set in the registry. Please be mindful of what registry keys you delete to avoid putting the player in an unstable state.
:::

**Segment Values**

- `section` <font color="#704ae0">string</font>: The name of the registry section (for example, "html" or "networking")
- `key` <font color="#704ae0">string</font>: The name of the registry value

**Request Example**

The example request parameters and headers are set as follows:

- `section` is set to `html`
- `key` is set to `use-brightsign-media-player`

```text
DELETE /api/v1/registry/html/use-brightsign-media-player/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the registry key was deleted
- `section` <font color="#704ae0">string</font>: This flag is set to the registry section
- `key` <font color="#704ae0">string</font>: This flag is set to the registry key

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "section": "html",
      "key": "use-brightsign-media-player"
    }
  }
}
```

## DELETE /v1/registry/\:section/ 

Deletes an entire registry section

**Segment**

- `section` <font color="#704ae0">string</font>: The name of the registry section (for example, "html" or "networking")

**Request Example**

The example request parameters and headers are set as follows:

- `section` is set to `test_section`

```text
DELETE /api/v1/registry/test_section/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the registry section was deleted
- `section` <font color="#704ae0">string</font>: This flag is set to the registry section

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "section": "test_section"
    }
  }
}
```

## GET  /v1/registry/recovery\_url/ 

Retrieves the recovery URL stored in the player registry

**Request Example**

- `recovery_url` is the recovery URL in the player registry

```text
GET /api/v1/registry/recovery_url/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the request was successfully read
- `value` <font color="#704ae0">string</font>: The recovery URL

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "value": "https://handlers.bsn.cloud//recovery/recovery.ashx"
    }
  }
}
```

## PUT /v1/registry/recovery\_url/ 

Updates the recovery URL in the player’s registry. 

**Request Body**

- `url` <font color="#704ae0">string</font>: The value of the recovery URL 

**Request Example**

The example request parameters and headers are set as follows:

- `url` is set to `www.google.com`

```text
PUT /api/v1/registry/recovery_url/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}}
Accept: application/json
Content-Type: application/json
Content-Length: 37
```

**Request Body**

```json
{
   "url": "www.google.com"
}
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the write was successful

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true
    }
  }
}
```

## PUT /v1/registry/flush/ 

Flushes the contents of the player’s registry immediately to persistent storage. This endpoint is only available in BOS 9.0.107 and 8.5.46 and later.

**Request Example**

The example request parameters and headers are set as follows:

```text
PUT /api/v1/registry/flush/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}}
Accept: application/json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the flush was successful

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true
    }
  }
}
```


[title] Autorun Files
[path] BrightSign Partner Packet/

As was covered, player provisioning consists of applying a Setup File to the player which includes the installation of a Player App. The Player App must contain an *autorun.brs* file which, as an example, may instruct the player to display a specific .html file, either local on the player or on an external website. Alternatively, the autorun may instruct the player to check a particular URL for updated presentations and/or content and, if new files are available, download them and play them.

There are three autorun-related files:

- autorun.brs (may also be referred to as “the autorun” or “autorun file”)
- autorun.zip
- autozip.brs

These have similar-sounding names, but each term has a different function so it’s important to not conflate the terms.

Upon bootup, the player searches for certain files. The player’s search follows a prescribed sequence as shown below.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/Sqxzz6ol81F664gD-A3qu_image-20230413-155338.png)

Players will search for storage devices in a [predefined order](docId\:o4YzospNpFaGbgLdUleee).

1. The player first looks for an *autorun.brs* file in the root directory of the first storage device it encounters.
   - If found, *autorun.brs* is executed.
2. If an *autorun.brs* file is not found, the player looks for an *autorun.zip* file in the same root directory.
   - If an *autorun.zip* file is found and it also contains within it an *autozip.brs* file, the player will unzip the *autorun.zip* file, in the process overwriting any existing files on the storage device.
   - The player will then reboot.
3. If these files are not found on the first storage device, the player will repeat these steps on the next storage device, if available.

If an *autorun.zip* is not found on any of the storage devices, the player will query the BSN.Cloud provisioning service to see if the player has previously been provisioned with BSN.Cloud.

Both *autorun.brs* and *autozip.brs* must be written in BrightScript and be given the specific filenames indicated.

Additional information about these files can be found [here](docId:1Dr98_7Il7GYneOwnX2cr).

Below are sample *autorun.brs* and *autozip.brs* files for reference.

## Sample autorun.brs

:::ExpandableHeading
This autorun.brs file instructs the player to display a local HTML file, specifically, index.html:

```text
Sub Main()
    'Create the BrightSign event handler.
    msgPort = CreateObject("roMessagePort")
    
    'Define the screen viewing area.
    r = CreateObject("roRectangle", 0, 0, 1920, 1080)
  
    'Set the URL where the presentation resides. This can be either local or external.
    config = {
      url: "file:///index.html",
    }

    'Create an HTML event since our presentation is an HTML file.
    h = CreateObject("roHtmlWidget", r, config)
    h.SetPort(msgPort)
    sleep(10000)
    h.Show()

    'Event loop to ensure that the script runs indefinitely
    while true
        msg = wait(0, msgPort)
        print "type(msg)=";type(msg)
        if type(msg) = "roHtmlWidgetEvent" then
            eventData = msg.GetData()
            if type(eventData) = "roAssociativeArray" and type(eventData.reason) = "roString" then
                print "reason = ";eventData.reason
                if eventData.reason = "load-error" then
                    print "message = ";eventData.message
                endif
            endif
        endif
    end while

End Sub
```


:::

## Sample autozip.brs

A sample autozip.brs file can be downloaded here:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/nCBH3P_SrRdBK0Cpx59zC_autozip.brs" label="autozip.brs" isUploading="false"}

[Next - Content Sources >](docId\:R6JuRCcPBpTLMjPKKKaj6)

[title] BrightSign / Partner Responsibilities
[path] BrightSign Partner Packet/

The high-level responsibilities expected of BrightSign and its partners are as follows:

# BrightSign Expectations

- The BrightSignOS is under continuous development and although we try to provide advance notice and roadmap guidance, the OS may be updated with minimal notice. It is the responsibility of the individual partners to manage player upgrades to ensure OS stability in their environment.
- BrightSign will share code examples to provide guidance to partners, but BrightSign does not write partner-oriented production code.
- BrightSign does not provide quality assurance for partner products.

# Partner Expectations

- Partners are responsible for writing the software that integrates their systems with BrightSign players.
- Partners are responsible for qualifying BrightSignOS updates (see [Update the Player OS](docId\:YuRogAgj103wwXgoDfMFj)).
- Partners should have a public web page listing supported BrightSign players.
- Refer to the earlier sections in this document on technical and operational best practices to optimize your BrightSign partner experience.

[Next - Support >](docId\:tbKWDyb9YGv6hR_94nLMm)

[title] Player Setup/Provisioning
[path] BrightSign Partner Packet/

# Player Setup

As covered in the [Set Up](docId\:BJecZ2-78lI32YH525r8I) section, new players must first be set up before they can do much of anything. This process involves applying a **Setup File** to the player. The Setup File applies various settings to the player (network settings, Publishing Mode, logging, etc.) and includes a **Player App** which provides instructions for what the player should do upon startup.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/Rw3snPvotn8CVqQRdU8HA_image-20240404-165839.png" size="82" width="1291" height="639" position="center" alt="image-20240404-165839.png" darkWidth="1291" darkHeight="639" showCaption="false"}

# Player Provisioning

The term *provisioning* refers to using BrightSign Cloud (BSN.Cloud) to set up a player, and given that BrightSign Control or BrightSign Author is used the vast majority of time to set up players, the term provision is often used when referring to player setup.

The primary cases where a player can be properly set up instead of provisioned (i.e., BSN.Cloud is not used to apply the Setup File to the player) are:

- Standalone player configurations where the Setup File is manually copied to a storage device and then the storage device is connected to a player.
- Uncommon situations where a partner chooses to set up players without using BSN.Cloud.

With BSN.Cloud, provisioning a new player can be nearly automatic - if things are properly set up beforehand, new players can be automatically provisioned just by plugging them in! For customers who can’t or don’t want to connect their players to the internet, offline provisioning options are also available.

:::hint{type="info"}
Players can be provisioned for free using either BrightSign Author or Control. However, most partners prefer BrightSign Control (*control.bsn.cloud),* this guide will largely focus on using that interface.
:::

# Setup

Setup Files can be created using the interface at *control.bsn.cloud*. Setup Files can be saved to the [Setup Library](docId\:HZY2W0MeeeryifOrZ9XFR) to be used or modified in the future.

Once created, Setup Files can be applied to a player or group of players using *control.bsn.cloud*. Alternatively, the information contained in a Setup File can be directly incorporated into the Player App (described below) and manually copied to the player’s storage device.

## Player Settings

The Setup File establishes various player settings which include things like [Publishing Mode](docId\:rEScIigY-dJRPuZgwaA4e), network settings (Ethernet, WiFi, etc.), player identification (name and description), logging, and more.

## Player App

The set of files and folders that instruct the player what to do upon boot up is collectively known as the Player App. At a minimum, the Player App must contain an *autorun.brs* file (the .brs extension denotes a BrightScript file) which instructs the player what to do upon startup.

When a Setup File is applied to a player via BrightSign Cloud, an *autorun.brs* file is automatically created on the player.

Partners can write custom Player Apps according to their specific needs. For example, the Player App may be designed to connect to the partner CMS to download content from the CMS for the player to display.

:::hint{type="info"}
The term Partner App or Partner CMS may sometimes be used when referring to the partner’s Player App.
:::

More info about Setups can be found [here](docId\:XNnXywMV09iEgZIIt7RWA) and more info about provisioning can be found [here](docId\:Cyl9kPm02CO5rgcB9WQQv).&#x20;

[Next - Player Provisioning and Recovery System Requirements >](docId\:jEn_1OeDB74_D94u8KLYf)

[title] Partner Resources
[path] BrightSign Partner Packet/Integrating with BrightSign/

# Caching

Details on HTML caching can be found [here](docId\:klnl87Z9zBZpxm3f6cgy8).

# JavaScript

Information about our JavaScript API can be found [here](docId\:o2uIyNVKbsyd1qXCvhVCN).

# Node.js

Details on how to use Node.js with BrightSign players can be found [here](docId\:vlSKfVzeQu04pD58rvXam).

# REST APIs

BrightSign offers REST APIs that enable partners to interface with players. Details [here](docId:7lwJKKuAb9KwoNqnKv06M).

# Extensions

In most cases, any desired functionalities can be accomplished through the various tools and resources available. While extensions may be useful in certain circumstances, they are generally discouraged for long-term support reasons. If you feel an extension is necessary for your application, ask [integrations@brightsign.biz](mailto\:integrations@brightsign.biz) for assistance regarding your specific situation.

Next, we will cover the partner onboarding process.

[Next - Onboarding >](docId\:hh2_e0VXaquMeJkGdZ59b)

[title] BrightSign Registry Keys
[path] /

Registry key settings may be removed without notice.

See also:

- [roRegistry](docId\:YTpSfntswYFMXx8PCqJLf), [roRegistrySection](docId\:FfM73tjd_BThW4-P-0JVG) (BrightScript)
- [registry](docId\:tXWoOMbD2-u12dfegX7gA) (JavaScript)

| **Registry Section** | **Registry Key**                    | **Description**                                                                                                                                                                                                                                                                                                                                                                                       | **Key/Value**                                                                                                                                                                                                                                                                                                                                                                                                                       | **SW that uses it&#x20;**                             |
| -------------------- | ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- |
| audio                | volume                              | Defaults to “logarithmic”, but can be set to “linear” to make the audio volume curve act the same as Series 4 and earlier players.                                                                                                                                                                                                                                                                    | Either linear or logarithmic                                                                                                                                                                                                                                                                                                                                                                                                        |                                                       |
| boot                 | splash                              | Controls whether the splash screen is shown.                                                                                                                                                                                                                                                                                                                                                          | If set to "0", the splash screen is not displayed, otherwise it is shown.                                                                                                                                                                                                                                                                                                                                                           | OS                                                    |
| brightscript         | debug                               | Enables/disables BrightScript debugging (you can also enable this at the Brightsign> prompt by typing "script debug on")                                                                                                                                                                                                                                                                              | "1" turns on BrightScript debugging.                                                                                                                                                                                                                                                                                                                                                                                                | OS                                                    |
| customer             | obfuscation\_key                    | Allows you to use an alternative obfuscation key.                                                                                                                                                                                                                                                                                                                                                     |                                                                                                                                                                                                                                                                                                                                                                                                                                     | OS                                                    |
| html                 | disable-http-cache                  | Some customers with web apps that make many XHR requests find that due to Chromium's caching design many small files are created in the Chromium cache directory, even when a storage quota is set. This key will prevent that at the cost of a small performance reduction. Available from BOS 8.5.62, 9.0.190, and 9.1.15.                                                                          | "1" disables http caching in Chromium.                                                                                                                                                                                                                                                                                                                                                                                              | OS                                                    |
| html                 | disable-hw-accelerated-video-decode | Disable support for hardware accelerated decode. Only Series 5 and later players support hardware accelerated decode.                                                                                                                                                                                                                                                                                 | "1" disables support for hw accelerated video decode in Chromium when "use-brightsign-media-player = 0".                                                                                                                                                                                                                                                                                                                            | OS                                                    |
| html                 | disable-web-security                | With BOS 8.2 and later (Chromium69 and later), several new CORS checks have been added. This lets you disable checks.                                                                                                                                                                                                                                                                                 | "1" disables checks. This flag will take effect on all *roHtmlWidget* instances.                                                                                                                                                                                                                                                                                                                                                    | OS                                                    |
| html                 | enable-virtual-keyboard             | Enables the OS built-in virtual keyboard, which is an alternative to [html virtual keyboard](https://github.com/brightsign/html-virtual-keyboard/tree/master) for simpler applications. The OS built-in virtual keyboard has no customization options but it doesn’t require any script changes or plugins.                                                                                           | "1" enables the virtual keyboard                                                                                                                                                                                                                                                                                                                                                                                                    |                                                       |
| html                 | enable\_web\_inspector              | Allows the *roHtmlWidget* web Inspector to be enabled. On BOS 8.5.31 and newer, you must enable the inspector via this key and the *roHtmlWidget* config.                                                                                                                                                                                                                                             | Possible values are "1" or "0"                                                                                                                                                                                                                                                                                                                                                                                                      | Written by the supervisor or customer, read by the OS |
| html                 | insecure\_private\_network\_access  | Disables the security checks when a public website tries to access resources on the local network (PNA, PrivateNetworkAccess). Available in BOS 9.1.116 +                                                                                                                                                                                                                                             | Possible values are "1" or "0"<br />This is only valid for Chromium 120 (i.e. 9.1) and it is used to disable all PNA enforcement stages. This setting was not carried over to 10.0 for Chromium 148 as newer Chromium no longer blocks PAN.                                                                                                                                                                                         |                                                       |
| html                 | js-trace-gc                         |                                                                                                                                                                                                                                                                                                                                                                                                       | Pass --trace-gc in --js-flags                                                                                                                                                                                                                                                                                                                                                                                                       | OS                                                    |
| html                 | js-trace-fragmentation              |                                                                                                                                                                                                                                                                                                                                                                                                       | Pass --trace-fragmentation in --js-flags                                                                                                                                                                                                                                                                                                                                                                                            | OS                                                    |
| html                 | js-trace-gc-ignore-scavenger        |                                                                                                                                                                                                                                                                                                                                                                                                       | Pass --trace-gc-ignore-scavenfer in --js-flags                                                                                                                                                                                                                                                                                                                                                                                      | OS                                                    |
| html                 | js-trace-gc-verbose                 |                                                                                                                                                                                                                                                                                                                                                                                                       | Pass --trace-gc-verbose in --js-flags                                                                                                                                                                                                                                                                                                                                                                                               | OS                                                    |
| html                 | mse-support                         | Enables MSE support on Series 3 players                                                                                                                                                                                                                                                                                                                                                               | "1" turns on MSE support on Series 3 players. Series 4 players enable it by default when running BOS 8.3+. It is ignored on Series 5 players if the built-in player is enabled.                                                                                                                                                                                                                                                     | OS                                                    |
| html                 | mpm                                 | Enable or disable the Memory Pressure Monitor                                                                                                                                                                                                                                                                                                                                                         | "1" enables MPM                                                                                                                                                                                                                                                                                                                                                                                                                     | OS                                                    |
| html                 | overlay-scrollbar                   | Set scrollbar style                                                                                                                                                                                                                                                                                                                                                                                   | "1" sets to touch-friendly mode, otherwise as desktop                                                                                                                                                                                                                                                                                                                                                                               | OS                                                    |
| html                 | process-per-tab                     | Set --process-per-tab rather than --process-per-site-instance which is the default                                                                                                                                                                                                                                                                                                                    | “1” sets --process-per-tab rather than --process-per-site-instance (the default)                                                                                                                                                                                                                                                                                                                                                    | OS                                                    |
| html                 | tracecategories                     | Chromium trace control                                                                                                                                                                                                                                                                                                                                                                                |                                                                                                                                                                                                                                                                                                                                                                                                                                     | OS                                                    |
| html                 | traceduration                       | Chromium trace capture time in seconds                                                                                                                                                                                                                                                                                                                                                                |                                                                                                                                                                                                                                                                                                                                                                                                                                     | OS                                                    |
| html                 | tracemaxsnapshots                   | Chromium trace maximum snapshots                                                                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                                                                                                     | OS                                                    |
| html                 | tracememorymaps                     | Enable memory bench marking                                                                                                                                                                                                                                                                                                                                                                           | "1" enables bench marking                                                                                                                                                                                                                                                                                                                                                                                                           | OS                                                    |
| html                 | tracemonitorinterval                | Chromium trace monitor interval in seconds.                                                                                                                                                                                                                                                                                                                                                           | Must be > 30, or zero/missing to disable.                                                                                                                                                                                                                                                                                                                                                                                           | OS                                                    |
| html                 | use-brightsign-media-player         | Disables MPV. The Chromium media player will be used instead and players will have hardware accelerated video decode inside HTML. Only Series 5 and later players support hardware accelerated decode.                                                                                                                                                                                                | "use-brightsign-media-player = 0" disables mpv                                                                                                                                                                                                                                                                                                                                                                                      | OS                                                    |
| html                 | web\_inspector\_address             | When a player has multiple network interfaces (e.g., USB ethernet, ethernet port, or Wi-Fi), you can enable the inspector on one in<font color="#0C121D">terface by specifying its IP address. Th</font>is allows safe inspector activation using a “control” port. <font color="#0C121D">1.121 and later.</font>                                                                                     |                                                                                                                                                                                                                                                                                                                                                                                                                                     |                                                       |
| html                 | web\_inspector\_port                | Allows the web inspector port to be changed from the default value of 2999                                                                                                                                                                                                                                                                                                                            |                                                                                                                                                                                                                                                                                                                                                                                                                                     |                                                       |
| html                 | webaudio-support                    | Report web audio as enabled by default. Web audio support is incomplete; this option allows an appropriate report to be made depending on the application.                                                                                                                                                                                                                                            | When present, this parameter must be "1" for web audio to be reported as enabled.                                                                                                                                                                                                                                                                                                                                                   | OS                                                    |
| html                 | webgl\_antialiasing\_enabled        | Enables WebGL anti-aliasing                                                                                                                                                                                                                                                                                                                                                                           | "1" enables WebGL anti-aliasing                                                                                                                                                                                                                                                                                                                                                                                                     | OS                                                    |
| html                 | widget\_type                        | Changes the browser engine used for *roHtmlWidget*. Currently only valid for Series 5.                                                                                                                                                                                                                                                                                                                | BOS 9.0.126 to 9.0.145.1 allow `electron` or `qtwebengine `values. In 9.0.145.1+, `electron` is deprecated and replaced with `chromium110`, which sets the Chromium version to `Chromium120`.                                                                                                                                                                                                                                       |                                                       |
| networking           | cdr                                 | A boolean value as to whether the content downloads should be restricted.                                                                                                                                                                                                                                                                                                                             |                                                                                                                                                                                                                                                                                                                                                                                                                                     | setup script and presentation autorun                 |
| networking           | cdrl                                | The length of time for the content download (this key and cdrs, below, create a window of time)                                                                                                                                                                                                                                                                                                       |                                                                                                                                                                                                                                                                                                                                                                                                                                     | setup script and presentation autorun                 |
| networking           | cdrs                                | The start time for the content download (this key and cdrl, above, create a window of time)                                                                                                                                                                                                                                                                                                           |                                                                                                                                                                                                                                                                                                                                                                                                                                     | setup script and presentation autorun                 |
| networking           | curl\_debug                         | Turns on debug output whenever the OS uses curl. It can be very verbose and fill up logs quickly.                                                                                                                                                                                                                                                                                                     | “1” turns on debug output whenever the OS uses curl.                                                                                                                                                                                                                                                                                                                                                                                | OS                                                    |
| networking           | dwse                                | Enables/disables the local DWS                                                                                                                                                                                                                                                                                                                                                                        | “yes” enables, “no” disables the local DWS                                                                                                                                                                                                                                                                                                                                                                                          | Supervisor, setup script                              |
| networking           | ele                                 | A boolean value denoting if event logging should be enabled                                                                                                                                                                                                                                                                                                                                           |                                                                                                                                                                                                                                                                                                                                                                                                                                     | Supervisor, setup script, presentation autorun        |
| networking           | enable\_http\_redirect              | If set to `false`, external requests to HTTP will be processed normally instead of redirected                                                                                                                                                                                                                                                                                                         |                                                                                                                                                                                                                                                                                                                                                                                                                                     |                                                       |
| networking           | enableremotesnapshot                | A boolean value denoting if remote snapshot is enabled                                                                                                                                                                                                                                                                                                                                                |                                                                                                                                                                                                                                                                                                                                                                                                                                     | setup script, presentation autorun                    |
| networking           | force\_igmp\_version                | Allows customization of the player response to the IGMP network environment. See [IGMP Behavior](docId\:P2_NLzKngNs1E9Ebk62yr)                                                                                                                                                                                                                                                                        |                                                                                                                                                                                                                                                                                                                                                                                                                                     |                                                       |
| networking           | http\_server                        | Lets you run the DWS on the standard port. See [here](docId\:IAFCHERlJfjDJTWTtKpk5).                                                                                                                                                                                                                                                                                                                  |                                                                                                                                                                                                                                                                                                                                                                                                                                     | OS and supervisor                                     |
| networking           | isc                                 | Set the color for the splash screen                                                                                                                                                                                                                                                                                                                                                                   |                                                                                                                                                                                                                                                                                                                                                                                                                                     | Setup script, presentation autorun                    |
| networking           | ldws\_certs\_path                   | Available in BOS 8.5.64 and higher, this key can be used to provide the folder path to certs, which can be in any storage folder location                                                                                                                                                                                                                                                             | Example values are `/storage/ssd`, `/storage/usb`, `/storage/flash`                                                                                                                                                                                                                                                                                                                                                                 |                                                       |
| networking           | ple                                 | A boolean value denoting if playback logging should be enabled or not                                                                                                                                                                                                                                                                                                                                 |                                                                                                                                                                                                                                                                                                                                                                                                                                     | Supervisor, setup script, presentation autorun        |
| networking           | prometheus-node-exporter-port       | By default, node\_exporter binds to localhost:9100 only to enable metrics collection – this will happen if the key is unset or with any setting other than an explicit disable.<br />This setting is available in BOS 9.0.144 and above.                                                                                                                                                              | "-" explicitly disables node\_exporter. If the value is set to an integer usable as a port number (1025 to 65535, with 9100 being the conventional port) , node\_exporter metrics will be available on all external interfaces on that port number. Port numbers \< 1025 will prevent the binding of node\_exporter to external adapters and an error message will be logged. However, the service will be bound to localhost:9100. | Supervisor, monitoring                                |
| networking           | ptp\_domain                         | PTP clocks are turned off by default, this command lets you turn them on.                                                                                                                                                                                                                                                                                                                             | To turn on PTP clocks (substitute the domain-reserved PTP address number):<br />`registry write networking ptp_domain <# between 0 - 127> reboot`                                                                                                                                                                                                                                                                                   | OS                                                    |
| networking           | rdwse                               | A boolean flag which tells you if rDWS is enabled or not.                                                                                                                                                                                                                                                                                                                                             | A value of “true” means that the rDWS is enabled. This is the default value.                                                                                                                                                                                                                                                                                                                                                        | Supervisor                                            |
| networking           | recurl                              | URL to which "/Recovery.ashx" is appended if the previous registry entry is not present.                                                                                                                                                                                                                                                                                                              | If ''\[networking]recover'' or ''\[networking]ru'' keys exists then the recovery URL is the contents of that registry key. Otherwise if ''\[networking]recurl'' exists, the recovery URL is the contents of that registry key with ''"/Recovery.ashx"'' appended.                                                                                                                                                                   |                                                       |
| networking           | remotesnapshotinterval              | If remoteshapshot is enabled, use this to set the interval at which the remote snapshot should be taken                                                                                                                                                                                                                                                                                               |                                                                                                                                                                                                                                                                                                                                                                                                                                     | Setup script, presentation autorun                    |
| networking           | remotesnapshotjpegqualitylevel      | If remoteshapshot is enabled, use this to set the quality level at which the remote snapshot should be taken.                                                                                                                                                                                                                                                                                         | The quality level is a number.                                                                                                                                                                                                                                                                                                                                                                                                      | Setup script, presentation autorun                    |
| networking           | remotesnapshotmaximages             | If remoteshapshot is enabled, use this to set the maximum number of images that should be taken. Older images will be deleted.                                                                                                                                                                                                                                                                        |                                                                                                                                                                                                                                                                                                                                                                                                                                     | Setup script, presentation autorun                    |
| networking           | remotesnapshotorientation           | If remoteshapshot is enabled, use this to set portrait or landscape orientation.                                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                                                                                                     | Setup script, presentation autorun                    |
| networking           | rollback\_enabled                   | A boolean value indicating if the rollback feature should be enabled or not.                                                                                                                                                                                                                                                                                                                          | A value of “False” disables rollback (which is enabled by default)                                                                                                                                                                                                                                                                                                                                                                  | Supervisor                                            |
| networking           | rs                                  | After the OS calls the recovery handler, one of recovery\_reinstall\_noreformat.bas and recovery\_reinstall.bas will be returned. This is used in both files as a URL to download the recovery script.                                                                                                                                                                                                |                                                                                                                                                                                                                                                                                                                                                                                                                                     | Recovery BrightScript                                 |
| networking           | rtl8821\_disable\_ht                | Disables or enables HT on Realtek WiFi (WS103). This requires BOS 8.1.70 or higher.                                                                                                                                                                                                                                                                                                                   | Set this value to “1” to disable HT on Realtek WiFi (WS103); other values means enabled.                                                                                                                                                                                                                                                                                                                                            | OS                                                    |
| networking           | rtl8821\_disable\_vht               | Disables or enables VHT on Realtek WiFi (WS103). This requires BOS 8.1.70 or higher.                                                                                                                                                                                                                                                                                                                  | Set this value to “1” to disable VHT on Realtek WiFi (WS103); other values mean enabled.                                                                                                                                                                                                                                                                                                                                            | OS                                                    |
| networking           | ru                                  | A URL used by system software to download a script to be executed in the event of recovery. If this key exists, the recovery URL is the contents of the key.                                                                                                                                                                                                                                          |                                                                                                                                                                                                                                                                                                                                                                                                                                     | OS                                                    |
| networking           | serial\_with\_telnet                | Enables serial over telnet. By default, enabling BrightSign-level telnet or ssh will disable the serial console. The first serial port can still be used by scripts for communication with other devices; it just stops being usable as a console but if kernel console output is enabled then that will still be visible on the first serial port.                                                   | A value of ''1'' enables serial console at the same time as telnet. Note that serial communication via *roSerialPort* in scripts will be highly unreliable. To set the password:<br />`ifconfig login-password my-top-secret-password`                                                                                                                                                                                              | OS                                                    |
| networking           | sip                                 | The static IP address for either the ethernet or WiFi interface                                                                                                                                                                                                                                                                                                                                       |                                                                                                                                                                                                                                                                                                                                                                                                                                     | Supervisor, setup script, presentation autorun        |
| networking           | sip2                                | The static IP address for either the ethernet or WiFi interface (sip2 denotes the interface with the lower priority)                                                                                                                                                                                                                                                                                  |                                                                                                                                                                                                                                                                                                                                                                                                                                     | Supervisor, setup script, presentation autorun        |
| networking           | status\_handler\_duration           | The interval to report status                                                                                                                                                                                                                                                                                                                                                                         |                                                                                                                                                                                                                                                                                                                                                                                                                                     | Supervisor                                            |
| networking           | ssh                                 | Enables ssh access. A reboot is required for this to take effect but DO NOT DO THIS UNTIL YOU HAVE SET A PASSWORD!                                                                                                                                                                                                                                                                                    | To enable ssh access, set the key to the ssh port (the default ssh port is 22). For example: `registry write networking ssh 22`<br /><br />To disable ssh access, delete the key (the player must reboot for this to take effect). For example:  `registry delete networking ssh`                                                                                                                                                   | OS                                                    |
| networking           | subnetmask\_vlan\_'+id              | The subnet mask for the static configuration of the VLAN interface. Id suffix refers to VLAN id.                                                                                                                                                                                                                                                                                                      |                                                                                                                                                                                                                                                                                                                                                                                                                                     | Supervisor                                            |
| networking           | syslog                              | Configures remote logging. See [roSystemLog](docId\:KrRnuJD7STbMMV3z3xjD3).                                                                                                                                                                                                                                                                                                                           |                                                                                                                                                                                                                                                                                                                                                                                                                                     | OS                                                    |
| networking           | telnet                              | Enables or deletes telnet access.                                                                                                                                                                                                                                                                                                                                                                     | To enable telnet access set this key to the port you wish to run telnet on (the default telnet port is 23).  Delete the key to disable telnet access.                                                                                                                                                                                                                                                                               | OS                                                    |
| networking           | telnet\_server                      | Enables Telnet access to the Linux shell prompt on players that have had secure boot disabled or are booting without verification. You can enable this feature along with BrightSign-level Telnet if they run on different ports.                                                                                                                                                                     | Set this registry key to the port you wish to run telnet on. For example: `registry write networking telnet_server 23`                                                                                                                                                                                                                                                                                                              | OS                                                    |
| networking           | twf                                 | Tells you if text feeds data type is enabled over the WiFi interface                                                                                                                                                                                                                                                                                                                                  | A boolean value                                                                                                                                                                                                                                                                                                                                                                                                                     |                                                       |
| networking           | twr                                 | Tells you if text feeds data type is enabled over the ethernet interface                                                                                                                                                                                                                                                                                                                              | A boolean value                                                                                                                                                                                                                                                                                                                                                                                                                     |                                                       |
| networking/private   | tz                                  | The device time zone                                                                                                                                                                                                                                                                                                                                                                                  |                                                                                                                                                                                                                                                                                                                                                                                                                                     |                                                       |
| networking           | ub                                  | A URL prefix which is applied to all URLs that follow if they do not contain a colon.                                                                                                                                                                                                                                                                                                                 | This value is the URL prefix to apply.                                                                                                                                                                                                                                                                                                                                                                                              |                                                       |
| networking           | vu                                  | Events are reported to this URL                                                                                                                                                                                                                                                                                                                                                                       |                                                                                                                                                                                                                                                                                                                                                                                                                                     | OS                                                    |
| networking           | wifi                                | Indicates if WiFi is enabled on the player or not                                                                                                                                                                                                                                                                                                                                                     | A boolean value                                                                                                                                                                                                                                                                                                                                                                                                                     | Supervisor, setup script, presentation autorun        |
| networking           | wired\_debug                        | Enable verbose diagnostics on the ethernet interface                                                                                                                                                                                                                                                                                                                                                  |                                                                                                                                                                                                                                                                                                                                                                                                                                     | OS                                                    |
| serial               | usb\_first                          | LS3 and LS4 players don't have a dedicated serial port, but have several ways to send and receive serial data depending on the cable in use. Two types of cable can be used: a "passive serial splitter" or a "genuine USB serial adapter", which can be set with this key.                                                                                                                           | “\[usb]type\_c\_serial” or “\[serial]usb\_first”, with the right port number, set the cable value to either "passive serial splitter" or a "genuine USB serial adapter". A  “usb\_first” value only affects serial ports opened by BrightScript and JavaScript, not the console.                                                                                                                                                    | OS                                                    |
| usb                  | hotplug\_tty:106c:3718:1.0          | Supports Pantech UML290 modems. Note that there is a generic "hotplug\_tty" mechanism, this is just an example.                                                                                                                                                                                                                                                                                       | The appended numbers are modem keys reflecting product ID, vendor ID, and interface number. The settings numbers are visible in /sys/bus/usb/devices when the modem is plugged in.                                                                                                                                                                                                                                                  | OS                                                    |
| usb                  | hotplug\_tty:12d1:155e:1.0          | Supports Huawei E3531 / E3372 modems                                                                                                                                                                                                                                                                                                                                                                  | The appended numbers are modem keys reflecting product ID, vendor ID, and interface number. The settings numbers are visible in /sys/bus/usb/devices when the modem is plugged in.                                                                                                                                                                                                                                                  | OS                                                    |
| usb                  | type\_c\_serial                     | LS3 and LS4 players don't have a dedicated serial port, but have several ways to send and receive serial data, depending on the cable in use. This registry setting is *only* required when using a passive serial cable (like the ones that BrightSign makes with a USB type A socket and a 3.5mm socket) and not when using a USB serial adapter.                                                   | The cable type: "passive serial splitter" or a "genuine USB serial adapter"                                                                                                                                                                                                                                                                                                                                                         | OS                                                    |
| video                | auto\_mode\_vms\_override           | Overrides the “Auto” video mode and allows multi-output or other video modes to be configured for the player outside a CMS app. When a video mode is set to “Auto”, or not specified by a script, the player should see if a specific mode is set in the public registry. If it finds a valid video mode there, it should apply it instead of negotiating a mode using the EDID provided by the sync. | Example values would be: <br />`auto_mode_vms_override -> "{"HDMI-1":{"mode":"1920x1080x60p","transform":"normal","x":0,"y":0}}"`                                                                                                                                                                                                                                                                                                   |                                                       |
| video                | gpu\_sync                           | Available only in BOS versions 9.0.168 to 9.0.189, this alleviates artifacts and/or frame corruption when content goes through the GPU. It will affect HS5, LS5, MX5, HD5, and XD5 players, but is ignored on XT5, XC5, and Series 4 players. This setting comes with a performance hit.                                                                                                              | Setting the value to `1` enables a workaround artifacts and/or frame corruption when content goes through the GPU                                                                                                                                                                                                                                                                                                                   | OS                                                    |


[title] Debugging HTML/Node Apps
[path] HTML Development/

Chromium or Node inspectors can be used to debug Html and Node applications that run on BrightSign players. See the sections below for more information about how to use each of these tools.

## Chromium Inspector

This example uses Visual Studio Code. You can store your application on the [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer) module if you use VS Code, or on a local server. 

:::hint{type="warning"}
This only should be used during development, and is not recommended for applications deployed to a player in the field unless you can restart the player or control the runtime.
:::

### Prerequisites

- Connect to your player through a serial connection (see [BrightSign Shell](docId\:FXXyu9jmocUtC6XE2p7l2) or [Serial Port Configuration](docId\:Zen3QyWtjoHOeOTkbRX2a) for more information).
- Use the `bsc` ([BrightSign CLI](https://www.npmjs.com/package/@brightsign/bsc)) to push files using over the Local or Remote DWS, or the DWS UI.
  - If you have a local HTTP server on your computer, put your application on the server and point the BrightSign player to it. Otherwise, you'll have to copy the application code onto the player.
- Download or install [this REST client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) for VS Code, which lets you use keyboard shortcuts to quickly upload files to the player.
- Open your Chrome browser and go to this URL: *chrome://inspect/#devices*.

### Enabling the Debugger

1. Open your autorun in a code editor.
2. Enable debug in the registry by adding the following lines to your autorun:

```javascript
debugrs = createobject("roregistrysection", "brightscript")
debug = debugrs.read("debug")
if debug <> "1" then
	debugrs.write("debug","1")
	debugrs.flush()
	'stop
	RebootSystem() 'reboots player first time it's changed
end if
```

3\. To test the debugger, type `Ctrl-C` at the `BrightScript>` prompt in the serial control window. The prompt will change to `BrightScript Debugger>`. Type `exit` to leave the debugger.

4\. Enter the code below in your autorun. The `--inspect-brk` flag will let you quickly see what variables are in scope, their values, and the call stack at specific places in the script.

```javascript
m.node.js = CreateObject("roNodeJs", "sd:/main.js", {message_port: m.msgPort, node_arguments: ["--inspect-brk=0.0.0.0:2999"]})
```

### Running the Debugger

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-d7t8DJ6jseJzUFZnyykpL-20250722-151404.png" size="62" width="947" height="827" position="center" caption="Image 1" showCaption="true"}

1. Type `script autorun.brs` at the prompt to restart the autorun (you don't need to reboot the player when you make changes if you use this method).
2. Once the autorun has restarted, go to the Chromium inspector. Select **Configure...** to access the Node and HTML instances of the player. You will need the IP address of the player to inspect the Node process.
3. Because we added the `roNodeJs --inspect-brk` parameter in the autorun, the execution of the script is paused at the first line. Select **inspect** to launch the debugger (see Image 1). Press the **resume script** button in the debugger to run your JavaScript code and play the video on your screen.
4. Enter the `debugger` keyword on a separate line in your JavaScript code to set a breakpoint. You will need to close the app and restart it before the breakpoint will be activated.

## BrightSign Debugger (Node Inspector)

The BrightSign debugger is useful if you want to upload the application to the player for debugging rather than an HTTP web server. Once it has been uploaded to the player, the application can be restarted (if you do this, there is no need to restart the player).&#x20;

To do this:&#x20;

1. Select Ctrl-C to drop to the `BrightScript Debugger` prompt.
2. Type `exit` to get to the `BrightSign` prompt.
3. Type `script autorun.brs` to restart the app.

### Features in Recent OS Versions

Type `node` with no parameters to get an interactive Node shell, and then enter JavaScript, which is evaluated immediately:

```javascript
BrightSign> node
> process.release
{ name: 'node',
  lts: 'Dubnium',
  sourceUrl:
   'https://nodejs.org/download/release/v10.15.3/node-v10.15.3.tar.gz',
  headersUrl:
   'https://nodejs.org/download/release/v10.15.3/node-v10.15.3-headers.tar.gz' }
>Type Ctrl-D to exit Node and return to the BrightSign prompt, or you can give it the name of a script to run:
```

```javascript
BrightSign> node sd:/hello.js
Hello world
BrightSign>
```

If you want to attach a remote debugger to your Node process, you can pass `--inspect` as normal.  It will show you the URL for the debugger:

```javascript
BrightSign> node --inspect=0.0.0.0:1234 sd:/hello.js
Debugger listening on ws://0.0.0.0:1234/c67ca30e-388b-49b2-baf4-9924d94f0ac6
For help, see: https://nodejs.org/en/docs/inspector
Hello world
```

### Features Requiring OS 8.3.1 or Later

If you want to debug interactively at the console, use `node inspect` (without dashes).  It will start the inspector and then connect to it locally:

```javascript
BrightSign> node inspect sd:/hello.js
< Debugger listening on ws://127.0.0.1:9229/2c63116d-d1d4-4248-81b4-718217bef35e
< For help, see: https://nodejs.org/en/docs/inspector
< Debugger attached.

Break on start in file:///storage/sd/hello.js:1
> 1 (function (exports, require, module, __filename, __dirname) { console.log("Hello world");
  2
  3
debug>
```

If you have a single-file or webpacked program that's located on a remote host, you can pass an http or https URL to Node.  BrightSign will fetch the file and run it (this doesn't work if the program needs other resources that it expects to find in the cwd).

```javascript
BrightSign> node http://192.168.82.66/test.js
Hello
BrightSign>
```

If you want to run your program inside Chronode (the Node.js that is embedded in Chromium) rather than in the standalone Node, use `htmlplay chronode`. This is similar to `htmlplay`, except that it expects to be given the URL to a .js file rather than an html site: 

Note that in this case, the output goes to the system log and not to the shell console.

```javascript
BrightSign> htmlplay chronode http://192.168.82.66/test.js
```

If you want to attach the debugger to a program or a website that you've launched with `htmlplay`, set this option before loading the page:

```javascript
BrightSign> htmlplay params inspector-port 1234
BrightSign> htmlplay http://www.brightsign.biz/
```


[title] Using iframes with Chromium 110/120
[path] HTML Development/

In Chromium version 110 and later, [BrightScript-JavaScript Objects](docId\:URrXhU7L-V9ea-Zhy0JV3) are only supported within iframes in BrightSignOS version 9.0.191 or greater. This change impacts developers who have been embedding content in iframes that rely on these BrightSign-specific objects.

### Apps with iframe Content Control

If your application embeds content within an iframe and you have control over the content inside that iframe, you’ll need to adjust your approach. Instead of using BrightSign objects directly inside the iframe, you should send messages from the iframe to the parent window using the `postMessage()` method. The parent window, which contains the BrightSign objects, can then handle these messages and execute the necessary actions.&#x20;

Below is an example in which the iframe sends a message to the parent window using  `window.parent.postMessage()`. The parent window listens for messages using the `message` event listener, and upon receiving a message, it can interact with the BrightSign objects to perform the desired actions.

**iframe content:**

:::ExpandableHeading
Child iframe

```javascript
<!-- Inside the iframe -->
<script>
    // Create a message to send to the parent window
    const message = { action: 'exampleCommand', data: 'example data' };

    // Send the message to the parent window
    window.parent.postMessage(message, '*'); // The '*' wildcard allows any origin. Use specific origin for security.
</script>

```


:::

**Parent window:**

::::ExpandableHeading
Parent window with BrightSign objects

:::CodeblockTabs
BrightScript

```javascript
<!-- Parent window containing BrightSign objects -->
<script>
    window.addEventListener('message', (event) => {
        // Make sure to validate the origin of the message for security
        if (event.origin !== 'https://your-trusted-origin.com') {
            return;
        }

        const message = event.data;

        if (message.action === 'exampleCommand') {
            // Use the BrightSign object to perform the necessary action
            // Example: brightSignObject.someFunction(message.data);
            console.log('Received message:', message);
        }
    });
</script>

```
:::

### Apps Displaying Public URLs

If your app loads public URLs within an iframe, avoid using BrightSign objects within the iframe. Public content can be unpredictable and potentially insecure. Using BrightSign objects in such scenarios could expose your app to vulnerabilities if the content is compromised or maliciously altered. Avoid embedding BrightSign objects in these cases and instead use Node-style @brightsign [objects](docId\:o2uIyNVKbsyd1qXCvhVCN) whenever possible. These objects align with modern JavaScript development practices, provide enhanced security, and let you maintain compatibility and security across different environments and Chromium versions.
::::


[title] rDWS Logs Endpoints
[path] Diagnostic Web Server APIs/Remote DWS APIs/

Base URL for these endpoints:  ***https\://ws.bsn.cloud/rest/v1/***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /logs/ 

Fetches the player log files as a raw string. The log output is similar to the information generated through serial, Telnet, or SSH on the player.

**Request Example**

```text
GET /rest/v1/logs/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `result` <font color="#704ae0">string</font>: The raw contents of the player log. Each line is separated by a newline character `\n`

**Response Example**

```json
{
    "route": "/v1/logs",
    "method": "GET",
    "data": {
        "result": "[    0.000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]\n[    0.000] Linux version 5.10.160+bs9.0.97 (builder@brightsign) (aarch64-oe-linux-gcc (GCC) 9.5.0, GNU ld (GNU Binutils) 2.34.0.20200910) #1 SMP PREEMPT Wed Aug 16 18:56:35 UTC 2023\n[    0.000] Machine model: BrightSign Cobra\n[    0.000] Zone ranges:\n[    0.000]   DMA      [mem 0x0000000000200000-0x00000000f7ffffff]\n[    0.000]   DMA32    empty\n[    0.000]   Normal   empty\n[    0.000] Movable zone start for each node\n[    0.000] Early memory node ranges\n[    0.000]   node   0: [mem 0x0000000000200000-0x00000000083fffff]\n[    0.000]   node   0: [mem 0x000000000a200000-0x00000000f7ffffff]\n[    0.000] Initmem setup node 0 [mem 0x0000000000200000-0x00000000f7ffffff]\n[    0.000] On node 0 totalpages: 1007616\n[    0.000]   DMA zone: 15864 pages used for memmap\n[    0.000]   DMA zone: 0 pages reserved\n[    0.000]   DMA zone: 1007616 pages, LIFO batch:63\n[    0.000] cma: Reserved 16 MiB at 0x00000000f2800000\n[    0.000] psci: probing for conduit method from DT.\n[    0.000] psci: PSCIv1.0 detected in firmware.\n[    0.000] psci: Using standard PSCI v0.2 function IDs\n[    0.000] psci: Trusted OS migration not required\n[    0.000] psci: SMC Calling Convention v1.0\n[    0.000] percpu: Embedded 31 pages/cpu s87000 r8192 d31784 u126976\n[    0.000] pcpu-alloc: s87000 r8192 d31784 u126976 alloc=31*4096\n[    0.000] pcpu-alloc: [0] 0 [0] 1 [0] 2 [0] 3 [0] 4 [0] 5 \n[    0.000] Detected VIPT I-cache on CPU0\n[    0.000] CPU features: detected: GIC system register CPU interface\n[    0.000] Built 1 zonelists, mobility grouping on.  Total pages: 991752\n[    0.000] Kernel command line: \n[    0.000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)\n[    0.000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)\n[    0.000] mem auto-init: stack:off, heap alloc:off, heap free:off\n[    0.000] Memory: 3899096K/4030464K available (15102K kernel code, 2736K rwdata, 6044K rodata, 5248K init, 784K bss, 114984K reserved, 16384K cma-reserved)\n[    0.000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=6, Nodes=1\n[    0.000] ftrace: allocating 49739 entries in 195 pages\n[    0.000] ftrace: allocated 195 pages with 4 groups\n[    0.000] rcu: Preemptible hierarchical RCU implementation.\n[    0.000] rcu: \tRCU event tracing is enabled.\n[    0.000] rcu: \tRCU restricting CPUs from NR_CPUS=8 to nr_cpu_ids=6.\n[    0.000] \tTrampoline variant of Tasks RCU enabled.\n[    0.000] \tRude variant of Tasks RCU enabled.\n[    0.000] \tTracing variant of Tasks RCU enabled.\n[    0.000] rcu: RCU calculated value of scheduler-enlistment delay is 30 jiffies.\n[    0.000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=6\n[    0.000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0\n[    0.000] GICv3: GIC: Using split EOI/Deactivate mode\n[    0.000] GICv3: 256 SPIs implemented\n[    0.000] GICv3: 0 Extended SPIs implemented\n[    0.000] GICv3: Distributor has no Range Selector support\n[    0.000] GICv3: 16 PPIs implemented\n[    0.000] GICv3: CPU0: found redistributor 0 region 0:0x00000000fef00000\n[    0.000] ITS [mem 0xfee20000-0xfee3ffff]\n[    0.000] ITS@0x00000000fee20000: allocated 65536 Devices @2600000 (flat, esz 8, psz 64K, shr 0)\n[    0.000] ITS: using cache flushing for cmd queue\n[    0.000] GICv3: using LPI property table @0x00000000025a0000\n[    0.000] GIC: using cache flushing for LPI property table\n[    0.000] GICv3: CPU0: using allocated LPI pending table @0x00000000025b0000\n[    0.000] GICv3: GIC: PPI partition interrupt-partition-0[0] { /cpus/cpu@0[0] /cpus/cpu@1[1] /cpus/cpu@2[2] /cpus/cpu@3[3] }\n[    0.000] GICv3: GIC: PPI partition interrupt-partition-1[1] { /cpus/cpu@100[4] /cpus/cpu@101[5] }\n[    0.000] rockchip_clk_register_frac_branch: could not find dclk_vop0_frac as parent of dclk_vop0, rate changes may not work\n[    0.000] rockchip_clk_register_frac_branch: could not find dclk_vop1_frac as parent of dclk_vop1, rate changes may not work\n[    0.000] arch_timer: cp15 timer(s) running at 24.00MHz (phys).\n[    0.000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns\n[    0.000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns\n[    0.001] Console: colour dummy device 80x25\n[    0.001] printk: console [tty0] enabled\n[    0.001] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=80000)\n[    0.001] pid_max: default: 32768 minimum: 301\n[    0.002] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)\n[    0.002] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)\n[    0.005] rcu: Hierarchical SRCU implementation.\n[    0.006] Platform MSI: interrupt-controller@fee20000 domain created\n[    0.007] PCI/MSI: /interrupt-controller@fee00000/interrupt-controller@fee20000 domain created\n[    0.008] smp: Bringing up secondary CPUs ...\n[    0.009] Detected VIPT I-cache on CPU1\n[    0.009] GICv3: CPU1: found redistributor 1 region 0:0x00000000fef20000\n[    0.009] GICv3: CPU1: using allocated LPI pending table @0x00000000025c0000\n[    0.009] CPU1: Booted secondary processor 0x0000000001 [0x410fd034]\n[    0.010] Detected VIPT I-cache on CPU2\n[    0.011] GICv3: CPU2: found redistributor 2 region 0:0x00000000fef40000\n[    0.011] GICv3: CPU2: using allocated LPI pending table @0x00000000025d0000\n[    0.011] CPU2: Booted secondary processor 0x0000000002 [0x410fd034]\n[    0.012] Detected VIPT I-cache on CPU3\n[    0.012] GICv3: CPU3: found redistributor 3 region 0:0x00000000fef60000\n[    0.012] GICv3: CPU3: using allocated LPI pending table @0x00000000025e0000\n[    0.012] CPU3: Booted secondary processor 0x0000000003 [0x410fd034]\n[    0.013] CPU features: detected: Spectre-v2\n[    0.013] CPU features: detected: Spectre-v4\n[    0.013] CPU features: detected: ARM errata 1165522, 1319367, or 1530923\n[    0.013] CPU features: detected: Spectre-BHB\n[    0.013] Detected PIPT I-cache on CPU4\n[    0.013] GICv3: CPU4: found redistributor 100 region 0:0x00000000fef80000\n[    0.013] GICv3: CPU4: using allocated LPI pending table @0x00000000025f0000\n[    0.014] CPU4: Booted secondary processor 0x0000000100 [0x410fd082]\n[    0.015] Detected PIPT I-cache on CPU5\n[    0.015] GICv3: CPU5: found redistributor 101 region 0:0x00000000fefa0000\n[    0.015] GICv3: CPU5: using allocated LPI pending table @0x0000000002680000\n[    0.015] CPU5: Booted secondary processor 0x0000000101 [0x410fd082]\n[    0.015] smp: Brought up 1 node, 6 CPUs\n[    0.015] SMP: Total of 6 processors activated.\n[    0.015] CPU features: detected: 32-bit EL0 Support\n[    0.015] CPU features: detected: CRC32 instructions\n[    0.015] CPU: All CPU(s) started at EL2\n[    0.015] alternatives: patching kernel code\n[    0.017] devtmpfs: initialized\n[    0.030] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 6370867519511994 ns\n[    0.030] futex hash table entries: 2048 (order: 5, 131072 bytes, linear)\n[    0.030] pinctrl core: initialized pinctrl subsystem\n[    0.031] regulator-dummy: no parameters, enabled\n[    0.032] NET: Registered protocol family 16\n[    0.034] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations\n[    0.035] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations\n[    0.035] audit: initializing netlink subsys (disabled)\n[    0.035] audit: type=2000 audit(0.033:1): state=initialized audit_enabled=0 res=1\n[    0.036] thermal_sys: Registered thermal governor 'fair_share'\n[    0.036] thermal_sys: Registered thermal governor 'step_wise'\n[    0.036] thermal_sys: Registered thermal governor 'user_space'\n[    0.037] thermal_sys: Registered thermal governor 'power_allocator'\n[    0.037] thermal thermal_zone1: power_allocator: sustainable_power will be estimated\n[    0.037] cpuidle: using governor menu\n[    0.037] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.\n[    0.037] ASID allocator initialised with 65536 entries\n[    0.061] platform ff770000.syscon:phy@f780: Fixing up cyclic dependency with fe330000.sdhci\n[    0.078] rockchip-gpio ff720000.gpio0: probed /pinctrl/gpio0@ff720000\n[    0.079] rockchip-gpio ff730000.gpio1: probed /pinctrl/gpio1@ff730000\n[    0.079] rockchip-gpio ff780000.gpio2: probed /pinctrl/gpio2@ff780000\n[    0.080] rockchip-gpio ff788000.gpio3: probed /pinctrl/gpio3@ff788000\n[    0.081] rockchip-gpio ff790000.gpio4: probed /pinctrl/gpio4@ff790000\n[    0.081] rockchip-pinctrl pinctrl: probed pinctrl\n[    0.118] vcc12v_dcin: 12000 mV, enabled\n[    0.118] reg-fixed-voltage dc-12v: vcc12v_dcin supplying 12000000uV\n[    0.118] reg-fixed-voltage vcc-sys: Looking up vin-supply from device tree\n[    0.118] vcc5v0_sys: supplied by vcc12v_dcin\n[    0.118] vcc12v_dcin: could not add device link regulator.2: -ENOENT\n[    0.118] vcc5v0_sys: 5000 mV, enabled\n[    0.118] reg-fixed-voltage vcc-sys: vcc5v0_sys supplying 5000000uV\n[    0.118] reg-fixed-voltage vcc3v3-sys: Looking up vin-supply from device tree\n[    0.118] vcc3v3_sys: supplied by vcc5v0_sys\n[    0.118] vcc5v0_sys: could not add device link regulator.3: -ENOENT\n[    0.118] vcc3v3_sys: 3300 mV, enabled\n[    0.119] reg-fixed-voltage vcc3v3-sys: vcc3v3_sys supplying 3300000uV\n[    0.119] reg-fixed-voltage vcc5v0-host-regulator: Looking up vin-supply from device tree\n[    0.119] vcc5v0_host: supplied by vcc5v0_sys\n[    0.119] vcc5v0_sys: could not add device link regulator.4: -ENOENT\n[    0.119] vcc5v0_host: at 5000 mV, enabled\n[    0.119] reg-fixed-voltage vcc5v0-host-regulator: vcc5v0_host supplying 0uV\n[    0.119] reg-fixed-voltage vcc5v0-typec-regulator: Looking up vin-supply from device tree\n[    0.119] vcc5v0_typec: supplied by vcc5v0_sys\n[    0.119] vcc5v0_sys: could not add device link regulator.5: -ENOENT\n[    0.119] vcc5v0_typec: at 5000 mV, enabled\n[    0.120] reg-fixed-voltage vcc5v0-typec-regulator: vcc5v0_typec supplying 0uV\n[    0.120] vcc_lan: 3300 mV, enabled\n[    0.120] reg-fixed-voltage vcc3v3-phy-regulator: vcc_lan supplying 3300000uV\n[    0.120] sd_vcc: no parameters, disabled\n[    0.120] reg-fixed-voltage sd-vcc-regulator: Looking up vin-supply from device tree\n[    0.120] sd_vcc: supplied by vcc3v3_sys\n[    0.120] reg-fixed-voltage sd-vcc-regulator: sd_vcc supplying 0uV\n[    0.121] iommu: Default domain type: Translated \n[    0.122] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vcodec-supply from device tree\n[    0.122] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vcodec-supply property in node /power-management@ff310000/power-controller failed\n[    0.122] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vdu-supply from device tree\n[    0.122] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vdu-supply property in node /power-management@ff310000/power-controller failed\n[    0.123] rockchip-pm-domain ff310000.power-management:power-controller: Looking up iep-supply from device tree\n[    0.123] rockchip-pm-domain ff310000.power-management:power-controller: Looking up iep-supply property in node /power-management@ff310000/power-controller failed\n[    0.124] SCSI subsystem initialized\n[    0.124] usbcore: registered new interface driver usbfs\n[    0.124] usbcore: registered new interface driver hub\n[    0.124] usbcore: registered new device driver usb\n[    0.125] mc: Linux media interface: v0.10\n[    0.125] videodev: Linux video capture interface: v2.00\n[    0.125] pps_core: LinuxPPS API ver. 1 registered\n[    0.125] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>\n[    0.125] PTP clock support registered\n[    0.125] EDAC MC: Ver: 3.0.0\n[    0.128] Advanced Linux Sound Architecture Driver Initialized.\n[    0.129] Bluetooth: Core ver 2.22\n[    0.129] NET: Registered protocol family 31\n[    0.129] Bluetooth: HCI device and connection manager initialized\n[    0.129] Bluetooth: HCI socket layer initialized\n[    0.129] Bluetooth: L2CAP socket layer initialized\n[    0.129] Bluetooth: SCO socket layer initialized\n[    0.130] clocksource: Switched to clocksource arch_sys_counter\n[    0.297] NET: Registered protocol family 2\n[    0.297] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)\n[    0.300] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)\n[    0.300] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)\n[    0.300] TCP bind hash table entries: 32768 (order: 7, 524288 bytes, linear)\n[    0.301] TCP: Hash tables configured (established 32768 bind 32768)\n[    0.301] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)\n[    0.301] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)\n[    0.301] NET: Registered protocol family 1\n[    0.302] RPC: Registered named UNIX socket transport module.\n[    0.302] RPC: Registered udp transport module.\n[    0.302] RPC: Registered tcp transport module.\n[    0.302] RPC: Registered tcp NFSv4.1 backchannel transport module.\n[    0.303] PCI: CLS 0 bytes, default 64\n[    0.303] Trying to unpack rootfs image as initramfs...\n[    1.680] Freeing initrd memory: 3864K\n[    1.681] rockchip-thermal ff260000.tsadc: tsadc is probed successfully!\n[    1.682] hw perfevents: enabled with armv8_cortex_a53 PMU driver, 7 counters available\n[    1.683] hw perfevents: enabled with armv8_cortex_a72 PMU driver, 7 counters available\n[    1.685] Initialise system trusted keyrings\n[    1.685] workingset: timestamp_bits=46 max_order=20 bucket_order=0\n[    1.692] squashfs: version 4.0 (2009/01/31) Phillip Lougher\n[    1.693] ntfs: driver 2.1.32 [Flags: R/O].\n[    1.694] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.\n[    1.694] fuse: init (API version 7.32)\n[    1.742] Key type asymmetric registered\n[    1.742] Asymmetric key parser 'x509' registered\n[    1.743] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 243)\n[    1.743] io scheduler mq-deadline registered\n[    1.743] io scheduler kyber registered\n[    1.745] phy phy-ff770000.syscon:phy@f780.0: Looking up phy-supply from device tree\n[    1.745] phy phy-ff770000.syscon:phy@f780.0: Looking up phy-supply property in node /syscon@ff770000/phy@f780 failed\n[    1.746] rockchip-usb2phy ff770000.syscon:usb2-phy@e450: IRQ index 0 not found\n[    1.746] phy phy-ff770000.syscon:usb2-phy@e450.1: Looking up phy-supply from device tree\n[    1.746] vcc5v0_host: could not add device link phy-ff770000.syscon:usb2-phy@e450.1: -ENOENT\n[    1.747] phy phy-ff770000.syscon:usb2-phy@e450.2: Looking up phy-supply from device tree\n[    1.747] phy phy-ff770000.syscon:usb2-phy@e450.2: Looking up phy-supply property in node /syscon@ff770000/usb2-phy@e450/otg-port failed\n[    1.747] phy phy-ff770000.syscon:usb2-phy@e450.2: Looking up vbus-supply from device tree\n[    1.747] phy phy-ff770000.syscon:usb2-phy@e450.2: Looking up vbus-supply property in node /syscon@ff770000/usb2-phy@e450/otg-port failed\n[    1.748] rockchip-usb2phy ff770000.syscon:usb2-phy@e460: IRQ index 0 not found\n[    1.748] phy phy-ff770000.syscon:usb2-phy@e460.3: Looking up phy-supply from device tree\n[    1.748] vcc5v0_host: could not add device link phy-ff770000.syscon:usb2-phy@e460.3: -ENOENT\n[    1.749] phy phy-ff770000.syscon:usb2-phy@e460.4: Looking up phy-supply from device tree\n[    1.749] phy phy-ff770000.syscon:usb2-phy@e460.4: Looking up phy-supply property in node /syscon@ff770000/usb2-phy@e460/otg-port failed\n[    1.749] phy phy-ff770000.syscon:usb2-phy@e460.4: Looking up vbus-supply from device tree\n[    1.749] phy phy-ff770000.syscon:usb2-phy@e460.4: Looking up vbus-supply property in node /syscon@ff770000/usb2-phy@e460/otg-port failed\n[    1.751] phy phy-ff770000.syscon:pcie-phy.5: Looking up phy-supply from device tree\n[    1.751] phy phy-ff770000.syscon:pcie-phy.5: Looking up phy-supply property in node /syscon@ff770000/pcie-phy failed\n[    1.751] phy phy-ff770000.syscon:pcie-phy.6: Looking up phy-supply from device tree\n[    1.751] phy phy-ff770000.syscon:pcie-phy.6: Looking up phy-supply property in node /syscon@ff770000/pcie-phy failed\n[    1.752] phy phy-ff770000.syscon:pcie-phy.7: Looking up phy-supply from device tree\n[    1.752] phy phy-ff770000.syscon:pcie-phy.7: Looking up phy-supply property in node /syscon@ff770000/pcie-phy failed\n[    1.752] phy phy-ff770000.syscon:pcie-phy.8: Looking up phy-supply from device tree\n[    1.752] phy phy-ff770000.syscon:pcie-phy.8: Looking up phy-supply property in node /syscon@ff770000/pcie-phy failed\n[    1.753] phy phy-ff7c0000.phy.9: Looking up phy-supply from device tree\n[    1.753] phy phy-ff7c0000.phy.9: Looking up phy-supply property in node /phy@ff7c0000/dp-port failed\n[    1.753] phy phy-ff7c0000.phy.10: Looking up phy-supply from device tree\n[    1.753] phy phy-ff7c0000.phy.10: Looking up phy-supply property in node /phy@ff7c0000/usb3-port failed\n[    1.753] rockchip-pm-domain ff310000.power-management:power-controller: Looking up tcpd0-supply from device tree\n[    1.753] rockchip-pm-domain ff310000.power-management:power-controller: Looking up tcpd0-supply property in node /power-management@ff310000/power-controller failed\n[    1.754] phy phy-ff800000.phy.11: Looking up phy-supply from device tree\n[    1.754] phy phy-ff800000.phy.11: Looking up phy-supply property in node /phy@ff800000/dp-port failed\n[    1.754] phy phy-ff800000.phy.12: Looking up phy-supply from device tree\n[    1.754] phy phy-ff800000.phy.12: Looking up phy-supply property in node /phy@ff800000/usb3-port failed\n[    1.754] rockchip-pm-domain ff310000.power-management:power-controller: Looking up tcpd1-supply from device tree\n[    1.754] rockchip-pm-domain ff310000.power-management:power-controller: Looking up tcpd1-supply property in node /power-management@ff310000/power-controller failed\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 0 I=120 O=120 OE=64\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 1 I=121 O=121 OE=65\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 2 I=122 O=122 OE=66\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 3 I=123 O=123 OE=67\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 4 I=124 O=124 OE=68\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 5 I=125 O=125 OE=69\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 6 I=126 O=126 OE=70\n[    1.756] gpio-brightsign-synthetic3 external-gpio: 7 I=127 O=127 OE=71\n[    1.758] iep ff670000.iep: Adding to iommu group 2\n[    1.758] iep: failed to find iep power down clock source.\n[    1.759] iep: IEP Power ON\n[    1.759] iep: IEP Power OFF\n[    1.759] iep: IEP Driver loaded succesfully\n[    1.759] iep: Module initialized.\n[    1.759] mpp_service mpp-srv: unknown mpp version for missing VCS info\n[    1.759] mpp_service mpp-srv: probe start\n[    1.760] mpp_rkvdec ff660000.rkvdec: Adding to iommu group 1\n[    1.761] mpp_rkvdec ff660000.rkvdec: probing start\n[    1.761] rkvdec_init:1242: failed on clk_get clk_hevc_cabac\n[    1.761] mpp_rkvdec ff660000.rkvdec: shared_video_hevc_cabac is not found!\n[    1.761] rkvdec_init:1273: No hevc cabac reset resource define\n[    1.761] mpp_rkvdec ff660000.rkvdec: probing finish\n[    1.763] mpp_vdpu2 ff650400.vdpu: Adding to iommu group 0\n[    1.763] mpp_vdpu2 ff650400.vdpu: probe device\n[    1.763] mpp_vdpu2 ff650400.vdpu: reset_group->rw_sem_on=0\n[    1.763] mpp_vdpu2 ff650400.vdpu: reset_group->rw_sem_on=0\n[    1.763] mpp_vdpu2 ff650400.vdpu: probing finish\n[    1.764] mpp_vepu2 ff650000.vepu: Adding to iommu group 0\n[    1.764] mpp_vepu2 ff650000.vepu: probing start\n[    1.764] mpp_vepu2 ff650000.vepu: reset_group->rw_sem_on=0\n[    1.764] mpp_vepu2 ff650000.vepu: reset_group->rw_sem_on=0\n[    1.765] mpp_vepu2 ff650000.vepu: probing finish\n[    1.766] mpp_service mpp-srv: probe success\n[    1.769] dma-pl330 ff6d0000.dma-controller: Loaded driver for PL330 DMAC-241330\n[    1.769] dma-pl330 ff6d0000.dma-controller: \tDBUFF-32x8bytes Num_Chans-6 Num_Peri-12 Num_Events-12\n[    1.771] dma-pl330 ff6e0000.dma-controller: Loaded driver for PL330 DMAC-241330\n[    1.771] dma-pl330 ff6e0000.dma-controller: \tDBUFF-128x8bytes Num_Chans-8 Num_Peri-20 Num_Events-16\n[    1.771] rockchip-pvtm ff770000.syscon:pvtm: pvtm@0 probed\n[    1.771] rockchip-pvtm ff770000.syscon:pvtm: pvtm@1 probed\n[    1.771] rockchip-pvtm ff770000.syscon:pvtm: pvtm@2 probed\n[    1.771] rockchip-pvtm ff770000.syscon:pvtm: pvtm@3 probed\n[    1.772] rockchip-system-monitor rockchip-system-monitor: system monitor probe\n[    1.773] input: brightsign-polled-io as /devices/platform/brightsign-polled-io/input/input0\n[    1.774] brightsign-poe-load brightsign-poe-load: PoE fitted\n[    1.774] of_pwm_get(): can't parse \"pwms\" property\n[    1.775] Serial: 8250/16550 driver, 10 ports, IRQ sharing disabled\n[    1.776] ff1a0000.serial: ttyS0 at MMIO 0xff1a0000 (irq = 46, base_baud = 1500000) is a 16550A\n[    1.779] cacheinfo: Unable to detect cache hierarchy for CPU 0\n[    1.786] brd: module loaded\n[    1.794] loop: module loaded\n[    1.794] zram: Added device: zram0\n[    1.794] lkdtm: No crash points registered, enable through debugfs\n[    1.795] no ATF memory for init\n[    1.799] rk_gmac-dwmac fe300000.ethernet: IRQ eth_wake_irq not found\n[    1.799] rk_gmac-dwmac fe300000.ethernet: IRQ eth_lpi not found\n[    1.799] rk_gmac-dwmac fe300000.ethernet: PTP uses main clock\n[    1.799] rk_gmac-dwmac fe300000.ethernet: Looking up phy-supply from device tree\n[    1.800] rk_gmac-dwmac fe300000.ethernet: clock input or output? (output).\n[    1.800] rk_gmac-dwmac fe300000.ethernet: TX delay(0x28).\n[    1.800] rk_gmac-dwmac fe300000.ethernet: RX delay(0x20).\n[    1.800] rk_gmac-dwmac fe300000.ethernet: integrated PHY? (no).\n[    1.800] rk_gmac-dwmac fe300000.ethernet: cannot get clock clk_mac_speed\n[    1.800] rk_gmac-dwmac fe300000.ethernet: init for RGMII\n[    1.800] rk_gmac-dwmac fe300000.ethernet: User ID: 0x10, Synopsys ID: 0x35\n[    1.800] rk_gmac-dwmac fe300000.ethernet: \tDWMAC1000\n[    1.800] rk_gmac-dwmac fe300000.ethernet: DMA HW capability register supported\n[    1.800] rk_gmac-dwmac fe300000.ethernet: RX Checksum Offload Engine supported\n[    1.800] rk_gmac-dwmac fe300000.ethernet: COE Type 2\n[    1.800] rk_gmac-dwmac fe300000.ethernet: TX Checksum insertion supported\n[    1.800] rk_gmac-dwmac fe300000.ethernet: Wake-Up On Lan supported\n[    1.800] rk_gmac-dwmac fe300000.ethernet: Normal descriptors\n[    1.800] rk_gmac-dwmac fe300000.ethernet: Ring mode enabled\n[    1.800] rk_gmac-dwmac fe300000.ethernet: Enable RX Mitigation via HW Watchdog Timer\n[    1.931] RTL8211F Gigabit Ethernet stmmac-0:00: attached PHY driver [RTL8211F Gigabit Ethernet] (mii_bus:phy_addr=stmmac-0:00, irq=POLL)\n[    1.931] RTL8211F Gigabit Ethernet stmmac-0:01: attached PHY driver [RTL8211F Gigabit Ethernet] (mii_bus:phy_addr=stmmac-0:01, irq=POLL)\n[    1.933] PPP generic driver version 2.4.2\n[    1.934] usbcore: registered new interface driver rtl8150\n[    1.934] usbcore: registered new interface driver r8152\n[    1.934] usbcore: registered new interface driver asix\n[    1.934] usbcore: registered new interface driver ax88179_178a\n[    1.934] usbcore: registered new interface driver cdc_ether\n[    1.934] usbcore: registered new interface driver net1080\n[    1.934] usbcore: registered new interface driver rndis_host\n[    1.934] usbcore: registered new interface driver cdc_subset\n[    1.934] usbcore: registered new interface driver cdc_ncm\n[    1.946] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver\n[    1.946] ehci-pci: EHCI PCI platform driver\n[    1.946] ehci-platform: EHCI generic platform driver\n[    1.949] ehci-platform fe380000.usb: EHCI Host Controller\n[    1.949] ehci-platform fe380000.usb: new USB bus registered, assigned bus number 1\n[    1.949] ehci-platform fe380000.usb: irq 38, io mem 0xfe380000\n[    1.960] ehci-platform fe380000.usb: USB 2.0 started, EHCI 1.00\n[    1.961] hub 1-0:1.0: USB hub found\n[    1.961] hub 1-0:1.0: 1 port detected\n[    1.964] ehci-platform fe3c0000.usb: EHCI Host Controller\n[    1.964] ehci-platform fe3c0000.usb: new USB bus registered, assigned bus number 2\n[    1.965] ehci-platform fe3c0000.usb: irq 40, io mem 0xfe3c0000\n[    1.976] ehci-platform fe3c0000.usb: USB 2.0 started, EHCI 1.00\n[    1.977] hub 2-0:1.0: USB hub found\n[    1.977] hub 2-0:1.0: 1 port detected\n[    1.979] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver\n[    1.979] ohci-platform: OHCI generic platform driver\n[    1.979] ohci-platform fe3a0000.usb: Generic Platform OHCI controller\n[    1.979] ohci-platform fe3a0000.usb: new USB bus registered, assigned bus number 3\n[    1.980] ohci-platform fe3a0000.usb: irq 39, io mem 0xfe3a0000\n[    2.038] hub 3-0:1.0: USB hub found\n[    2.038] hub 3-0:1.0: 1 port detected\n[    2.038] ohci-platform fe3e0000.usb: Generic Platform OHCI controller\n[    2.039] ohci-platform fe3e0000.usb: new USB bus registered, assigned bus number 4\n[    2.039] ohci-platform fe3e0000.usb: irq 41, io mem 0xfe3e0000\n[    2.098] hub 4-0:1.0: USB hub found\n[    2.098] hub 4-0:1.0: 1 port detected\n[    2.099] phy phy-ff770000.syscon:usb2-phy@e450.2: illegal mode\n[    2.099] xhci-hcd xhci-hcd.0.auto: xHCI Host Controller\n[    2.099] xhci-hcd xhci-hcd.0.auto: new USB bus registered, assigned bus number 5\n[    2.099] xhci-hcd xhci-hcd.0.auto: hcc params 0x0220fe64 hci version 0x110 quirks 0x0000000002010010\n[    2.099] xhci-hcd xhci-hcd.0.auto: irq 75, io mem 0xfe800000\n[    2.100] hub 5-0:1.0: USB hub found\n[    2.100] hub 5-0:1.0: 1 port detected\n[    2.101] xhci-hcd xhci-hcd.0.auto: xHCI Host Controller\n[    2.101] xhci-hcd xhci-hcd.0.auto: new USB bus registered, assigned bus number 6\n[    2.101] xhci-hcd xhci-hcd.0.auto: Host supports USB 3.0 SuperSpeed\n[    2.101] usb usb6: We don't know the algorithms for LPM for this host, disabling LPM.\n[    2.101] hub 6-0:1.0: USB hub found\n[    2.101] hub 6-0:1.0: 1 port detected\n[    2.102] phy phy-ff770000.syscon:usb2-phy@e460.4: illegal mode\n[    2.102] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller\n[    2.102] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 7\n[    2.102] xhci-hcd xhci-hcd.1.auto: hcc params 0x0220fe64 hci version 0x110 quirks 0x0000000002010010\n[    2.102] xhci-hcd xhci-hcd.1.auto: irq 76, io mem 0xfe900000\n[    2.103] hub 7-0:1.0: USB hub found\n[    2.103] hub 7-0:1.0: 1 port detected\n[    2.104] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller\n[    2.104] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 8\n[    2.104] xhci-hcd xhci-hcd.1.auto: Host supports USB 3.0 SuperSpeed\n[    2.104] usb usb8: We don't know the algorithms for LPM for this host, disabling LPM.\n[    2.104] hub 8-0:1.0: USB hub found\n[    2.104] hub 8-0:1.0: 1 port detected\n[    2.105] usbcore: registered new interface driver cdc_acm\n[    2.105] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters\n[    2.105] usbcore: registered new interface driver usb-storage\n[    2.105] usbcore: registered new interface driver usbserial_generic\n[    2.105] usbserial: USB Serial support registered for generic\n[    2.105] usbcore: registered new interface driver ch341\n[    2.105] usbserial: USB Serial support registered for ch341-uart\n[    2.105] usbcore: registered new interface driver cp210x\n[    2.105] usbserial: USB Serial support registered for cp210x\n[    2.106] usbcore: registered new interface driver ftdi_sio\n[    2.106] usbserial: USB Serial support registered for FTDI USB Serial Device\n[    2.106] usbcore: registered new interface driver keyspan\n[    2.106] usbserial: USB Serial support registered for Keyspan - (without firmware)\n[    2.106] usbserial: USB Serial support registered for Keyspan 1 port adapter\n[    2.106] usbserial: USB Serial support registered for Keyspan 2 port adapter\n[    2.106] usbserial: USB Serial support registered for Keyspan 4 port adapter\n[    2.106] usbcore: registered new interface driver option\n[    2.106] usbserial: USB Serial support registered for GSM modem (1-port)\n[    2.106] usbcore: registered new interface driver oti6858\n[    2.106] usbserial: USB Serial support registered for oti6858\n[    2.107] usbcore: registered new interface driver pl2303\n[    2.107] usbserial: USB Serial support registered for pl2303\n[    2.107] usbcore: registered new interface driver qcserial\n[    2.107] usbserial: USB Serial support registered for Qualcomm USB modem\n[    2.107] usbcore: registered new interface driver sierra\n[    2.107] usbserial: USB Serial support registered for Sierra USB modem\n[    2.107] mousedev: PS/2 mouse device common for all mice\n[    2.108] usbcore: registered new interface driver usbtouchscreen\n[    2.108] i2c /dev entries driver\n[    2.113] rk808 0-001b: chip id: 0x0\n[    2.116] rk808-regulator rk808-regulator: there is no dvs0 gpio\n[    2.117] rk808-regulator rk808-regulator: there is no dvs1 gpio\n[    2.118] rk808 0-001b: Looking up vcc1-supply from device tree\n[    2.118] vdd_center: supplied by vcc5v0_sys\n[    2.118] vcc5v0_sys: could not add device link regulator.8: -ENOENT\n[    2.119] vdd_center: 750 <--> 1350 mV at 900 mV, enabled\n[    2.120] rk808 0-001b: Looking up vcc2-supply from device tree\n[    2.120] vdd_cpu_l: supplied by vcc5v0_sys\n[    2.120] vcc5v0_sys: could not add device link regulator.9: -ENOENT\n[    2.122] vdd_cpu_l: 750 <--> 1300 mV at 900 mV, enabled\n[    2.122] rk808 0-001b: Looking up vcc3-supply from device tree\n[    2.122] vcc_ddr: supplied by vcc5v0_sys\n[    2.122] vcc5v0_sys: could not add device link regulator.10: -ENOENT\n[    2.123] vcc_ddr: at 5000 mV, enabled\n[    2.124] rk808 0-001b: Looking up vcc4-supply from device tree\n[    2.124] vcc_1v8: supplied by vcc5v0_sys\n[    2.124] vcc5v0_sys: could not add device link regulator.11: -ENOENT\n[    2.125] vcc_1v8: 1800 mV, enabled\n[    2.126] LDO_REG1: at 1800 mV, enabled\n[    2.127] rk808 0-001b: Looking up vcc6-supply from device tree\n[    2.127] LDO_REG1: supplied by vcc5v0_sys\n[    2.128] rk808 0-001b: Looking up vcc6-supply from device tree\n[    2.128] vcc1v8_hdmi: supplied by vcc5v0_sys\n[    2.128] vcc5v0_sys: could not add device link regulator.13: -ENOENT\n[    2.129] vcc1v8_hdmi: 1800 mV, enabled\n[    2.130] rk808 0-001b: Looking up vcc7-supply from device tree\n[    2.130] vcca_1v8: supplied by vcc5v0_sys\n[    2.130] vcc5v0_sys: could not add device link regulator.14: -ENOENT\n[    2.131] vcca_1v8: 1800 mV, enabled\n[    2.132] rk808 0-001b: Looking up vcc9-supply from device tree\n[    2.132] vcc_sdio: supplied by vcc5v0_sys\n[    2.132] vcc5v0_sys: could not add device link regulator.15: -ENOENT\n[    2.134] vcc_sdio: 1800 <--> 3300 mV at 3300 mV, enabled\n[    2.135] LDO_REG5: at 3000 mV, enabled\n[    2.135] rk808 0-001b: Looking up vcc9-supply from device tree\n[    2.135] LDO_REG5: supplied by vcc5v0_sys\n[    2.136] rk808 0-001b: Looking up vcc10-supply from device tree\n[    2.136] vcc_1v5: supplied by vcc5v0_sys\n[    2.136] vcc5v0_sys: could not add device link regulator.17: -ENOENT\n[    2.137] vcc_1v5: 1500 mV, enabled\n[    2.138] rk808 0-001b: Looking up vcc7-supply from device tree\n[    2.138] vcc0v9_hdmi: supplied by vcc5v0_sys\n[    2.138] vcc5v0_sys: could not add device link regulator.18: -ENOENT\n[    2.139] vcc0v9_hdmi: 900 mV, enabled\n[    2.141] rk808 0-001b: Looking up vcc11-supply from device tree\n[    2.141] vcc_3v0: supplied by vcc5v0_sys\n[    2.141] vcc5v0_sys: could not add device link regulator.19: -ENOENT\n[    2.142] vcc_3v0: 3000 mV, enabled\n[    2.143] SWITCH_REG1: no parameters, enabled\n[    2.143] rk808 0-001b: Looking up vcc8-supply from device tree\n[    2.143] SWITCH_REG1: supplied by vcc3v3_sys\n[    2.144] SWITCH_REG2: no parameters, enabled\n[    2.144] rk808 0-001b: Looking up vcc12-supply from device tree\n[    2.144] SWITCH_REG2: supplied by vcc3v3_sys\n[    2.146] fan53555-regulator 0-0040: FAN53555 Option[8] Rev[1] Detected!\n[    2.149] fan53555-regulator 0-0040: Looking up vin-supply from device tree\n[    2.149] vdd_cpu_b: supplied by vcc5v0_sys\n[    2.149] vcc5v0_sys: could not add device link regulator.22: -ENOENT\n[    2.151] vdd_cpu_b: 712 <--> 1300 mV at 1000 mV, enabled\n[    2.154] fan53555-regulator 0-0041: FAN53555 Option[8] Rev[1] Detected!\n[    2.157] fan53555-regulator 0-0041: Looking up vin-supply from device tree\n[    2.157] vdd_gpu: supplied by vcc5v0_sys\n[    2.157] vcc5v0_sys: could not add device link regulator.23: -ENOENT\n[    2.159] vdd_gpu: 712 <--> 1300 mV at 1000 mV, enabled\n[    2.165] dw_wdt ff848000.watchdog: No valid TOPs array specified\n[    2.166] device-mapper: ioctl: 4.44.0-ioctl (2021-02-01) initialised: dm-devel@redhat.com\n[    2.167] cpu cpu0: bin=1\n[    2.167] cpu cpu0: leakage=18\n[    2.167] cpu cpu0: Looking up cpu-supply from device tree\n[    2.167] cpu cpu0: bin-scale=34\n[    2.167] cpu cpu4: bin=1\n[    2.167] cpu cpu4: leakage=31\n[    2.167] cpu cpu4: Looking up cpu-supply from device tree\n[    2.168] cpu cpu4: bin-scale=17\n[    2.168] cpu cpu0: Looking up cpu-supply from device tree\n[    2.169] cpu cpu0: avs=0\n[    2.169] cpu cpu4: Looking up cpu-supply from device tree\n[    2.171] cpu cpu4: avs=0\n[    2.171] cpu cpu0: EM: created perf domain\n[    2.171] cpu cpu0: l=10000 h=2147483647 hyst=5000 l_limit=0 h_limit=0 h_table=0\n[    2.171] cpu cpu0: failed to read out thermal zone (-22)\n[    2.175] cpu cpu4: EM: OPP:600000 is inefficient\n[    2.175] cpu cpu4: EM: OPP:408000 is inefficient\n[    2.175] cpu cpu4: EM: created perf domain\n[    2.176] cpu cpu4: l=10000 h=2147483647 hyst=5000 l_limit=0 h_limit=0 h_table=0\n[    2.176] cpu cpu4: failed to read out thermal zone (-22)\n[    2.210] sdhci: Secure Digital Host Controller Interface driver\n[    2.210] sdhci: Copyright(c) Pierre Ossman\n[    2.210] Synopsys Designware Multimedia Card Interface Driver\n[    2.211] sdhci-pltfm: SDHCI platform and OF driver helper\n[    2.212] dwmmc_rockchip fe320000.mmc: No normal pinctrl state\n[    2.212] dwmmc_rockchip fe320000.mmc: No idle pinctrl state\n[    2.212] dwmmc_rockchip fe320000.mmc: IDMAC supports 32-bit address mode.\n[    2.212] dwmmc_rockchip fe320000.mmc: Using internal DMA controller.\n[    2.212] dwmmc_rockchip fe320000.mmc: Version ID is 270a\n[    2.212] dwmmc_rockchip fe320000.mmc: DW MMC controller at irq 36,32 bit host data width,256 deep fifo\n[    2.212] dwmmc_rockchip fe320000.mmc: Looking up vmmc-supply from device tree\n[    2.212] dwmmc_rockchip fe320000.mmc: Looking up vqmmc-supply from device tree\n[    2.213] dwmmc_rockchip fe320000.mmc: Got CD GPIO\n[    2.213] sdhci-arasan fe330000.sdhci: Looking up vmmc-supply from device tree\n[    2.213] sdhci-arasan fe330000.sdhci: Looking up vmmc-supply property in node /sdhci@fe330000 failed\n[    2.213] sdhci-arasan fe330000.sdhci: Looking up vqmmc-supply from device tree\n[    2.213] sdhci-arasan fe330000.sdhci: Looking up vqmmc-supply property in node /sdhci@fe330000 failed\n[    2.214] cryptodev: driver 1.12 loaded.\n[    2.215] hid: raw HID events driver (C) Jiri Kosina\n[    2.215] usbcore: registered new interface driver usbhid\n[    2.215] usbhid: USB HID core driver\n[    2.215] rockchip-dmc dmc: Looking up center-supply from device tree\n[    2.216] rockchip-dmc dmc: Looking up center-supply from device tree\n[    2.216] vdd_center: could not add device link dmc: -EEXIST\n[    2.216] vdd_center: Failed to create debugfs directory\n[    2.216] rockchip-dmc dmc: Failed to get ddr_leakage\n[    2.216] rockchip-dmc dmc: avs=0\n[    2.216] rockchip-dmc dmc: failed to get vop bandwidth to dmc rate\n[    2.216] rockchip-dmc dmc: l=-2147483648 h=2147483647 hyst=0 l_limit=0 h_limit=0 h_table=0\n[    2.216] rockchip-dmc dmc: could not find power_model node\n[    2.218] rockchip-saradc ff100000.saradc: Looking up vref-supply from device tree\n[    2.220] usbcore: registered new interface driver snd-usb-audio\n[    2.222] rockchip-pm-domain ff310000.power-management:power-controller: Looking up sdioaudio-supply from device tree\n[    2.222] rockchip-pm-domain ff310000.power-management:power-controller: Looking up sdioaudio-supply property in node /power-management@ff310000/power-controller failed\n[    2.224] u32 classifier\n[    2.224]     input device check on\n[    2.224]     Actions configured\n[    2.224] Initializing XFRM netlink socket\n[    2.225] NET: Registered protocol family 10\n[    2.225] Segment Routing with IPv6\n[    2.225] NET: Registered protocol family 17\n[    2.225] NET: Registered protocol family 15\n[    2.226] Bridge firewalling registered\n[    2.226] [BT_RFKILL]: Enter rfkill_rk_init\n[    2.226] [WLAN_RFKILL]: Enter rfkill_wlan_init\n[    2.226] mmc_host mmc1: Bus speed (slot 0) = 400000Hz (slot req 400000Hz, actual 400000HZ div = 0)\n[    2.227] registered taskstats version 1\n[    2.227] Loading compiled-in X.509 certificates\n[    2.228] rga: rga2, irq = 56, match scheduler\n[    2.228] rga: rga2 hardware loaded successfully, hw_version:3.2.18218.\n[    2.228] rockchip-pm-domain ff310000.power-management:power-controller: Looking up rga-supply from device tree\n[    2.228] rockchip-pm-domain ff310000.power-management:power-controller: Looking up rga-supply property in node /power-management@ff310000/power-controller failed\n[    2.228] rga: rga2 probe successfully\n[    2.229] rga_iommu: IOMMU binding successfully, default mapping core[0x4]\n[    2.229] rga: Module initialized. v1.2.27\n[    2.239] mmc0: SDHCI controller on fe330000.sdhci [fe330000.sdhci] using ADMA\n[    2.250] reg-fixed-voltage vcc-0v9: Looking up vin-supply from device tree\n[    2.250] vcc_0v9: supplied by vcc3v3_sys\n[    2.250] vcc3v3_sys: could not add device link regulator.24: -ENOENT\n[    2.250] vcc_0v9: 900 mV, enabled\n[    2.250] reg-fixed-voltage vcc-0v9: vcc_0v9 supplying 900000uV\n[    2.250] rockchip-iodomain ff320000.syscon:io-domains: Looking up pmu1830-supply from device tree\n[    2.251] rockchip-iodomain ff320000.syscon:io-domains: pmu1830(1800000 uV) supplied by vcc_1v8\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: Looking up bt656-supply from device tree\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: bt656(3000000 uV) supplied by vcc_3v0\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: Looking up audio-supply from device tree\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: audio(3000000 uV) supplied by vcc_3v0\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: Looking up sdmmc-supply from device tree\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: sdmmc(3300000 uV) supplied by vcc_sdio\n[    2.251] rockchip-iodomain ff770000.syscon:io-domains: Looking up gpio1830-supply from device tree\n[    2.252] rockchip-iodomain ff770000.syscon:io-domains: gpio1830(3000000 uV) supplied by vcc_3v0\n[    2.259] rockchip-pcie f8000000.pcie: host bridge /pcie@f8000000 ranges:\n[    2.259] rockchip-pcie f8000000.pcie:      MEM 0x00fa000000..0x00fbdfffff -> 0x00fa000000\n[    2.259] rockchip-pcie f8000000.pcie:       IO 0x00fbe00000..0x00fbefffff -> 0x00fbe00000\n[    2.260] rockchip-pcie f8000000.pcie: Looking up vpcie12v-supply from device tree\n[    2.260] rockchip-pcie f8000000.pcie: Looking up vpcie12v-supply property in node /pcie@f8000000 failed\n[    2.260] rockchip-pcie f8000000.pcie: no vpcie12v regulator found\n[    2.260] rockchip-pcie f8000000.pcie: Looking up vpcie3v3-supply from device tree\n[    2.260] rockchip-pcie f8000000.pcie: Looking up vpcie1v8-supply from device tree\n[    2.260] rockchip-pcie f8000000.pcie: Looking up vpcie0v9-supply from device tree\n[    2.279] mmc0: new HS200 MMC card at address 0001\n[    2.280] mmcblk0: mmc0:0001 4FTE4R 1.82 GiB \n[    2.280] mmcblk0boot0: mmc0:0001 4FTE4R partition 1 4.00 MiB\n[    2.281] mmcblk0boot1: mmc0:0001 4FTE4R partition 2 4.00 MiB\n[    2.281] mmcblk0rpmb: mmc0:0001 4FTE4R partition 3 512 KiB, chardev (237:0)\n[    2.284]  mmcblk0: p1 p2 p3 p4 p5 p6 p7\n[    2.345] vendor storage:20190527 ret = 0\n[    2.353] usb 7-1: new high-speed USB device number 2 using xhci-hcd\n[    2.480] vcc_sdio: ramp_delay not set\n[    2.507] mmc_host mmc1: Bus speed (slot 0) = 148500000Hz (slot req 150000000Hz, actual 148500000HZ div = 0)\n[    2.532] usb-storage 7-1:1.0: USB Mass Storage device detected\n[    2.533] scsi host0: usb-storage 7-1:1.0\n[    2.650] dwmmc_rockchip fe320000.mmc: Successfully tuned phase to 211\n[    2.650] mmc1: new ultra high speed SDR104 SDHC card at address aaaa\n[    2.650] mmcblk1: mmc1:aaaa SK32G 29.7 GiB \n[    2.652]  mmcblk1: p1\n[    2.710] rockchip-pm-domain ff310000.power-management:power-controller: Looking up sd-supply from device tree\n[    2.710] rockchip-pm-domain ff310000.power-management:power-controller: Looking up sd-supply property in node /power-management@ff310000/power-controller failed\n[    2.817] rockchip-pcie f8000000.pcie: PCIe link training gen1 timeout!\n[    2.817] rockchip-pcie f8000000.pcie: deferred probe failed\n[    2.819] rockchip-pcie: probe of f8000000.pcie failed with error -110\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up isp1-supply from device tree\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up isp1-supply property in node /power-management@ff310000/power-controller failed\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up isp0-supply from device tree\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up isp0-supply property in node /power-management@ff310000/power-controller failed\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up gpu-supply from device tree\n[    2.822] rockchip-pm-domain ff310000.power-management:power-controller: Looking up gpu-supply property in node /power-management@ff310000/power-controller failed\n[    2.822] cfg80211: Loading compiled-in X.509 certificates for regulatory database\n[    2.828] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'\n[    2.828] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2\n[    2.828] cfg80211: failed to load regulatory.db\n[    2.830] ALSA device list:\n[    2.830]   #0: add2010-audio\n[    2.830]   #1: spdif-audio\n[    2.834] Freeing unused kernel memory: 5248K\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vopb-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vopb-supply property in node /power-management@ff310000/power-controller failed\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vopl-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vopl-supply property in node /power-management@ff310000/power-controller failed\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vo-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vo-supply property in node /power-management@ff310000/power-controller failed\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up hdcp-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up hdcp-supply property in node /power-management@ff310000/power-controller failed\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vio-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up vio-supply property in node /power-management@ff310000/power-controller failed\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up edp-supply from device tree\n[    2.835] rockchip-pm-domain ff310000.power-management:power-controller: Looking up edp-supply property in node /power-management@ff310000/power-controller failed\n[    2.853] Run /init as init process\n[    2.853]   with arguments:\n[    2.853]     /init\n[    2.853]   with environment:\n[    2.853]     HOME=/\n[    2.853]     TERM=linux\n[    2.872] random: pvscan: uninitialized urandom read (4 bytes read)\n[    2.888]   pvscan[1738] PV /dev/mmcblk0p7 online, VG bsos is complete.\n[    2.888]   pvscan[1738] VG bsos run autoactivation.\n[    2.894]   3 logical volume(s) in volume group \"bsos\" now active\n[    2.951] random: pvscan: uninitialized urandom read (4 bytes read)\n[    2.966]   pvscan[1751] PV /dev/mmcblk0p7 online, VG bsos is complete.\n[    2.966]   pvscan[1751] VG bsos skip autoactivation.\n[    3.032] random: pvs: uninitialized urandom read (4 bytes read)\n[    3.061]   PV             VG   Fmt  Attr PSize  PFree  \n[    3.061]   /dev/mmcblk0p7 bsos lvm2 a--  <1.67g 720.00m\n[    3.126]   VG   #PV #LV #SN Attr   VSize  VFree  \n[    3.126]   bsos   1   3   0 wz--n- <1.67g 720.00m\n[    3.203]   LV       VG   Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert\n[    3.203]   rootfs   bsos -wi-a----- 188.00m                                                    \n[    3.203]   storage  bsos -wi-a----- 768.00m                                                    \n[    3.203]   writable bsos -wi-a-----  32.00m                                                    \n[    3.345] device-mapper: verity: sha256 using implementation \"sha256-generic\"\n[    3.552] scsi 0:0:0:0: Direct-Access     Realtek  RTL9210B-CG      1.00 PQ: 0 ANSI: 6\n[    3.560] sd 0:0:0:0: [sda] Read Capacity(10) failed: Result: hostbyte=0x00 driverbyte=0x08\n[    3.560] sd 0:0:0:0: [sda] Sense Key : 0x5 [current] \n[    3.560] sd 0:0:0:0: [sda] ASC=0x24 ASCQ=0x0 \n[    3.560] sd 0:0:0:0: [sda] 0 512-byte logical blocks: (0 B/0 B)\n[    3.560] sd 0:0:0:0: [sda] 0-byte physical blocks\n[    3.561] sd 0:0:0:0: [sda] Write Protect is off\n[    3.561] sd 0:0:0:0: [sda] Mode Sense: 37 00 00 08\n[    3.561] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA\n[    3.605] sd 0:0:0:0: [sda] Read Capacity(10) failed: Result: hostbyte=0x00 driverbyte=0x08\n[    3.605] sd 0:0:0:0: [sda] Sense Key : 0x5 [current] \n[    3.605] sd 0:0:0:0: [sda] ASC=0x24 ASCQ=0x0 \n[    3.607] sd 0:0:0:0: [sda] Attached SCSI removable disk\n[    3.612] Starting udev\n[    3.668] \n[    3.668] \n[    3.669] udevd[1801]: starting version 3.2.9\n[    3.714] udevd[1802]: starting eudev-3.2.9\n[    3.939] random: lvm: uninitialized urandom read (4 bytes read)\n[    4.057] random: pvscan: uninitialized urandom read (4 bytes read)\n[    4.098]   pvscan[1830] PV /dev/mmcblk0p7 online, VG bsos is complete.\n[    4.098]   pvscan[1830] VG bsos run autoactivation.\n[    4.100]   3 logical volume(s) in volume group \"bsos\" now active\n[    4.148] random: pvs: uninitialized urandom read (4 bytes read)\n[    4.172]   PV             VG   Fmt  Attr PSize  PFree  \n[    4.172]   /dev/mmcblk0p7 bsos lvm2 a--  <1.67g 720.00m\n[    4.243]   VG   #PV #LV #SN Attr   VSize  VFree  \n[    4.243]   bsos   1   3   0 wz--n- <1.67g 720.00m\n[    4.381] total 0\n[    4.381] brw------- 1 root root 253,   2 Jan  1 00:00 bsos-rootfs\n[    4.381] brw------- 1 root root 253,   3 Jan  1 00:00 bsos-rootfs-verified\n[    4.381] brw------- 1 root root 253,   1 Jan  1 00:00 bsos-storage\n[    4.381] brw------- 1 root root 253,   0 Jan  1 00:00 bsos-writable\n[    4.381] crw------- 1 root root  10, 236 Jan  1 00:00 control\n[    4.394] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)\n[    4.718] BRIGHTSIGN boot=9.0.85 rescue=9.0.74 mission=9.0.97 model=XD1035 REVE serial=RE433D006644 hw=80102114f79 sk=1 sb=0\n[    4.764] UTC read from RTC: Wed Nov  8 06:10:46 2023\n[    4.773] Looking for crash dump: \n[    4.813] Reset causes: 0x0 unsupported-on-native\n[    4.813] No post-mortem crash dump available.\n[    4.854] Starting system message bus: \n[    4.896] dbus.\n[    5.221] handle_net /devices/platform/fe300000.ethernet/net/eth0 eth0\n[    5.224] Configuring IO scheduler for mmcblk1\n[    5.225] handle_net /devices/virtual/net/lo lo\n[    5.225] Hotplug ignoring network interface: lo\n[    5.229] Configuring IO scheduler for sda\n[    5.230] Configuring IO scheduler for mmcblk0\n[    5.233] USB vidpid=1d6b:0001\n[    5.235] USB vidpid=1d6b:0002\n[    5.236] USB vidpid=1d6b:0001\n[    5.236] USB vidpid=0bda:9210\n[    5.236] USB vidpid=1d6b:0003\n[    5.238] USB vidpid=1d6b:0002\n[    5.239] USB vidpid=1d6b:0003\n[    5.239] USB vidpid=1d6b:0002\n[    5.240] USB vidpid=1d6b:0002\n[    5.247] usbmount-1936: mount mmcblk1 /devices/platform/fe320000.mmc/mmc_host/mmc1/mmc1:aaaa/block/mmcblk1\n[    5.247] usbmount-1937: mount mmcblk0 /devices/platform/fe330000.sdhci/mmc_host/mmc0/mmc0:0001/block/mmcblk0\n[    5.258] usbmount-1936: path='/sys/devices/platform/fe320000.mmc/mmc_host/mmc1/mmc1:aaaa'\n[    5.258] usbmount-1937: path='/sys/devices/platform/fe330000.sdhci/mmc_host/mmc0/mmc0:0001'\n[    5.259] usbmount-1937: Ignoring eMMC\n[    5.263]  mmcblk1: p1\n[    5.275] Disk /dev/mmcblk1: 30 GB, 31914983424 bytes, 62333952 sectors\n[    5.275] 3880 cylinders, 255 heads, 63 sectors/track\n[    5.275] Units: sectors of 1 * 512 = 512 bytes\n[    5.275] \n[    5.275] Device       Boot StartCHS    EndCHS        StartLBA     EndLBA    Sectors  Size Id Type\n[    5.275] /dev/mmcblk1p1    0,130,3     1023,254,63       8192   62333951   62325760 29.7G  c Win95 FAT32 (LBA)\n[    5.293] usbmount-1936: Whole device /dev/mmcblk1...\n[    5.388] ID_PART_TABLE_TYPE=dos\n[    5.388] usbmount-1936: Considering /dev/mmcblk1p4...\n[    5.391] usbmount-1936: Considering /dev/mmcblk1p3...\n[    5.394] usbmount-1936: Considering /dev/mmcblk1p2...\n[    5.398] usbmount-1936: Considering /dev/mmcblk1p1...\n[    5.402] usbmount-1936: /dev/mmcblk1p1 is a valid block device\n[    5.406] Hotplug ignoring network interface: eth0\n[    5.441] ID_FS_UUID=6432-3934\n[    5.441] ID_FS_UUID_ENC=6432-3934\n[    5.441] ID_FS_BLOCK_SIZE=512\n[    5.441] ID_FS_TYPE=vfat\n[    5.449] usbmount-1936: Filesystem on /dev/mmcblk1p1\n[    5.541] storage-monitor ADD sda\n[    5.543] storage-monitor sda media added\n[    5.547] Mounting storage volume\n[    5.549] usbmount-2062: mount sda /block/sda\n[    5.552] usbmount-2062: path='/sys/devices/platform/usb@fe900000/fe900000.usb/xhci-hcd.1.auto/usb7/7-1/7-1:1.0/host0/target0:0:0/0:0:0:0'\n[    5.553] usbmount-1936: ID_FS_TYPE=vfat\n[    5.555] usbmount-2062: ssd_device=/sys/devices/platform/usb@fe900000/fe900000.usb/xhci-hcd.1.auto/usb8/8-1/8-1:1.0/host0/target0:0:0/0:0:0:0\n[    5.555] EXT4-fs (dm-1): mounted filesystem with ordered data mode. Opts: (null)\n[    5.566] sd 0:0:0:0: [sda] Read Capacity(10) failed: Result: hostbyte=0x00 driverbyte=0x08\n[    5.566] sd 0:0:0:0: [sda] Sense Key : 0x5 [current] \n[    5.566] sd 0:0:0:0: [sda] ASC=0x24 ASCQ=0x0 \n[    5.570] fdisk: can't open '/dev/sda'\n[    5.573] usbmount-2062: Whole device /dev/sda...\n[    5.575] usbmount-1936: device_size=62325760\n[    5.576] usbmount-1936: fsck_timeout=3626s calculated\n[    5.579] usbmount-2062: Considering /dev/sda4...\n[    5.582] usbmount-2062: Considering /dev/sda3...\n[    5.584] usbmount-2062: Considering /dev/sda2...\n[    5.587] usbmount-2062: Considering /dev/sda1...\n[    5.590] usbmount-2062: Considering /dev/sda...\n[    5.592] usbmount-2062: /dev/sda is a valid block device\n[    5.600] usbmount-2062: Unknown volume type on usb\n[    5.650] No appropriate upgrade files found.\n[    5.779] net-configure: eth0 start\n[    5.816] iep: iep dpi mode inactivity\n[    5.856] Successfully initialized wpa_supplicant\n[    5.887] rk_gmac-dwmac fe300000.ethernet eth0: PHY [stmmac-0:00] driver [RTL8211F Gigabit Ethernet] (irq=POLL)\n[    5.896] rk_gmac-dwmac fe300000.ethernet eth0: No Safety Features support found\n[    5.896] rk_gmac-dwmac fe300000.ethernet eth0: PTP not supported by HW\n[    5.897] rk_gmac-dwmac fe300000.ethernet eth0: configuring for phy/rgmii link mode\n[    5.925] fsck.fat 3.0.25 (2014-01-17)\n[    5.925] /dev/mmcblk1p1: 44 files, 621/973584 clusters\n[    5.928] timely: /sbin/dosfsck exited with 0 after 0s\n[    5.929] usbmount-1936: fsck.vfat /dev/mmcblk1p1 succeeded\n[    5.936] mount-filesystem-2142: /dev/mmcblk1p1 /storage/sd.fwup vfat\n[    5.978] dhcpcd[2147]: dhcpcd not running\n[    6.017] mount-filesystem-2142: Successfully mounted /dev/mmcblk1p1 at /storage/sd.fwup\n[    6.018] usbmount-1936: Successfully mounted /dev/mmcblk1p1 at /storage/sd.fwup\n[    6.020] usbmount-1936: Cleaned up fsck cruft at /storage/sd.fwup\n[    6.036] dhcpcd[2159]: dhcpcd-9.4.1 starting\n[    6.037] dhcpcd[2163]: DUID 00:02:04:33:69:4d:34:45:33:33:44:30:30:36:38:32:34\n[    6.052] forked to background, child pid 2163\n[    6.062] IP:eth0 NOCARRIER down\n[    6.083] No inbound bandwidth shaping on eth0\n[    6.175] usbmount-1936: Looking for firmware update at /storage/sd.fwup\n[    6.199] No appropriate upgrade files found.\n[    6.202] usbmount-1936: Migrating mounted filesystem from /storage/sd.fwup to /storage/sd\n[    6.250] Power source: PSU\n[    6.267] modprobe: module phy-brcm-usb-dvr not found in modules.dep\n[    6.269] modprobe: module xhci-brcm not found in modules.dep\n[    7.325] usbcore: registered new interface driver btusb\n[    7.380] random: avahi-daemon: uninitialized urandom read (4 bytes read)\n[    7.398] WiFi not found\n[    7.460] tun: Universal TUN/TAP device driver, 1.6\n[    7.476] net.ipv4.conf.eth0.force_igmp_version = 0\n[    7.530] BrightSign RTL9210 is at /dev/sda\n[    7.614] Current RTL9210 firmware version is - 1.30.28\n[    7.614] RTL9210 firmware is up to date\n[    7.621] sd 0:0:0:0: [sda] Read Capacity(10) failed: Result: hostbyte=0x00 driverbyte=0x08\n[    7.621] sd 0:0:0:0: [sda] Sense Key : 0x5 [current] \n[    7.621] sd 0:0:0:0: [sda] ASC=0x24 ASCQ=0x0 \n[    7.724] Panda firmware version 01.02 available for upgrades\n[    7.951] rk_gmac-dwmac fe300000.ethernet eth0: Link is Up - 100Mbps/Half - flow control off\n[    7.951] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready\n[    7.980] random: dhcpcd: uninitialized urandom read (112 bytes read)\n[    7.984] No Pandas found\n[    7.995] tangent: loading out-of-tree module taints kernel.\n[    8.043] tangent 1-0018: Tangent Micro version: tangent beabe2e (cobra)\n[    8.070] tangent 1-0018: Subdev 0 (\"\") is the CORE\n[    8.070] tangent 1-0018: Subdev 1 (\"IR-TRS\") is Infrared I/O\n[    8.070] Registered IR keymap rc-empty\n[    8.070] rc rc0: IR-TRS as /devices/platform/ff110000.i2c/i2c-1/1-0018/rc/rc0\n[    8.070] rc rc0: lirc_dev: driver tangent registered at minor = 0, raw IR receiver, raw IR transmitter\n[    8.071] input: IR-TRS as /devices/platform/ff110000.i2c/i2c-1/1-0018/rc/rc0/input1\n[    8.071] tangent 1-0018: Subdev 2 (\"IR-IO\") is Infrared I/O\n[    8.071] Registered IR keymap rc-empty\n[    8.071] rc rc1: IR-IO as /devices/platform/ff110000.i2c/i2c-1/1-0018/rc/rc1\n[    8.074] rc rc1: lirc_dev: driver tangent registered at minor = 1, raw IR receiver, raw IR transmitter\n[    8.075] input: IR-IO as /devices/platform/ff110000.i2c/i2c-1/1-0018/rc/rc1/input2\n[    8.082] tangent: uC running version:    beabe2e\n[    8.089] tangent: uC available version:  beabe2e\n[    8.090] tangent: firmware already matches available version\n[    8.105] random: dbus-uuidgen: uninitialized urandom read (8 bytes read)\n[    8.106] Starting extensions message bus: \n[    8.114] dbus.\n[    8.324] dw-apb-uart ff1a0000.serial: failed to request DMA, use interrupt mode\n[    8.324] share-terminal: serial console only\n[    8.355] bluetoothd[2372]: Bluetooth daemon 5.43\n[    8.366] bluetoothd[2372]: Starting SDP server\n[    8.378] bluetoothd[2372]: kernel lacks bnep-protocol support\n[    8.378] bluetoothd[2372]: System does not support network plugin\n[    8.380] bluetoothd[2372]: Bluetooth management interface 1.18 initialized\n[    8.468] random: certutil: uninitialized urandom read (32 bytes read)\n[    8.539] Loading Panfrost GPU driver\n[    8.555] panfrost ff9a0000.gpu: clock rate = 200000000\n[    8.556] panfrost ff9a0000.gpu: Looking up mali-supply from device tree\n[    8.557] panfrost ff9a0000.gpu: mali-t860 id 0x860 major 0x2 minor 0x0 status 0x0\n[    8.557] panfrost ff9a0000.gpu: features: 00000000,100e77bf, issues: 00000000,24040400\n[    8.557] panfrost ff9a0000.gpu: Features: L2:0x07120206 Shader:0x00000000 Tiler:0x00000809 Mem:0x1 MMU:0x00002830 AS:0xff JS:0x7\n[    8.557] panfrost ff9a0000.gpu: shader_present=0xf l2_present=0x1\n[    8.559] [drm] Initialized panfrost 1.1.0 20180908 for ff9a0000.gpu on minor 0\n[    8.562] Default to restarting weston with brightsign\n[    8.625] Failed to initialize DRI paths\n[    8.625] GraphicsUpscaleFactor: 1\n[    8.625] repaint-window set to 16\n[    8.672] rockchip-vop ff900000.vop: Adding to iommu group 3\n[    8.677] Win 2 set to primary\n[    8.677] Init primary/cursor Win 2\n[    8.678] Init primary/cursor Win 3\n[    8.678] Init overlay Win 0\n[    8.678] Init overlay Win 1\n[    8.678] Init overlay Win 4\n[    8.678] Init overlay Win 5\n[    8.678] Init overlay Win 6\n[    8.678] rockchip-drm display-subsystem: bound ff900000.vop (ops vop_component_ops [rockchipdrm])\n[    8.679] dwhdmi-rockchip ff940000.hdmi: Detected HDMI TX controller v2.11a with HDCP (DWC HDMI 2.0 TX PHY)\n[    8.680] dwhdmi-rockchip ff940000.hdmi: IRQ index 1 not found\n[    8.681] rockchip-drm display-subsystem: bound ff940000.hdmi (ops dw_hdmi_rockchip_ops [rockchipdrm])\n[    8.682] rockchip-drm display-subsystem: failed to parse loader memory\n[    8.716] rockchip-drm display-subsystem: [drm] fb0: rockchipdrmfb frame buffer device\n[    8.734] [drm] Initialized rockchip 3.0.0 20140818 for display-subsystem on minor 1\n[    8.735] no ATF memory for init\n[    8.824] input: hdmi_cec_key as /devices/platform/ff940000.hdmi/dw-hdmi-cec.3.auto/input/input3\n[    9.843] Starting weston --tty 1 --debug --config=/var/volatile/etc/bs_weston.ini -Swayland-0 --continue-without-input\n[    9.844] VOP1 disable weston restarts\n[    9.844] Starting BrightSign application...\n[    9.908] Starting brightsign tracing: default\n[    9.908] /etc/init.d/brightsign.sh: \n[    9.908] line 12: \n[    9.908] can't create /var/volatile/lttng/trace-brightsign.log: nonexistent directory\n[    9.908] \n[    9.908] Failed to start tracing 0\n[    9.939] WARNING: debug protocol has been enabled. This is a potential denial-of-service attack vector and information leak.\n[   10.411] Failed to create /home/root/.cache for shader cache (Read-only file system)---disabling.\n[   11.262] IP:eth0 BOUND6 ip=2600:1700:dac0:2060::23 dns=\n[   11.270] random: crng init done\n[   11.270] random: 28 urandom warning(s) missed due to ratelimiting\n[   11.630] could not load cursor 'dnd-move'\n[   11.630] could not load cursor 'dnd-copy'\n[   11.630] could not load cursor 'dnd-none'\n[   11.633] could not load cursor 'dnd-move'\n[   11.633] could not load cursor 'dnd-copy'\n[   11.633] could not load cursor 'dnd-none'\n[   11.736] xkbcommon: ERROR: \n[   11.736] couldn't find a Compose file for locale \"C\"\n[   11.736] could not create XKB compose table for locale 'C'.  Disabiling compose\n[   13.543] xkbcommon: ERROR: \n[   13.543] couldn't find a Compose file for locale \"C\"\n[   13.543] could not create XKB compose table for locale 'C'.  Disabiling compose\n[   15.490] BrightSign application cobra-9.0.97 starting\n[   15.589] OpenVpn is not configured\n[   15.599] NetworkTime: server changed to 'http://time.bsn.cloud'\n[   15.599] NetworkTime: Configuration changed.\n[   15.659] \n[   15.659]    ~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.4.17 |~~~~~~~~~~~~~~~~~~~~~~~~~~\n[   15.659]         (c) 2001-2012  The world wide DirectFB Open Source Community\n[   15.659]         (c) 2000-2004  Convergence (integrated media) GmbH\n[   15.659]       ----------------------------------------------------------------\n[   15.659] \n[   15.659] (*) DirectFB/Core: Single Application Core. (2023-05-24 15:31) [ DEBUG ]\n[   15.687] (*) Direct/Memcpy: Using Generic 64bit memcpy()\n[   15.696] (*) DirectFB/Graphics: Generic Software Rasterizer 0.7 (directfb.org)\n[   15.701] (*) DirectFB/Core/WM: Default 0.3 (directfb.org)\n[   15.724] WestonDebug: log, Weston and Wayland log\n[   15.724] WestonDebug: scene-graph, Scene graph details\n[   15.724] WestonDebug: timeline, Timeline event points\n[   15.724] WestonDebug: proto, Wayland protocol dump for all clients.\n[   15.724] WestonDebug: drm-backend, Debug messages from DRM/KMS backend\n[   15.724] WestonDebug: gl-shader-generator, GL renderer shader compilation and cache.\n[   15.724] WestonDebug: content-protection-debug, debug-logs for content-protection\n[   15.732] Configure HDMI-1 as 1920x1080x60p , modeline \"148.5 1920 2008 2052 2200 1080 1084 1089 1125 +hsync +vsync\"\n[   15.736] VSYNC alignment enabled\n[   15.796] ALSA lib ../../../alsa-lib-1.2.1.2/src/pcm/pcm.c:2642:(snd_pcm_open_noupdate) \n[   15.796] Unknown PCM Headphone\n[   15.796] \n[   15.797] No path switch element\n[   15.797] ALSA lib ../../../alsa-lib-1.2.1.2/src/pcm/pcm.c:2642:(snd_pcm_open_noupdate) \n[   15.797] Unknown PCM hdmi2\n[   15.797] \n[   15.797] No path switch element\n[   15.799] Failed to open /sys/block/mapper/bsos-storage/error_report\n[   15.829] /dev/input/event3: supported event types 0000000000000003\n[   15.829] Found a keyboard at /dev/input/event3\n[   15.857] /dev/input/event2: Not a physical device\n[   15.873] /dev/input/event1: Not a physical device\n[   15.883] IP:eth0 BOUND ip=192.168.1.174 nm=255.255.255.0 gw=192.168.1.254 domain=attlocal.net dns=192.168.1.254\n[   15.890] /dev/input/event0: Ignoring Brightsign GPIO device\n[   16.003] Failed to create /home/root/.cache for shader cache (Read-only file system)---disabling.\n[   16.275] CPUs armv8_cortex_a72 from 4 to 5 (4,5)\n[   16.275] CPUs armv8_cortex_a53 from 0 to 3 (0,1,2,3)\n[   16.275] Configured CPUs for /bin/node: 0,1,2,3\n[   17.404] JS.Bootstrap : Loading bootstrap...\n[   17.512] JS.Bootstrap : INFO Last tried supervisor was ''\n[   17.512] JS.Bootstrap : Starting bootstrap...\n[   17.513] JS.Bootstrap :   bootstrap version {\"major\":1,\"minor\":0,\"patch\":1}\n[   17.514] JS.Bootstrap :   NodeJS version {\"major\":\"14\",\"minor\":\"17\",\"patch\":\"6\"}\n[   17.514] JS.Bootstrap : INFO Generating Supervisor services list\n[   17.515] JS.Bootstrap : INFO Scanning directory to find supervisors\n[   17.524] JS.Bootstrap : INFO Reference name detected as 2023-08-16T15-40-45.909Z\n[   17.525] JS.Bootstrap : INFO Supervisor, /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/2023-08-16T15-40-45.909Z.js :  Creating...\n[   18.079] Setting system clock to 1706641057.000000\n[   18.081] NetworkTime: clock set to 2024/01/30 18:57:37.001 UTC\n[   19.096] JS.Bootstrap : INFO Supervisor, /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/2023-08-16T15-40-45.909Z.js (v 2.1.10) :    Complete\n[   19.096] JS.Bootstrap : INFO Enumeration of supervisor list complete.\n[   19.097] JS.Bootstrap : INFO No previous supervisors have been tried, so none will be locked\n[   19.098] JS.Bootstrap : INFO Supervisor, /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/2023-08-16T15-40-45.909Z.js (v 2.1.10) :  Supervisor bootcheck has 14400 seconds to respond\n[   19.099] JS.Bootstrap : INFO Supervisor, /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/2023-08-16T15-40-45.909Z.js (v 2.1.10) :  Starting...\n[   19.108] JS.Supervisor : Starting supervisor version {\"major\":2,\"minor\":1,\"patch\":10}\n[   19.110] JS.Bootstrap : INFO Writing last tried entry of 2023-08-16T15-40-45.909Z\n[   20.407] JS.remote view :  INFO Constructing remote view service, with {}\n[   20.876] JS.FailSafe : INFO Constructing fail safe service, with {}\n[   20.885] JS.Supervisor : Service configure-bootstrap : Loading version {\"major\":0,\"minor\":0,\"patch\":0} (Standalone)\n[   20.888] JS.configure bootstrap :  INFO Preparing logging level\n[   20.901] JS.Bootstrap : Logs now report to Info as set by setLoggingLevelTo\n[   20.902] JS.configure bootstrap :  INFO Looking for proxy configuration\n[   20.919] JS.configure bootstrap :  INFO No proxy configured\n[   20.925] JS.Supervisor : INFO Launched all services in step 0 with success\n[   20.927] JS.Supervisor : Service configure-autorun : Loading version {\"major\":0,\"minor\":0,\"patch\":0} (Standalone)\n[   20.928] JS.Supervisor : Service configure-supervisor : Loading version {\"major\":0,\"minor\":0,\"patch\":0} (Standalone)\n[   20.930] JS.Supervisor : Service configure-network : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   20.931] JS.Supervisor : Service cellular-modem : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   20.938] JS.configure network :  INFO Checking registry for meta client\n[   20.970] JS.configure network :  INFO Configuring network to {\"base\":\"https://handlers.bsn.cloud/\",\"contentDownloadsRestricted\":\"no\",\"contentXfersEnabledWired\":\"true\",\"deviceScreenShotsCountLimit\":\"1\",\"deviceScreenShotsEnabled\":\"no\",\"deviceScreenShotsInterval\":\"60\",\"deviceScreenShotsOrientation\":\"Landscape\",\"deviceScreenShotsQuality\":\"0\",\"deviceScreenShotsTemporaryStorage\":\"https://bsncloud-dssp.s3.amazonaws.com/DeviceScreenShots/Incoming/\",\"devicedownload\":\"/bs/DeviceDownload.ashx\",\"devicedownloadprogress\":\"/bs/DeviceDownloadProgress.ashx\",\"deviceerror\":\"/bs/DeviceError.ashx\",\"diagnosticLoggingEnabled\":\"no\",\"dwsEnabled\":\"no\",\"dwsPassword\":null,\"enableSerialDebugging\":\"False\",\"enableSystemLogDebugging\":\"True\",\"event\":\"/bs/Events.ashx\",\"eventLoggingEnabled\":\"no\",\"getfile\":\"/bs/GetFile.ashx\",\"healthXfersEnabledWired\":\"true\",\"heartbeat\":\"/bs/Heartbeat.ashx\",\"idleScreenColor\":\"FF702896\",\"incomingDeviceScreenshotsQueue\":\"http://queue.amazonaws.com/965175186373/bsn-cloud-dssp\",\"limitSt<...>\n[   20.970] pace\":\"False\",\"logUploadsXfersEnabledWired\":\"true\",\"mediaFeedsXfersEnabledWired\":\"true\",\"networkConnectionPriorityWired\":\"0\",\"networkConnectionPriorityWireless\":\"-1\",\"networkdiagnostic\":\"/bs/NetworkDiagnostic.ashx\",\"next\":\"/bs/CheckForContent.ashx\",\"playbackLoggingEnabled\":\"no\",\"rateLimitModeInWindow\":\"default\",\"rateLimitModeInitialDownloads\":\"default\",\"rateLimitModeOutsideWindow\":\"unlimited\",\"rateLimitRateInWindow\":\"0\",\"rateLimitRateInitialDownloads\":\"0\",\"rateLimitRateOutsideWindow\":\"0\",\"stateLoggingEnabled\":\"no\",\"textFeedsXfersEnabledWired\":\"true\",\"timeBetweenNetConnects\":\"21600\",\"timeServer\":\"http://time.bsn.cloud\",\"timezone\":\"PST\",\"trafficdownload\":\"/bs/TrafficDownload.ashx\",\"unitDescription\":\"Trying again\",\"unitName\":\"XD5\",\"unitNamingMethod\":\"appendUnitIDToUnitName\",\"uploadLogFilesAtBoot\":\"no\",\"uploadLogFilesAtSpecificTime\":\"no\",\"uploadLogFilesTime\":\"0\",\"uploadlogs\":\"/bs/UploadLogs.ashx\",\"useDHCP\":\"yes\",\"useWireless\":\"no\",\"variableLoggingEnabled\":\"no\"}\n[   20.972] JS.configure network :  INFO Configuring pre-registered network\n[   20.974] JS.configure network :  INFO In configureNetworkBeforeRegistered: Player has registered.\n[   21.034] JS.configure supervisor : INFO Looking for local presentations...\n[   21.036] JS.configure supervisor : INFO There is a presentation stored locally at /storage/sd/autorun.brs\n[   21.191] JS.configure supervisor : INFO Enabling BSN cloud, because enabled in registry or sync spec, or bsn.cloud is not explicitly disabled\n[   21.200] JS.configure supervisor : INFO bacon flag set by registry : true\n[   21.217] JS.Supervisor : INFO Launched all services in step 1 with success\n[   21.218] JS.Supervisor : Service internal-garbage-collector : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.219] JS.Supervisor : Service internal-watchdog : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.229] JS.Supervisor : Service internal-test : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.230] JS.Supervisor : Service internal-test-fail : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.231] JS.Supervisor : Service configure-connection : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.233] JS.Supervisor : Service api-bridge : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.244] JS.Configure-connection : INFO No network detected\n[   21.248] JS.Configure-connection : Refreshing features state from network server.\n[   21.291] JS.Supervisor : INFO Launched all services in step 2 with success\n[   21.292] JS.Supervisor : Service configure-process : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.299] JS.Supervisor : INFO Launched all services in step 3 with success\n[   21.300] JS.Supervisor : Service bacon-runner : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.308] JS.Supervisor : Service token-services : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.342] JS.token services :  INFO Registry already contains a valid access token, no need to exchange refresh token\n[   21.349] JS.system runner : INFO Stopping httpd\n[   21.371] JS.Configure-connection : INFO Check endpoints from server at https://certs.bsn.cloud/features/api/v1/features\n[   21.423] JS.Configure-connection : INFO Check endpoints from server at https://certs.bsn.cloud/features/api/v1/features\n[   21.497] SignalDispatcher received signal 17\n[   21.499] JS.system runner : INFO Starting http with start-local\n[   21.578] SignalDispatcher received signal 17\n[   21.579] JS.Supervisor : INFO Launched all services in step 4 with success\n[   21.581] JS.Supervisor : Service remote-storage : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.582] JS.Supervisor : Service channel-autorun : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.596] JS.Supervisor : Service DWS : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.602] JS.Supervisor : INFO Logging is now unmuted for messages with the prefix 'JS.REST API :'\n[   21.603] JS.Supervisor : Service channel-bsn : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.604] JS.Supervisor : INFO Logging is now unmuted for messages with the prefix 'JS.websocket-player :'\n[   21.606] JS.Supervisor : Service supervisor-upgrader : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.610] JS.AutoUpgrade : INFO Getting up-to-date list of available firmware from server.\n[   21.621] JS.Supervisor : Service remote-view : Loading version {\"major\":0,\"minor\":0,\"patch\":0} (Networked)\n[   21.664] JS.REST API : INFO Local DWS UI flag set to : false\n[   21.697] JS.Channel-AUTORUN: INFO Autorun messaging socket now being created\n[   21.710] JS.Channel-AUTORUN: INFO Autorun messaging applicationport now being created\n[   21.722] JS.REST API : INFO DWS UI is secured by DIGEST authentication.\n[   21.723] JS.REST API : INFO Local html_path set to : /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/DWS_html\n[   21.872] JS.Channel-BSN: INFO Features payload has not been retrieved\n[   21.872] JS.Channel-BSN: INFO BSN.cloud is enabled; New Local DWS is disabled, Remote DWS is enabled\n[   21.964] JS.REST API : INFO http server now running on port 80\n[   21.965] JS.Supervisor : INFO Launched all services in step 5 with success\n[   21.966] JS.Supervisor : Service player-register : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.968] JS.player-register : INFO Websocket has not open yet. Do not trigger registration request\n[   21.968] JS.Supervisor : Service player-status : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Networked)\n[   21.969] JS.Supervisor : Service player-settings : Loading version {\"major\":1,\"minor\":2,\"patch\":0} (Networked)\n[   21.972] JS.Supervisor : Service autorun-invoker : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.975] JS.Supervisor : Service fail-safe : Loading version {\"major\":0,\"minor\":0,\"patch\":0} (Networked)\n[   21.976] JS.FailSafe : INFO Preparing timeout to check failsafe in 69 minutes\n[   21.977] JS.Supervisor : Service rollback : Loading version {\"major\":1,\"minor\":0,\"patch\":0} (Standalone)\n[   21.985] Autorun.payload-cellular : INFO Did not find any active supported modems\n[   22.034] JS.system rollback : INFO Retrieving rollback state\n[   22.043] JS.Bootstrap : INFO Supervisor is now invoking autorun.\n[   22.088] JS.Supervisor : INFO Launched all services in step 6 with success\n[   22.089] JS.Bootstrap : INFO Supervisor, /opt/roku/sys/supervisors/2023-08-16T15-40-45.909Z/2023-08-16T15-40-45.909Z.js (v 2.1.10) :  is HAPPY\n[   22.090] JS.Bootstrap : INFO Writing last tried entry of <empty>\n[   22.104] JS.Configure-connection : INFO No payload processing required\n[   22.181] JS.Channel-BSN: INFO Received message: sys.network.boot.connected\n[   22.182] JS.Channel-BSN: INFO Received sys.network.boot.connected\n[   22.184] JS.player-register : INFO Received a network connection, try registration\n[   22.184] JS.player-register : INFO Websocket has not open yet. Do not trigger registration request\n[   22.184] JS.player-status : INFO Received sys.network.boot.connected\n[   22.188] JS.Channel-BSN: ERROR checkWebSocketStability has failed. Attempting to restart websockets.\n[   22.194] JS.Channel-BSN: INFO BSN.cloud is enabled; New Local DWS is disabled, Remote DWS is enabled\n[   22.199] JS.websocket-player : INFO Creating WS listener\n[   22.700] Checking for network recovery override.\n[   22.701] Looking for recovery script at 'https://handlers.bsn.cloud//recovery/recovery.ashx'\n[   23.176] JS.websocket-player : INFO { 2024-01-30T18:57:42.095Z} WS connection open\n[   23.177] JS.player-register : INFO Received a websocket connection, try registration\n[   23.186] JS.player-register : INFO checkForRegistration: Device is already registered\n[   23.303] Recovery server response code: 204\n[   23.327] Server provided empty recovery response\n[   23.348] JS.AutoUpgrade : ERROR No auto-upgrades available : {\"size\":0,\"timeout\":0}\n[   23.368] Loading 'SD:/autorun.brs' (739ff2e102438ccea53877e7889a7efbf77dabe8)\n[   23.619] JS.Channel-AUTORUN: INFO Message from application: ' \"{}\"'\n[   23.667] JS.Supervisor : INFO API GET request \"/v1/system\"\n[   23.809] JS.Supervisor : INFO API response to \"/v1/system\" => {\"nodejs\":{\"version\":{\"major\":\"14\",\"minor\":\"17\",\"patch\":\"6\"}},\"firmware\":{\"version\":{\"major\":\"9\",\"minor\":\"0\",\"patch\":\"97\",\"description\":\"9.0.97\"}},\"bootstrap\":{\"version\":{\"major\":1,\"minor\":0,\"patch\":1},\"autorun_drive\":\"/storage/sd/\",\"supervisors_available\"... [truncated]\n[   23.862] JS.Supervisor : INFO API GET request \"/v1/system/supervisor/registration\"\n[   23.877] JS.Supervisor : INFO API response to \"/v1/system/supervisor/registration\" => {\"token\":\"\",\"isRegistered\":true,\"setupSupport\":{\"network\":true}}\n[   23.923] JS.Channel-AUTORUN: INFO Message from application: ' \"{\\\"payload\\\":{\\\"body\\\":{\\\"script\\\":{\\\"type\\\":\\\"Autorun\\\",\\\"version\\\":\\\"10.0.98\\\"}},\\\"route\\\":\\\"/v1/script-status\\\"}}\"'\n[   23.924] JS.player-status : INFO Received sync.status.update\n[   23.925] Autorun.status : INFO Update status payload from autorun message.\n[   23.935] Autorun.status : INFO Sending status request.\n[   24.002] JS.Supervisor : INFO API GET request \"/v1/system/supervisor/autorun-config\"\n[   24.055] JS.Supervisor : INFO API response to \"/v1/system/supervisor/autorun-config\" => {\"status\":200,\"settings\":{\"meta\":{\"client\":{\"lastModifiedAutorunSettingsAt\":\"2024-01-09T18:03:50.000Z\",\"contentDownloadsRestricted\":false,\"deviceScreenShotsEnabled\":false,\"deviceScreenShotsInterval\":60,\"deviceScreenShotsCountLimit\":1,\"deviceScreenShotsQual... [truncated]\n[   24.134] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[   24.142] JS.Supervisor : INFO API GET request \"/v1/system/supervisor/autorun-config\"\n[   24.200] JS.Supervisor : INFO API response to \"/v1/system/supervisor/autorun-config\" => {\"status\":200,\"settings\":{\"meta\":{\"client\":{\"lastModifiedAutorunSettingsAt\":\"2024-01-09T18:03:50.000Z\",\"contentDownloadsRestricted\":false,\"deviceScreenShotsEnabled\":false,\"deviceScreenShotsInterval\":60,\"deviceScreenShotsCountLimit\":1,\"deviceScreenShotsQual... [truncated]\n[   24.252] BrightScript creation of roControlPort failed:\n[   24.252]   GPIO port 'LightController-0-CONTROL' not found\n[   24.252] BrightScript creation of roControlPort failed:\n[   24.252]   GPIO port 'LightController-1-CONTROL' not found\n[   24.253] BrightScript creation of roControlPort failed:\n[   24.253]   GPIO port 'LightController-2-CONTROL' not found\n[   24.253] BrightScript creation of roControlPort failed:\n[   24.253]   GPIO port 'LightController-0-DIAGNOSTICS' not found\n[   24.253] BrightScript creation of roControlPort failed:\n[   24.253]   GPIO port 'LightController-1-DIAGNOSTICS' not found\n[   24.253] BrightScript creation of roControlPort failed:\n[   24.253]   GPIO port 'LightController-2-DIAGNOSTICS' not found\n[   24.253] BrightScript creation of roControlPort failed:\n[   24.253]   GPIO port 'TouchBoard-0-GPIO' not found\n[   24.254] BrightScript creation of roControlPort failed:\n[   24.254]   GPIO port 'TouchBoard-1-GPIO' not found\n[   24.254] BrightScript creation of roControlPort failed:\n[   24.254]   GPIO port 'TouchBoard-2-GPIO' not found\n[   24.254] BrightScript creation of roControlPort failed:\n[   24.254]   GPIO port 'TouchBoard-3-GPIO' not found\n[   24.309] JS.websocket-player : INFO { 2024-01-30T18:57:43.228Z} sync.status.response message received from : BSN with id r7iXidpsp \n[   24.310] + 2024/01/30 10:57:43.230\n[   24.311] + ### Current active sync list suggests next URL of https://handlers.bsn.cloud//bs/CheckForContent.ashx\n[   24.311] + ### Time between net connects = 21600\n[   24.311] + ### Content downloads are unrestricted\n[   24.311] + SetInboundShaperRate to -1\n[   24.351] net-configure: eth0 reconfigure\n[   24.367] dhcpcd[2714]: sending signal TERM to pid 2163\n[   24.367] dhcpcd[2714]: waiting for pid 2163 to exit\n[   24.370] IP:eth0 STOP6 unexpected\n[   24.459] IP:eth0 STOP down\n[   24.460] JS.Configure-connection : The network interface eth0 has been detached via hotplug.\n[   24.461] JS.Channel-BSN: INFO Received message: sys.network.hotplug\n[   24.461] JS.Channel-BSN: INFO Received SYS_NETWORK_HOTPLUG; sending a WSS ping\n[   24.464] JS.Configure-connection : Refreshing features state from network server.\n[   24.472] IP:eth0 STOPPED unexpected\n[   24.478] JS.Configure-connection : INFO Check endpoints from server at https://certs.bsn.cloud/features/api/v1/features\n[   24.588] Removing bandwidth shaper (if present) for eth0\n[   24.618] Error: Cannot find specified qdisc on specified device\n[   24.618] .\n[   24.618] \n[   24.642] dhcpcd[2751]: dhcpcd-9.4.1 starting\n[   24.644] dhcpcd[2754]: DUID 00:02:04:33:69:4d:34:45:33:33:44:30:30:36:38:32:34\n[   24.650] forked to background, child pid 2754\n[   24.677] No inbound bandwidth shaping on eth0\n[   24.680] SignalDispatcher received signal 17\n[   24.681] + NetworkScheduler: entry signal\n[   24.681] + RetrievingSyncList: entry signal\n[   24.681] + 2024/01/30 10:57:43.601\n[   24.681] + ### start_sync download\n[   24.683] + ### xfer created - identity =  18 ###\n[   24.683] + ### Looking for new sync list from https://handlers.bsn.cloud//bs/CheckForContent.ashx\n[   24.687] + 2024/01/30 10:57:43.607\n[   24.687] + GetBindingByPriority entry:\n[   24.687] + dataType: contentDownloadEnabled\n[   24.687] + priorityIndex:  0\n[   24.687] + Selected network_interface:  0\n[   24.687] + roNetworkConfiguration succeeded for selected network_interface\n[   24.703] + GetCurrentConfig succeeded for selected network_interface\n[   24.703] + Return network_interface:  0\n[   24.703] + ### Binding for StartSync is  0\n[   24.714] + Set idle screen color: red =  112, green =  40, blue =  150\n[   24.764] JS.Supervisor : INFO API POST request \"/v1/system/supervisor/capabilities\"\n[   24.766] JS.player-status : INFO Received sync.status.update\n[   24.766] Autorun.status : INFO Update status payload from autorun message.\n[   24.768] JS.Settings : INFO Settings Handler enabled by /capabilities or UDP/IPC.\n[   24.774] JS.Supervisor : INFO API response to \"/v1/system/supervisor/capabilities\" => {\"success\":true}\n[   24.789] JS.Settings : INFO Requesting a settings update from BSN with msgId py4YmCr7M\n[   24.790] JS.Channel-BSN: INFO Received message: ws.registration.request.send\n[   24.798] JS.websocket-player : INFO sendWsRequest (sync.device.settings.retrieval.request)\n[   24.805] JS.Supervisor : INFO API POST request \"/v1/system/supervisor/capabilities\"\n[   24.806] JS.player-status : INFO Received sync.status.update\n[   24.806] Autorun.status : INFO Update status payload from autorun message.\n[   24.807] JS.Settings : INFO Settings Handler enabled by /capabilities or UDP/IPC.\n[   24.810] JS.Supervisor : INFO API response to \"/v1/system/supervisor/capabilities\" => {\"success\":true}\n[   24.866] + Creating roDatagramSender for notifications\n[   24.866] + UDP notification sent: startPlayback\n[   24.866] BrightScript creation of roStorageInfo failed:\n[   24.866]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] BrightScript creation of roStorageInfo failed:\n[   24.867]   Failed to map filename\n[   24.867] + Player: entry signal\n[   24.868] + Waiting: entry signal\n[   24.868] + 2024/01/30 10:57:43.788\n[   24.868] + msg received - type=roNetworkDetached\n[   24.868] + 2024/01/30 10:57:43.788\n[   24.868] + msg received - type=roUrlEvent\n[   24.868] + STRetrievingSyncListEventHandler: roUrlEvent\n[   24.868] + ### reset_download_timer_to_do_retry - wait  60 seconds.\n[   24.868] + ### Failed to download sync list: Could not resolve host: handlers.bsn.cloud\n[   24.868] + ### UploadDeviceError\n[   24.871] + 2024/01/30 10:57:43.791\n[   24.871] + GetBindingByPriority entry:\n[   24.871] + dataType: contentDownloadEnabled\n[   24.871] + priorityIndex:  0\n[   24.871] + Selected network_interface:  0\n[   24.871] + roNetworkConfiguration succeeded for selected network_interface\n[   24.883] + GetCurrentConfig succeeded for selected network_interface\n[   24.883] + Return network_interface:  0\n[   24.884] + ### Binding for UploadDeviceError is  0\n[   24.884] + RetrievingSyncList: exit signal\n[   24.884] + WaitForTimeout: entry signal\n[   24.884] + 2024/01/30 10:57:43.804\n[   24.884] + msg received - type=roStorageAttached\n[   24.885] + 2024/01/30 10:57:43.805\n[   24.885] + msg received - type=roAssociativeArray\n[   24.886] + 2024/01/30 10:57:43.806\n[   24.886] + msg received - type=roUrlEvent\n[   24.886] + ### UploadDeviceError\n[   28.648] IP:eth0 BOUND6 ip=2600:1700:dac0:2060::23 dns=\n[   31.334] + 2024/01/30 10:57:50.254\n[   31.334] + msg received - type=roNetworkAttached\n[   31.336] JS.Configure-connection : The network interface eth0 has been attached via hotplug.\n[   31.338] IP:eth0 BOUND ip=192.168.1.174 nm=255.255.255.0 gw=192.168.1.254 domain=attlocal.net dns=192.168.1.254\n[   31.352] + WaitForTimeout: exit signal\n[   31.352] + RetrievingSyncList: entry signal\n[   31.352] + 2024/01/30 10:57:50.272\n[   31.352] + ### start_sync download\n[   31.355] + ### xfer created - identity =  24 ###\n[   31.355] + ### Looking for new sync list from https://handlers.bsn.cloud//bs/CheckForContent.ashx\n[   31.359] + 2024/01/30 10:57:50.279\n[   31.359] + GetBindingByPriority entry:\n[   31.359] + dataType: contentDownloadEnabled\n[   31.359] + priorityIndex:  0\n[   31.359] + Selected network_interface:  0\n[   31.359] + roNetworkConfiguration succeeded for selected network_interface\n[   31.374] + GetCurrentConfig succeeded for selected network_interface\n[   31.374] + Return network_interface:  0\n[   31.374] + ### Binding for StartSync is  0\n[   31.375] + 2024/01/30 10:57:50.295\n[   31.375] + msg received - type=roAssociativeArray\n[   31.378] JS.Configure-connection : INFO Check endpoints from server at https://certs.bsn.cloud/features/api/v1/features\n[   31.944] + 2024/01/30 10:57:50.863\n[   31.944] + msg received - type=roUrlEvent\n[   31.944] + STRetrievingSyncListEventHandler: roUrlEvent\n[   31.944] + ### Spec received from server\n[   31.946] + GetSyncSpecChangeType ### Server has given us a spec that matches current-sync. Nothing more to do.\n[   31.946] + ### UploadDeviceDownload\n[   31.948] + ### UploadDeviceDownload - proceed with post\n[   31.948] + 2024/01/30 10:57:50.868\n[   31.948] + GetBindingByPriority entry:\n[   31.948] + dataType: contentDownloadEnabled\n[   31.948] + priorityIndex:  0\n[   31.948] + Selected network_interface:  0\n[   31.948] + roNetworkConfiguration succeeded for selected network_interface\n[   31.961] + GetCurrentConfig succeeded for selected network_interface\n[   31.961] + Return network_interface:  0\n[   31.961] + ### Binding for UploadDeviceDownload is  0\n[   31.988] + ### UploadDeviceDownloadProgressFileList\n[   31.991] + ### UploadDeviceDownloadProgressItems\n[   31.991] + ### UploadDeviceDownloadProgressItems - proceed with post\n[   31.993] + 2024/01/30 10:57:50.913\n[   31.994] + GetBindingByPriority entry:\n[   31.994] + dataType: contentDownloadEnabled\n[   31.994] + priorityIndex:  0\n[   31.994] + Selected network_interface:  0\n[   31.994] + roNetworkConfiguration succeeded for selected network_interface\n[   32.010] + GetCurrentConfig succeeded for selected network_interface\n[   32.010] + Return network_interface:  0\n[   32.010] + ### Binding for UploadDeviceDownloadProgressItems is  0\n[   32.011] + RetrievingSyncList: exit signal\n[   32.011] + WaitForTimeout: entry signal\n[   32.031] JS.Configure-connection : Refreshing features state from network server.\n[   32.047] JS.Configure-connection : INFO Check endpoints from server at https://certs.bsn.cloud/features/api/v1/features\n[   32.154] + 2024/01/30 10:57:51.074\n[   32.154] + msg received - type=roUrlEvent\n[   32.155] + ### UploadDeviceDownload\n[   32.496] + 2024/01/30 10:57:51.416\n[   32.496] + msg received - type=roUrlEvent\n[   32.497] + ### UploadDeviceDownloadProgressItems\n[   32.700] JS.Configure-connection : INFO No payload processing required\n[   32.748] JS.Configure-connection : Network hotplug: Found connection, notifying services\n[   32.754] JS.Channel-BSN: INFO Received message: sys.network.hotplug\n[   32.754] JS.Channel-BSN: INFO Received SYS_NETWORK_HOTPLUG; sending a WSS ping\n[   32.756] JS.player-register : INFO Received a network hotplug, checking for registration\n[   32.757] JS.player-status : INFO Received sys.network.hotplug\n[   32.764] JS.token services :  INFO Registry already contains a valid access token, no need to exchange refresh token\n[   32.766] JS.player-register : INFO checkForRegistration: Device is already registered\n[   33.082] JS.websocket-player : INFO { 2024-01-30T18:57:52.002Z} sync.device.settings.retrieval.response message received from : bsn.cloud-py4YmCr7M with id py4YmCr7M for /2022/06/REST/Devices/RE433D006644/Settings/\n[   33.083] JS.websocket-player : INFO sync.device.settings.retrieval.response : {\"source\":{\"type\":\"app\",\"name\":\"bsn.cloud-py4YmCr7M\"},\"destination\":{\"type\":\"player\",\"name\":\"RE433D006644\"},\"type\":\"sync.device.settings.retrieval.response\",\"payload\":{\"route\":\"/2022/06/REST/Devices/RE433D006644/Settings/\",\"headers\":{\"Content-Type\":\"application/vnd.bsn.device.settings+json\",\"Last-Modified\":\"Tue, 09 Jan 2024 18:03:50 GMT\"},\"data\":{\"statusCode\":200,\"result\":{\"name\":\"XD5\",\"description\":\"Trying again\",\"concatNameAndSerial\":true,\"setupType\":\"BSN\",\"lastModifiedDate\":\"2024-01-09T18:03:50Z\",\"group\":{\"id\":30914,\"name\":\"Default\",\"link\":null},\"brightWall\":null,\"timezone\":\"PST\",\"screen\":{\"idleColor\":\"FF702896\",\"splashUrl\":null},\"synchronization\":{\"status\":{\"period\":\"00:05:00\"},\"settings\":{\"period\":\"06:00:00\"},\"schedule\":{\"period\":\"06:00:00\"},\"content\":{\"start\":null,\"end\":null}},\"network\":{\"hostname\":null,\"proxyServer\":null,\"proxyBypass\":[],\"timeServers\":[\"http://time.bsn.cloud\"],\"interf<...>\n[   33.083] [{\"enabled\":true,\"proto\":\"DHCP\",\"ip\":null,\"gateway\":null,\"dns\":null,\"rateLimitDuringInitialDownloads\":0,\"rateLimitInsideContentDownloadWindow\":0,\"rateLimitOutsideContentDownloadWindow\":null,\"contentDownloadEnabled\":true,\"textFeedsDownloadEnabled\":true,\"mediaFeedsDownloadEnabled\":true,\"healthReportingEnabled\":true,\"logsUploadEnabled\":true,\"name\":\"eth0\",\"type\":\"Ethernet\"}]},\"beacons\":null,\"location\":{\"gpsLatitude\":37.4152,\"gpsLongitude\":-122.1224,\"placeId\":null,\"country\":\"US\",\"countryLongName\":\"United States\",\"adminAreaLevel1\":\"CA\",\"adminAreaLevel1LongName\":\"California\",\"adminAreaLevel2\":\"Santa Clara County\",\"adminAreaLevel2LongName\":\"Santa Clara County\",\"locality\":\"Palo Alto\",\"localityLongName\":\"Palo Alto\",\"path\":\"/US/CA/Santa Clara County/Palo Alto/\",\"pathLongName\":\"/United States/California/Santa Clara County/Palo Alto/\"},\"screenshots\":null,\"logging\":{\"enableDiagnosticLog\":false,\"enableEventLog\":false,\"enablePlaybackLog\":false,\"enableStateLog\":false,\"enableVariableLog\":<...>\n[   33.083] \"uploadAtBoot\":false,\"uploadTime\":null},\"lws\":{\"enableUpdateNotifications\":true,\"username\":\"\",\"password\":\"\"},\"ldws\":null},\"error\":null}},\"token\":\"gdUKFoegOu4tAUArHECsiU1tKpmHMhRLHco2R8QXDSU4JH3UUBgCEyRSv4AvRdC3CBnpeQKMR18yHG50r7QMrhBeWRtGSFezxV8QtemTh9lcPwjCKPl0rRcK253tShfs\",\"msgId\":\"py4YmCr7M\",\"version\":null}\n[   33.084] JS.Settings : INFO Response from BSN, regarding the latest settings retrieval, has been received\n[   33.085] JS.Channel-BSN: INFO Received message: ws.registration.response.send\n[   33.092] JS.Settings : INFO Send settings GET response received.\n[   33.101] JS.websocket-player : INFO { 2024-01-30T18:57:52.021Z} sync.device.settings.retrieval.response sending response to bsn.cloud-py4YmCr7M with id py4YmCr7M \n[   33.121] JS.Settings : INFO The Last-Modified header value has not changed; supervisor will not apply settings from GET.\n[   33.218] JS.websocket-player : INFO { 2024-01-30T18:57:52.138Z} sync.device.settings.retrieval.response message received from : BSN with id py4YmCr7M \n[   33.219] JS.websocket-player : INFO sync.device.settings.retrieval.response : {\"source\":{\"type\":\"app\",\"name\":\"BSN\"},\"destination\":{\"type\":\"player\",\"name\":\"RE433D006644\"},\"type\":\"sync.device.settings.retrieval.response\",\"payload\":{\"data\":{\"statusCode\":202,\"result\":{\"message\":\"Accepted\"}}},\"token\":\"TDZwzMzZeSrKJpTEmkmEhcgi3EzShVvcPR124GQZDTca65m7quYaWM4wyaU2LdQ5nvQiT38umo4dy32vYCHA1GztjKFmsXYAKk33zwMxKfEMXBDDXVDSO9vtQdmPUkyw\",\"msgId\":\"py4YmCr7M\"}\n[   33.219] JS.Settings : INFO Response from BSN, regarding the latest settings retrieval, has been received\n[   33.220] JS.Channel-BSN: INFO Received message: ws.registration.response.send\n[   33.232] JS.websocket-player : INFO { 2024-01-30T18:57:52.151Z} sync.device.settings.retrieval.response sending response to BSN with id py4YmCr7M \n[   34.031] JS.Configure-connection : INFO No payload processing required\n[   82.170] + 2024/01/30 10:58:41.090\n[   82.171] + msg received - type=roControlCloudMessageEvent\n[   82.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[   82.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[  142.170] + 2024/01/30 10:59:41.090\n[  142.170] + msg received - type=roControlCloudMessageEvent\n[  142.170] + supervisor / bootstrap roControlCloudMessageEvent received\n[  142.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[  202.170] + 2024/01/30 11:00:41.090\n[  202.171] + msg received - type=roControlCloudMessageEvent\n[  202.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[  202.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[  262.171] + 2024/01/30 11:01:41.091\n[  262.171] + msg received - type=roControlCloudMessageEvent\n[  262.171] + supervisor / bootstrap roControlCloudMessageEvent received\n[  262.172] + supervisor / bootstrap roControlCloudMessageEvent received\n[  322.172] + 2024/01/30 11:02:41.092\n[  322.172] + msg received - type=roControlCloudMessageEvent\n[  322.172] + supervisor / bootstrap roControlCloudMessageEvent received\n[  322.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  324.134] Autorun.status : INFO Sending status request.\n[  324.226] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[  324.411] JS.websocket-player : INFO { 2024-01-30T19:02:43.331Z} sync.status.response message received from : BSN with id UrI9sFx6h \n[  382.172] + 2024/01/30 11:03:41.092\n[  382.172] + msg received - type=roControlCloudMessageEvent\n[  382.172] + supervisor / bootstrap roControlCloudMessageEvent received\n[  382.172] + supervisor / bootstrap roControlCloudMessageEvent received\n[  442.172] + 2024/01/30 11:04:41.092\n[  442.172] + msg received - type=roControlCloudMessageEvent\n[  442.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  442.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  502.173] + 2024/01/30 11:05:41.093\n[  502.173] + msg received - type=roControlCloudMessageEvent\n[  502.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  502.174] + supervisor / bootstrap roControlCloudMessageEvent received\n[  562.173] + 2024/01/30 11:06:41.093\n[  562.173] + msg received - type=roControlCloudMessageEvent\n[  562.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  562.173] + supervisor / bootstrap roControlCloudMessageEvent received\n[  622.176] + 2024/01/30 11:07:41.096\n[  622.176] + msg received - type=roControlCloudMessageEvent\n[  622.176] + supervisor / bootstrap roControlCloudMessageEvent received\n[  622.177] + supervisor / bootstrap roControlCloudMessageEvent received\n[  624.135] Autorun.status : INFO Sending status request.\n[  624.216] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[  624.388] JS.websocket-player : INFO { 2024-01-30T19:07:43.307Z} sync.status.response message received from : BSN with id rMAgtKZ0Y \n[  682.177] + 2024/01/30 11:08:41.097\n[  682.177] + msg received - type=roControlCloudMessageEvent\n[  682.177] + supervisor / bootstrap roControlCloudMessageEvent received\n[  682.177] + supervisor / bootstrap roControlCloudMessageEvent received\n[  742.177] + 2024/01/30 11:09:41.097\n[  742.177] + msg received - type=roControlCloudMessageEvent\n[  742.177] + supervisor / bootstrap roControlCloudMessageEvent received\n[  742.178] + supervisor / bootstrap roControlCloudMessageEvent received\n[  802.178] + 2024/01/30 11:10:41.098\n[  802.178] + msg received - type=roControlCloudMessageEvent\n[  802.179] + supervisor / bootstrap roControlCloudMessageEvent received\n[  802.179] + supervisor / bootstrap roControlCloudMessageEvent received\n[  862.178] + 2024/01/30 11:11:41.098\n[  862.178] + msg received - type=roControlCloudMessageEvent\n[  862.179] + supervisor / bootstrap roControlCloudMessageEvent received\n[  862.179] + supervisor / bootstrap roControlCloudMessageEvent received\n[  922.179] + 2024/01/30 11:12:41.099\n[  922.179] + msg received - type=roControlCloudMessageEvent\n[  922.180] + supervisor / bootstrap roControlCloudMessageEvent received\n[  922.180] + supervisor / bootstrap roControlCloudMessageEvent received\n[  924.136] Autorun.status : INFO Sending status request.\n[  924.222] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[  924.383] JS.websocket-player : INFO { 2024-01-30T19:12:43.303Z} sync.status.response message received from : BSN with id -Ix9gW61s \n[  982.180] + 2024/01/30 11:13:41.100\n[  982.180] + msg received - type=roControlCloudMessageEvent\n[  982.180] + supervisor / bootstrap roControlCloudMessageEvent received\n[  982.180] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1042.180] + 2024/01/30 11:14:41.100\n[ 1042.180] + msg received - type=roControlCloudMessageEvent\n[ 1042.180] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1042.181] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1102.181] + 2024/01/30 11:15:41.101\n[ 1102.181] + msg received - type=roControlCloudMessageEvent\n[ 1102.181] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1102.181] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1162.181] + 2024/01/30 11:16:41.101\n[ 1162.181] + msg received - type=roControlCloudMessageEvent\n[ 1162.182] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1162.182] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1222.181] + 2024/01/30 11:17:41.101\n[ 1222.181] + msg received - type=roControlCloudMessageEvent\n[ 1222.181] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1222.182] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1224.137] Autorun.status : INFO Sending status request.\n[ 1224.221] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 1224.385] JS.websocket-player : INFO { 2024-01-30T19:17:43.304Z} sync.status.response message received from : BSN with id xg1HvYoAc \n[ 1282.182] + 2024/01/30 11:18:41.102\n[ 1282.183] + msg received - type=roControlCloudMessageEvent\n[ 1282.183] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1282.183] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1342.182] + 2024/01/30 11:19:41.102\n[ 1342.182] + msg received - type=roControlCloudMessageEvent\n[ 1342.183] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1342.183] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1402.183] + 2024/01/30 11:20:41.103\n[ 1402.183] + msg received - type=roControlCloudMessageEvent\n[ 1402.183] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1402.184] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1462.184] + 2024/01/30 11:21:41.104\n[ 1462.184] + msg received - type=roControlCloudMessageEvent\n[ 1462.184] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1462.185] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1522.185] + 2024/01/30 11:22:41.105\n[ 1522.185] + msg received - type=roControlCloudMessageEvent\n[ 1522.185] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1522.186] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1524.137] Autorun.status : INFO Sending status request.\n[ 1524.218] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 1524.411] JS.websocket-player : INFO { 2024-01-30T19:22:43.331Z} sync.status.response message received from : BSN with id W4XXOQQof \n[ 1582.185] + 2024/01/30 11:23:41.105\n[ 1582.185] + msg received - type=roControlCloudMessageEvent\n[ 1582.186] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1582.186] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1642.186] + 2024/01/30 11:24:41.106\n[ 1642.186] + msg received - type=roControlCloudMessageEvent\n[ 1642.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1642.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1702.187] + 2024/01/30 11:25:41.107\n[ 1702.187] + msg received - type=roControlCloudMessageEvent\n[ 1702.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1702.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1762.186] + 2024/01/30 11:26:41.106\n[ 1762.186] + msg received - type=roControlCloudMessageEvent\n[ 1762.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1762.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1822.186] + 2024/01/30 11:27:41.106\n[ 1822.187] + msg received - type=roControlCloudMessageEvent\n[ 1822.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1822.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1824.139] Autorun.status : INFO Sending status request.\n[ 1824.224] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 1824.389] JS.websocket-player : INFO { 2024-01-30T19:27:43.308Z} sync.status.response message received from : BSN with id HzQREFwFp \n[ 1826.783] IP:eth0 RENEW6 ip=2600:1700:dac0:2060::23 dns=\n[ 1832.819] JS.websocket-player : INFO { 2024-01-30T19:27:51.739Z} RestRequest message received from : ws-rest-server-b80f6345-5b81-47b1-8268-c140a8b8f5a0 with id b80f6345-5b81-47b1-8268-c140a8b8f5a0 for /v1/info\n[ 1832.838] JS.Supervisor : INFO API GET request \"/v1/info\"\n[ 1832.914] Failed to find volume: filesystem error: directory iterator cannot open directory: No such file or directory [/sys/class/ubi/ubi0/]\n[ 1832.933] JS.Supervisor : INFO API response to \"/v1/info\" => {\"serial\":\"RE433D006644\",\"upTime\":\"30 minutes\",\"upTimeSeconds\":1832,\"model\":\"XD1035\",\"FWVersion\":\"9.0.97\",\"bootVersion\":\"9.0.85\",\"family\":\"cobra\",\"isPlayer\":true,\"power\":{\"result\":{\"battery\":\"absent\",\"source\":\"AC\",\"switch_mode\":\"hard\"}},\"poe\":{\"result\":{\"s... [truncated]\n[ 1832.947] JS.websocket-player : INFO received rest response : 200\n[ 1832.961] JS.websocket-player : INFO { 2024-01-30T19:27:51.881Z} RestResponse sending response to ws-rest-server-b80f6345-5b81-47b1-8268-c140a8b8f5a0 with id b80f6345-5b81-47b1-8268-c140a8b8f5a0 for /v1/info\n[ 1882.187] + 2024/01/30 11:28:41.107\n[ 1882.187] + msg received - type=roControlCloudMessageEvent\n[ 1882.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1882.187] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1927.384] JS.websocket-player : INFO { 2024-01-30T19:29:26.304Z} RestRequest message received from : ws-rest-server-18392ce1-9381-46e8-afc5-f10911b7d242 with id 18392ce1-9381-46e8-afc5-f10911b7d242 for /v1/video-mode\n[ 1927.395] JS.Supervisor : INFO API GET request \"/v1/video-mode\"\n[ 1927.414] JS.Supervisor : INFO API response to \"/v1/video-mode\" => {\"isAutoMode\":false,\"name\":\"1920x1080x60p\",\"width\":\"1920\",\"height\":\"1080\",\"frames\":\"60\",\"scan\":\"p\",\"mode\":{\"colorDepth\":\"8bit\",\"colorSpace\":\"rgb\",\"dropFrame\":false,\"frequency\":60,\"graphicsPlaneHeight\":1080,\"graphicsPlaneWidth\":1920,\"height\":1080,\"interlace... [truncated]\n[ 1927.421] JS.websocket-player : INFO received rest response : 200\n[ 1927.430] JS.websocket-player : INFO { 2024-01-30T19:29:26.350Z} RestResponse sending response to ws-rest-server-18392ce1-9381-46e8-afc5-f10911b7d242 with id 18392ce1-9381-46e8-afc5-f10911b7d242 for /v1/video-mode\n[ 1942.188] + 2024/01/30 11:29:41.108\n[ 1942.188] + msg received - type=roControlCloudMessageEvent\n[ 1942.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 1942.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2002.188] + 2024/01/30 11:30:41.108\n[ 2002.188] + msg received - type=roControlCloudMessageEvent\n[ 2002.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2002.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2062.188] + 2024/01/30 11:31:41.108\n[ 2062.188] + msg received - type=roControlCloudMessageEvent\n[ 2062.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2062.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2122.189] + 2024/01/30 11:32:41.109\n[ 2122.189] + msg received - type=roControlCloudMessageEvent\n[ 2122.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2122.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2124.140] Autorun.status : INFO Sending status request.\n[ 2124.217] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 2124.390] JS.websocket-player : INFO { 2024-01-30T19:32:43.310Z} sync.status.response message received from : BSN with id S6n0c13Z6 \n[ 2182.188] + 2024/01/30 11:33:41.108\n[ 2182.188] + msg received - type=roControlCloudMessageEvent\n[ 2182.188] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2182.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2242.189] + 2024/01/30 11:34:41.109\n[ 2242.189] + msg received - type=roControlCloudMessageEvent\n[ 2242.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2242.189] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2302.189] + 2024/01/30 11:35:41.109\n[ 2302.189] + msg received - type=roControlCloudMessageEvent\n[ 2302.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2302.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2362.190] + 2024/01/30 11:36:41.110\n[ 2362.190] + msg received - type=roControlCloudMessageEvent\n[ 2362.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2362.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2422.190] + 2024/01/30 11:37:41.110\n[ 2422.190] + msg received - type=roControlCloudMessageEvent\n[ 2422.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2422.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2424.140] Autorun.status : INFO Sending status request.\n[ 2424.214] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 2424.475] JS.websocket-player : INFO { 2024-01-30T19:37:43.395Z} sync.status.response message received from : BSN with id IWiOCSenD \n[ 2482.190] + 2024/01/30 11:38:41.110\n[ 2482.190] + msg received - type=roControlCloudMessageEvent\n[ 2482.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2482.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2542.189] + 2024/01/30 11:39:41.110\n[ 2542.190] + msg received - type=roControlCloudMessageEvent\n[ 2542.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2542.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2602.189] + 2024/01/30 11:40:41.110\n[ 2602.189] + msg received - type=roControlCloudMessageEvent\n[ 2602.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2602.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2662.190] + 2024/01/30 11:41:41.110\n[ 2662.190] + msg received - type=roControlCloudMessageEvent\n[ 2662.190] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2662.191] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2722.191] + 2024/01/30 11:42:41.111\n[ 2722.191] + msg received - type=roControlCloudMessageEvent\n[ 2722.191] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2722.192] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2724.141] Autorun.status : INFO Sending status request.\n[ 2724.223] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 2724.422] JS.websocket-player : INFO { 2024-01-30T19:42:43.342Z} sync.status.response message received from : BSN with id 0Tf-kpexl \n[ 2782.192] + 2024/01/30 11:43:41.112\n[ 2782.192] + msg received - type=roControlCloudMessageEvent\n[ 2782.192] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2782.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2842.192] + 2024/01/30 11:44:41.113\n[ 2842.193] + msg received - type=roControlCloudMessageEvent\n[ 2842.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2842.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2902.192] + 2024/01/30 11:45:41.113\n[ 2902.193] + msg received - type=roControlCloudMessageEvent\n[ 2902.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2902.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2962.192] + 2024/01/30 11:46:41.112\n[ 2962.192] + msg received - type=roControlCloudMessageEvent\n[ 2962.192] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 2962.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3022.193] + 2024/01/30 11:47:41.113\n[ 3022.193] + msg received - type=roControlCloudMessageEvent\n[ 3022.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3022.193] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3024.141] Autorun.status : INFO Sending status request.\n[ 3024.223] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 3024.402] JS.websocket-player : INFO { 2024-01-30T19:47:43.322Z} sync.status.response message received from : BSN with id hxndYuC9z \n[ 3082.194] + 2024/01/30 11:48:41.114\n[ 3082.194] + msg received - type=roControlCloudMessageEvent\n[ 3082.194] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3082.195] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3142.194] + 2024/01/30 11:49:41.114\n[ 3142.194] + msg received - type=roControlCloudMessageEvent\n[ 3142.194] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3142.195] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3202.195] + 2024/01/30 11:50:41.115\n[ 3202.195] + msg received - type=roControlCloudMessageEvent\n[ 3202.195] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3202.196] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3262.196] + 2024/01/30 11:51:41.116\n[ 3262.196] + msg received - type=roControlCloudMessageEvent\n[ 3262.196] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3262.197] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3322.197] + 2024/01/30 11:52:41.117\n[ 3322.197] + msg received - type=roControlCloudMessageEvent\n[ 3322.197] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3322.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3324.142] Autorun.status : INFO Sending status request.\n[ 3324.216] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 3324.505] JS.websocket-player : INFO { 2024-01-30T19:52:43.425Z} sync.status.response message received from : BSN with id wyhDiXtuW \n[ 3382.198] + 2024/01/30 11:53:41.118\n[ 3382.198] + msg received - type=roControlCloudMessageEvent\n[ 3382.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3382.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3442.197] + 2024/01/30 11:54:41.117\n[ 3442.197] + msg received - type=roControlCloudMessageEvent\n[ 3442.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3442.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3502.197] + 2024/01/30 11:55:41.117\n[ 3502.197] + msg received - type=roControlCloudMessageEvent\n[ 3502.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3502.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3562.198] + 2024/01/30 11:56:41.118\n[ 3562.198] + msg received - type=roControlCloudMessageEvent\n[ 3562.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3562.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3622.198] + 2024/01/30 11:57:41.118\n[ 3622.198] + msg received - type=roControlCloudMessageEvent\n[ 3622.198] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3622.199] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3624.144] Autorun.status : INFO Sending status request.\n[ 3624.228] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 3624.405] JS.websocket-player : INFO { 2024-01-30T19:57:43.325Z} sync.status.response message received from : BSN with id bvx1CZgZs \n[ 3626.808] IP:eth0 RENEW6 ip=2600:1700:dac0:2060::23 dns=\n[ 3682.199] + 2024/01/30 11:58:41.119\n[ 3682.199] + msg received - type=roControlCloudMessageEvent\n[ 3682.199] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3682.199] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3742.199] + 2024/01/30 11:59:41.119\n[ 3742.199] + msg received - type=roControlCloudMessageEvent\n[ 3742.199] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3742.199] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3802.199] + 2024/01/30 12:00:41.120\n[ 3802.199] + msg received - type=roControlCloudMessageEvent\n[ 3802.200] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3802.200] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3862.200] + 2024/01/30 12:01:41.120\n[ 3862.200] + msg received - type=roControlCloudMessageEvent\n[ 3862.200] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3862.200] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3922.200] + 2024/01/30 12:02:41.120\n[ 3922.200] + msg received - type=roControlCloudMessageEvent\n[ 3922.201] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3922.201] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3924.144] Autorun.status : INFO Sending status request.\n[ 3924.221] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 3924.396] JS.websocket-player : INFO { 2024-01-30T20:02:43.316Z} sync.status.response message received from : BSN with id DyR2szE_x \n[ 3982.200] + 2024/01/30 12:03:41.120\n[ 3982.200] + msg received - type=roControlCloudMessageEvent\n[ 3982.200] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 3982.201] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4042.201] + 2024/01/30 12:04:41.121\n[ 4042.201] + msg received - type=roControlCloudMessageEvent\n[ 4042.201] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4042.202] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4102.202] + 2024/01/30 12:05:41.122\n[ 4102.202] + msg received - type=roControlCloudMessageEvent\n[ 4102.202] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4102.202] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4162.203] + 2024/01/30 12:06:41.123\n[ 4162.203] + msg received - type=roControlCloudMessageEvent\n[ 4162.203] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4162.203] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4222.203] + 2024/01/30 12:07:41.124\n[ 4222.204] + msg received - type=roControlCloudMessageEvent\n[ 4222.204] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4222.204] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4224.145] Autorun.status : INFO Sending status request.\n[ 4224.221] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 4224.409] JS.websocket-player : INFO { 2024-01-30T20:07:43.329Z} sync.status.response message received from : BSN with id t6EH5eEYa \n[ 4282.204] + 2024/01/30 12:08:41.124\n[ 4282.204] + msg received - type=roControlCloudMessageEvent\n[ 4282.204] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4282.204] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4342.204] + 2024/01/30 12:09:41.125\n[ 4342.204] + msg received - type=roControlCloudMessageEvent\n[ 4342.205] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4342.205] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4402.205] + 2024/01/30 12:10:41.125\n[ 4402.205] + msg received - type=roControlCloudMessageEvent\n[ 4402.205] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4402.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4462.206] + 2024/01/30 12:11:41.126\n[ 4462.206] + msg received - type=roControlCloudMessageEvent\n[ 4462.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4462.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4522.206] + 2024/01/30 12:12:41.126\n[ 4522.206] + msg received - type=roControlCloudMessageEvent\n[ 4522.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4522.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4524.147] Autorun.status : INFO Sending status request.\n[ 4524.235] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 4524.411] JS.websocket-player : INFO { 2024-01-30T20:12:43.332Z} sync.status.response message received from : BSN with id qnQKAJMph \n[ 4582.206] + 2024/01/30 12:13:41.126\n[ 4582.206] + msg received - type=roControlCloudMessageEvent\n[ 4582.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4582.207] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4642.206] + 2024/01/30 12:14:41.126\n[ 4642.206] + msg received - type=roControlCloudMessageEvent\n[ 4642.206] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4642.207] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4702.207] + 2024/01/30 12:15:41.127\n[ 4702.207] + msg received - type=roControlCloudMessageEvent\n[ 4702.207] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4702.208] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4762.208] + 2024/01/30 12:16:41.128\n[ 4762.208] + msg received - type=roControlCloudMessageEvent\n[ 4762.208] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4762.208] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4822.209] + 2024/01/30 12:17:41.129\n[ 4822.209] + msg received - type=roControlCloudMessageEvent\n[ 4822.209] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4822.209] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4824.147] Autorun.status : INFO Sending status request.\n[ 4824.228] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 4824.411] JS.websocket-player : INFO { 2024-01-30T20:17:43.331Z} sync.status.response message received from : BSN with id JqX7bWMq_ \n[ 4882.210] + 2024/01/30 12:18:41.130\n[ 4882.210] + msg received - type=roControlCloudMessageEvent\n[ 4882.210] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4882.210] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4942.211] + 2024/01/30 12:19:41.131\n[ 4942.211] + msg received - type=roControlCloudMessageEvent\n[ 4942.211] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 4942.211] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5002.212] + 2024/01/30 12:20:41.132\n[ 5002.212] + msg received - type=roControlCloudMessageEvent\n[ 5002.212] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5002.212] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5062.213] + 2024/01/30 12:21:41.133\n[ 5062.213] + msg received - type=roControlCloudMessageEvent\n[ 5062.213] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5062.213] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5122.213] + 2024/01/30 12:22:41.134\n[ 5122.213] + msg received - type=roControlCloudMessageEvent\n[ 5122.213] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5122.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5124.149] Autorun.status : INFO Sending status request.\n[ 5124.222] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 5124.480] JS.websocket-player : INFO { 2024-01-30T20:22:43.400Z} sync.status.response message received from : BSN with id JV5LuEB1W \n[ 5182.213] + 2024/01/30 12:23:41.134\n[ 5182.213] + msg received - type=roControlCloudMessageEvent\n[ 5182.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5182.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5242.213] + 2024/01/30 12:24:41.134\n[ 5242.213] + msg received - type=roControlCloudMessageEvent\n[ 5242.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5242.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5302.213] + 2024/01/30 12:25:41.134\n[ 5302.213] + msg received - type=roControlCloudMessageEvent\n[ 5302.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5302.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5362.213] + 2024/01/30 12:26:41.134\n[ 5362.213] + msg received - type=roControlCloudMessageEvent\n[ 5362.213] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5362.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5422.214] + 2024/01/30 12:27:41.134\n[ 5422.214] + msg received - type=roControlCloudMessageEvent\n[ 5422.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5422.214] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5424.150] Autorun.status : INFO Sending status request.\n[ 5424.232] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 5424.390] JS.websocket-player : INFO { 2024-01-30T20:27:43.310Z} sync.status.response message received from : BSN with id 3wquNZz3F \n[ 5426.828] IP:eth0 RENEW6 ip=2600:1700:dac0:2060::23 dns=\n[ 5482.215] + 2024/01/30 12:28:41.135\n[ 5482.215] + msg received - type=roControlCloudMessageEvent\n[ 5482.215] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5482.215] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5542.215] + 2024/01/30 12:29:41.136\n[ 5542.215] + msg received - type=roControlCloudMessageEvent\n[ 5542.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5542.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5602.216] + 2024/01/30 12:30:41.136\n[ 5602.216] + msg received - type=roControlCloudMessageEvent\n[ 5602.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5602.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5662.216] + 2024/01/30 12:31:41.137\n[ 5662.216] + msg received - type=roControlCloudMessageEvent\n[ 5662.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5662.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5722.216] + 2024/01/30 12:32:41.136\n[ 5722.216] + msg received - type=roControlCloudMessageEvent\n[ 5722.216] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5722.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5724.149] Autorun.status : INFO Sending status request.\n[ 5724.223] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 5724.376] JS.websocket-player : INFO { 2024-01-30T20:32:43.296Z} sync.status.response message received from : BSN with id IlkmBD5w7 \n[ 5782.216] + 2024/01/30 12:33:41.137\n[ 5782.216] + msg received - type=roControlCloudMessageEvent\n[ 5782.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5782.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5842.217] + 2024/01/30 12:34:41.137\n[ 5842.217] + msg received - type=roControlCloudMessageEvent\n[ 5842.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5842.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5902.217] + 2024/01/30 12:35:41.137\n[ 5902.217] + msg received - type=roControlCloudMessageEvent\n[ 5902.217] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5902.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5962.217] + 2024/01/30 12:36:41.138\n[ 5962.218] + msg received - type=roControlCloudMessageEvent\n[ 5962.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 5962.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6022.218] + 2024/01/30 12:37:41.138\n[ 6022.218] + msg received - type=roControlCloudMessageEvent\n[ 6022.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6022.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6024.151] Autorun.status : INFO Sending status request.\n[ 6024.222] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 6024.381] JS.websocket-player : INFO { 2024-01-30T20:37:43.302Z} sync.status.response message received from : BSN with id ItLZRehlv \n[ 6082.218] + 2024/01/30 12:38:41.139\n[ 6082.218] + msg received - type=roControlCloudMessageEvent\n[ 6082.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6082.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6142.218] + 2024/01/30 12:39:41.138\n[ 6142.218] + msg received - type=roControlCloudMessageEvent\n[ 6142.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6142.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6202.218] + 2024/01/30 12:40:41.139\n[ 6202.218] + msg received - type=roControlCloudMessageEvent\n[ 6202.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6202.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6262.218] + 2024/01/30 12:41:41.138\n[ 6262.218] + msg received - type=roControlCloudMessageEvent\n[ 6262.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6262.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6322.218] + 2024/01/30 12:42:41.139\n[ 6322.218] + msg received - type=roControlCloudMessageEvent\n[ 6322.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6322.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6324.152] Autorun.status : INFO Sending status request.\n[ 6324.234] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 6324.460] JS.websocket-player : INFO { 2024-01-30T20:42:43.380Z} sync.status.response message received from : BSN with id L-yzvZBZL \n[ 6382.218] + 2024/01/30 12:43:41.138\n[ 6382.218] + msg received - type=roControlCloudMessageEvent\n[ 6382.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6382.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6442.218] + 2024/01/30 12:44:41.138\n[ 6442.218] + msg received - type=roControlCloudMessageEvent\n[ 6442.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6442.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6502.218] + 2024/01/30 12:45:41.139\n[ 6502.218] + msg received - type=roControlCloudMessageEvent\n[ 6502.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6502.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6562.218] + 2024/01/30 12:46:41.139\n[ 6562.218] + msg received - type=roControlCloudMessageEvent\n[ 6562.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6562.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6622.218] + 2024/01/30 12:47:41.139\n[ 6622.218] + msg received - type=roControlCloudMessageEvent\n[ 6622.218] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6622.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6624.153] Autorun.status : INFO Sending status request.\n[ 6624.225] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 6624.388] JS.websocket-player : INFO { 2024-01-30T20:47:43.309Z} sync.status.response message received from : BSN with id ooDgOUxu0 \n[ 6682.219] + 2024/01/30 12:48:41.139\n[ 6682.219] + msg received - type=roControlCloudMessageEvent\n[ 6682.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6682.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6742.219] + 2024/01/30 12:49:41.139\n[ 6742.219] + msg received - type=roControlCloudMessageEvent\n[ 6742.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6742.219] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6802.220] + 2024/01/30 12:50:41.140\n[ 6802.220] + msg received - type=roControlCloudMessageEvent\n[ 6802.220] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6802.220] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6862.220] + 2024/01/30 12:51:41.141\n[ 6862.220] + msg received - type=roControlCloudMessageEvent\n[ 6862.220] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6862.221] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6922.220] + 2024/01/30 12:52:41.141\n[ 6922.220] + msg received - type=roControlCloudMessageEvent\n[ 6922.220] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6922.221] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6924.155] Autorun.status : INFO Sending status request.\n[ 6924.234] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 6924.413] JS.websocket-player : INFO { 2024-01-30T20:52:43.334Z} sync.status.response message received from : BSN with id mz4Z0TYJX \n[ 6982.220] + 2024/01/30 12:53:41.141\n[ 6982.220] + msg received - type=roControlCloudMessageEvent\n[ 6982.220] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 6982.221] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7042.221] + 2024/01/30 12:54:41.141\n[ 7042.221] + msg received - type=roControlCloudMessageEvent\n[ 7042.221] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7042.221] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7102.222] + 2024/01/30 12:55:41.142\n[ 7102.222] + msg received - type=roControlCloudMessageEvent\n[ 7102.222] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7102.222] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7162.222] + 2024/01/30 12:56:41.143\n[ 7162.222] + msg received - type=roControlCloudMessageEvent\n[ 7162.223] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7162.223] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7222.222] + 2024/01/30 12:57:41.142\n[ 7222.222] + msg received - type=roControlCloudMessageEvent\n[ 7222.222] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7222.222] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7222.701] Looking for recovery script at 'https://handlers.bsn.cloud//recovery/recovery.ashx'\n[ 7223.257] Recovery server response code: 204\n[ 7224.155] Autorun.status : INFO Sending status request.\n[ 7224.236] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 7224.530] JS.websocket-player : INFO { 2024-01-30T20:57:43.450Z} sync.status.response message received from : BSN with id l_tS57W_9 \n[ 7226.840] IP:eth0 RENEW6 ip=2600:1700:dac0:2060::23 dns=\n[ 7282.223] + 2024/01/30 12:58:41.143\n[ 7282.223] + msg received - type=roControlCloudMessageEvent\n[ 7282.223] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7282.223] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7342.223] + 2024/01/30 12:59:41.144\n[ 7342.224] + msg received - type=roControlCloudMessageEvent\n[ 7342.224] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7342.224] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7402.224] + 2024/01/30 13:00:41.145\n[ 7402.225] + msg received - type=roControlCloudMessageEvent\n[ 7402.225] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7402.225] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7462.225] + 2024/01/30 13:01:41.146\n[ 7462.225] + msg received - type=roControlCloudMessageEvent\n[ 7462.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7462.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7522.226] + 2024/01/30 13:02:41.147\n[ 7522.226] + msg received - type=roControlCloudMessageEvent\n[ 7522.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7522.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7524.155] Autorun.status : INFO Sending status request.\n[ 7524.228] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 7524.394] JS.websocket-player : INFO { 2024-01-30T21:02:43.315Z} sync.status.response message received from : BSN with id 9ED8KuHc8 \n[ 7582.226] + 2024/01/30 13:03:41.147\n[ 7582.226] + msg received - type=roControlCloudMessageEvent\n[ 7582.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7582.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7642.226] + 2024/01/30 13:04:41.147\n[ 7642.226] + msg received - type=roControlCloudMessageEvent\n[ 7642.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7642.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7702.226] + 2024/01/30 13:05:41.146\n[ 7702.226] + msg received - type=roControlCloudMessageEvent\n[ 7702.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7702.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7762.226] + 2024/01/30 13:06:41.147\n[ 7762.226] + msg received - type=roControlCloudMessageEvent\n[ 7762.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7762.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7822.226] + 2024/01/30 13:07:41.146\n[ 7822.226] + msg received - type=roControlCloudMessageEvent\n[ 7822.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7822.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7824.156] Autorun.status : INFO Sending status request.\n[ 7824.228] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 7824.403] JS.websocket-player : INFO { 2024-01-30T21:07:43.324Z} sync.status.response message received from : BSN with id n0c2crjUe \n[ 7882.226] + 2024/01/30 13:08:41.147\n[ 7882.226] + msg received - type=roControlCloudMessageEvent\n[ 7882.226] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7882.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7942.226] + 2024/01/30 13:09:41.147\n[ 7942.226] + msg received - type=roControlCloudMessageEvent\n[ 7942.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 7942.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8002.227] + 2024/01/30 13:10:41.148\n[ 8002.227] + msg received - type=roControlCloudMessageEvent\n[ 8002.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8002.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8062.227] + 2024/01/30 13:11:41.148\n[ 8062.227] + msg received - type=roControlCloudMessageEvent\n[ 8062.227] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8062.228] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8122.228] + 2024/01/30 13:12:41.148\n[ 8122.228] + msg received - type=roControlCloudMessageEvent\n[ 8122.228] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8122.228] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8124.156] Autorun.status : INFO Sending status request.\n[ 8124.242] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 8124.403] JS.websocket-player : INFO { 2024-01-30T21:12:43.323Z} sync.status.response message received from : BSN with id -ug-wSq34 \n[ 8182.228] + 2024/01/30 13:13:41.148\n[ 8182.228] + msg received - type=roControlCloudMessageEvent\n[ 8182.228] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8182.228] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8242.228] + 2024/01/30 13:14:41.149\n[ 8242.228] + msg received - type=roControlCloudMessageEvent\n[ 8242.229] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8242.229] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8302.228] + 2024/01/30 13:15:41.149\n[ 8302.228] + msg received - type=roControlCloudMessageEvent\n[ 8302.229] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8302.229] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8362.229] + 2024/01/30 13:16:41.150\n[ 8362.230] + msg received - type=roControlCloudMessageEvent\n[ 8362.230] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8362.230] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8422.230] + 2024/01/30 13:17:41.151\n[ 8422.231] + msg received - type=roControlCloudMessageEvent\n[ 8422.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8422.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8424.157] Autorun.status : INFO Sending status request.\n[ 8424.232] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 8424.382] JS.websocket-player : INFO { 2024-01-30T21:17:43.302Z} sync.status.response message received from : BSN with id D6O8fa1kH \n[ 8482.231] + 2024/01/30 13:18:41.151\n[ 8482.231] + msg received - type=roControlCloudMessageEvent\n[ 8482.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8482.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8542.231] + 2024/01/30 13:19:41.151\n[ 8542.231] + msg received - type=roControlCloudMessageEvent\n[ 8542.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8542.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8548.004] JS.websocket-player : INFO { 2024-01-30T21:19:46.924Z} RestRequest message received from : ws-rest-server-4403a96c-2fb4-4a4c-bf1e-e56a88b853b5 with id 4403a96c-2fb4-4a4c-bf1e-e56a88b853b5 for /v1/video/hdmi/output/0/edid\n[ 8548.021] JS.Supervisor : INFO API GET request \"/v1/video/hdmi/output/0/edid\"\n[ 8548.043] JS.Supervisor : INFO API response to \"/v1/video/hdmi/output/0/edid\" => \"00ffffffffffff004c2d0d050100000030120103801009780aee91a3544c99260f5054bdef80714f8100814081809500950fb3000101023a801871382d40582c4500a05a0000001e662150b051001b3040703600a05a0000001e000000fd00184b1a5117000a202020202020000000fc0053414d53554e470a2020202020016... [truncated]\n[ 8548.055] JS.websocket-player : INFO received rest response : 200\n[ 8548.069] JS.websocket-player : INFO { 2024-01-30T21:19:46.990Z} RestResponse sending response to ws-rest-server-4403a96c-2fb4-4a4c-bf1e-e56a88b853b5 with id 4403a96c-2fb4-4a4c-bf1e-e56a88b853b5 for /v1/video/hdmi/output/0/edid\n[ 8602.231] + 2024/01/30 13:20:41.152\n[ 8602.231] + msg received - type=roControlCloudMessageEvent\n[ 8602.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8602.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8662.231] + 2024/01/30 13:21:41.152\n[ 8662.231] + msg received - type=roControlCloudMessageEvent\n[ 8662.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8662.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8722.231] + 2024/01/30 13:22:41.152\n[ 8722.231] + msg received - type=roControlCloudMessageEvent\n[ 8722.231] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8722.232] + supervisor / bootstrap roControlCloudMessageEvent received\n[ 8724.158] Autorun.status : INFO Sending status request.\n[ 8724.230] JS.websocket-player : INFO sendWsRequest (sync.status.request)\n[ 8724.422] JS.websocket-player : INFO { 2024-01-30T21:22:43.342Z} sync.status.response message received from : BSN with id CK7se1dIO \n[ 8741.382] JS.websocket-player : INFO { 2024-01-30T21:23:00.303Z} RestRequest message received from : ws-rest-server-fff9eb81-7bb3-40e8-b575-73e50d5ad751 with id fff9eb81-7bb3-40e8-b575-73e50d5ad751 for /v1/logs\n[ 8741.392] JS.Supervisor : INFO API GET request \"/v1/logs\"\n"
    }
}
```

## GET /crash-dump/ 

Retrieves the crash dump from the player

**Request Example**

```text
GET /rest/v1/crash-dump/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `result` <font color="#704ae0">Result</font>: A Result object containing crash-dump files:
  - `isRecent` <font color="#704ae0">bool</font>: A flag indicating if this is the most recent set of crash-dump files
  - `crashDumpFiles` <font color="#704ae0">CrashDumpFiles</font><font color="#704ae0">[ ]</font>: An array of CrashDumpFiles instances that contain the following entries:
    - `fileName` <font color="#704ae0">string</font>: The name of the file. You can use this field to download the file later using `GET /v1/files/sd/{{filename}}?contents`.
    - `mimeType` <font color="#704ae0">string</font>: The MIME type of the crash-dump file
    - `fileContents` <font color="#704ae0">string</font>: The crash-dump file contents

**Response Example**

```text
{
    "route": "/v1/crash-dump/",
    "method": "GET",
    "data": {
        "result": {
            "isRecent": false,
            "crashDumpFiles": [],
            "crashDump": {
                "fileName": "BrightSign-RE433D006644.zip",
                "fileContents": "UEsFBgAAAAAAAAAAAAAAAAAAAAAAAA==",
                "mimeType": "application/zip"
            }
        }
    }
}
```


[title] Local DWS APIs
[path] Diagnostic Web Server APIs/

:::hint{type="warning"}
Local access (i.e., access over the local network) of the Diagnostic Web Server (DWS) is *disabled* by default as of BrightSignOS 9.0.218 (on the 9.0 branch) and BrightSignOS 9.1.75 (on the 9.1 branch). In BrightSignOS versions prior to these, local access to the DWS was enabled by default. To enable local access to the DWS, see [DWS: Local Access](docId\:IAFCHERlJfjDJTWTtKpk5).

Note that some specially configured players have the external microSD card port and USB storage disabled at the factory (SKU: SVC-internal-storage-only). For these players, local access to the DWS remains enabled by default.

Remote access (i.e., access over the internet) of the DWS remains available for all internet-connected players registered with BrightSign Cloud.
:::

There are two ways to access these APIs:

1. You can choose to use **digest authentication**. Digest authentication uses a username and a password. The username is always “admin”. The password can be set in three ways:
   - Use the default, which is the player serial number
   - Set it through the setup package
   - Set it using a custom script
2. You can choose to use **no authentication**. However, this is not recommended.

Once the password is set, you need to authenticate to access the Local DWS APIs. To do this:

- You should be using BrightSignOS 8.4.6 or newer.
- Call the desired API using digest authentication with the Local DWS username and password. Note that digest authentication is fairly insecure when used over an insecure transport (HTTP).

The URL prefix is always **https\://player\_ip/api**

# API Definitions

The listed APIs are prefixed with the version /v1. We can not guarantee that these documents will be current in every case.

- [LDWS Advanced Endpoints](docId\:RRbb0Z9dcT8MTxS9jQfo8)&#x20;
- [LDWS Control Endpoints](docId\:YLXb9c8Us70n09hoOkdp_)&#x20;
- [LDWS Diagnostics Endpoints](docId\:SAYOK1v5MYNJRFjDyJO5K)&#x20;
- [LDWS Display Control Endpoints](docId\:EeuFgOaVJljvCcGpGDXdn)&#x20;
- [LDWS General Endpoints](docId:7xFfmAhpax15y5oeYva1z)&#x20;
- [LDWS Info Endpoints](docId\:LRnVVAaa2rBz3-22KpTNu)&#x20;
- [LDWS Logs Endpoints](docId\:GVrlTps3CLNqwBF6nMEpM)&#x20;
- [LDWS Registry Endpoints](docId\:vGoS8rY1L2GRoThAU1OGK)&#x20;
- [LDWS Remote Snapshot Endpoint](docId:5clrLJAf12o4XJrg6TTdB)&#x20;
- [LDWS sendCecX Endpoint](docId\:V-ECyNuTwH-8p7ExQP06R)&#x20;
- [LDWS Storage Endpoints](docId:-NxNHjKhZyIJmLYmZrifA)&#x20;
- [LDWS Video Endpoints](docId\:ySqOggYSBTPMi8d_TyWz9)&#x20;

# Using HTTPS with the Local DWS

In BOS releases after BOS 8.2.35.4, users had the option use either a trusted certificate or a self-signed certificate to access HTTPS over the DWS. As of BOS 9.0.218 and 9.1.52, the Local DWS uses HTTPS by default with a self-signed certificate. Previously (in BOS 8.2.35.4 and newer) HTTPS was optional, but a self-signed certificate had to be provided. See [Add Digital Certificates](docId\:j17PU2fWzG7niK1NIYT-Y) for information about how to apply a certificate to a player.

If your existing scripts use **HTTP** to access LDWS, you should update them to use **HTTPS**. If updating the scripts is not immediately possible, you may temporarily set the enable\_http\_redirect registry key in the networking section to false (link to the registry doc). This disables HTTP redirection, allowing your current scripts to continue functioning.

Please note that **HTTPS is enforced regardless of the registry key setting**. The registry key only controls HTTP redirection behavior and does not disable HTTPS enforcement.&#x20;

## Generating a Self-Signed Certificate and Key

To do this, choose one of the following two methods:

1. Run this code: 

:::CodeblockTabs{indent="2"}
```text
openssl req -nodes -new -x509 -keyout dws.key -out dws.crt
```
:::

2. OR run the following code and use the 'dws.key' and 'dws.crt' files. The other files can be deleted later.

```text
openssl req -newkey rsa:4096 -keyform PEM -keyout ca.key -x509 -days 3650 -outform PEM -out ca.cer
openssl genrsa -out dws.key 4096
openssl req -new -key dws.key -out client.req
openssl x509 -req -in client.req -CA ca.cer -CAkey ca.key -set_serial 101 -extensions client -days 365 -outform PEM -out dws.crt
```

## Making the Certificate and Key Files Accessible

The operating system will look for files with known names at the root of the default storage. To make the certificate and key files you generated findable, either:

1. <font color="hsl(var(--ab-gray-900))">Name the files **dws.crt** and **dws.key**, as in the examples. </font>
2. <font color="hsl(var(--ab-gray-900))">Put the names of the files in the networking registry using the keys **ldws_cert_file_name**, **ldws_key_file_name**</font>. See [BrightSign Registry Keys](docId:8LUJ1vpF-ftLCBISBqBvZ) for more information.

:::hint{type="info"}
<font color="hsl(var(--ab-gray-900))">If you want to supply the CA certificate, you can use the default name **dws.ca** or if you want to use another name use the registry key **ldws_ca_file_name** to specify the filename.</font>
:::

<font color="hsl(var(--ab-gray-900))">Then put the files at the root of the default storage. If you have defined the **ldws_certs_path** registry key, this will be the certs location (rather than the default storage).</font>




[title] App URL/CMS URL
[path] BrightSign Partner Packet/Integrating with BrightSign/

In the hands-on example, a player was manually provisioned by physically copying a Player App to the player’s storage device. Since the Default Setup File was acceptable, provisioning of the player did not require a new Setup File to be explicitly applied.

While manual provisioning is a very straightforward process, it poses challenges when multiple players are involved, players are in remote or hard-to-access locations, and/or the content needs to be updated frequently. Remote provisioning can therefore be highly beneficial in many scenarios.

The recommended method for partner provisioning of players, either manually or remotely, is through the use of Setup Files which can be created via BrightSign Control or Author.

# CMS URL/App URL

The [Publishing Mode](docId\:rEScIigY-dJRPuZgwaA4e) is one of the important settings included in a Setup File, and the CMS URL (also known as App URL) Publishing Mode is an effective way to remotely get content onto players. More details of this Setup can be found [here](docId\:rEScIigY-dJRPuZgwaA4e), but a summary is as follows:

1. The desired *autorun.brs* or *autorun.zip* file is uploaded to a player-accessible URL. The *autorun.zip* file includes the essentials (*autozip.brs* and *autorun.brs*) and, if desired, the presentation file and associated content files. The URL path to the *autorun.brs* or *autorun.zip* file is designated as the CMS URL/App URL (an example is available at [https://www.brightsign.biz/examples/autorun.zip](https://www.brightsign.biz/examples/autorun.zip) which you may use).
2. The player is configured with the CMS URL/App URL. There are several ways to do this:
   - A CMS URL/App URL can be applied directly to a player or group of players in BrightSign Author (in the Provision screen) or BrightSign Control. You will be shown one way to do this in the next section.
   - Create a CMS URL/App URL Setup using BrightSign Author or Control (see [App URL Setup](docId\:xtwqFLwCI3MHbkoDM7eWm)).&#x20;
     - The Setup File contains info about the CMS URL/App URL.
     - The Setup File can be remotely applied to a player or group of internet-connected players.
     - Players download the *autorun.brs* or *autorun.zip* file from the CMS URL/App URL specified in the Setup File.
3. Player(s) configured for a CMS URL/App URL will, upon booting, download the *autorun.br*s or *autorun.zip* file from the specified CMS URL/App URL. If the file is an *autorun.zip* file containing an *autozip.brs* file, the player will unzip that file. The player will then reboot, and then run the *autorun.brs* file.

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/zxa9vjVMCwwGgk8JWUhub_screenshot-2026-08-06-at-22430-pm.png)

Next, we will walk through another hands-on example in which we provision a player directly to use an CMS URL/App URL.

[Next - Example (App URL) >](docId\:giRa9PDvYpKDwJDYbDHr9)

[title] IGMP Behavior
[path] Untitled/

In OS version 8.0.84, players accept a `force_igmp_version` registry entry in the networking section. This entry allows for customization of the player response to the IGMP network environment. It can have the following values:

- 0: The default behavior. The player will use IGMPv3 unless a querier with an older version is present, in which case the player will fall back to v2 or v1.
- 1: The player will always use IGMPv1.
- 2 : The player will use IGMPv2 if possible, but will fall back to v1 if an older querier is present.
- 3 : The player will only use IGMPv3 and will not fall back to v1 or v2.

### Example

This is a simple example which sets the value to 1. You will have to reboot the player to see registry changes. See BrightScript [roRegistry](docId\:YTpSfntswYFMXx8PCqJLf) or JavaScript [registry](docId\:tXWoOMbD2-u12dfegX7gA) for more details.

```javascript
var registryClass = require("@brightsign/registry");
var registry = new registryClass();
 
//Writes to the registry, forcing the player to always use IGMPv1
registry.write({networking:{force_igmp_version:"1"}}).then(
	function(){console.log("Write Successful");});
```


[title] HTML Authoring Resources
[path] HTML Development/

There are a large number of online resources—including tutorials, samples, templates, and widgets—available to help you get started creating content with HTML5. The HTML5 standard offers huge advantages to web developers, including digital signage authors. The following websites are great places to learn how to create pages using HTML5: 

- [http://www.html5report.com](http://www.html5report.com)
- [http://www.w3schools.com](http://www.w3schools.com)

## WordPress 

WordPress is an excellent HTML5 resource that provides an intuitive approach to creating digital signage. Here are some of the benefits of using the WordPress architecture: 

- WordPress offers advanced HTML5 support, with premade widgets ranging from weather to e-commerce. The system also supports advanced HTML5 options using CSS3 features. The [http://www.jqwidgets.com](http://www.jqwidgets.com) site also provides HTML5 widgets.
- You can either run WordPress from [the website](http://wordpress.org/) or install a WordPress instance on your own servers.
- WordPress has an ecosystem of template creators that offer sophisticated templates for a wide range of industries: Template creators include the following:
  - [http://www.rockettheme.com/wordpress](http://www.rockettheme.com/wordpress)
  - [http://www.templatemonster.com](http://www.templatemonster.com)
  - [http://graphpaperpress.com](http://graphpaperpress.com)

## HTML5 Authoring

These are some of the common HTML5 authoring applications:

- Adobe CS Tools: Dreamweaver, Illustrator, InDesign, Photoshop
- Aptana Studio
- CoffeeCup Software


[title] Using HTML Websites that Require Logins
[path] HTML Development/HTML Best Practices/

If you want to use websites that require credentials:

1. Some URLs allow you to add the login information inline with the URL. For example: *http\://login\:password\@myserver.com*.
2. Some URLs require that the username and password be added to the end of the URL. For example: *http\://www\.mywebsite.com?username=test\&password=test*
3. You can whitelist the player IP so that a login is not required for the website.
4. You can use locally installed cert files that can be applied to a player using a plugin for authentication.
5. You can use a HTML page to log into another page by modifying the first page to match the form needed by the website. Usually, this means that you will need to get the name of the login form as well as the IDs used for the login name field and the password field. Note that:
   - Some pages can be logged into just using an iframe.
   - Some require using JavaScript injection.
   - Some pages are complex with multiple dialogs and timeouts.

### Example

To implement automatic login for web pages in a presentation using HTML and JavaScript, download this example:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/GZ9OG9u42sGOEv_nm99Tm_pageloginexample.zip" label="PageLoginExample.zip" isUploading="false"}

To use the example:

1. Add the HTML page to your BrightSign Author or CMS presentation.
2. Configure the login details in the CONFIG section of the JavaScript:

:::CodeblockTabs{indent="2"}
```text
const CONFIG = {
targetUrl: 'YOUR_TARGET_URL',
credentials: {
username: 'YOUR_USERNAME',
password: 'YOUR_PASSWORD'
}
};
```
:::

3. Update the form action URL to match your login endpoint:

```text
<form id="loginForm" method="post" action="YOUR_LOGIN_URL">
```

The script will automatically:

- Fill in the credentials when the page loads
- Submit the login form
- Redirect to your target URL after successful login

:::hint{type="info"}
This example assumes a basic form-based authentication. You may need to modify the JavaScript to match your specific login requirements.
:::

**Security** **Consideration**: Storing credentials in the HTML/JavaScript files means they could be accessed if someone has physical access to the player with JavaScript console enabled. For most internal network deployments, this presents an acceptable level of risk.

[title] Technical Best Practices
[path] BrightSign Partner Packet/

To assist partners in getting up and running as efficiently as possible, we’ve compiled a list of technical best practices to maximize your chances of success.

# brightsign-dumps Folder

When developing your own autoruns, do not forget to include instructions for the autorun to create a *brightsign-dumps* folder on the player. The *brightsign-dumps* folder is used to store crash information and is very useful to BrightSign support when troubleshooting.

# Storage Paths

All partner applications make use of storage device paths, either to indicate where files will be downloaded to, or where to locate certain files present on the storage device.

The BrightSign OS supports multiple storage devices and following is the priority order in which they are mounted:

| **Storage Device (in priority order)** | **BrightScript path** | **JavaScript path** | **Description**                                                                                                                |
| -------------------------------------- | --------------------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| USB1                                   | USB1:/                | /storage/usb1       | The drive for USB storage devices connected to the player                                                                      |
| SD                                     | SD:/                  | /storage/sd         | The primary SD or microSD drive on the player                                                                                  |
| SD2                                    | SD2:/                 | /storage/sd2        | The internal microSD drive on  players that support this (see [Storage Devices by Player Model](docId\:mGdEFc6YvkIbeiUxH9J1O)) |
| SSD                                    | SSD:/                 | /storage/ssd        | The internal SSD on the player (XT and XD models only)                                                                         |
| Flash                                  | Flash:/               | /storage/flash      | The internal flash storage on the player                                                                                       |

:::hint{type="danger"}
Note that the LGUV5N model only features Flash or USB storage (no SD), and will fall back to the Flash if no other storage is found. Due to popular demand, the FLASH: storage on LG is renamed SD: and references to FLASH: will no longer work as of the BOS 9.1.96 Beta release.
:::

Below are some of the recommended practices when using storage device paths:&#x20;

1. Derive the default mounted storage device path in your application. See the examples for BrightScript and JavaScript below.
2. Validate the derived storage device as needed. See the `DriveIsMounted()` function in the BrightScript example below.
3. If your app uses relative file paths, BrightScript will assume that the file paths are relative to the default storage device.
4. If your app uses different storage for autorun and media, then it should specify a path (as per list above) and validate that the path exists.

### Code Examples

The following examples provide an approach to find the highest priority storage device that is mounted on the player.

**BrightScript**

```none
Function GetMountedDrive() As String
'''''''''''''''''''''''''''''''''''''
    drives = ["USB1:/","SD:/","SD2:/","SSD:/","FLASH:/"]
    for each drive in drives
        If DriveIsMounted(drive) Then
            return drive
        End If
    next
    return ""
End Function

Function DriveIsMounted(driveName$ As String) As Boolean
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    du = CreateObject("roStorageInfo", driveName$)
    If type(du) = "roStorageInfo" Then
        return true
    End If
    return false
End Function
```

**JavaScript**

```javascript
const fs = require('fs');
const path = require('path');

function getDefaultStorageDevice() {
  const rootPrefix = '/storage';
  const storage_list = [ 'usb1', 'sd', 'sd2', 'ssd', 'flash' ];
  for(const storage of storage_list) {
    try {
      fs.realpathSync(path.join(rootPrefix, storage));
      return storage;
    } catch(ex) {
      // nop - the dir doesn't exist on this system
    }
  }
  return undefined;
}
```

# Free Tools

BrightSign offers a plethora of free tools and services that greatly ease provisioning and diagnostics. These include the powerful tools available via BSN.Cloud for player provisioning as well as the many tools described in the [Developer Tools](docId\:WFjRzUBBUvewOhJo-Tf3Q) section of this guide. Partners are highly encouraged to take as much advantage of these tools as possible as it accelerates development and also makes support and troubleshooting much easier.

# Memory Management

BrightSign players are purpose-built for digital signage. Players are not general-purpose devices and they do not have, nor do they require, as much memory as a typical Mac or PC. When developing for the BrightSign platform, developers should be cognizant of potential memory limitations that they may not be accustomed to.

# OS Updates

Partners should try to use the latest BrightSignOS builds in order to take advantage of the latest bug fixes and newest features. Keeping up to date with the latest OS build also enables partners to more easily expand their deployments with our latest hardware.

We are continuously improving the firmware on our players, but as is often the case with software, problems are sometimes inadvertently introduced. A stable player is paramount to any BrightSign integration, so we strongly encourage partners to thoroughly test any BrightSign firmware releases prior to upgrading any players being used in a production environment.

# HTML \<video> Elements & Memory

It is fairly common for a presentation to include switching from one video to another. In many BrightSign players, including the Series 4 line, if a video element is not explicitly released, that element will continue to use memory even if it is no longer actively displaying. It is therefore important to reset the source to blank prior to switching videos. If this is not done, the first video(s) will continue to use memory while subsequent videos are playing, potentially resulting in the following log message:

`Failed to find a video decoder`

To release the video element, the `src` attribute of the `<video>` should be set to blank:

`video.src = "";`

Additional detail on this topic can be found [here](docId\:e6uJleH69Q0JmMv8kyTrp).

# Smooth Video Transitions

If multiple videos are being displayed sequentially, it is generally desired for one video to transition smoothly into the other one. To help ensure this, make sure that both the first and last frames of the videos do not consist of a blank frame. The presence of even one blank frame between videos can result in a noticeably jarring transition between videos.

# Upgradeability

Change is inevitable so partners are recommended to design their apps with the ability to push updates to players remotely. This applies not only to the partner app itself, but also to diagnostic scripts which can be very useful for troubleshooting.

[Next - Operational Best Practices >](docId\:NTbn8xiRZFucKFBzWQ_2Z)

[title] Support
[path] BrightSign Partner Packet/

As you dive into the details of your integration, technical questions will inevitably arise. Many questions can be answered in this documentation space.

If more assistance is needed, we are here to help and have created a ticketing system to help manage and track issues. The ticketing system ensures efficient routing of issues directly to the relevant teams within BrightSign and makes it easier for all parties involved to stay updated on issue status.

New issues and questions should be emailed to [integrations@brightsign.biz](http://support@brightsign.biz/) which will trigger a new ticket to be created. A few important things to keep in mind:

- Each new issue or question you or your team has should be generated as a new ticket. To create a new ticket, email [integrations@brightsign.biz](http://support@brightsign.biz/). Any messages coming from your email domain gets automatically routed to a priority queue for partners.
- To get your issue resolved as expeditiously as possible, refer to the page [Writing Support Tickets](docId\:oMXTOFi-CI-ATHwA660eO).
- To reply to tickets, simply reply to the email sent by the ticketing system.
- The ticketing system can also be accessed via a web UI. Generally speaking, the primary benefit of the web UI is to view all open items. In most cases, it is easiest to just reply to the emails from the ticketing system.

We are always excited to hear from our customers. Feature requests and other feedback can be made on the [BrightSign Product and Feature Request Discussion forum](https://brightsign.zendesk.com/hc/en-us/community/topics/115000001633-BrightSign-Product-and-Feature-Request-Discussion). Our Product Management team uses this community/forum to track requests from our users. While you're there, make sure to upvote any other features you think would be useful in future releases.

When requesting technical support, it is important to include all relevant information. Next, we provide some guidelines for writing a good support ticket.

[Next - Staying Updated >](docId:9qXITaPxA4VgFHYIpqkJV)&#x20;

[title] Developer Tools
[path] BrightSign Partner Packet/Integrating with BrightSign/

BrightSign offers an extensive array of developer tools. These are listed here in alphabetical order.

# BrightSign Shell & BrightScript Debugger

The BrightSign Shell is the CLI (command-line interface) that enables interaction with the BrightSignOS through a serial cable or Telnet/SSH. The BrightScript Debugger is a tool that facilitates debugging of BrightScript code. More info about these tools can be found [here](docId\:FXXyu9jmocUtC6XE2p7l2).

# Crash Dumps

If a player encounters a non-deliberate shutdown (aka a crash), “crash dumps” are generated upon reboot. These files contain useful information that BrightSign Support can analyze and use for troubleshooting. These files can be found in the *brightsign-dumps* folder located in the root folder of the player’s storage device.

# Diagnostic Web Server

The Diagnostic Web Server (DWS) is a powerful tool that enables inspection of various player settings and diagnostic details. The DWS can be accessed locally (over the local network via the player’s IP address or by typing `http://BrightSign-NNNNNNNNNN.local` into a browser where `NNNNNNNNNN` is the serial number) as well as remotely (via BrightSign Author). General info about the DWS can be found [here](docId\:qXt4YHey7IEj_M9dH73wM).

## Media Analyzer

The DWS includes a useful tool that can analyze media files for playability. More info can be found [here](docId\:qXt4YHey7IEj_M9dH73wM).

# HTML

HTML is a common format for displaying presentations on BrightSign players. The [HTML Best Practices](docId\:GXcTVNW8g46EvdxOOkUKu) page will likely be very useful to developers. Specific sub-sections from that document worth noting individually are listed below.

## Web Inspector

Web pages can be debugged over the local network using the [Web Inspector](docId:4qlK1krr1cnx7xypWXRY5).

## Chromium Version

The Chromium version that BrightSign players use is likely several versions behind that version that most users are using in their web browsers. Find the Chromium version for the specific OS version of your player [here](docId\:YGi_yIWT6pZ2BtU-GrfuP).

During development and testing, it is useful to have the correct version of Chromium on your Mac or PC. More info about this can be found [here](docId\:YGi_yIWT6pZ2BtU-GrfuP).

# Logs / Diagnostics

Logs contain important diagnostic information about players. System logs (sometimes referred to as player logs) from the player are available and can be gathered via a syslog server, Telnet or SSH, or a serial cable. More info about accessing logs via these means can be found [here](docId\:FXXyu9jmocUtC6XE2p7l2).

Refer to [this article](docId\:qsLJGbc6ax5NZxhFnHtJW) on obtaining player logs and [this one](docId\:mOlxN8L89xSeDvjEe4KmH) for interpreting player logs. Logs can easily be accessed via the RDWS as described [here](docId\:qXt4YHey7IEj_M9dH73wM).

# Node

The node prompt is a command-line interface (CLI) that allows you to interact with Node.js. It is used to run JavaScript code and execute Node.js commands. Information about the Node prompt as well as the Node Inspector/Debugger can be found [here](docId:4qlK1krr1cnx7xypWXRY5).

# Registry

The *registry* object allows you to read from and write to the player registry (the player’s persistent memory). More info about the registry can be found [here](docId\:tXWoOMbD2-u12dfegX7gA).

# Serial Ports

Brightsign players have serial ports for diagnostic purposes as well as to provide interactive capabilities. More info about the hardware details of player serial ports can be found [here](docId\:Zen3QyWtjoHOeOTkbRX2a) and how to use the serial port to access the BrightSign Shell and BrightScript Debugger can be found [here](docId\:FXXyu9jmocUtC6XE2p7l2).

# Telnet and SSH

Telnet and SSH can be used to communicate with BrightSign players. More info can be found [here](docId\:FXXyu9jmocUtC6XE2p7l2).

# VSCode Extension for BrightScript

The popular [BrightScript Language Extension](https://marketplace.visualstudio.com/items?itemName=RokuCommunity.brightscript) for [VSCode](https://code.visualstudio.com/) facilitates writing BrightScript and is used by thousands of developers around the world. Note that Brightsign’s BrightScript is a fork of Roku’s BrightScript. The forks have diverged and while they are similar, they are technically not the same. The value add is mainly the BrightScript syntax highlighting.

Next, we provide a recommended developer setup to help maximize efficiency in developing for the BrightSign platform.

[Next - Developer Setup >](docId:92LUy00TknTQUK2z1SiWF)

[title] LDWS Info Endpoints
[path] Diagnostic Web Server APIs/Untitled/

## GET /v1/info/ 

Returns basic player information

**Request Example**

```text
GET /api/v1/info/ HTTP/1.1
Host: {{playerIP}
Authorization: {{DigestAuth}}
```

**Response Body**

- `serial` <font color="#704ae0">string</font>: The serial number of the player
- `model` <font color="#704ae0">string</font>: The model number of the device (e.g. "XD234")
- `connectionType` <font color="#704ae0">string</font>: The currently active network interface, which can be either "Ethernet" or "WiFi"
- `ethernet` <font color="#704ae0">object</font>: An object containing information about the ethernet connection. This property will only be available if there's a valid ethernet connection on the player. The object can contain the following properties:
  - `IPv4` <font color="#704ae0">object</font>: An object containing information about the IPv4 configuration. The object can contain the following properties:
    - `address` <font color="#704ae0">string</font>: The assigned IPv4 address
    - `netmask` <font color="#704ae0">string</font>: The IPv4 network mask
    - `family` <font color="#704ae0">string</font>: `IPv4`
    - `mac` <font color="#704ae0">string</font>: The MAC address of the network interface
    - `internal` <font color="#704ae0">bool</font>: `true` if the network interface is a loopback or similar interface that is not remotely accessible; otherwise `false`
    - `cidr` <font color="#704ae0">string</font>: The assigned IPv4 address with the routing prefix in CIDR notation. If the `netmask` is invalid, this property is set to `null`.
  - `IPv6` <font color="#704ae0">object</font>: An object containing information about the IPv6 configuration:
    - `address` <font color="#704ae0">string</font>: The assigned IPv6 address
    - `netmask` <font color="#704ae0">string</font>: The IPv6 network mask
    - `family` <font color="#704ae0">string</font>: `IPv6`
    - `mac` <font color="#704ae0">string</font>: The MAC address of the network interface
    - `internal` <font color="#704ae0">bool</font>: `true` if the network interface is a loopback or similar interface that is not remotely accessible; otherwise `false`
    - `cidr` <font color="#704ae0">string</font>: The assigned IPv6 address with the routing prefix in CIDR notation. If the `netmask` is invalid, this property is set to `null`.
- `bootVersion` <font color="#704ae0">string</font>: The current version of the boot loader
- `fwVersion`  <font color="#704ae0">string</font>: The current version of firmware installed on the player
- `upTime` <font color="#704ae0">string</font>: The amount of time (as a human-readable string) that the player has been powered on and working correctly
- `upTimeSeconds` <font color="#704ae0">int</font>: The amount of time (in seconds) that the player has been powered on and working correctly
- `extensions` <font color="#704ae0">extension[ ]</font>: An array of Extension objects describing Firmware Extensions currently installed on the player
- `blessings` <font color="#704ae0">blessing[ ]</font>: An array of Blessing objects describing proprietary codecs that are currently authorized on the player

**Response Example**

:::ExpandableHeading
Expand

```json
{
    "route": "/v1/info",
    "method": "GET",
    "data": {
        "result": {
            "serial": "RE433D006644",
            "upTime": "30 minutes",
            "upTimeSeconds": 1832,
            "model": "XD1035",
            "FWVersion": "9.0.97",
            "bootVersion": "9.0.85",
            "family": "cobra",
            "isPlayer": true,
            "power": {
                "result": {
                    "battery": "absent",
                    "source": "AC",
                    "switch_mode": "hard"
                }
            },
            "poe": {
                "result": {
                    "status": "inactive"
                }
            },
            "extensions": {
                "result": {
                    "extensions": []
                }
            },
            "blessings": {
                "result": {
                    "ac3": false,
                    "eac3": false
                }
            },
            "networking": {
                "result": {
                    "description": "Test_player",
                    "name": "XD5-RE433D006644"
                }
            },
            "bvnPipelines": {
                "result": {
                    "pipelines": []
                }
            },
            "bvnComponents": {
                "result": {
                    "components": []
                }
            },
            "hardware_features": {
                "hdmi": true,
                "component video": false,
                "vga": false,
                "two channel audio": true,
                "ethernet": true,
                "usb": true,
                "serial port 0": true,
                "serial port 1": false,
                "gpio connector": true,
                "svc button": true,
                "reset button": true,
                "rtc": true,
                "settings rom": false,
                "microsd": false,
                "sdhc": true,
                "six channel audio": false,
                "ir blaster": true,
                "wifi": false,
                "serial port 2": false,
                "audio input": false,
                "cec": true,
                "battery": false,
                "portrait lcd": false,
                "hdmi input": false,
                "digital tuner": false,
                "spdif": true,
                "audio input loopback": false,
                "msata": false,
                "ac3": false,
                "eac3": false,
                "onboard storage": true,
                "no 4k decode": false,
                "no bluetooth": false,
                "no poe": false,
                "internal storage only": false,
                "disable packet capture": false,
                "disable bsn cloud": false,
                "brightear": false,
                "disable dws": false
            },
            "api_features": {
                "video": true
            },
            "active_features": {
                "legacyDWS": true
            },
            "connectionType": "eth0",
            "ethernet": [
                {
                    "interfaceName": "eth0",
                    "interfaceType": "Ethernet",
                    "IPv4": [
                        {
                            "address": "123.456.7.890",
                            "netmask": "255.255.255.0",
                            "family": "IPv4",
                            "mac": "90:ac:3f:2a:01:79",
                            "internal": false,
                            "cidr": "192.168.1.174/24"
                        }
                    ],
                    "IPv6": [
                        {
                            "address": "2600:1700:dac0:2060::23",
                            "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
                            "family": "IPv6",
                            "mac": "90:ac:3f:2a:01:79",
                            "internal": false,
                            "cidr": "2600:1700:dac0:2060::23/128",
                            "scopeid": 0
                        },
                        {
                            "address": "2600:1700:dac0:2060:92ac:3fff:fe2a:179",
                            "netmask": "ffff:ffff:ffff:ffff::",
                            "family": "IPv6",
                            "mac": "90:ac:3f:2a:01:79",
                            "internal": false,
                            "cidr": "2600:1700:dac0:2060:92ac:3fff:fe2a:179/64",
                            "scopeid": 0
                        },
                        {
                            "address": "fe80::92ac:3fff:fe2a:179",
                            "netmask": "ffff:ffff:ffff:ffff::",
                            "family": "IPv6",
                            "mac": "90:ac:3f:2a:01:79",
                            "internal": false,
                            "cidr": "fe80::92ac:3fff:fe2a:179/64",
                            "scopeid": 2
                        }
                    ]
                }
            ],
            "wireless": [],
            "interfaces": [],
            "bsnce": true
        }
    }
}
```
:::

## GET /v1/time/ 

Retrieves the date and time as configured on the player. The date/time value is formatted as `"yyyy-mm-dd hh:mm:ss <timezone>"`. 

**Request Example**

```text
GET /api/v1/time/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
```

**Response Example**

```json
{
    "route": "/v1/time",
    "method": "GET",
    "data": {
        "result": {
            "time": "2018-10-18 14:34:34 PDT",
            "timezone_mins": null,
            "timezone_name": "America/Los_Angeles",
            "timezone_abbr": "PDT",
            "year": 2018,
            "month": 10,
            "date": 18,
            "hour": 14,
            "minute": 34,
            "second": 34,
            "millisecond": 569
        }
    }
}

```

## PUT /v1/time/ 

Sets the time on the player. 

**Request Body**

- `date` <font color="#704ae0">string</font>: The recommended format is: "`YYYY-MM-DD`"
- `time` <font color="#704ae0">string</font>: The recommended format is: "`HH:mm`"
- `applyTimezone` <font color="#704ae0">bool</font>: This value decides if the date and time passed is in UTC or not (the default is false).

**Request Example**

```text
PUT /api/v1/time/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Content-Type: application/json
Content-Length: 117
```

This is the example request body:

```json
{
    "data": {
        "time": "22:00:00",
        "date": "2023-11-07",
        "applyTimezone": true
    }
}
```

**Response Example**

```json
{
  "data": {
    "result": true
  }
}
```

## GET /v1/video-mode/ 

Returns the current video mode of the player

**Request Example**

```text
GET /api/v1/video-mode/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
```

**Response Body**

- `width` <font color="#704ae0">int</font>: The screen width
- `height` <font color="#704ae0">int</font>: The screen height
- `frames` <font color="#704ae0">int</font>: The frame rate
- `scan` <font color="#704ae0">string</font>: The scan method of the video signal, which can be either progressive ("p") or interlaced ("i")
- `name` <font color="#704ae0">string</font>: The full name of the video mode (a full list of modes can be found on [this page](docId\:QpML112mBhEK7LBDGUxnv))
- `isAutoMode` <font color="#704ae0">bool</font>: A flag indicating whether the video mode was set using [auto](docId\:QQ734nQz0hCwNI0uNSdMP) mode
- `mode` <font color="#704ae0">mode{ }</font>: A Mode object that gives additional information about the video output. This object can contain the following properties:
  - `preferred` <font color="#704ae0">bool</font>: A flag indicating whether the video mode is the preferred mode
  - `overscan` <font color="#704ae0">bool</font>: A flag indicating whether the video output is using an overscan setting or not
  - `modeName` <font color="#704ae0">string</font>: The full name of the video mode (a full list of modes can be found on [this page](docId\:QpML112mBhEK7LBDGUxnv))
  - `interlaced` <font color="#704ae0">bool</font>: A flag indicating whether the video output is interlaced (`true`) or progressive (`false`)
  - `width` <font color="#704ae0">int</font>: The width of the video output
  - `height` <font color="#704ae0">int</font>: The height of the video output
  - `graphicsPlaneWidth` <font color="#704ae0">int</font>: The width of the graphics plane 
  - `graphicsPlaneHeight` <font color="#704ae0">int</font>: The height of the graphics plane
  - `frequency` <font color="#704ae0">int</font>: The frame rate of the video output
  - `dropFrame` <font color="#704ae0">bool</font>: A flag indicating whether the video timecode utilizes drop frames
  - `colorSpace` <font color="#704ae0">string</font>: The color space of the video signal ("rgb", "yuv420", or "yuv422")
  - `colorDepth` <font color="#704ae0">string</font>: The color depth of the video signal ("8bit", "10bit", or "12bit")

**Response Example**

```json
{
    "route": "/v1/video-mode",
    "method": "GET",
    "data": {
        "result": {
            "isAutoMode": false,
            "name": "640x480x60p",
            "width": "640",
            "height": "480",
            "frames": "60",
            "scan": "p",
            "mode": {
                "colorDepth": "8bit",
                "colorSpace": "rgb",
                "dropFrame": false,
                "frequency": 60,
                "graphicsPlaneHeight": 480,
                "graphicsPlaneWidth": 640,
                "height": 480,
                "interlaced": false,
                "modeName": "640x480x60p",
                "overscan": false,
                "preferred": false,
                "width": 640
            }
        }
    }
}

```


[title] Partner Glossary
[path] BrightSign Partner Packet/

# autorun.brs

Upon bootup, players look for an *autorun.brs* file which instructs the player what to do upon startup. This file is required for all players.

# autorun.zip and autozip.brs

Players also look for *autorun.zip* files that contain the script *autozip.brs*. If found, the player will execute *autozip.brs* which unpacks the contents of the *autorun.zip* file to the root directory of the storage device and reboots the player.

# BrightSign Author

This software, available for Mac and PC, provides an easy-to-use interface for creating presentations, create and assign player schedules, and monitor player status and health of players. The software also enables users to setup, activate, and provision new players as well as manage user roles and permissions.

# BrightScript Debug Console

The BrightScript Debug Console is a tool that facilitates debugging of BrightScript code. It is available through the BrightSign Shell (see below). To turn the BrightScript Debug Console on, type `script debug on` at the console. More info can be found [here](docId\:YWkSi6X-2hez1BwztfHMP).

# BrightSign Shell / Console

The BrightSign Shell, also referred to as the BrightSign Console, is the command line interface that enables interaction with the BrightSign OS through a serial cable or telnet/SSH.

From the BrightSign Shell, the `script` command can be used to access the BrightScript Debug Console, and the `node` command can be used to access Node related functions.

Commands for the BrightSign Shell can be found [here](docId\:FXXyu9jmocUtC6XE2p7l2).

# BSN.Cloud

BrightSign’s robust cloud-based platform that provides a myriad of tools and services to help customers and partners easily use a single player or manage an expansive network of players. BSN.Cloud consists of four different options: the free BrightSign Author and Control and the paid BrightSign Author Plus and Content Plus. See the [Author](docId:2nkIGkJlqYB3UuDXXEcNc) and [Control](docId:5GQLISK9evu6kfhzQJe38) pages for more information on these products.

# Chromium

Chromium is the free and open-source web browser project primarily developed and maintained by Google. It is the underlying engine for the ubiquitous Chrome browser. BrightSign players use the same Chromium software to render and display web content.

# Console

The informal name for BrightSign’s command line interface.

# CMS

As might be surmised, a Content Management System, or CMS, is used to manage content. CMSs are also often used to manage player setup, activation, provisioning, scheduling, and diagnostics.

While separate apps may be used to author and publish presentations, this guide will use the term CMS as a catch-all term to refer to software that enables authoring, publishing, and management of presentations, content, and players.

# Content Delivery

This term is used to describe the process of getting content onto the player’s storage device.

# Content / Presentation

Strictly speaking, a presentation refers to the file that controls the layout and behavior of the items that the player will display.

Content refers to the visual item(s) being displayed by the presentation. Content thus refers to media files associated with the presentation such as videos, images, and audio files.

Since the presentation and content depend on each other to render properly (one cannot be displayed without the other), the term “content” is generally be used to represent *both* the presentation *and* its content.

# Crash Dumps

When a player encounters a non-deliberate shutdown (aka a crash), “crash dumps” are generated upon reboot. These files contain useful information that BrightSign Support can analyze and use to help troubleshoot. These files can be found in the *brightsign-dumps* folder located in the root folder of the player’s storage device.

# Diagnostic Web Server

The Diagnostic Web Server (DWS) is a powerful tool that enables inspection of various player settings and diagnostic details. Both a Local Diagnostic Web Server (LDWS, accessible over the local network via the player’s IP address) and Remote Diagnostic Web Server (RDWS, accessible via BrightSign Author) are available. General info about the DWS can be found [here](docId\:ceCeRJ5wSfYr5diZ3kRnu) and more specific info about the RDWS can be found [here](docId:6zVEBQJF7-9aGT11u3eqw).

### Media Analyzer

The DWS includes a useful tool that can analyze media files for playability. More info can be found [here](docId:6zVEBQJF7-9aGT11u3eqw).

# HTML

HTML stands for HyperText Markup Language. It is a standard markup language for web page creation and is also a common format for displaying presentations on BrightSign players. The [HTML Best Practices](docId\:GXcTVNW8g46EvdxOOkUKu) section will likely be very useful to developers. Specific sub-sections from that document worth noting individually are listed below:

## Web Inspector

Web pages can be debugged over the local network using the [Web Inspector](docId:4qlK1krr1cnx7xypWXRY5).

## Chromium Version

The Chromium version that BrightSign players use is likely several versions behind that version that most users are using in their web browsers. Find the Chromium version for the specific firmware version of your player [here](docId\:YGi_yIWT6pZ2BtU-GrfuP).

During development and testing, it is useful to have the correct version of Chromium on your Mac or PC. More information about this can be found [here](docId\:YGi_yIWT6pZ2BtU-GrfuP).

# Logs / Diagnostics

Logs contain important diagnostic information about players. System logs (sometimes referred to as player logs) from the player are available and can be gathered via a syslog server, telnet or SSH, or an RS-232 serial cable. More info can be found [here](docId\:KrRnuJD7STbMMV3z3xjD3).

Refer to [this article](docId\:qsLJGbc6ax5NZxhFnHtJW) on obtaining player logs and [this one](docId\:mOlxN8L89xSeDvjEe4KmH) for interpreting player logs. Logs can easily be accessed via the RDWS as described [here](docId:6zVEBQJF7-9aGT11u3eqw).

# Node

The node prompt is a command-line interface (CLI) that allows you to interact with Node.js. It is used to run JavaScript code and execute Node.js commands.

# Partner App/CMS

A "partner CMS", “partner application”, or “partner app” refers to the partner software that resides on the player’s storage device. In most cases, it consists of the presentation that the partner wishes the player to display. Upon bootup, the player runs the *autorun.brs* file which can be configured to invoke the partner app/CMS.

# Player

BrightSign’s extensive line of hardware devices specifically designed for digital signage.

# Provisioning

This term generally refers to the process of activating a player and getting an *autorun.brs* file onto the player’s storage device.

# Registry

The *registry* object allows you to read from and write to the player registry (the player’s persistent memory). More info about the registry can be found [here](docId\:tXWoOMbD2-u12dfegX7gA).

# Serial Ports

BrightSign players have serial ports for diagnostic purposes as well as to provide interactive capabilities. More info about serial ports can be found [here](docId\:Zen3QyWtjoHOeOTkbRX2a).

# Setup File

Setup Files contain information such as the intended publishing configuration and various player settings. Setup Files can be applied to one or many players and different Setup Files can be saved to the Setup Library.

# Storage Device

BrightSign players lack onboard storage and require a separate storage device. Storage devices include microSD (µSD) cards as well as USB drives such as thumb drives, external hard drives, and external solid-state drives (SSDs). Many BrightSign players also support internal SSDs in the common M.2 form factor.

# Swivel

While not an official term, the word “swivel” is sometimes used to describe a partner integration in which users interact with the partner’s CMS using one browser tab while interacting with the BrightSign Control/Author interface in another browser tab.

# Telnet and SSH

Telnet and SSH are both network protocols that allow you to connect to remote computers over the internet. Telnet is an older protocol that is used for remote access to servers and networking devices. It sends data in plain text without any encryption or authentication, which makes it insecure. SSH (Secure Shell) is a newer protocol that provides secure remote access to servers and networking devices. It encrypts all data sent between the client and server, making it much more secure than Telnet. SSH also uses public key authentication for added security.

Telnet and SSH can be used to communicate with BrightSign players. More info can be found [here](docId\:L0L_gyiHAvtdBci9FFcQh).

# Visual Studio Code

Visual Studio Code (VS Code) is a source-code editor made by Microsoft with the Electron Framework, for Windows, Linux and macOS. It is used for editing text and managing your entire codebase like an integrated development environment (IDE). [It supports debugging, syntax highlighting, intelligent code completion, snippets, code refactoring, and embedded Git](https://opensource.com/article/20/6/open-source-alternatives-vs-code).

### VS Code Extension for BrightScript

The popular [BrightScript Language](https://marketplace.visualstudio.com/items?itemName=RokuCommunity.brightscript) extension for [VSCode](https://code.visualstudio.com/) facilitates coding in BrightScript and is used by thousands of developers around the world. Note that BrightSign’s BrightScript is a fork of Roku’s BrightScript. The forks have diverged and while they are similar, they are technically not the same. Nevertheless, developers may find value in this extension.

[title] Adding Partner CMS Players to  Networks
[path] BSN.Cloud for Partners/

Players that are configured for a partner CMS application can also use a BSN.Cloud network connection to access players for configuration and maintenance. To do this, temporary replace the partner CMS autorun with an *autorun*.*brs* that can make the changes needed to connect to BSN.Cloud. This process is described below.

:::hint{type="warning"}
Players cannot be migrated from one BSN.Cloud network to another unless the player provisioning record is first deleted from the old network and created in the new network (see [Provision](docId\:Cyl9kPm02CO5rgcB9WQQv) for more information). Otherwise, the player will remain in the old network.
:::

# Prerequisites

1. You must be able to access the player on the local DWS through a browser.
2. You must know the name of the target BSN.Cloud network.
3. You will need a registration token. See the Appendix for instructions.
4. After getting the token, you must download the *cloudParameters.json* file from the Appendix and customize it:
   - Edit line 9 to add the registration token.
   - Edit line 10 to add the target network name, then save the file.

## Replace the Autorun and Reboot the Player

1. Open the local DWS for the player you are adding to BSN.Cloud and go to the **SD** tab.
   - Upload the *cloudParameters.json* file to the SD card.
   - Download and open the *standalone-autorun.brs* file in the Appendix. If you saved the *cloudParameters.json* file under a different name on the SD card, make sure that line 4 of *standalone-autorun.brs* references the correct name.
   - Upload the *standalone-autorun.brs* to the SD card.
2. Go to the **SD** tab in the local DWS and locate the *autorun.brs* file.  
3. Select the cogs icon, shown in Image 1, to go to the **Rename** section:
   - Rename *autorun.brs* to *autorun.backup*
   - Rename *standalone-autorun.brs* to *autorun.brs.*
4. Go to the **Control** tab in the local DWS and reboot the player.
5. The player will appear in the BrightAuthor\:connected **Network** tab when it has rebooted, and the *autorun.brs* will again reference the partner CMS application.

![image-20240305-163734.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/1FT_hL8__fNRj36kXP0bN_image-20240305-163734.png)

# Appendix

## BRS and JSON Files

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/eAwbh0SjYtO_nFGJb2Zl2_cloudparameters.json" label="cloudParameters.json" isUploading="false"}

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/WZUo69-mIN0WR5xTnTdgO_standalone-autorun.brs" label="standalone-autorun.brs" isUploading="false"}

## Get a Registration Token through BSN.Cloud

1. Create a new setup package with BSN.Cloud.
2. Select **Save Setup** and choose a location to save the package on your computer.
3. Open the folder where you saved the package and open the *current-sync.json* file.
4. At the top of the file you will find similar script to Image 2. The long string after `"bsnRegistrationToken"`, is your registration token. The string after “account” should match your target network name inserted in step 4c.

![Screenshot 2024-03-05 at 8.28.20 AM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/BUS5yj22a8A9lSk3if8Uz_screenshot-2024-03-05-at-82820-am.png)

## Get a Registration Token through an API

First get your OAuth token correctly issued for the target network, then see [Token Entity (v3)](docId\:xFtPKROWdWpe6DqhYNwfE).

[title] Onboarding
[path] BrightSign Partner Packet/Integrating with BrightSign/

Every partner has different needs and perspectives, so meeting with our Partner Integration and Engineering team can help us put you on a path best suited for your needs. Connect with the team at [integrations@brightsign.biz](mailto\:integrations@brightsign.biz) to get started creating an integration plan.

New partners typically follow this process to integrate with BrightSign:

1. Sign NDAs.
2. BrightSign shares relevant documentation.
3. After the documentation has been read, a technical call can be set up to discuss the technical details of the integration.
4. The partner develops their integration for BrightSign players.
5. If technical issues arise during development, BrightSign can provide support through our ticketing system.
6. The partner tests and approves their code.
7. When the technical integration is complete, the partner fills out the self-certification form which is required for any co-marketing activities with BrightSign.
8. The integration is packaged and handed over to the go-to-market teams.

To maximize the chances for a successful integration, we recommend that you adhere to our guidelines for Technical Best Practices.

[Next - Technical Best Practices >](docId\:qcEvA3OCMVeT4jzT5L6PE)

[title] rDWS Control Endpoints
[path] Diagnostic Web Server APIs/Remote DWS APIs/

Base URL for these endpoints:  ***https\://ws.bsn.cloud/rest/v1/***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## PUT /control/reboot/ 

Reboots the player. The player will not send a response to a reboot request.

**Request Body**

- `crash_report` <font color="#704ae0">bool</font>: Setting to `true` reboots the player and save a crash-report file to the brightsign-dumps folder. You should use this only when directed by BrightSign customer service, which may need the crash report when helping you troubleshoot a player.
- `factory_reset` <font color="#704ae0">bool</font>: Setting to `true` resets the player to the factory defaults, erasing all persistent registry settings for networking, security, and other applications.
- `autorun` <font color="#704ae0">string</font>: Setting to `disable` disables the current autorun script (this is helpful for debugging).

**Request Example (Simple Reboot)**

This request has no body.

```text
PUT /rest/v1/control/reboot/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Request Example (Crash Report)**

```none
PUT /rest/v1/control/reboot/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 56
```

This is the example request body:

```json
{
    "data": {
        "crash_report": true
    }
}
```

**Request Example (Factory Reset)**

```text
PUT /rest/v1/control/reboot/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 57
```

This is the example request body:

```json
{
    "data": {
        "factory_reset": true
    }
}
```

**Request Example (Disable Autorun)**

```text
PUT /rest/v1/control/reboot/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 56
```

This is the example request body:

```json
{
    "data": {
        "autorun": "disable"
    }
}
```

**Response Body**

The server will return a success or error message. A successful response will almost always cause a reboot which will be indicated in the response.

- `result` <font color="#704ae0">object</font>: The response object
  - `success` <font color="#704ae0">bool</font>: Whether or not the operation was successful
  - `reboot` <font color="#704ae0">bool</font>: Whether or not the player is rebooting

**Response Examples**

**Crash Report**

```json
{
    "data": {
        "result": {
            "success": true,
            "message": "A reboot has been initiated (with crash report)"
        }
    },
    "route": "/v1/control/reboot",
    "method": "PUT"
}
```

**Factory Reset**

```json
{
    "data": {
        "result": {
            "success": true,
            "message": "A reboot has been initiated (with factory reset)"
        }
    },
    "route": "/v1/control/reboot",
    "method": "PUT"
}
```

**Disable Autorun**

```json
{
    "data": {
        "result": {
            "success": true,
            "message": "A reboot has been initiated"
        }
    },
    "route": "/v1/control/reboot",
    "method": "PUT"
}
```

## GET /control/dws-password/ 

Retrieves information about the current password of the local DWS (but not the password itself) such as whether the password is blank or invalid

**Request Example**

```text
GET /rest/v1/control/dws-password/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the password was successfully read
- `password` <font color="#704ae0">Password{ }</font>: A Password object that describes the DWS password. The following are possible values:
  - `isResultValid` <font color="#704ae0">bool</font>: A flag indicating whether the DWS password is valid
  - `isBlank` <font color="#704ae0">bool</font>: A flag indicating whether the DWS password is blank (i.e. no password is required)

**Response Example**

```json
{
    "route": "/v1/control/dws-password",
    "method": "GET",
    "data": {
        "result": {
            "success": true,
            "password": {
                "isResultValid": true,
                "isBlank": true
            }
        }
    }
}
```

## PUT /control/dws-password/ 

Sets a new password for the local DWS (or removes the password requirement on older BOS versions).

**Request Body**

- `password` <font color="#704ae0">string</font>: The new local DWS password for the player.  <font color="#4d4d4d">As of BOS 9.0.128 and BOS 9.1.75, this API enforces strong password requirements, so passing in an empty string will cause an error.</font> <font color="#4d4d4d">In older BOS versions, t</font><font color="#4d4d4d">he absence of this parameter (or a blank string) removes the password requirement for the DWS.</font>
- `previous_password` <font color="#704ae0">string</font>: The previous DWS password. This parameter must be included. This value can be an empty string to indicate that the previous password was blank.

**Request Example**

```text
PUT /rest/v1/control/dws-password/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 106
```

This is the example request body:

```json
{
	"data": {
		"password": "newpassword",
		"previous_password": "oldpassword"
	}
}
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the password was successfully set
- `reboot` <font color="#704ae0">bool</font>: A flag indicating whether the player will reboot to set the password

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": false
        }
    },
    "route": "/v1/control/dws-password",
    "method": "PUT"
}
```

##

## GET /control/local-dws/ 

Retrieves the current state of the local DWS

**Request Example**

```text
GET /rest/v1/control/local-dws/?destinationType=player&destinationName=27D33C000051 HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the local DWS is enabled or disabled

**Response Example**

```json
{
    "route": "/v1/control/local-dws",
    "method": "GET",
    "data": {
        "result": {
            "success": true,
            "value": true
        }
    }
}
```

****

## PUT /control/local-dws/ 

Enables or disables the local DWS

**Request Body**

- `enable` <font color="#704ae0">bool</font>: A flag indicating whether the local DWS should be enabled or disabled

**Request Example**

```text
PUT /rest/v1/control/local-dws/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 50
```

This is the example request body:

```json
{
    "data": {
        "enable": true
    }
}
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag indicating whether the local DWS was successfully enabled or disabled
- `reboot` <font color="#704ae0">bool</font>: A flag indicating whether the player will reboot to enable/disable the local DWS

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": true
        }
    },
    "route": "/v1/control/local-dws",
    "method": "PUT"
}
```

****

## PUT /control/ssh-host-keys/reset/

Resets the SSH host keys by regenerating new host key pairs. This is useful for security purposes or when host keys have been compromised. The system will automatically determine if a reboot is required, unless overriden by the reboot parameter.

**Request Example**

```text
PUT /rest/v1/control/ssh-host-keys/reset/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 56
```

**Request Body**

This is the optional example request body:

```json
{
    "data": {
        "reboot": "true"
    }
}
```

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "value": true
        }
    }
}
```

##

## PUT /control/dws-default-certs/reset/

Resets the DWS default certificates by regenerating new certificate pairs. This is useful for security purposes or when certificates have been compromised. The system will reboot to activate new certificates, unless overriden by the reboot parameter.

**Request Example**

```text
PUT /rest/v1/control/dws-default-certs/reset/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 56
```

**Request Body**

This is the optional example request body:

```json
{
    "data": {
        "reboot": "true"
    }
}
```

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "value": true
        }
    }
}
```




[title] rDWS Information Endpoints
[path] Diagnostic Web Server APIs/Remote DWS APIs/

Base URL for these endpoints:  ***https\://ws.bsn.cloud/rest/v1/***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET  /info/ 

Retrieves general information about the player

**Request Example**

```text
GET /rest/v1/info/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response**

- `serial` <font color="#704ae0">string</font>: The serial number of the player
- `model` <font color="#704ae0">string</font>: The model number of the device (e.g. "XD234")
- `connectionType` <font color="#704ae0">string</font>: The currently active network interface, which can be either "Ethernet" or "WiFi"
- `ethernet` <font color="#704ae0">object</font>: An object containing information about the ethernet connection. This property will only be available if there's a valid ethernet connection on the player. The object can contain the following properties:
  - `IPv4` <font color="#704ae0">object</font>: An object containing information about the IPv4 configuration. The object can contain the following properties:
    - `address` <font color="#704ae0">string</font>: The assigned IPv4 address
    - `netmask` <font color="#704ae0">string</font>: The IPv4 network mask
    - `family` <font color="#704ae0">string</font>: `IPv4`
    - `mac` <font color="#704ae0">string</font>: The MAC address of the network interface
    - `internal` <font color="#704ae0">bool</font>: `true` if the network interface is a loopback or similar interface that is not remotely accessible; otherwise `false`
    - `cidr` <font color="#704ae0">string</font>: The assigned IPv4 address with the routing prefix in CIDR notation. If the `netmask` is invalid, this property is set to `null`.
  - `IPv6` <font color="#704ae0">object</font>: An object containing information about the IPv6 configuration:
    - `address` <font color="#704ae0">string</font>: The assigned IPv6 address
    - `netmask` <font color="#704ae0">string</font>: The IPv6 network mask
    - `family` <font color="#704ae0">string</font>: `IPv6`
    - `mac` <font color="#704ae0">string</font>: The MAC address of the network interface
    - `internal` <font color="#704ae0">bool</font>: `true` if the network interface is a loopback or similar interface that is not remotely accessible; otherwise `false`
    - `cidr` <font color="#704ae0">string</font>: The assigned IPv4 address with the routing prefix in CIDR notation. If the `netmask` is invalid, this property is set to `null`.
- `bootVersion` <font color="#704ae0">string</font>: The current version of the boot loader
- `fwVersion`  <font color="#704ae0">string</font>: The current version of firmware installed on the player
- `upTime` <font color="#704ae0">string</font>: The amount of time (as a human-readable string) that the player has been powered on and working correctly
- `upTimeSeconds` <font color="#704ae0">int</font>: The amount of time (in seconds) that the player has been powered on and working correctly
- `extensions` <font color="#704ae0">extension[ ]</font>: An array of Extension objects describing Firmware Extensions currently installed on the player
- `blessings` <font color="#704ae0">blessing[ ]</font>: An array of Blessing objects describing proprietary codecs that are currently authorized on the player

**Response Example**

```json
{
    "route": "/v1/info",
    "method": "GET",
    "data": {
        "result": {
            "serial": "RE433D006644",
            "upTime": "30 minutes",
            "upTimeSeconds": 1832,
            "model": "XD1035",
            "FWVersion": "9.0.97",
            "bootVersion": "9.0.85",
            "family": "cobra",
            "isPlayer": true,
            "power": {
                "result": {
                    "battery": "absent",
                    "source": "AC",
                    "switch_mode": "hard"
                }
            },
            "poe": {
                "result": {
                    "status": "inactive"
                }
            },
            "extensions": {
                "result": {
                    "extensions": []
                }
            },
            "blessings": {
                "result": {
                    "ac3": false,
                    "eac3": false
                }
            },
            "networking": {
                "result": {
                    "description": "Test_player",
                    "name": "XD5-RE433D006644"
                }
            },
            "bvnPipelines": {
                "result": {
                    "pipelines": []
                }
            },
            "bvnComponents": {
                "result": {
                    "components": []
                }
            },
            "hardware_features": {
                "hdmi": true,
                "component video": false,
                "vga": false,
                "two channel audio": true,
                "ethernet": true,
                "usb": true,
                "serial port 0": true,
                "serial port 1": false,
                "gpio connector": true,
                "svc button": true,
                "reset button": true,
                "rtc": true,
                "settings rom": false,
                "microsd": false,
                "sdhc": true,
                "six channel audio": false,
                "ir blaster": true,
                "wifi": false,
                "serial port 2": false,
                "audio input": false,
                "cec": true,
                "battery": false,
                "portrait lcd": false,
                "hdmi input": false,
                "digital tuner": false,
                "spdif": true,
                "audio input loopback": false,
                "msata": false,
                "ac3": false,
                "eac3": false,
                "onboard storage": true,
                "no 4k decode": false,
                "no bluetooth": false,
                "no poe": false,
                "internal storage only": false,
                "disable packet capture": false,
                "disable bsn cloud": false,
                "brightear": false,
                "disable dws": false
            },
            "api_features": {
                "video": true
            },
            "active_features": {
                "legacyDWS": true
            },
            "connectionType": "eth0",
            "ethernet": [
                {
                    "interfaceName": "eth0",
                    "interfaceType": "Ethernet",
                    "IPv4": [
                        {
                            "address": "123.456.7.890",
                            "netmask": "255.255.255.0",
                            "family": "IPv4",
                            "mac": "90:ac:3f:2a:01:79",
                            "internal": false,
                            "cidr": "192.168.1.174/24"
                        }
                    ],
                    "IPv6": [
                        {
                            "address": "2600:1700:dac0:2060::23",
                            "netmask": "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
                            "family": "IPv6",
                            "mac": "90:ac:3f:2a:01:79",
                            "internal": false,
                            "cidr": "2600:1700:dac0:2060::23/128",
                            "scopeid": 0
                        },
                        {
                            "address": "2600:1700:dac0:2060:92ac:3fff:fe2a:179",
                            "netmask": "ffff:ffff:ffff:ffff::",
                            "family": "IPv6",
                            "mac": "90:ac:3f:2a:01:79",
                            "internal": false,
                            "cidr": "2600:1700:dac0:2060:92ac:3fff:fe2a:179/64",
                            "scopeid": 0
                        },
                        {
                            "address": "fe80::92ac:3fff:fe2a:179",
                            "netmask": "ffff:ffff:ffff:ffff::",
                            "family": "IPv6",
                            "mac": "90:ac:3f:2a:01:79",
                            "internal": false,
                            "cidr": "fe80::92ac:3fff:fe2a:179/64",
                            "scopeid": 2
                        }
                    ]
                }
            ],
            "wireless": [],
            "interfaces": [],
            "bsnce": true
        }
    }
}
```

## GET  /time/ 

Retrieves the date and time as configured on the player. The date/time value is formatted as `"yyyy-mm-dd hh:mm:ss <timezone>"`. This call is identical to using the Node.js® time API.

**Request Example**

```text
GET /rest/v1/time/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Example**

```json
{
    "route": "/v1/time",
    "method": "GET",
    "data": {
        "result": {
            "time": "2018-10-18 14:34:34 PDT",
            "timezone_mins": null,
            "timezone_name": "America/Los_Angeles",
            "timezone_abbr": "PDT",
            "year": 2018,
            "month": 10,
            "date": 18,
            "hour": 14,
            "minute": 34,
            "second": 34,
            "millisecond": 569
        }
    }
}
```

## PUT  /time/ 

Sets the date/time on the player

**Request Body**

- `time` <font color="#704ae0">string</font>: The time to set on the player, formatted as `"hh:mm:ss <timezone>"`
- `date` <font color="#704ae0">string</font>: The date to set on the player, formatted as `"yyyy-mm-dd"`
- `applyTimezone` <font color="#704ae0">bool</font>:  A flag specifying whether the date and time should be applied using the time zone configured on the player (`true`) or the UTC time zone (`false`)

**Request Example**

```text
PUT /rest/v1/time/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 117
```

This is the example request body:

```json
{
    "data": {
        "time": "22:00:00",
        "date": "2023-11-07",
        "applyTimezone": true
    }
}
```

**Response Example**

A successful response would be a <font color="#15803D">200</font> status code with the following body:

```json
{
  "data": {
    "result": true
  }
}
```

## GET  /health/ 

Retrieves the current status of the player. Currently, this endpoint is only used to determine if a player can respond to a WebSockets request; it cannot determine the error state of a player.

**Request Example**

```text
GET /rest/v1/health/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `status` <font color="#704ae0">string</font>: The player status. The only possible value is "active".
- `statusTime` <font color="#704ae0">string</font>: The date and time the player responded to the status request. The date/time is formatted as `"yyyy-mm-dd hh:mm:ss <timezone>"`.

**Response Example**

```json
{
    "route": "/v1/health",
    "method": "GET",
    "data": {
        "result": {
            "status": "active",
            "statusTime": "2024-01-30 07:38:05 PST"
        }
    }
}
```


[title] Displaying HTML without BrightSign Author or  BA Classic
[path] HTML Development/

There are two methods to display HTML without BrightAuthor Classic or BrightSign Author. 

- You can play an HTML page from the local storage without an autorun script by placing the  *index.html* file (along with other files and folders containing the page content) into the root folder of the player storage.
- You can use BrightScript to display local or remote HTML content. The sections below pertain to using the [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) BrightScript object to display HTML. To learn more about BrightScript, see the [BrightScript](docId\:R7Xc0_ZE4u0BR662lI2Sj) section.

## Simple Webpage Script

The simple script outlined below displays a webpage stored on a remote server. Save this script as an *autorun.brs* file, place it on an SD card, and publish it to the player.

If you want to display a webpage located on local storage, replace the "http\://www\.brightsign.biz" URL on line 4 with the filename of the .html file: `"file:///mytestpage.html"`

Notice that the script has a `Sleep(10000)` line. This line delays loading of the web URL–this is necessary to compensate for connection delays that may occur on your network. If you don’t use this script, the BrightSign player may not connect in time to load the page, resulting in a “cannot resolve host” error, which indicates that the player does not have an Internet connection. In certain network configurations, especially when the player utilizes DHCP, you may need to increase the sleep amount (in milliseconds) to give the player more time to establish a connection before loading the page.

Parameters for the *roHtmlWidget* are defined in an associative array, which is then passed during object creation. See [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) for more information on creating and configuring an HTML widget. 

```text
Sub Main()
msgPort = CreateObject("roMessagePort")
r = CreateObject("roRectangle", 0, 0, 1920, 1080)
 
config = {
url: "http://www.brightsign.biz",
}
h = CreateObject("roHtmlWidget", r, config)
h.SetPort(msgPort)
sleep(10000)
h.Show()
while true
	msg = wait(0, msgPort)
	print "type(msg)=";type(msg)
	if type(msg) = "roHtmlWidgetEvent" then
		eventData = msg.GetData()
		if type(eventData) = "roAssociativeArray" and type(eventData.reason) = "roString" then
			print "reason = ";eventData.reason
			if eventData.reason = "load-error" then
				print "message = ";eventData.message
			endif
		endif
	endif
end while
End Sub
```

## Portrait Orientation

To rotate the contents of an HTML page, include the `transform` parameter when creating the *roHtmlWidget* object: For clockwise portrait orientation, use `transform:"rot90"`; for counter-clockwise portrait orientation, use `transform:"rot270"`. If you're using the above simple webpage script, you can add this parameter to the `config` associative array on line 7.

## Displaying Scrollbars

The scrollbar behavior will be the same as it is in the current version of Chromium.

Scrollbars can be enabled by including the `scrollbar_enabled:true` parameter when creating the *roHtmlWidget* object. If you're using the above simple webpage script, you can add `scrollbar_enabled:true` to the `config` associative array on line 7.

You can also enable scrollbars using CSS (for example, by referencing the simple CSS file below).

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/1Nqv70r0er5GtsL2iUeJC_forcescrollbars.css" label="ForceScrollbars.css" isUploading="false"}

## Mobile Scrollbars

Browser scrollbars default to desktop style (i.e. more prominent and visible at all times). You can configure the Chromium instance for mobile-style scrollbars (i.e. less prominent and only visible when scrolling) by writing the `overlay-scrollbar` entry to the `html` section of the registry.

```text
htmlRegistry = CreateObject("roRegistrySection", "html")
htmlRegistry.Write("overlay-scrollbar", "1")
```


[title] LDWS Advanced Endpoints
[path] Diagnostic Web Server APIs/Untitled/

## GET /v1/advanced/property-lock/

Returns the [property-lock](docId\:a6Ali6u-szxHuansk6T3-) setting and if the registry has been set to override the property-lock value.

**Request Example**

```text
GET /api/v1/advanced/property-lock/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
```

**Response Body**

The server will return a success or error message. A successful response will include:

- `settingsHandlerEnabled` <font color="#704ae0">bool</font>: Whether the [settings handler](docId\:pz4pkahLR3dsSpr-w1sX9) is enabled&#x20;
- `forceRegistrySettings` <font color="#704ae0">bool</font>: Whether registry settings should take priority
- `registryEnableSettings` <font color="#704ae0">bool</font>: The registry value for enable settings handler
- `bsnce` <font color="#704ae0">bool</font>: Whether BSN.Cloud is enabled

**Response Example** 

```json
{
    "data": {
        "result": {
            "settingsHandlerEnabled": true,
            "forceRegistrySettings": false,
            "registryEnableSettings": true,
            "bsnce": true
        }
    }
}
```



## PUT /v1/advanced/property-lock/

Lets users override the current [property-lock](docId\:a6Ali6u-szxHuansk6T3-) setting

**Request Body**

- `forceRegistrySettings` <font color="#704ae0">bool</font>: Whether registry settings should take priority
- `registryEnableSettings` <font color="#704ae0">bool</font>: Registry value for enable settings handler

**Request Example**

```text
PUT /api/v1/advanced/property-lock/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
```

This is an example of the request body:

```json
{
  "forceRegistrySettings": true,
  "registryEnableSettings": true
}
```

**Response Body**

The server will return a success or error message. A successful response will almost always cause a reboot which will be indicated in the response.

- `result` <font color="#704ae0">object</font>: The response object
  - `success` <font color="#704ae0">bool</font>: Whether or not the operation was successful
  - `reboot` <font color="#704ae0">bool</font>: Whether or not the player is rebooting

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": true
        }
    }
}
```

****

## GET /v1/system/supervisor/logging/ 

Returns the current logging level on the player. The default value is `info`.

**Request Example**

```text
GET /api/v1/system/supervisor/logging/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
```

**Response Body**

- `status` is the HTTP response code
- `level` is the logging level on the player. The higher the number, the more detail is offered.
- `name` is the name of the logging level (trace, info, error, or warn)

**Response Example**

```json
{
    "data": {
        "result": {
            "status": 200,
            "level": "2",
            "name": "info"
        }
    }
}
```

## PUT /v1/system/supervisor/logging/ 

Sets the logging level on the player.

**Request Body**

- `level` <font color="#704ae0">int</font>: The integer values correspond to the logging levels:
  - 3: Trace
  - 2: Info
  - 1: Warn
  - 0: Error

**Request Example**

```text
PUT /api/v1/system/supervisor/logging/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
```

This is the example request body:

```json
{
  "level": 1
}
```

**Response Example**

```json
{
    "data": {
        "result": {
            "status": 200
        }
    }
}
```


[title] Applying Settings in the Properties Panel
[path] BSN.Cloud for Partners/

Newer BrightSign Author and BrightSignOS versions contain a feature that lets users see and modify settings using the Author **Properties Panel&#x20;**&#x6F;r through the BSN.Cloud API (you can also modify some player settings in BrightSign Control). To avoid backwards compatibility issues, the supervisor won't honor these settings unless it is first enabled in a custom presentation or custom application/plugin.

This feature is natively supported and enabled in BrightSign Author presentations using version 1.6.29 or later, but you must enable it if you are running custom scripts. The steps required to enable this feature are described below.

# Prerequisites

- You must be using BSN.Cloud
- Minimum BrightSign Author version: 1.6.29
- Minimum BrightSignOS version: OS 8.2.72

# Implement the Settings Handler / Disable Property Lock

A player under the control of BSN.Cloud will, by default, disallow updates pushed from the cloud to the player if it is using a partner application. To allow the player to accept property updates from BSN.Cloud, implement the Settings Handler which allows you to disable [Property Lock](docId\:a6Ali6u-szxHuansk6T3-). Partners can do this using the Example Script on this page.

To enable the Settings Handler:

1. Include the code snippet from the Example Script section in your custom presentation or custom application/plugin.
2. In BrightSign Author, navigate to the player’s network (under the [Network](docId\:Uba8sfkMSAJsIBrbv4A6N) tab on the top right). In this section, the player settings are available in the Properties panel.

Once the device-side API is turned on, the player settings will be accessible in the Properties panel of BrightSign Author (under the [Network](docId\:Uba8sfkMSAJsIBrbv4A6N) tab).

# API Specification

This API specification is used by custom presentations or plugins, either invoked by BrightScript or JavaScript, to enable the “Settings Panel” (Settings Handler).

The base URL or player’s IPv4 IP address (the default port server is hosted on 80) is *http\://localhost*

:::hint{type="info"}
This is an internal endpoint and will only respond to a Node or JavaScript application running on the player (it is not part of the local DWS).
:::

## POST /api/v1/system/supervisor/capabilities

### Request Body

```text
{
	"script": {
	“type”: “Custom”
	“version”: “10.0.60” // Can be any version in a x.x.x format. Used to communicate script version to BSN.cloud,
	displayed in “Settings Panel” }
}
```

### Response Body

- Success: `{"success":true}`
- Error: `{"status”: , “message”: }`

# Example Script

Partners who want to upgrade to use this feature must include the following code snippet in their BrightSign presentation or plugin. 

Note that this example is a simple autorun which can be run as is. However the `EnableSettingsHandler()` subroutine should either be copied and called in an appropriate location relative to the other logic in the script, or the code within  `EnableSettingsHandler()` can be copied and pasted into a valid location in script to be run within the existing logic. This assumes the developer has basic knowledge of BrightScript.

```text
Sub main()
  EnableSettingsHandler()
end sub
 
Sub EnableSettingsHandler()
  localBaseUrl = "http://localhost"
  supervisorApiV1Route = "/api/v1"
   
  supervisorCapabilitiesUrlXfer = CreateObject("roUrlTransfer")
  supervisorCapabilitiesUrlXfer$ = localBaseUrl + supervisorApiV1Route + "/system/supervisor/capabilities"
  supervisorCapabilitiesUrlXfer.SetUrl(supervisorCapabilitiesUrlXfer$)
  supervisorCapabilitiesUrlXfer.SetTimeout(15000)
  supervisorCapabilitiesUrlXfer.SetProxyBypass(["127.0.0.1", "localhost"])
  supervisorCapabilitiesUrlXfer.addHeader("Content-type", "application/json")
   
  msgPort = CreateObject("roMessagePort")
  supervisorCapabilitiesUrlXfer.SetPort(msgPort)
  initiatorIdentity = supervisorCapabilitiesUrlXfer.GetIdentity()
   
  script = CreateObject("roAssociativeArray")
  scriptType$ = "Custom"
  version$ = "10.0.60" ' current autorun script version
     
  script.AddReplace("type", scriptType$)
  script.AddReplace("version", version$)
   
  body = {}
  body.AddReplace("script", script)
     
  stringifiedJson = FormatJson(body)
     
  ok = supervisorCapabilitiesUrlXfer.AsyncPostFromString(stringifiedJson)
   
  if not ok then
    print "=== Failed to send POST Request"
  else
    print "=== Settings Handler request sent"
  end if
   
  while true
    msg = Wait(0, msgPort)
    if (type(msg) = "roUrlEvent")
      receivedIdentity = msg.GetSourceIdentity()
      if (initiatorIdentity = receivedIdentity) then
        print "=== " + supervisorCapabilitiesUrlXfer$ + ", Response Code: " + strI(msg.GetResponseCode())
      end if
    end if
  end while
end sub

```

# Caveats

- The settings handler can override custom settings applied by the setup script.
- Edits to the property sheet settings in the interface will not be applied on the device side unless the code snippet above is added to the runtime application or it is added as a plugin to the custom presentation.


[title] Postman Collections
[path] Cloud APIs/

:::hint{type="warning"}
This is a collection of sample endpoint calls to introduce users to our infrastructure. It is not a comprehensive document of our available endpoints. Please see the [BSN.Cloud](docId\:gOEMCi9nmvGAktTR5qcjs), [Remote DWS](docId\:Kku9e7f7CHC5LwofXs9E0), and [B-Deploy/Provisioning](docId\:wccw4TQERZPXV7KJq_a3P) endpoint documentation for a complete list of those endpoints and their usage.
:::

# Prerequisites

- A Postman account. If necessary, go to [this site](https://www.postman.com/downloads/) to download Postman and create a free account.
- A BrightSign player with an active internet connection
- A BSN.Cloud account with at least one network
- Access to [control.bsn.cloud](https://control.bsn.cloud)
- The two files below:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/ViJCXV-t9lhoEud6n6Bd4-20260224-161207.json" label="bsn-cloud-production.postman_environment.json"}

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/aIpGhO7NIsLVEpeesC5sN-20260224-161223.json" label="BSN_Cloud_API_2022-06.postman_collection.json"}

# Create Client Credentials

Before you can use the APIs, you need to create an Application in [control.bsn.cloud](https://control.bsn.cloud) to get a Client ID and Client Secret. See [Applications](docId\:GI3BlFto5AGKZnmikcWqz) for instructions.

:::hint{type="warning"}
Client Secrets expire every 180 days. Set a reminder to rotate them before expiry.
:::

# Import the Collection & Environment

**Import the Environment**

1. Open Postman and select **Import** at the top-left.
2. Drag and drop (or browse to) the *bsn-cloud-production.postman\_environment.json* file.
3. Select **Import** to confirm

**Import the Collection**

1. Select **Import** again
2. Drag and drop (or browse to) the *BSN\_Cloud\_API\_2022-06.postman\_collection.json* file
3. Select **Import** to confirm

**Activate the Environment**

Select **bsn-cloud-production** from the environment dropdown in the top right corner (it may say "No Environment"), as shown in Image 1. The environment is now active — all `{{variable}}` references in the collection will resolve using these values

::Image[]{src="https://api.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/2LTBop2Lm6mA_Lheqa_Cv-20260224-163447.png" size="72" width="1217" height="656" position="center" darkWidth="1217" darkHeight="656" showCaption="false"}

# Configure Environment Variables

Click the **eye icon** next to the environment dropdown to view and edit your environment variables. You need to set a few values before making any requests.

**Required Variables**

| **Variable**   | **What to Enter**                             | **Example**                          |
| -------------- | --------------------------------------------- | ------------------------------------ |
| `clientId`     | Your Client ID from the Admin Panel           | a1b2c3d4-e5f6-7890-abcd-ef1234567890 |
| `clientSecret` | Your Client Secret from the Admin Panel       | AbCdEfGhIjKlMnOpQrStUvWx             |
| `networkName`  | The name of the network you want to work with | MyCompanyNetwork                     |

**Optional Variables (set as needed)**

| **Variable**    | **Purpose**                                             |
| --------------- | ------------------------------------------------------- |
| `networkId`     | Numeric network ID (alternative to networkName)         |
| `playerSerial`  | Serial number of a player (for DWS and device requests) |
| `playerModel`   | Player model string (for B-Deploy)                      |
| `deviceName`    | Name for a device (for B-Deploy)                        |
| `setupName`     | B-Deploy setup package name                             |
| `partnerLogin`  | Your BSN.Cloud login email (for B-Deploy requests)      |
| `applicationId` | Application ID for secret rotation (not the Client ID)  |

**Auto-Populated Variables**

- `token`: set by "Get Access Token"
- `setupId`: set by "POST /setup/"
- `deviceId`: set by "POST /device/"
- `deviceRegToken`, `deviceRegTokenScope`, `deviceRegTokenValidFrom`, `deviceRegTokenValidTo`: set by "Get Device Registration Token"

:::hint{type="success"}
Enter values in the CURRENT VALUE column (not the INITIAL VALUE column) to keep your credentials local and prevent them from being synced to Postman's cloud.
:::

# Authentication Workflow

The BSN.Cloud API uses a two-step authentication process. You must complete *both steps* before making any other API calls.

**Step 1: Get an Access Token**

1. In the collection sidebar, expand the **Authentication** folder
2. Select **Get Access Token**
3. Click **Send**

This sends a `POST` request to the BrightSign auth server using the OAuth2 Client Credentials flow. The request uses HTTP Basic authentication with your Client ID and Client Secret (handled automatically by Postman's auth tab). On success, the test script automatically saves the `access_token` to the `{{token}}` environment variable.

**Step 2: Set the Network**

1. Select **Set Network (by Name)** (or **Set Network (by ID)** if you prefer)
2. Select **Send.**

This tells the BSN.Cloud API which network you want to work with in this session. The request uses the token obtained in Step 1. An HTTP `204 No Content` empty body response is normal and means success.

After both steps complete successfully, all other requests in the collection will work using the `{{token}}` variable that was automatically set.

:::hint{type="warning"}
Every time you get a new access token, you must set the network again. The token expires after *5 minutes 30 seconds*, but the network session lasts *24 hours***.**
:::

# Troubleshooting

**Could not get any response" or connection timeout**

- Verify you have internet connectivity
- Check that the URLs in your environment are correct (click the eye icon to verify)
- Ensure your corporate firewall/proxy allows connections to `*.bsn.cloud`

**204 No Content on Set Network (but subsequent calls fail)**

- The network name may be misspelled. Names are case-sensitive.
- Verify the network exists and your account has access to it
- Try **Set Network (by ID)** instead of the numeric network ID

**400 Bad Request on Set Network**

- The specified network does not exist or you don't have access to it
- Double-check the `networkName` or `networkId` in your environment

**401 Unauthorized on Get Access Token**

- Double-check your `clientId` and `clientSecret` values in the environment (look for extra spaces or missing characters)
- Verify your Client Secret hasn't expired (180-day limit). If it has:
  - Run **Get Access Token** again
  - Run **Set Network** again
  - Retry your original request
- Make sure you're entering values in the CURRENT VALUE column

**401 Unauthorized on other requests**

- Your access token has expired (it has a five minute 30 second lifetime). You must run **Get Access Token** and **Set Network** again
- Make sure the environment dropdown (top-right) is set to bsn-cloud-production

**403 Forbidden**

- Your application doesn't have the required scope for this API call:
  - Go to the Admin Panel, edit your Application, and add the necessary features
  - Then get a new access token (scope changes don't take effect on existing tokens)
- You must belong to the same BSN.Cloud network as the player if you are messaging it using the Remote DWS APIs

**404 Not Found**

- Check that the URL path is correct


[title] rDWS Diagnostics Endpoints
[path] Diagnostic Web Server APIs/Remote DWS APIs/

Base URL for these endpoints:  ***https\://ws.bsn.cloud/rest/v1/***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /diagnostics/ 

Runs network diagnostics on the player

**Request Example**

```text
GET /rest/v1/diagnostics/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

For each of `ethernet`, `wifi`, `modem`, and `internet`:

- `diagnosis` <font color="#704ae0">string</font>: Indicates if this type of interface is present
- `log` <font color="#704ae0">object[ ]</font>: This contains the diagnostic results for the interface:
  - `name` <font color="#704ae0">string</font>: The name of the diagnostic test
  - `pass` <font color="#704ae0">bool</font>: Indicates whether the test passed or not
  - `result` <font color="#704ae0">string</font>: The actual value for the diagnostic tests like checking type and ping.
- `ok` <font color="#704ae0">bool</font>: If diagnostics were run on the interface or not.

**Response Example**

```json
{
    "route": "/v1/diagnostics",
    "method": "GET",
    "data": {
        "result": {
            "ethernet": {
                "diagnosis": "OK",
                "log": [
                    {
                        "name": "Checking model networking support",
                        "pass": true,
                        "result": ""
                    },
                    {
                        "name": "Checking for Ethernet interface",
                        "pass": true,
                        "result": ""
                    },
                    {
                        "name": "Checking interface type",
                        "pass": true,
                        "result": "Ethernet"
                    },
                    {
                        "name": "Checking Ethernet link",
                        "pass": true,
                        "result": ""
                    },
                    {
                        "name": "Checking Ethernet IP address",
                        "pass": true,
                        "result": ""
                    },
                    {
                        "name": "Checking Ethernet netmask",
                        "pass": true,
                        "result": ""
                    },
                    {
                        "name": "Checking Ethernet gateway",
                        "pass": true,
                        "result": "PING 10/10: 1375/1537/1623us"
                    }
                ],
                "ok": true
            },
            "wifi": {
                "diagnosis": "WiFi interface not present",
                "log": [
                    {
                        "name": "Checking model networking support",
                        "pass": true,
                        "result": ""
                    },
                    {
                        "name": "Checking for WiFi interface",
                        "pass": false,
                        "result": "WiFi interface not present"
                    }
                ],
                "ok": false
            },
            "modem": {
                "diagnosis": "Modem interface not present",
                "log": [
                    {
                        "name": "Checking model networking support",
                        "pass": true,
                        "result": ""
                    },
                    {
                        "name": "Checking for Modem interface",
                        "pass": false,
                        "result": "Modem interface not present"
                    }
                ],
                "ok": false
            },
            "internet": {
                "diagnosis": "OK",
                "log": [
                    {
                        "info": [
                            "DNS server 2600:1700:dac0:2060::1 is not a valid IPv4 address"
                        ],
                        "name": "Checking DNS servers",
                        "pass": true,
                        "result": "At least one DNS server is valid"
                    },
                    {
                        "info": [
                            "DNS pass/fail/timeout/mismatch UDP: 50/0/0/0 TCP 50/0/0/0"
                        ],
                        "name": "Checking DNS server (cached)",
                        "pass": true,
                        "result": "DNS servers responded to 100% of potentially cached requests"
                    },
                    {
                        "info": [
                            "DNS pass/fail/timeout/mismatch UDP: 5/0/0/0 TCP 5/0/0/0"
                        ],
                        "name": "Checking DNS server (hopefully not cached)",
                        "pass": true,
                        "result": "DNS servers responded to 100% of hopefully uncached requests"
                    },
                    {
                        "name": "Checking Internet connectivity",
                        "pass": true,
                        "result": "PING 10/10: 87398/87760/88247us"
                    },
                    {
                        "name": "Checking HTTP",
                        "pass": true,
                        "result": "External IP is 76.218.104.224"
                    },
                    {
                        "name": "Checking time server",
                        "pass": true,
                        "result": ""
                    }
                ],
                "ok": true
            }
        }
    }
}
```

## GET /diagnostics/dns-lookup/\{:domain\_name}/ 

Tests name resolution on the specified DNS address

**Segment**

- `domain_name`: The DNS address (for example, google.com)

**Request Example**

```text
GET /rest/v1/diagnostics/dns-lookup/google.com/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

The player queries each DNS field separately, then collects returned data into the *records* object and returned errors into the *errorList* object. The following DNS fields are queried: "ipv4", "ipv6", "cname", "mx", "service", "text".

- `records` <font color="#704ae0">object:</font>
  - `ipv4` <font color="#704ae0">string[ ]</font>: IPv4 addresses
  - `ipv6` <font color="#704ae0">string[ ]</font>: IPv6 addresses
  - `text` <font color="#704ae0">string[ ]</font>: Text records
  - `mx` <font color="#704ae0">object[ ]</font>: Mail exchange records
    - `exchange` <font color="#704ae0">string</font>
    - `priority` <font color="#704ae0">int</font>
- `server_test` <font color="#704ae0">object</font>
  - `tcp` <font color="#704ae0">object</font>
    - `made` <font color="#704ae0">int</font>:  The total number of DNS requests made
    - `pass` <font color="#704ae0">int</font>: The total number of requests that passed
    - `fail` <font color="#704ae0">int</font>: The total number of requests that failed.
    - `timeout` <font color="#704ae0">int</font>: The total number of requests that timed out.
    - `mismatch` <font color="#704ae0">int</font>: The total number of mismatched requests between the host and pointer records
  - `udp` <font color="#704ae0">object</font>
    - `made` <font color="#704ae0">int</font>: The total number of DNS requests made
    - `pass` <font color="#704ae0">int</font>: The total number of requests that passed
    - `fail` <font color="#704ae0">int</font>: The total number of requests that failed.
    - `timeout` <font color="#704ae0">int</font>: The total number of requests that timed out.
    - `mismatch` <font color="#704ae0">int</font>: The total number of mismatched requests between the host and pointer records
- `errorList` <font color="#704ae0">object[ ]</font>
  - `field` <font color="#704ae0">string</font>: The field ('ipv4', 'ipv6', 'cname', 'mx',  'service', or 'text') where the error came from
  - `err` <font color="#704ae0">object</font>:
    - `errno` <font color="#704ae0">string</font>: Error number (usually the same value as code)
    - `code` <font color="#704ae0">string</font>: Error code number (see [DNS | Node.js v14.21.3 Documentation](https://nodejs.org/docs/latest-v14.x/api/dns.html#dns_error_codes))
    - `syscall` <font color="#704ae0">string</font>: Information about the system call stack
    - `hostname` <font color="#704ae0">string</font>: The value passed in the URL

**Response Example**

```json
{
    "route": "/v1/diagnostics/dns-lookup/google.com",
    "method": "GET",
    "data": {
        "result": {
            "records": {
                "ipv4": [
                    "142.250.105.113",
                    "142.250.105.102",
                    "142.250.105.139",
                    "142.250.105.101",
                    "142.250.105.138",
                    "142.250.105.100"
                ],
                "ipv6": [
                    "2607:f8b0:4002:c0c::8a",
                    "2607:f8b0:4002:c0c::8b",
                    "2607:f8b0:4002:c0c::71",
                    "2607:f8b0:4002:c0c::64"
                ],
                "mx": [
                    {
                        "exchange": "smtp.google.com",
                        "priority": 10
                    }
                ]
            },
            "server_test": {
                "tcp": {
                    "made": 100,
                    "pass": 100,
                    "fail": 0,
                    "timeout": 0,
                    "mismatch": 0
                },
                "udp": {
                    "made": 100,
                    "pass": 100,
                    "fail": 0,
                    "timeout": 0,
                    "mismatch": 0
                }
            },
            "errorList": [
                {
                    "field": "cname",
                    "err": {
                        "code": "ENODATA",
                        "syscall": "queryCname",
                        "hostname": "google.com"
                    }
                },
                {
                    "field": "service",
                    "err": {
                        "code": "ENODATA",
                        "syscall": "querySrv",
                        "hostname": "google.com"
                    }
                },
                {
                    "field": "text",
                    "err": {
                        "code": "ETIMEOUT",
                        "syscall": "queryTxt",
                        "hostname": "google.com"
                    }
                }
            ]
        }
    }
}
```

## GET /diagnostics/ping/\{:domain\_name}/ 

Requests the player to ping the specified IP or DNS address on its local network. This call can take over 10 seconds to return.

**Segment**

- `domain_name`: The specified IP or DNS address

**Request Example**

```text
GET /rest/v1/diagnostics/ping/0.0.0.0/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag that indicates if the operation succeeded or not
- `response` <font color="#704ae0">object</font>:
  - `hostname` <font color="#704ae0">string</font>: The value that you passed in the URL
  - `results` <font color="#704ae0">object</font>:
    - `ipv4` <font color="#704ae0">object[ ]</font>:
      - `address` <font color="#704ae0">string</font>: The IPv4 address that is pinged
      - `results` <font color="#704ae0">object</font>:
        - `received` <font color="#704ae0">int</font>: The number of packets received
        - `stats` <font color="#704ae0">object</font>
          - `average` <font color="#704ae0">int</font>: The average time for the packet to return
          - `quickest` <font color="#704ae0">int</font>: The quickest time for the packet to return
          - `slowest` <font color="#704ae0">int</font>: The slowest time for the packet to return
          - `units` <font color="#704ae0">int</font>: The time units (usually microseconds)
          - `transmitted` <font color="#704ae0">int</font>: The number of packets transmitted
    - `ipv6` <font color="#704ae0">object[ ]</font>: This will only be returned if IPv6 is present.
      - `interface` <font color="#704ae0">string</font>
      - `source` <font color="#704ae0">string</font>
      - `address` <font color="#704ae0">string</font>: The IPv6 address that is pinged
      - `results` <font color="#704ae0">object</font>
        - `received` <font color="#704ae0">int</font>: The number of packets received
        - `transmitted` <font color="#704ae0">int</font>: The number of packets transmitted

:::hint{type="info"}
The `ipv6` entry will only be returned if IPv6 is present.
:::

**Response Example**

```json
{
    "route": "/v1/diagnostics/ping/0.0.0.0",
    "method": "GET",
    "data": {
        "result": {
            "success": true,
            "response": {
                "hostname": "0.0.0.0",
                "results": {
                    "ipv4": [
                        {
                            "address": "0.0.0.0",
                            "results": {
                                "received": 10,
                                "stats": {
                                    "average": 318,
                                    "quickest": 223,
                                    "slowest": 336,
                                    "units": "us"
                                },
                                "transmitted": 10
                            },
                            "up": true
                        }
                    ]
                },
                "up": true
            }
        }
    }
}
```

## GET /diagnostics/trace-route/\{:domain\_name}/ 

Requests the player to perform a standard trace-route diagnostic on the specified IP or DNS address. This call can take several minutes to return.

**Segment**

- `domain_name`: The specified IP or DNS address

**Query String Parameter**

- `resolveAddress` <font color="#704ae0">bool</font>: Specifies whether the IP or DNS address should be resolved or not

**Request Example**

```text
GET /rest/v1/diagnostics/trace-route/google.com/?resolveAddress=true&destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `address` <font color="#704ae0">string</font>: The IP address on which you are running the trace route
- `results` <font color="#704ae0">object</font>:
  - `output` <font color="#704ae0">string[ ]</font>: Returns the trace route output information in text format
  - `protocol` <font color="#704ae0">string</font>: The IP protocol, for example, "ipv4"
  - `route` <font color="#704ae0">object[ ]</font>:
    - `hop` <font color="#704ae0">int</font>: How many times the data moves from one router to the next 
    - `servers` <font color="#704ae0">object</font>:
      - `address` <font color="#704ae0">string</font>: The address to which the trace route request is made
      - `hostname` <font color="#704ae0">string</font>: The server hostname
      - `stats` <font color="#704ae0">object</font>
        - `reachable` <font color="#704ae0">string</font>
        - `time` <font color="#704ae0">string</font>: The time required for the trace route request to return
        - `units` <font color="#704ae0">string</font>: The time units (usually in milliseconds)

**Response Example**

```json
{
    "route": "/v1/diagnostics/trace-route/152.101.32.76",
    "method": "GET",
    "data": {
        "result": {
            "address": "123.456.7.890",
            "resolveAddress": "true",
            "results": {
                "152.101.32.76": {
                    "output": [
                        "traceroute to 152.101.32.76 (152.101.32.76), 30 hops max, 46 byte packets",
                        " 1  10.0.4.1  0.744 ms  0.458 ms  1.740 ms",
                        " 2  192.168.0.1  1.738 ms  1.387 ms  1.387 ms",
                        " 3  96.120.89.217  10.553 ms  11.250 ms  11.961 ms",
                        " 4  96.110.176.145  11.958 ms  11.250 ms  9.845 ms",
                        " 5  162.151.78.253  11.957 ms  13.366 ms  10.549 ms",
                        " 6  96.108.99.249  13.366 ms  14.072 ms  20.414 ms",
                        " 7  68.86.143.93  13.368 ms  11.960 ms  10.549 ms",
                        " 8  96.97.98.246  32.397 ms  96.112.146.22  11.954 ms  69.241.75.42  9.841 ms",
                        " 9  *  *  *",
                        "10  152.101.32.76  10.452 ms  152.101.32.76  13.302 ms  152.101.32.76  12.649 ms",
                        "11  192.178.105.102  11.948 ms  142.251.224.181  11.073 ms  192.178.46.198  17.759 ms",
                        "12  142.251.32.46  11.955 ms  12.649 ms  10.543 ms"
                    ],
                    "protocol": "ipv4",
                    "result": 0,
                    "route": [
                        {
                            "error": "timeout",
                            "hop": 9
                        }
                    ]
                }
            }
        }
    }
}
```

## GET /diagnostics/network-configuration/\{:interface}/ 

Retrieves information about network-interface settings on the player

**Segment**

- `interface`: The network interface. Possible names include `eth0`, `wlan0`, and `modem`.

**Request Example**

```text
GET /rest/v1/diagnostics/network-configuration/eth0/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

:::hint{type="info"}
Some entries (e.g. `caCertificates`, `clientIdentifier`) are identical for all interfaces.
:::

- `text` <font color="#704ae0">string</font>: The network configuration information in plain-text form
- `output` <font color="#704ae0">Output</font>: The network configuration information as a JSON object:
  - `interfaces` <font color="#704ae0">Interface[ ]</font>: An array of Interface objects representing network interfaces:
    - `name` <font color="#704ae0">string</font>: The interface name (for example, `"eth0"`)
    - `errors`  <font color="#704ae0">Error[ ]</font>: An array of error messages associated with the interface
    - `params` <font color="#704ae0">Param[ ]</font>: An array of Param objects representing parameters associated with the network interface. Each Param interface has the following entries:
      - `name` <font color="#704ae0">string</font>: The property name (e.g. `"MAC"`)
      - `value` <font color="#704ae0">string</font>: The property value (e.g. `"90:ac:3f:0b:d2:88"`)
  - `host` <font color="#704ae0">Info[ ]</font>: An array of Info objects providing network host information. Each object can have the following entries:
    - `errors` <font color="#704ae0">Error[ ]</font>: An array of error messages associated with the network host
    - `params` <font color="#704ae0">Param[ ]</font>: An array of Param objects representing parameters associated with the network host 
  - `bsn` <font color="#704ae0">Info[ ]</font>: An array of Info objects providing information about BSN communication. 
  - `other` <font color="#704ae0">Info[ ]</font>: An array of Info objects providing information miscellaneous network information.
- `caCertificate` <font color="#704ae0">string</font>: The contents of a CA certificate file in text form (i.e. a "pem" file).
- `clientCertificate` <font color="#704ae0">bool</font>: A flag indicating whether the player is using a client certificate
- `clientIdentifier` <font color="#704ae0">string</font>: The DHCP client identifier for the network interface
- `dnsServerList` <font color="#704ae0">string[ ]</font>:  An IP address list of the DNS servers
- `domain` <font color="#704ae0">string</font>: The domain name for the network interface
- `eapTlsOptions` <font color="#704ae0">string</font>: A string containing EAP-specific options
- `enabledProtocolList` <font color="#704ae0">string[ ]</font>: An array of enabled IP protocols. Currently supported values are `"IPv4"` and "`IPv6"`.
- `identity` <font color="#704ae0">string</font>: The RADIUS identity
- `ipAddressList` <font color="#704ae0">string[ ]</font>: The IP addresses assigned to the player
- `inboundShaperRate` <font color="#704ae0">int</font>: The bandwidth limit for inbound traffic in bits per second. A value of -1 specifies the default bandwidth limit, and a value of 0 specifies no bandwidth limit (these two settings are functionally the same).
- `metric` <font color="#704ae0">int</font>: The routing metric for the default gateway on the interface. Routes with lower metrics are preferred over routes with higher metrics.
- `mtu` <font color="#704ae0">int</font>: The maximum transmission unit (MTU) for the network interface in bytes
- `privateKey` <font color="#704ae0">string</font>: The private key for authentication
- `vlanIdList` <font color="#704ae0">int[ ]</font>: An array of VLAN ids that are supported on the parent network interface
- `securityMode` <font color="#704ae0">string</font>: Security mode for authentication

**Response Example**

```json
{
  "route": "/v1/diagnostics/network-configuration/eth0",
  "method": "GET",
  "data": {
    "result": {
      "success": true,
      "response": [
        {
          "text": "\r\nInterface: eth0\r\nType: Wired\r\nLink: Yes\r\nConfiguration: DHCP\r\nClient ID: BrightSign:RE433D006644\r\nMAC: 90:ac:3f:2a:01:79\r\nCurrent IP: 192.168.1.174\r\nNetmask: 255.255.255.0\r\nBroadcast: 192.168.1.255\r\nGateway: 192.168.1.254\r\nIP6 Address: 2600:1700:dac0:2060::43/128\r\nIP6 Address: 2600:1700:dac0:2060:92ac:3fff:fe2a:179/64\r\nIP6 Address: fe80::92ac:3fff:fe2a:179/64\r\nMetric: 0\r\nDomains: attlocal.net\r\nDNS: 192.168.1.254\r\n 2600:1700:dac0:2060::1\r\nShape inbound: No\r\n\r\nHost \r\nHost Name: BrightSign-RE433D006644\r\nmDNS Host Name: BrightSign-RE433D006644.local\r\nTime server: http://time.brightsignnetwork.com\r\nProxy Bypass: <none>\r\n\r\nBSN \r\nCrash URL: https://crashes.brightsignnetwork.com/bs/crashdump\r\nError URL: https://handlers.bsn.cloud//bs/error.ashx\r\nRecovery URL: https://handlers.bsn.cloud//recovery/recovery.ashx\r\n\r\nOther \r\nHttp Port: \r\n\r\n\r\n",
          "output": {
            "interfaces": [
              {
                "name": "eth0",
                "errors": [],
                "params": [
                  {
                    "name": "Type",
                    "value": [
                      "Wired"
                    ]
                  },
                  {
                    "name": "Link",
                    "value": [
                      "Yes"
                    ]
                  },
                  {
                    "name": "Configuration",
                    "value": [
                      "DHCP"
                    ]
                  },
                  {
                    "name": "Client ID",
                    "value": [
                      "BrightSign:RE433D006644"
                    ]
                  },
                  {
                    "name": "MAC",
                    "value": [
                      "90:ac:3f:2a:01:79"
                    ]
                  },
                  {
                    "name": "Current IP",
                    "value": [
                      "192.168.1.174"
                    ]
                  },
                  {
                    "name": "Netmask",
                    "value": [
                      "255.255.255.0"
                    ]
                  },
                  {
                    "name": "Broadcast",
                    "value": [
                      "192.168.1.255"
                    ]
                  },
                  {
                    "name": "Gateway",
                    "value": [
                      "192.168.1.254"
                    ]
                  },
                  {
                    "name": "IP6 Address",
                    "value": [
                      "2600:1700:dac0:2060::43/128"
                    ]
                  },
                  {
                    "name": "IP6 Address",
                    "value": [
                      "2600:1700:dac0:2060:92ac:3fff:fe2a:179/64"
                    ]
                  },
                  {
                    "name": "IP6 Address",
                    "value": [
                      "fe80::92ac:3fff:fe2a:179/64"
                    ]
                  },
                  {
                    "name": "Metric",
                    "value": [
                      "0"
                    ]
                  },
                  {
                    "name": "Domains",
                    "value": [
                      "attlocal.net"
                    ]
                  },
                  {
                    "name": "DNS",
                    "value": [
                      "192.168.1.254",
                      "2600:1700:dac0:2060::1"
                    ]
                  },
                  {
                    "name": "Shape inbound",
                    "value": [
                      "No"
                    ]
                  }
                ]
              }
            ],
            "Host": [
              {
                "errors": [],
                "params": [
                  {
                    "name": "Host Name",
                    "value": [
                      "BrightSign-RE433D006644"
                    ]
                  },
                  {
                    "name": "mDNS Host Name",
                    "value": [
                      "BrightSign-RE433D006644.local"
                    ]
                  },
                  {
                    "name": "Time server",
                    "value": [
                      "http://time.brightsignnetwork.com"
                    ]
                  },
                  {
                    "name": "Proxy Bypass",
                    "value": [
                      "<none>"
                    ]
                  }
                ]
              }
            ],
            "BSN": [
              {
                "errors": [],
                "params": [
                  {
                    "name": "Crash URL",
                    "value": [
                      "https://crashes.brightsignnetwork.com/bs/crashdump"
                    ]
                  },
                  {
                    "name": "Error URL",
                    "value": [
                      "https://handlers.bsn.cloud//bs/error.ashx"
                    ]
                  },
                  {
                    "name": "Recovery URL",
                    "value": [
                      "https://handlers.bsn.cloud//recovery/recovery.ashx"
                    ]
                  }
                ]
              }
            ],
            "Other": [
              {
                "errors": [],
                "params": [
                  {
                    "name": "Http Port",
                    "value": [
                      ""
                    ]
                  }
                ]
              }
            ]
          }
        },
        {
          "caCertificates": "",
          "clientCertificate": false,
          "clientIdentifier": "BrightSign:RE433D006644",
          "dnsServerList": [],
          "domain": "",
          "eapTlsOptions": "",
          "enabledProtocolList": [
            "IPv4",
            "IPv6"
          ],
          "identity": "",
          "ipAddressList": [],
          "metric": 0,
          "privateKey": false,
          "securityMode": "",
          "vlanIdList": []
        }
      ]
    }
  }
}
```

## PUT /diagnostics/network-configuration/\{:interface}/ 

Applies a test network configuration on the player. You should use GET to get the configuration parameters before setting it using this API. The `text` and `output` parameters are NOT needed in PUT.

**Segment**

- `interface`: The network interface. Possible names include `eth0`, `wlan0`, and `modem`.

**Request Body**

- `caCertificate` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The contents of a CA certificate file in text form (i.e. a "pem" file).
- `clientCertificate` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: A flag indicating whether the player is using a client certificate
- `clientIdentifier` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The DHCP client identifier for the network interface
- `dnsServerList` <font color="#704ae0">string[ ]</font> <font color="#01a0af">optional</font>:  An IP address list of the DNS servers
- `domain` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The domain name for the network interface
- `eapTlsOptions` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: A string containing EAP-specific options
- `enabledProtocolList` <font color="#704ae0">string[ ]</font> <font color="#01a0af">optional</font>: An array of enabled IP protocols. Currently supported values are "IPv4" and "IPv6".
- `identity` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The RADIUS identity
- `ipAddressList` <font color="#704ae0">string[ ]</font> <font color="#01a0af">optional</font>: The IP addresses assigned to the player
- `inboundShaperRate` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The bandwidth limit for inbound traffic in bits per second. A value of -1 specifies the default bandwidth limit, and a value of 0 specifies no bandwidth limit (these two settings are functionally the same).
- `metric` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The routing metric for the default gateway on the interface. Routes with lower metrics are preferred over routes with higher metrics.
- `mtu` <font color="#704ae0">int</font> <font color="#01a0af">optional</font>: The maximum transmission unit (MTU) for the network interface in bytes
- `privateKey` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The private key for authentication
- `vlanIdList` <font color="#704ae0">int[ ]</font> <font color="#01a0af">optional</font>: An array of VLAN ids that are supported on the parent network interface
- `securityMode` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: Security mode for authentication

**Request Example**

The example request parameters and headers are set as follows:

```text
PUT /rest/v1/diagnostics/network-configuration/eth0 HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json
Content-Type: application/json
Content-Length: 75
```

This is the example request body:

```json
{
  "data": {
    "caCertificates": "",
    "clientCertificate": false,
    "clientIdentifier": "BrightSign:D7E8CV332141",
    "dnsServerList": [],
    "domain": "",
    "eapTlsOptions": "",
    "enabledProtocolList": [
      "IPv4",
      "IPv6"
    ],
    "identity": "",
    "ipAddressList": [],
    "privateKey": false,
    "securityMode": "",
    "vlanIdList": []
  }
}
```

## GET /diagnostics/network-neighborhood/ 

Retrieves information about the player’s current network neighborhood (the other players on the same network).

**Request Example**

```text
GET /rest/v1/diagnostics/network-neighborhood/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag that indicates if the operation succeeded
- `response` <font color="#704ae0">object[ ]</font>: An array of information about players in your network neighborhood
  - `chassis-descr` <font color="#704ae0">string</font>: The model version, OS version, serial number, etc.
  - `chassis-id` <font color="#704ae0">string</font>: A unique identifier for the player
  - `chassis-name` <font color="#704ae0">string</font>: The name of the player
  - `mgmt-ip` <font color="#704ae0">string</font>
  - `port-descr` <font color="#704ae0">string</font>: Which interface the player is using
  - `port-id` <font color="#704ae0">string</font>
  - `vlan-pvid` <font color="#704ae0">string</font>

If the diagnostic could not be performed, the response body may instead be an error message.

**Response Example**

```json
{
    "route": "/v1/diagnostics/network-neighborhood",
    "method": "GET",
    "data": {
        "result": {
            "success": true,
            "response": [
                {
                    "chassis-descr": "BrightSign XT1144 REVE 8.5.47 UHE115005214",
                    "chassis-id": "90:ac:3f:28:fb:a4",
                    "chassis-name": "BrightSign-UHE115005214",
                    "mgmt-ip": "2601:647:4500:1e5e:92ac:3fff:fe28:fba4",
                    "port-descr": "eth0",
                    "port-id": "90:ac:3f:28:fb:a4",
                    "vlan-pvid": "0"
                }
            ]
        }
    }
}
```

## GET /diagnostics/packet-capture/ 

Gets the current status of packet capture operation. Packet capture operation requires the legacy DWS to be working.

**Request Example**

```text
GET /rest/v1/diagnostics/packet-capture/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

- `statusCode` <font color="#704ae0">int</font>: The success or error code (200 is success)
- `is_running` <font color="#704ae0">bool</font>: Flag indicating if the packet capture operation is running

**Response Example**

```json
{
    "route": "/v1/diagnostics/packet-capture",
    "method": "GET",
    "data": {
        "result": {
            "statusCode": 200,
            "is_running": false
        }
    }
}
```

## POST /diagnostics/packet-capture/ 

Starts a packet capture operation

**Request Body**

- `filename` <font color="#704ae0">string</font>: The name of the packet capture file. If you don't pass this string, 'capture.pcap' is the default.
- `interface` <font color="#704ae0">string</font>: The name of the interface for which we are performing packet capture. 'eth0' is the default.
- `duration` <font color="#704ae0">int</font>: The duration for which the packet capture runs in seconds. The default is 300 seconds (5 minutes).
- `maxpackets` <font color="#704ae0">int</font>: The maximum number of packets to capture before concluding the process. 0 is the default value.
- `snaplen` <font color="#704ae0">int</font>: The maximum size of each packet. Specifying 0 will instruct the function to capture the entire packet no matter the size.
- `filter` <font color="#704ae0">string</font>: A field for conditional filtering of packets. This operation uses standard pcap syntax. This string is empty by default.

**Request Example**

```text
POST /rest/v1/diagnostics/packet-capture/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 190
```

This is the example request body:

```json
{
    "data": {
        "filename": "capture.pcap",
        "interface": "eth0",
        "duration": 300,
        "maxpackets": 0,
        "snaplen": 0,
        "filter": ""
    }
}
```

**Response Example**

```json
{
    "data": {
        "result": {
            "statusCode": 200,
            "is_running": true
        }
    },
    "route": "/v1/diagnostics/packet-capture",
    "method": "POST"
}
```

## DELETE /diagnostics/packet-capture/ 

Stops a packet capture operation

**Request Example**

```text
DELETE /rest/v1/diagnostics/packet-capture/?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Example**

```json
{
    "route": "/v1/diagnostics/packet-capture",
    "method": "DELETE",
    "data": {
        "result": {
            "statusCode": 200,
            "is_running": false
        }
    }
}
```

## GET /diagnostics/telnet/

Get information about telnet from the player, including its enabled status and port number. This is only available in BOS 9.0.110 and above.

**Request Example**

```text
GET /rest/v1/diagnostics/telnet?destinationType=player&destinationName={{deviceSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
```

**Response Example**

```json
{
    "route": "/v1/diagnostics/telnet",
    "method": "GET",
    "data": {
        "result": {
            "enabled": true,
            "portNumber": 23
        }
    }
}
```

## PUT /diagnostics/telnet/

This is only available in BOS 9.0.110 and above.

**Request Body**

- `enabled` <font color="#704ae0">bool</font>: Enable or disable Telnet on the player
- `portNumber` <font color="#704ae0">int</font>: The port number on which to enable Telnet
- `reboot` <font color="#704ae0">bool</font>: This optional parameter reboots the player immediately after executing this operation. It is `true` by default.

**Request Example**

The example request parameters and headers are set as follows:

```text
PUT /rest/v1/diagnostics/telnet/ HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json
Content-Type: application/json
Content-Length: 75
```

This is the example request body:

```json
{
  "data": {
    "enabled": true
    "portNumber": "23",
    "password": {{password}}
  }
}
```

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": true
        }
    },
    "route": "/v1/diagnostics/telnet",
    "method": "PUT"
}
```

## GET /diagnostics/ssh/

Returns information about whether or not SSH is enabled on the player, and the port number on which it is enabled if it is. This is only available in BOS 9.0.110 and above.

**Request Example**

The example request parameters and headers are set as follows:

```text
GET /rest/v1/diagnostics/ssh/ HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json
```

**Response Example**

A successful response is a <font color="#15803D">200</font> and this response body:

```json
{
    "enabled": true,
    "portNumber": 22,
    "password": true // Indicates that a value is set
}
```

## PUT /diagnostics/ssh/

This is only available in BOS 9.0.110 and above.

**Request Body**

- `enabled` <font color="#704ae0">bool</font>: Enable or disable SSH on the player
- `portNumber` <font color="#704ae0">int</font>: The port number on which to enable SSH
- `password` <font color="#704ae0">string</font>: Sets the plain-text login password for the SSH connection
- `reboot` <font color="#704ae0">bool</font>: This optional parameter reboots the player immediately after executing this operation. It is `true` by default.
- `obfuscatedPassword` <font color="#704ae0">string</font>: This optional parameter sets the login password for the SSH connection. The password should previously have been obfuscated using a shared secret. Contact [support@brightsign.biz](mailto\:support@brightsign.biz) to learn more about generating a key for obfuscation and storing it on the player.

**Request Example**

The example request parameters and headers are set as follows:

```text
PUT /rest/v1/diagnostics/ssh/ HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json
Content-Type: application/json
Content-Length: 65
```

This is the example request body:

```json
{
  "data": {
    "enabled": true,
    "portNumber": 22,
    "password": {{password}}
  }
}
```

**Response Example**

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": true
        }
    },
    "route": "/v1/diagnostics/ssh",
    "method": "PUT"
}
```


[title] LDWS sendCecX Endpoint
[path] Diagnostic Web Server APIs/Untitled/

:::hint{type="warning"}
This API is experimental and may change.
:::

## POST /v1/sendCecX/

Sends specified CEC payloads out of a player’s HDMI-1 port

**Request Body**

- `hexCommand` <font color="#704ae0">string</font>: The custom Cec command, in hexadecimal format, sent from the player to the connected display. You can use [https://www.cec-o-matic.com/](https://www.cec-o-matic.com/) to understand and convert commands.

**Request Example**

The example request parameters and headers are set as follows:

```text
POST /api/v1/sendCecX/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
```

This is the example request body:

```json
{
  "hexCommand": "4f36"
}
```

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true
    }
  }
}
```

**Failure Response Examples**

<font color="#B91C1C">400</font>: Invalid request parameter

<font color="#B91C1C">500</font>: Internal server error

[title] Provisioning & Recovery
[path] BrightSign Partner Packet/Untitled/

# Overview

BrightSign players in large, distributed networks should meet certain provisioning and recovery requirements. Partners who want to set up their own provisioning and recovery systems, rather than using BSN.Cloud, should make sure that those systems meet the following requirements.

Each player must be able to provision itself, and once provisioned, periodically check in with the server for updates if configured to do so. The player and server must also be able to initiate a recovery process should the player enter an error state that cannot be fixed by rebooting (for example, filesystem corruption caused by power loss or failure of the storage device).

To meet these requirements, two separate but complementary systems must be developed:

- A set of *autorun.brs* files that can play content, facilitate fault recovery, or provision the player for an HTML/JavaScript playback environment
- A *request handler* server to process recovery/provisioning HTTP requests sent by the player. The request handler delivers an autorun file or other HTTP response depending on player information contained within the header of the request. The request handler database can also contain conditional flags for each player, that enable new autorun scripts to be pushed to specific players in the field. If a partner-specific request handler is not specified in the registry, BSN.Cloud provides a default request handler.

# Player Provisioning

BrightSign player provisioning integrates the player into your environment, primarily by changing registry settings to reflect that environment and usually by downloading an application or Setup package to the player. The following settings are configured within the registry during BrightAuthor\:connected or BSN.cloud provisioning:

- BSN.cloud account, username, password, and group
- Recovery/provisioning URL, error notification URL, crash report URL
- Timezone

## Player Registry Entries 

The following player registry entries are associated with the provisioning and recovery process. These keys can be modified by accessing the registry’s “networking” section using the [roRegistry](docId\:YTpSfntswYFMXx8PCqJLf) BrightScript object.

| **Registry Key** | **Description**                                                                                                                            |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `ub`             | The URL prefix that is applied to the URLs of the ru, eu, and cu key values. This prefix is not applied to a key value containing a colon. |
| `ru`             | The provisioning/recovery URL used by the player to download an autorun script                                                             |
| `eu`             | The URL to which error notifications are posted                                                                                            |
| `cu`             | The URL to which crash reports are posted                                                                                                  |
| `p`              | The *password* to the recovery handler (`ru`) that is specified above                                                                      |

The following registry keys are specific to BSN.cloud but can be modified by partners to affect the BSN.cloud registration. You should not store your own information in these sections because it can affect BSN.cloud operations:

| **Registry Key** | **Description**                                                             |
| ---------------- | --------------------------------------------------------------------------- |
| `a`              | The name of the BSN.cloud *account* to which the player belongs.            |
| `u`              | The name of the BSN.cloud *user* in the account to which the player belongs |
| `g`              | The BSN.cloud *group* within the account to which the player belongs        |

:::hint{type="info"}
The account, username, and group registry keys are used for provisioning/recovery with BSN.cloud. A request handler may use these keys, but they are not required.
:::

## Player Startup Processes

These processes occur when a BrightSign player boots:

1. The player connects to a network and obtains an IP address.
2. The player checks the storage device for an autorun. If an autorun is found, the player will execute the autorun and if none is found, it will proceed with the steps below. See  [Player Storage](docId\:o4YzospNpFaGbgLdUleee) for more info about storage devices and device priority (if you have multiple storage devices).
3. If an IPv4 address exists, the player will attempt to provision over the network.
4. The player will check for a recovery URL (ru):
   - If a DHCP Option 43 recovery URL (ru) is found, it will override any registry value for `ru` until the end of the DHCP lease. This URL can be set through DHCP Option 43. See [Option 43](docId:5RglQFftt-PxzAhHl8gL3)<font color="#ef1b0600"> </font>to configure a DHCP server to communicate this URL to a BrightSign player.
   - If DHCP Option 43 ru is not found, the ru that is set in the registry will be used.
   - If there is no registry value for the ru, this step will be skipped.
5. If the recovery URL is blank, the player will attempt:
   - **Well-known host** **provisioning**: Also known as custom name mapping in your network's DNS server. If an IP address is mapped to *brightsign-b-deploy*, then the player will attempt to use the associated IP to provision itself automatically.
   - **B-Deploy cloud provisioning**: See [B-Deploy/Provisioning APIs](docId\:wccw4TQERZPXV7KJq_a3P).
   - **multicast DNS (mDNS)**: The player will automatically check the standard mDNS location (*http\://brightsign-b-deploy.local/)* and if there is a server on your network with that address, the player will automatically provision itself. However, no other provisioning methods can be active if you want to provision with mDNS. See the Appendix at the end of this page for more information about this option.
6. The player will retry the provisioning process every 30 seconds until there is a successful response or interruption.

## URL Request Parameters

These parameters are used for communicating between a player and the request handler. 

## Player Request Parameters

The following parameters are included in the header of HTTP GET requests that a player sends to provisioning/recovery URL:

| **Parameter**     | **Example Value**                             | **Description**                                                                                                                                                                                                                                                                                             |
| ----------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DeviceModel`     | `XT1144`                                      | The model designation of the BrightSign player                                                                                                                                                                                                                                                              |
| `DeviceFamily`    | `malibu`                                      | The family designation of the BrightSign player                                                                                                                                                                                                                                                             |
| `DeviceId`        | `D5E86P001287`                                | The unique serial number of the player                                                                                                                                                                                                                                                                      |
| `DeviceFwVersion` | `8.2.42`                                      | The OS (firmware) version currently installed on the player                                                                                                                                                                                                                                                 |
| `DeviceUpTime`    | `240`                                         | The amount of time (in seconds) since the player booted up                                                                                                                                                                                                                                                  |
| `RecoveryMode`    | `override`                                    | The mode of the current URL request: <br /><br />- override: The initial HTTP GET request of a player with a valid autorun script<br />- periodic: Subsequent HTTP GET requests of a player with a valid autorun script<br />- last-resort: The HTTP GET request of a player without a valid autorun script |
| `CrashDump`       | `yes`                                         | A flag indicating that the current boot was initiated by a forced reboot due to a crash (this header is only present if true).                                                                                                                                                                              |
| `StorageStatus`   | `usb1=none;sd=autorun; sd2=storage;ssd=none;` | The current autorun and file-system status of each storage device.                                                                                                                                                                                                                                          |

### Optional BSN.cloud Keys

| **Parameter** | **Example Value** | **Description**                        |
| ------------- | ----------------- | -------------------------------------- |
| `Account`     | `bsaccount`       | The `a` registry value described above |
| `User`        | `bsuser`          | The `u` registry value described above |
| `Group`       | `bsgroup`         | The `g` registry value described above |
| `Password`    | `bspassword`      | The p registry value described above   |

### Storage Status Parameters 

The `StorageStatus` value contains a list of key-value pairs indicating the status of each storage device. The following storage device keys are returned:

| **BrightScript Key** | **Storage Status Key** |
| -------------------- | ---------------------- |
| USB1:                | usb1                   |
| SD:                  | sd                     |
| SD2:                 | sd2                    |
| SSD:                 | ssd                    |

These status values can be returned for each storage device:

| **Storage Status Value** | **Description**                                                                                                                            |
| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ |
| `none`                   | The storage device was not detected.                                                                                                       |
| `storage`                | The storage device is present, but an autorun script was not detected.                                                                     |
| `autorun`                | The storage device is present and contains an *autorun.brs* or *autorun.zip* file.                                                         |
| `autorun-load-error`     | The storage device is present and contains an *autorun.brs* or *autorun.zip* file that failed to load.                                     |
| `autorun-runtime-error`  | The storage device is present and contains an *autorun.brs* or *autorun.zip* file that encountered a runtime error.                        |
| `error`                  | The storage device is present but failed a file-system check. This value also implies that attempts to repair the file system also failed. |

### Server Response Parameters

The header of a request handler response may contain a single parameter. This parameter can accompany an HTTP 204 or 200 response (even if the response body is empty). 

| **Parameter** | **Example Value** | **Description**                                                                                                                                                                                             |
| ------------- | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Retry-After   | 7200              | The amount of time (in seconds) that the player should wait to make a periodic request to the provisioning/recovery URL. If this parameter is not provided, the default request interval will be two hours. |

# Player Recovery

If no valid autorun is found, a recovery is triggered. In a recovery, the player pulls down content from the recovery URL (stored in the registry) and attempts to execute it.

The recovery process and the recovery URL should not be confused. While the recovery process uses the recovery URL, some deployment scenarios also use the recovery URL and it is also the provisioning URL in the registry.

## Override Recovery

Once the boot process has been completed, the player scans each storage device to determine if one or more devices contain an autorun file:

1. If at least one device contains an autorun file, the player will delay executing the autorun while a background process sends an HTTP GET request (containing parameters describing the player in the header) to the provisioning/recovery URL:
   - If the request handler responds using an HTTP code 200 with a non-empty body, the player will use the response body as the new autorun script.
   - If the request handler responds with an HTTP code 204, or an HTTP code 200 containing an empty message body, the player will execute the preexisting autorun script as normal. The response may also include a "Retry-After" header indicating (in seconds) how frequently the player should check in with the request handler. If this parameter is not specified, the check-in interval will default to two hours.
   - If no response is received within 20 seconds, the preexisting autorun will be executed. The player will send another request to the request handler after five minutes, then after 10 minutes. It will then make a request once every two hours. If multiple storage devices contain an autorun file, the player will select the first autorun in the following order: USB, SD, SD2, SSD. If it takes too long to check the integrity of a storage device, then that device might be skipped in the order of autorun selection so do not build a system that relies on this order.
2. If none of the devices contain an autorun, the player will enter last-resort recovery mode. 

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/vHxlpCYxCDvMK0URUxq83_diagram2.png" size="80" width="1368" height="1413" position="center" alt="Diagram2.png" showCaption="false"}

## Periodic Recovery

The player will periodically send an HTTP GET request to the provisioning and recovery URL to determine if the device should be updated.

- If no response is received, the preexisting autorun will continue without interruption.
- If the request handler responds with an HTTP code 204, or an HTTP code 200 containing an empty message body, the preexisting autorun will continue without interruption. The response may also include a "Retry-After" header indicating (in seconds) how frequently the player should check in with the request handler. If this parameter is not specified, the check-in interval will default to two hours.
- If the request handler responds using an HTTP code 200 with a non-empty body, the player will use the response body as the new autorun script. 

![Diagram1a.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/sB7aleFVhSF4GiKeddbQn_diagram1a.png)

## Last-Resort Recovery

If none of the attached storage devices contain an autorun file, or if the designated autorun encounters an `autorun-load-error` or `autorun-runtime-error`, then last-resort recovery will begin.

- The player sends an HTTP GET request to the provisioning/recovery URL. The header of this request contains information about the player, as well as the status of the storage devices and autorun files on the player: This allows the request handler to determine the correct course of action based on the attributes and current status of the player.
  - If the request handler responds using an HTTP code 200 with a non-empty body, the player will use the response body as the new autorun script. The autorun script should reboot the player once it performs necessary recovery tasks (the player will not automatically reboot).
  - If the request handler responds with an HTTP code 204, or an HTTP code 200 containing an empty message body, the player will immediately reboot.
  - If the request handler does not respond, the player will continue to send requests for 30 minutes before rebooting. Alternatively, a reboot will occur after only 5 minutes if the autorun script has encountered an `autorun-runtime-error`. This process will cycle indefinitely until an autorun script is received from the request handler.
    -

![Diagram3.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/3M2_7ISBREF9rbRDvfGo0_diagram3.png)

# Appendix

## mDNS

Multicast DNS is a unique DNS protocol developed for small networks. These diagrams show the differences between a normal DNS setup and a mDNS setup. Note that multicast DNS is not on by default in all networks.

![Screenshot 2024-03-22 at 1.17.38 PM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/UBpoLw6vofs_RoExjHScO_screenshot-2024-03-22-at-11738-pm.png)

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/iaXajaQWbk4ypkdOAZUkz_screenshot-2024-03-22-at-11742-pm.png" size="70" width="962" height="946" position="center" alt="Screenshot 2024-03-22 at 1.17.42 PM.png" showCaption="false"}

## Set Up a Recovery / Provisioning Server

The following workflow diagram describes a simple request handler implementation. This workflow assumes implementation of:

- A database that can associate forced-recovery flags with an individual device or group of devices
- A provisioning script
- A recovery script that first reformats the storage device
- A recovery script that does not reformat the storage device

This workflow does not implement the following features:

- Different provisioning scripts depending on the DeviceId or Group (or other HTTP GET parameters)
- Multiple provisioning or recovery autorun scripts for different storage

![Screenshot 2024-03-22 at 10.46.21 AM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/LbeVYzaMiEPLHAOhs3Hit_screenshot-2024-03-22-at-104621-am.png)

[Next - Autorun Files >](docId:7ViTOacfAsnMPNOZL0ZBq)

[title] BrightSign Partner Packet
[path] /

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/oFvZC3-dIX1khi6H7C_0Q_brightsign-partner-packet-20230120-182258.png)

Welcome to the BrightSign Partner Packet! This document serves as an introductory guide for the integration of partner Content Management Systems (CMS) with the BrightSign ecosystem which includes BrightSign’s extensive array of digital signage players as well as a rich set of player management services.

CMS partners are able to build applications that allow their customers to set up, publish to, and manage BrightSign players. BrightSign’s development technologies, including our open APIs, enable seamless partner integrations.

We offer services and support from multiple worldwide locations, and our Partner Integration, Business Development, and Marketing teams are dedicated to helping our partners every step of the way from initial inquiries and on-boarding to market launch.

:::hint{type="warning"}
## Attention New Partners

BrightSign’s products and services are highly differentiated and function in unique ways. If you are new to BrightSign, it is *highly recommended* that you go through the  [Welcome!](docId\:BJecZ2-78lI32YH525r8I) section which provides a quick, high-level overview of how our products and services work.
:::

For partners who already have a good understanding of how our players and services function, let’s get started!

Each page will have a “Next >” link at the bottom which takes you to the next page in the packet. Alternatively, you can skip to any page/section in the packet using the collapsible page tree on the left.

[Next - BrightSign Players >](docId\:PfBODx3gvi9tCXz8Il8R1)

[title] BrightSign Players
[path] BrightSign Partner Packet/

BrightSign players run on a highly efficient, embedded system specifically designed for connectivity and the processing of media files. Our players are purpose-built from the ground up for digital signage!

# Software

The BrightSign operating system (BrightSignOS or BOS) is an open-source Linux-based OS based on the Yocto and OpenEmbedded projects. It includes substantial BrightSign modifications that include a read-only root filesystem in flash memory, a Chromium rendering engine, and additional components for audio/video processing and security.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/ePKJM-aS4A30HDWK6F2f5_image-20230626-152212.png" size="64" width="1484" height="1355" position="center" showCaption="false"}

Thanks to the built-in Chromium engine, BrightSign players are able to run any HTML/JavaScript application.

BrightSign players are highly specialized and although they are based on a Linux OS, they are *not* general-purpose Linux PCs. They cannot run Linux apps nor are they capable of running apps for Android, iOS, or Windows. However, if you have a native Android, iOS, or Windows app, we may be able to help you leverage your existing code to run natively on our players.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/l_TrmZxu3pe2YjVPEovGN_image-20230224-203455.png" size="34" width="654" height="644" position="center" showCaption="false"}

Some of BrightSign’s software components are open source, and the open source code is freely available on BrightSign’s website. See [BrightSign Open Source](docId\:xZGELiJeq8J84xudeHoTO) for more information.

:::hint{type="info"}
Note that the term “firmware” is occasionally used in BrightSign’s documentation. “Firmware” refers to BrightSignOS.
:::

# Hardware

BrightSign players are compact, highly-efficient, and, because they’re fan-less, virtually silent. Performance is maximized by running all video decoding and encoding through dedicated hardware.

With an efficient heat-dissipating enclosure and no moving parts that can break down, BrightSign players are extremely reliable even when they're running 24 hours a day, 7 days a week. Indeed, the reliability and longevity of BrightSign players are widely viewed as unmatched in the industry.

You can learn more about the current BrightSign hardware lineup [here](https://www.brightsign.biz/digital-signage-products).

[Next - Player Setup / Provisioning >](docId\:ZL0b0J5duAalQFefN58Nb)

[title] BrightSign Extensions
[path] HTML Development/HTML Best Practices/

The BrightSign implementation of the Chromium engine includes several platform-specific extensions. Extensions for \<video> elements are covered on the [HTML Video](docId\:e6uJleH69Q0JmMv8kyTrp) page.

## GPU Rasterization

GPU rasterization is enabled by default in firmware versions 6.2.x and later. 

## Optimized Image Rendering

The `image-rendering` CSS property can be assigned the `optimizeSpeedBS` value. Using this value ensures that Chromium uses lower-quality but faster bilinear filtering when scaling images to 50% or less. We recommend using this value with pages that scale a lot of images at runtime.

## More Information

This [GitHub repo](https://github.com/brightsign/extension-template) provides a guide to creating, debugging, and deploying extensions.

[title] Creating HTML Pages
[path] HTML Development/HTML Best Practices/

Follow these steps when creating HTML pages:

1. Make sure the HTML page has the same aspect ratio as your signage display. If you are using HTML content in a BrightSign Author zone that is smaller than the screen, fit the page to the same aspect ratio as the zone.
2. Use a master Div aligned to 0,0 when building an HTML page. This will ensure correct alignment.
3. When creating an HTML site, make sure that all webpage assets (image files, video files, etc.) are contained within the same folder on your local disk. This folder is a “site folder,” meaning that all assets in this folder and its subfolders will be used in the production of the webpage. If these assets are not in the folder, they will not display when the project is published.
4. You can test the layout and appearance of a page locally by opening it with Google Chrome, which has similar rendering capabilities to BrightSign players.
5. If you want to publish resource-intensive presentations (e.g. `<video>` elements or multiple transforms) using HTML, we recommend using a Class 10 (10Mb/s) SD card.


[title] Touchscreen Support
[path] HTML Development/HTML Best Practices/

BrightSign players are compatible with touchscreens that use standard HID drivers. Note that some manufacturers claim support for HID but still use custom drivers. See [this page](docId\:ACL5V8_jQiuq3SntxSNfO) for further discussion and a list of touchscreen models that have been tested with BrightSign players.

[title] HTML Development
[path] /

BrightSign players feature the Chromium HTML rendering engine, allowing you to display local or remote HTML pages. You can use a single, full-screen page of HTML content as a presentation, or you can display HTML content within one or more BrightAuthor zones along with other multimedia content. This feature greatly increases your creative options when using BrightSign players.

The contained pages are not general-purpose instructions for writing HTML code or using HTML publishing software, but you can use these sections to get the most out of your HTML presentations and ensure that your HTML content works seamlessly with your BrightSign players.

See [this page](docId\:Wx7RHJmrG74EQxGXRwqtD) for more information about the new Chromium options on Series 5 and 6 players.

Reference implementation details can be found on [our GitHub repository](https://github.com/brightsign/bs-node-serialport).

[title] Example (Manual Setup)
[path] BrightSign Partner Packet/

In this section, you will be guided through a hands-on example that demonstrates how our players can be manually provisioned to simultaneously display local, web, and streaming content.

While many partners are likely to prefer remote provisioning over manual provisioning, this example is nevertheless useful because it introduces some important info while providing a fundamental demonstration of how our players function. As the example is straightforward to replicate, it enables users to easily follow along with their own player. Remote provisioning will be covered later in this packet.

As covered previously, provisioning a player involves applying a Setup File and Player App to a player. Players that do not have a Setup explicitly applied will use the [BrightSign Default setup](docId\:XNnXywMV09iEgZIIt7RWA) which configures players to look for a network connection via Ethernet and, if a connection is found, obtain an IP address using DHCP. In this example, we will maintain the BrightSign Default Setup and copy a custom Player App to the player.

[Next - Preparations >](docId\:dlPbgnJvy7CJLRHd7pfaO)

[title] Staying Updated
[path] BrightSign Partner Packet/

BrightSign regularly makes announcements of new firmware releases, product updates, and other notes. You can sign up to receive notifications of these announcements by clicking the bell icon at the top of the [Announcements](docId:9d71BkFiynjnqk9cKFfoS) page.

You’ve reached the end of this guide and hopefully now have a good understanding of how to integrate your systems into the BrightSign ecosystem.

As you continue to familiarize yourself with BrightSign’s technologies, this [Partner Glossary](docId\:q1B-wv6j9vZ2nuWJPA-S6) may come in handy.

Here’s to a successful integration!

[title] Operational Best Practices
[path] BrightSign Partner Packet/

Based on our experience, partners that follow these practices have the most successful BrightSign integrations:

- We encourage you to report any issues so that we can help you resolve them. Contact [integrations@brightsign.biz](mailto\:integrations@brightsign.biz) for support.
- If integration issues arise, the partner should be the one that communicates with our support team, not the partner’s customers.
- To ensure ongoing alignment between BrightSign’s technologies and partners' goals, we encourage partners to be proactive and talk to us before making major changes to their existing integration(s).
- Partners should be aware that BrightSign may not fully test experimental features in components such as Chromium. If experimental features are used as part of the integration, stability may be adversely affected.

Next, we will cover the responsibilities expected of BrightSign and our partners.

[Next - BrightSign / Partner Responsibilities >](docId:3ba1Ohxn2y-vmfSnX2SVy)&#x20;

[title] BSN.Cloud for Partners
[path] /

BSN.Cloud is the next-generation cloud-based infrastructure for networked BrightSign players. This section includes documentation for BSN.Cloud services, including the following:

- [Adding a CMS to bsn.Cloud Partner Gallery](docId\:SLFRrM6A-TIGnoXJqdKd5)&#x20;
- [Adding Partner CMS Players to  Networks](docId\:N7U8o2FuR4fjqjQ2u4hv9)&#x20;
- [Applying Settings in the Properties Panel](docId\:pz4pkahLR3dsSpr-w1sX9)&#x20;
- [BrightSign Cloud](docId\:Ga-zCVP2sYSG2ZCS1Vuip)&#x20;
- [Partner Setup and Recovery](docId\:Qt5mKqoUWVlBScUzp9CC4)&#x20;

See [Cloud APIs](docId:7lwJKKuAb9KwoNqnKv06M) for an overview of the BrightSign REST APIs.

[title] Node.js
[path] HTML Development/

Our customers often need to communicate between applications on a BrightSign player, or between a BrightSign player and the outside world. This can be done using various protocols: HTTP, serial, and UDP are the most popular. You can write applications in either BrightScript or JavaScript to create this functionality. If you choose to write your application in JavaScript, you will need Node.js® to implement features such as hosting a web server in JavaScript.

BrightSign makes a Node.js endpoint available so that our partners can use Node.js modules and features. 

## BrightSign Node.js Implementation

BrightSign players support the Node.js runtime environment, which runs on the same V8 JavaScript engine used by Chromium. The Node.js® and Chromium instances share a single JavaScript execution context, so JavaScript applications can access both Node.js modules and DOM objects at the same time. BrightSign firmware pushes Node.js events to the Chromium event loop, ensuring that JavaScript applications receive Node.js and DOM events seamlessly.

The BrightSign Node.js implementation is based on the [NW.js](https://github.com/nwjs/nw.js) and [Electron](https://github.com/electron/electron) projects and shares many characteristics with them. Whereas Electron uses a JavaScript file as the entry point (i.e. the JavaScript file creates a webview, which also has access to the Node.js runtime), NW\.js and BrightSign use an HTML file as the entry point: On a BrightSign player, BrightScript creates a Node.js-enabled *roHtmlWidget* instance; the initial URL, which is passed when *roHtmlWidget* is initialized, acts as the entry point for Node.js applications.

Like NW\.js and Electron, BrightSign does not use sandboxing. Instead, it launches the render process with a Node.js user and storage group, which has write permissions for local storage and read permissions for the entire file system. It also can access networking interfaces and use privileged ports.

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/TXfd3iBmB-q7V89DT8qqo_nodejscombineddiagrams.png)

The integrated Node.js implementation in OS 8.2.x and OS 8.3.x is based on Node v10. For further documentation and usage information, consult the [Node.js 10.0.0 API documentation](https://nodejs.org/dist/v10.0.0/docs/api/). 

:::hint{type="info"}
Node.js is not enabled for iframes or Web Workers.
:::

## Enabling Node.js

Node.js object functionality is available in BrightSign Author when users specify Node.js items in [Presentation Settings](docId\:a6Ali6u-szxHuansk6T3-). Node.js objects are not available in BrightAuthor Classic.

Node.js is enabled for individual *roHtmlWidget* instances by including the `nodejs_enabled:true` entry in the [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK) object.

**Example:**

```text
r=CreateObject("roRectangle", 0,0,1920,1080)
is = {
	port: 3000
}
config = {
	nodejs_enabled: true
	inspector_server: is
	brightsign_js_objects_enabled: true
	url: "file:///sd:/nodehello.html"
}
h=CreateObject("roHtmlWidget", r, config)
h.Show()
```

:::hint{type="warning"}
We do not recommend loading arbitrary websites with Node.js enabled. Some JavaScript libraries assume that Node.js is running on an instance with server-side capabilities, and they will attempt to load dependencies, causing playback to fail.
:::

:::hint{type="info"}
If you are using a BrightSign Author plugin to enable Node.js, you will need to set other desired parameters in the plugin, rather than with an HTML5 state. For example, if you want to enable the mouse cursor, you will need to set `mouse_enabled:true` during the *roHtmlWidget* initialization, rather than checking the box in the HTML5 state.
:::

### Cross-Domain Security

Chromium has default security measures for preventing cross-site scripting attacks: If the URL for the *roHtmlWidget* instance is a remote domain, JavaScript applications from that domain cannot make HTTP requests to other domains; on the other hand, if the URL points to local storage, requests to other, remote domains are acceptable.

If you want to reference other domains in remote applications, set the `websecurity` parameter to `false` when initalizing the *roHtmlWidget*, as shown below:

**Example:**

```text
r=CreateObject("roRectangle", 0,0,1920,1080)
is = {
	port: 3000
}
config = {
	nodejs_enabled: true
	inspector_server: is
	brightsign_js_objects_enabled: true
	url: "http://www.mysitehere.com"
	security_params: {websecurity: false} 
}
h=CreateObject("roHtmlWidget", r, config)
h.Show()
```

### Web Storage

If you want to use JavaScript storage applications, you will need to specify a  `storage_path` and `storage_quota` when initializaing the *roHtmlWidget*:

**Example:**

```text
r=CreateObject("roRectangle", 0,0,1920,1080)
is = {
	port: 3000
}
config = {
	nodejs_enabled: true
	inspector_server: is
	brightsign_js_objects_enabled: true
	url: "file:///sd:/nodehello.html"
	storage_path: "SD:"
	storage_quota: 1073741824
}
h=CreateObject("roHtmlWidget", r, config)
h.Show()
```

### JQuery

JQuery® requires a workaround to operate correctly with Node.js (see [this page](https://stackoverflow.com/questions/4299363/how-to-use-jquery-selectors-in-node-js) for an example). This workaround requires modifying the content, so if you don't have control over the webpage enabling node in your HTML widget, this can cause an intractable problem. You should only enable Node.js if you are planning to use it (for example with our [JavaScript APIs](docId\:o2uIyNVKbsyd1qXCvhVCN)).

See also [HTML Best Practices](docId\:GXcTVNW8g46EvdxOOkUKu).

### Node SerialPort

The BrightSign player provides JavaScript serial port bindings for the Node SerialPort package. These bindings can be used using with the *@brightsign/serialport* API:

```text
const SerialPort = require('@serialport/stream');
const BrightSignBinding = require('@brightsign/serialport');
SerialPort.Binding = BrightSignBinding;
```

Also see our [reference implementation](https://github.com/brightsign/bs-node-serialport) on GitHub.

### Reloading Node.js Enabled Web Applications

Any customer application that uses *@brightsign* objects, and some of the "BS" objects, will throw a JavaScript exception when reloaded in BrightSignOS 8.0 to 8.4 (even though it may have worked in OS 7.x and earlier) due to limitations with native modules in Node 10. This problem will be fixed in OS 8.5 and above, which ships with Node 14.x. You can also disable Node.js (and *@brightsign* objects) if you don’t need it.

:::hint{type="warning"}
Reloading Node.js using Web Inspector or JavaScript is not supported.
:::

## Packaging and Delivering Node.js Applications

:::hint{type="warning"}
If you are using Electron/Chromium 110 or a later version, BrightSign no longer supports any BrightScript/JavaScript objects in iframes for security reasons. iframes requests should be sent to [parent](https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Fdeveloper.mozilla.org%2Fen-US%2Fdocs%2FWeb%2FAPI%2FWindow%2Fparent\&data=05%7C02%7Csmulqueen%40brightsign.biz%7Cc0b4df4b1a374212f14308dc95fa4ac2%7C8fbcdf641ab847cebdc743e23b04fb3c%7C0%7C0%7C638550149459230214%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C0%7C%7C%7C\&sdata=%2BBc0ofFac7LaEWddOehvXi7WJyxDFMvLPhPV6YNKl1g%3D\&reserved=0) and then the parent page should call BrightSign/JavaScript objects.
:::

To deploy your Node.js application to a BrightSign player, run "npm install" on your computer. This will create the `node_modules` directory. Copy this directory to the SD card along with the rest of the application.

When initialized, the BrightSign Node.js implementation seeks to the `node_modules`  directory relative to the loaded HTML file. Like a standard Node.js application, it then loads all modules contained in the `node_modules` directory.

Note that you should update your Node modules to versions supported by the [corresponding Node.js version](docId\:jxMrSYlnKOxoBHOfmHTyd) for your OS when you are qualifying your code. For example, if you are using Chromium 120 (BOS 9.1), you should use module versions supported on Node.js v18.18.2. Using older versions of the modules could result in unexpected behavior. As an example, an older version of the `unzipper` module on BOS 9.1 caused unzipped BrightScript files to swap/scramble blocks of code.

:::hint{type="info"}
The majority of Node.js modules contain JavaScript code only. However, some modules contain binary code. When a module containing binary parts is installed using "npm install", the binary parts are compiled for the local platform (usually Intel x64), and this code will not run on a BrightSign player. Currently, the BrightSign Node.js implementation is limited to JavaScript code only.
:::

### WebPack

The *node\_modules* directory associated with a Node.js application may contain hundreds or thousands of unnecessary files. The [webpack](https://webpack.js.org/)® bundler allows you to reduce the *node\_modules* directory to a manageable size.

To use webpack®, you will need to place your Node.js entry-point function in a separate file (e.g. "index.js"), rather than as inline HTML. This file will contain the references to other JavaScript files and Node.js modules:

**Example index.js:**

```text
var myutils = require('./utilities'); // My utilities.js
var moment = require('moment'); // A node module
 
function main() {
 
  myutils.foo();
  moment.now();
  //...
}
```

The JavaScript file containing the Node.js entry point can then be referenced in the HTML file:

**Example HTML:**

```text
<script src='./index.js'></script>
```

To use webpack®, attach `main()` to the window object so that it can be found from the HTML file:

```text
var myutils = require('./utilities'); // My utilities.js
var moment = require('moment'); // A node module
 
function main() {
 
  myutils.foo();
  moment.now();
  //...
}
window.main = main;
```

Change the HTML file so that it points to the bundled JavaScript and to `window.main()`:

```text
<script src='./bundle.js'></script>
 
<body onload="window.main()">
```

To build your bundle, run the following npm steps on your computer:

```text
npm i -D webpack webpack-cli
npx webpack --mode production
```

Now you can publish the index.html and bundle.js files; there's no need to publish the `node_modules` directory. See the sample webpack® configuration below for more information.

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LLOcj1QfrweQkaBLldSXF_webpackconfig.js" label="webpack.config.js" isUploading="false"}

## Device Storage Paths

To load Node.js modules and read/write files, you must first define the root directory of the device storage. The following are common root directories:

- microSD: `"storage/sd/"`
- SSD: `"storage/ssd/"`
- USB: `"storage/usb1/"`

We recommend using the `process.chdir()` call at the beginning of the script to change the process path:

**Example:**

```text
var process = require("process");
process.chdir("/storage/sd");
```

Alternatively, if you have modules located on multiple storage drives, you can append multiple search paths to a module:

**Example:**

```text
module.paths.push("/storage/sd/")
module.paths.push("/storage/ssd/")
module.paths.push("/storage/usb1/")
```

## Debugging Applications

When Node.js modules are enabled, they become visible from the [Chromium remote inspector](docId:4qlK1krr1cnx7xypWXRY5), allowing you to debug applications. The console.log works like a normal web application: Output is redirected to both stderr and the remote inspector.

## Downloading Large Files

If your application uses the XMLHttpRequest object to download a large file (100-200MB, depending on the player model), the player will run out of memory and the download operation will fail. The XMLHttpRequest object first downloads the whole file into memory, then creates a blob object of equal size, so memory requirements for a download are effectively double that of the file size.

To download multi-gigabyte files, see our [large file download](https://github.com/brightsign/dev-cookbook/tree/main/examples/browser/large-file-download) example. The application is defined in `index.html` which uses Node.js streams via [roHtmlWidget](docId\:xljq5_YhDmA2SSmpZimtK)  to download the file and includes an `autorun.brs` which tells the player to run the application. More information is available in the Readme.md file associated with the example.&#x20;

## Node.js Examples

GitHub contains a [Node.js-starter-project](https://github.com/brightsign/node.js-starter-project). This project was originally created for BrightAuthor Classic but can also be used with BrightSign Author.

Another example is the script below, which initializes an HTTP server on the BrightSign player at port 8000. When a client (for example, a desktop browser) connects to the server, it will send the model number and boot version of the player to the client. The script also displays the IP address of the connected client on the screen attached to the player. 

**Example:**

```text
<html>
<script>
function displayMessage()
{
  // Load the http module to create an http server.
  var http = require('http');

  // Configure our HTTP server to respond with Hello World to all requests.
  var server = http.createServer(function (request, response) {
    var device_info = new BSDeviceInfo();
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.end("Device Information:\n" + device_info.model + "\n" + device_info.bootVersion + "\n");
    var ip = request.connection.remoteAddress;
    document.getElementById("Ip").innerHTML+="Server responded to: "+ ip + "<br>";
    console.log("Server responded to request from " + ip);
  });

  // Listen on port 8000, IP defaults to 127.0.0.1
  server.listen(8000);

  // Display it on brightsign browser
  var os = require('os');
  var interfaces = os.networkInterfaces();
  var addresses = [];
  for (var k in interfaces) {
      for (var k2 in interfaces[k]) {
          var address = interfaces[k][k2];
          if (address.family === 'IPv4' && !address.internal) {
              addresses.push(address.address);
          }
      }
  }
  var message = "Server running at: " + addresses[0] + ":8000<br>";
  document.getElementById("Ip").innerHTML+= message;

  // Print message on console
  console.log(message);

}
</script>
<body style="background-color:red" onload="displayMessage()">
  <div id = "Ip" style="font-size:60px; text-align:center;">
  </div>
</body>
</html>
```

Built-in modules, such as "os" and "http", can be initialized using the `require()` method. If the `nodejs_enabled:true` entry is not included when initializing the *roHtmlWidget* object (as shown above), the `require()` method will not be available.

[title] LDWS Display Control Endpoints
[path] Diagnostic Web Server APIs/Untitled/

:::hint{type="info"}
These display-control APIs can only be used on Moka displays that have built-in BrightSign players and are only available in BOS 9.0.189 and above.
:::

## GET /v1/display-control/ 

Returns all control settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /api/v1/display-control/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the display control settings, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "tvInfo": {
        "macAddress": "ff:ff:ff:ff:ff:ff",
        "wifiMacAddress": "ff:ff:ff:ff:ff:ff",
        "serialNo": "1234567890",
        "osVersion": "V8-AM963BS-0020015",
        "hwRevision": 1
      },
      "whiteBalance": {
        "redBalance": 120,
        "greenBalance": 120,
        "blueBalance": 120
      },
      "volume": 50,
      "brightness": 50,
      "contrast": 50,
      "idleStandbyTimeout": 50,
      "powerSetting": "on",
      "videoOutput": "HDMI1",
      "sdConnection": "brightsign",
      "alwaysConnectedEnabled": true
    }
  }
}
```

## GET /v1/display-control/brightness/ 

Returns the brightness settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /api/v1/display-control/brightness/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the brightness setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "brightness": 100
    }
  }
}
```

## PUT /v1/display-control/brightness/  

Changes the brightness setting of a display connected to a BrightSign player.

**Request Example**

```text
PUT /api/v1/display-control/brightness/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 18
```

This is the example request body:

```json
{
  "brightness": 100
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated brightness setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "brightness": 100
    }
  }
}
```

## GET /v1/display-control/contrast/ 

Returns the contrast settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /api/v1/display-control/contrast/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the contrast setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "contrast": 45
    }
  }
}
```

## PUT /v1/display-control/contrast/  

Changes the contrast of a display connected to a BrightSign player.

**Request Example**

```text
PUT /api/v1/display-control/contrast/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 22
```

This is the example request body:

```json
{
  "contrast": 45
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated contrast setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "contrast": 45
    }
  }
}
```

## GET /v1/display-control/always-connected/ 

Returns the connection settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /api/v1/display-control/always-connected/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the connection setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "enabled": true
    }
  }
}
```

## PUT /v1/display-control/always-connected/  

Changes the connection setting of a display connected to a BrightSign player.

**Request Example**

```text
PUT /api/v1/display-control/always-connected/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 23
```

This is the example request body:

```json
{
  "enable": true
}
```

**Response Body**

<font color="#15803D">200</font>: Returns the connection setting for the display as `true`, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "enable": true
    }
  }
}
```

## GET /v1/display-control/always-on/ 

Returns a connection setting (whether or not it is always on) for a player-connected display. See [this page](docId\:H7HTRo-84LYoUgQrax_NV) for an explanation of this setting.

**Request Example**

```text
GET /api/v1/display-control/always-on/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the connection setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "enabled": true
    }
  }
}
```

## PUT /v1/display-control/always-on/  

Enables you to set the display connection so that it is always on. See [this page](docId\:H7HTRo-84LYoUgQrax_NV) for an explanation of this setting.

**Request Example**

```text
PUT /api/v1/display-control/always-on/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 23
```

This is the example request body:

```json
{
  "enable": true
}
```

**Response Body**

<font color="#15803D">200</font>: Returns the connection setting for the display as `true`, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "enable": true
    }
  }
}
```

## PUT /v1/display-control/firmware/  

Changes the firmware setting for a display connected to a BrightSign player.

**Request Example**

```text
PUT /api/v1/display-control/firmware/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 105
```

The example request body can be `filepath` or `url`:

```json
{
  "filepath": "path/to/firmware/relative/to/sd",
}
```

```json
{
  "url": "https://example.com/tv-firmware.zip"
}
```

**Response Body**

<font color="#15803D">202</font>: This updates the firmware and reboots the player, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "reboot": true
    }
  }
}
```

## GET /v1/display-control/info/ 

Returns the settings about the BrightSign player that is connected to a display

**Request Example**

```text
GET /api/v1/display-control/info/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the information about the display that is connected to a BrightSign player, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "macAddress": "ff:ff:ff:ff:ff:ff",
      "serialNo": "1234567890",
      "osVersion": "V8-AM963BS-0020015",
      "hwRevision": 2,
      "wifiMacAddress": "ff:ff:ff:ff:ff:ff"
    }
  }
}
```

## GET /v1/display-control/power-settings/ 

Returns the power settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /api/v1/display-control/power-settings/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the power setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "setting": "on"
    }
  }
}
```

## PUT /v1/display-control/power-settings/  

Changes the power setting for a display connected to a BrightSign player.

**Request Example**

```text
PUT /api/v1/display-control/power-settings/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 38
```

This is the example request body:

```json
{
  "setting": "standby"
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated power setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "setting": "standby"
    }
  }
}
```

## GET /v1/display-control/standby-timeout/ 

Returns the standby/timeout settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /api/v1/display-control/standby-timeout/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the standby/timeout setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "seconds": 60
    }
  }
}
```

## PUT /v1/display-control/standby-timeout/  

Changes the standby/timeout setting of a display connected to a BrightSign player.

**Request Example**

```text
PUT /api/v1/display-control/standby-timeout/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 19
```

This is the example request body:

```json
{
  "seconds": 60
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated standby/timeout setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "seconds": 60
    }
  }
}
```

## GET /v1/display-control/sd-connection/ 

Returns the SD connection settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /api/v1/display-control/sd-connection/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the SD connection setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "connection": "brightsign"
    }
  }
}
```

## PUT /v1/display-control/sd-connection/  

Changes the SD connection setting of a display connected to a BrightSign player. The SD card control is passed either to the display (`display`) or the BrightSign player (`brightsign`)

**Request Example**

```text
PUT /api/v1/display-control/usb-connection/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 19
```

This is the example request body:

```json
{
  "connection": "display"
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated SD connection setting for the display, as shown in the example below.

**Response Example**

```text
{
  "data": {
    "result": {
      "success": true,
      "connection": "display"
    }
  }
}
```

## GET /v1/display-control/video-output/ 

Returns the video output settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /api/v1/display-control/video-output/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the video output setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "output": "HDMI1"
    }
  }
}
```

## PUT /v1/display-control/video-output/  

Changes the video output setting of a display connected to a BrightSign player.

**Request Example**

```text
PUT /api/v1/display-control/video-output/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 18
```

This is the example request body:

```json
{
  "output": "HDMI2"
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated video output connection setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "output": "HDMI2"
    }
  }
}
```

## GET /v1/display-control/volume/ 

Returns the volume settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /api/v1/display-control/volume/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the volume setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "volume": 50
    }
  }
}
```

## PUT /v1/display-control/volume/  

Changes the volume of a display connected to a BrightSign player.

**Request Example**

```text
PUT /api/v1/display-control/volume/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 16
```

This is the example request body:

```json
{
  "volume": 100
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated volume setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "volume": 100
    }
  }
}
```

## GET /v1/display-control/white-balance/ 

Returns the white balance settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /api/v1/display-control/white-balance/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response Body**

<font color="#15803D">200</font>: This returns the white balance setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "redBalance": 120,
      "greenBalance": 120,
      "blueBalance": 120
    }
  }
}
```

## PUT /v1/display-control/white-balance/  

Changes the white-balance of a display connected to a BrightSign player.

**Request Example**

```text
PUT /api/v1/display-control/white-balance/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 48
```

This is the example request body:

```json
{
  "redBalance": 120,
  "greenBalance": 120,
  "blueBalance": 120
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated white balance setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "redBalance": 120,
      "greenBalance": 120,
      "blueBalance": 120
    }
  }
}
```


[title] rDWS Display Control Endpoints
[path] Diagnostic Web Server APIs/Remote DWS APIs/

:::hint{type="info"}
These display-control APIs can only be used on Moka displays that have built-in BrightSign players and are only available in BOS 9.0.189 and above.
:::

Base URL for these endpoints:  ***https\://ws.bsn.cloud/rest/***

*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_*

## GET /v1/display-control/ 

Returns all control settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /rest/v1/display-control/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns the display control settings, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "tvInfo": {
        "macAddress": "ff:ff:ff:ff:ff:ff",
        "wifiMacAddress": "ff:ff:ff:ff:ff:ff",
        "serialNo": "1234567890",
        "osVersion": "V8-AM963BS-0020015",
        "hwRevision": 1
      },
      "whiteBalance": {
        "redBalance": 120,
        "greenBalance": 120,
        "blueBalance": 120
      },
      "volume": 50,
      "brightness": 50,
      "contrast": 50,
      "idleStandbyTimeout": 50,
      "powerSetting": "on",
      "videoOutput": "HDMI1",
      "sdConnection": "brightsign",
      "alwaysConnectedEnabled": true
    }
  }
}
```

## GET /v1/display-control/brightness/ 

Returns the brightness settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /rest/v1/display-control/brightness/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns the brightness setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "brightness": 100
    }
  }
}
```

## PUT /v1/display-control/brightness/  

Changes the brightness setting of a display connected to a BrightSign player.

**Request Example**

```text
PUT /rest/v1/display-control/brightness/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 14
```

This is the example request body:

```json
{
  "data": {
    "brightness": 100
  }
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated brightness setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "brightness": 100
    }
  }
}
```

## GET /v1/display-control/contrast/ 

Returns the contrast settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /rest/v1/display-control/contrast/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns the contrast setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "contrast": 45
    }
  }
}
```

## PUT /v1/display-control/contrast/  

Changes the contrast of a display connected to a BrightSign player.

**Request Example**

```text
PUT /rest/v1/display-control/contrast/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 22
```

This is the example request body:

```json
{
  "data": {
    "contrast": 45
  }
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated contrast setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "contrast": 45
    }
  }
}
```

## GET /v1/display-control/always-connected/ 

Returns the connection settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /rest/v1/display-control/always-connected/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns the connection setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "enabled": true
    }
  }
}
```

## PUT /v1/display-control/always-connected/  

Changes the connection setting of a display connected to a BrightSign player.

**Request Example**

```text
PUT /rest/v1/display-control/always-connected/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 23
```

This is the example request body:

```json
{
  "data": {
    "enable": true
  }
}
```

**Response Body**

<font color="#15803D">200</font>: Returns the connection setting for the display as `true`, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "enable": true
    }
  }
}
```

## GET /v1/display-control/always-on/ 

Returns a connection setting (whether it is always on or not) for a BrightSign-connected display.  See [this page](docId\:H7HTRo-84LYoUgQrax_NV) for an explanation of this setting.

**Request Example**

```text
GET /rest/v1/display-control/always-on/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns the connection setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "enabled": true
    }
  }
}
```

## PUT /v1/display-control/always-on/  

Enables you to set the display connection so that it is always on.  See [this page](docId\:H7HTRo-84LYoUgQrax_NV) for an explanation of this setting.

**Request Example**

```text
PUT /rest/v1/display-control/always-on/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 23
```

This is the example request body:

```json
{
  "data": {
    "enable": true
  }
}
```

**Response Body**

<font color="#15803D">200</font>: Returns the connection setting for the display as `true`, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "enable": true
    }
  }
}
```

## PUT /v1/display-control/firmware/  

Changes the firmware setting for a display connected to a BrightSign player.

**Request Example**

```text
PUT /rest/v1/display-control/firmware/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 105
```

The example request body can be `filepath` or `url`:

```json
{
  "data": {
    "filepath": "path/to/firmware/relative/to/sd"
  }
}
```

```json
{
  "data": {
    "url": "https://example.com/tv-firmware.zip"
  }
}
```

**Response Body**

<font color="#15803D">202</font>: This updates the firmware and reboots the player, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "reboot": true
    }
  }
}
```

## GET /v1/display-control/info/ 

Returns the settings about the BrightSign player that is connected to a display

**Request Example**

```text
GET /rest/v1/display-control/info/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns information about a display that is connected to a BrightSign player, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "macAddress": "ff:ff:ff:ff:ff:ff",
      "serialNo": "1234567890",
      "osVersion": "V8-AM963BS-0020015",
      "hwRevision": 2,
      "wifiMacAddress": "ff:ff:ff:ff:ff:ff"
    }
  }
}
```

## GET /v1/display-control/power-settings/ 

Returns the power settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /rest/v1/display-control/power-settings/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns the power setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "setting": "on"
    }
  }
}
```

## PUT /v1/display-control/power-settings/  

Changes the power setting for a display connected to a BrightSign player.

**Request Example**

```text
PUT /rest/v1/display-control/power-settings/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 38
```

This is the example request body:

```json
{
  "data": {
    "setting": "standby"
  }
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated power setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "setting": "standby"
    }
  }
}
```

## GET /v1/display-control/standby-timeout/ 

Returns the standby/timeout settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /rest/v1/display-control/standby-timeout/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns the standby/timeout setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "seconds": 60
    }
  }
}
```

## PUT /v1/display-control/standby-timeout/  

Changes the standby/timeout setting of a display connected to a BrightSign player.

**Request Example**

```text
PUT /rest/v1/display-control/standby-timeout/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 19
```

This is the example request body:

```json
{
  "data": {
    "seconds": 60
  }
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated standby/timeout setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "seconds": 60
    }
  }
}
```

## GET /v1/display-control/sd-connection/ 

Returns the SD connection settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /rest/v1/display-control/sd-connection/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns the SD connection setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "connection": "brightsign"
    }
  }
}
```

## PUT /v1/display-control/sd-connection/  

Changes the SD connection setting of a display connected to a BrightSign player. The SD card control is passed either to the display (`display`) or the BrightSign player (`brightsign`)

**Request Example**

```text
PUT /rest/v1/display-control/sd-connection/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 19
```

This is the example request body:

```json
{
  "data": {
    "connection": "display"
  }
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated SD connection setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "connection": "display"
    }
  }
}
```

## GET /v1/display-control/video-output/ 

Returns the video output settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /rest/v1/display-control/video-output/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns the video output setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "output": "HDMI1"
    }
  }
}
```

## PUT /v1/display-control/video-output/  

Changes the video output setting of a display connected to a BrightSign player.

**Request Example**

```text
PUT /rest/v1/display-control/video-output/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 18
```

This is the example request body:

```json
{
  "data": {
    "output": "HDMI2"
  }
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated video output connection setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "output": "HDMI2"
    }
  }
}
```

## GET /v1/display-control/volume/ 

Returns the volume settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /rest/v1/display-control/volume/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns the volume setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "volume": 50
    }
  }
}
```

## PUT /v1/display-control/volume/  

Changes the volume of a display connected to a BrightSign player.

**Request Example**

```text
PUT /rest/v1/display-control/volume/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 16
```

This is the example request body:

```json
{
  "data": {
    "volume": 100
  }
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated volume setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "volume": 100
    }
  }
}
```

## GET /v1/display-control/white-balance/ 

Returns the white balance settings for a display that is connected to a BrightSign player.

**Request Example**

```text
GET /rest/v1/display-control/white-balance/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Body**

<font color="#15803D">200</font>: This returns the white balance setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "redBalance": 120,
      "greenBalance": 120,
      "blueBalance": 120
    }
  }
}
```

## PUT /v1/display-control/white-balance/  

Changes the white-balance of a display connected to a BrightSign player.

**Request Example**

```text
PUT /rest/v1/display-control/white-balance/?destinationType=player&destinationName={{playerSerial}} HTTP/1.1
Host: ws.bsn.cloud
Authorization: Bearer {{UserAccessToken}}
Accept: application/json, application/vnd.bsn.error+json
Content-Type: application/json
Content-Length: 58
```

This is the example request body:

```json
{
  "data": {
    "redBalance": 120,
    "greenBalance": 120,
    "blueBalance": 120
  }
}
```

**Response Body**

<font color="#15803D">200</font>: This returns the updated white balance setting for the display, as shown in the example below.

**Response Example**

```json
{
  "data": {
    "result": {
      "success": true,
      "redBalance": 120,
      "greenBalance": 120,
      "blueBalance": 120
    }
  }
}
```


[title] BrightScript Debugger
[path] /

This page serves as a guide for accessing the **BrightScript Debugger** of BrightSign players. The BrightScript Debugger can be accessed via a physical serial connection or over the network via SSH or Telnet. For the physical serial connection, certain cables are recommended as described on [this page](docId\:FXXyu9jmocUtC6XE2p7l2).

## What is the BrightScript Debugger?

:::hint{type="info"}
The BrightScript Debugger is sometimes referred to as the BrightScript Debug Console. However, in an effort to maintain consistency and to avoid potential confusion, the term BrightScript Debugger, or more simply, Debugger, is predominantly used.
:::

The BrightScript Debugger is a CLI which enables interaction with the BrightScript Interpreter. It is denoted by the prompt `BrightScript Debugger>` and is a powerful tool for troubleshooting and debugging issues with BrightScript scripts or interacting with BrightScript objects. It is similar to the JavaScript console in web browsers as well as other popular debuggers (e.g., GDB). Developers can set stop statements (a breakpoint), step through a BrightScript script, and gain access to the current scope or initialized variables.

If the BrightScript Debugger has not been enabled, runtime errors will often cause the player to reboot. When the BrightScript Debugger is enabled, runtime errors will cause the BrightSignOS to stop on the line of the runtime error, allowing a step-through of the script.

:::hint{type="warning"}
Since enabling the BrightScript Debugger will cause the player to hang when runtime errors are encountered, the BrightScript Debugger should only be used in development environments or debugging situations; it should be disabled for production deployments.
:::

## BrightSign Console

The BrightSign Console (or more simply, Console) enables access to the BrightSign Shell, BrightScript Debugger, and logs over the 3.5mm serial port. More information about the BrightSign Console and how to enable it can be found on [this page](docId\:FXXyu9jmocUtC6XE2p7l2).

## Enabling the Debugger

The Debugger is enabled by writing a registry key to the player’s registry. This can be done in several ways as described below.

:::hint{type="info"}
Note: If an autorun.brs is not present on the player's storage device, pressing the SVC button will have no effect. The Debugger's purpose is to help debug your script / app which necessarily must contain the autorun.brs. Thus, if an autorun.brs is not present on the storage device, there is nothing to debug.
:::

### From the BrightSign Shell

Type the following from the [BrightSign Shell](docId\:FXXyu9jmocUtC6XE2p7l2):

```text
script debug on
```

### DWS Registry Tab

From the DWS Registry tab in BrightSign Author, submit the following command:
`registry write brightscript debug 1`

### Inclusion with Autorun

The following lines can be included as part of an autorun.brs file:

```text
reg = CreateObject("roRegistrySection", "brightscript")
reg.write("debug","1")
```

### Accessing the Debugger

When enabled, the Debugger is denoted by the prompt `BrightScript Debugger>` and is accessible through a serial cable, Telnet, or SSH.

Navigate to the Debugger through one of the methods described below.

If you have not enabled the Debugger, any interruption to the BrightScript Interpreter execution will not give access to the Debugger. Instead, the player will reboot to attempt a clean execution.

### During Runtime

Press CTRL-C on your keyboard while the player is powered on.

### Runtime Stop Statement

If the Debugger has been enabled, the player will enter the Debugger if a runtime error occurs or a STOP statement is encountered while a script is running.

### Access at Bootup

1. Power off the player.
2. Power on the player and wait 5-15 seconds.
3. Press and hold the SVC button on the player for 15-30 seconds until the `BrightSign>` prompt appears in the serial/Telnet/SSH terminal app. The `BrightSign>` prompt indicates that you are in the BrightSign Shell. You can now release the SVC button.

If you are using Telnet or SSH, you will need to restart the Telnet or SSH instance.

### Additional Methods

- Press CTRL-C in your terminal app that is connected to the player.
- Remove the microSD card and press either the SVC button on the player or CTRL-C on your computer.
- If the serial console has been enabled (either temporarily or persistently), `Starting BrightSign Application...` will appear after the player reboots (note that this can take up to 30 seconds). Press and hold the SVC button until the `BrightSign>` prompt displays.
- If you have removable storage such as a microSD card, eject it. Reboot the player and press the SVC button. If you are accessing the player through Telnet, you will have to restart the Telnet connection after the player reboots using the telnet \{\{your player IP address}} 23 command.
- Place an autorun.brs file containing only the word “end” (without the quotes) on the storage device. The script will execute and when it ends as instructed you’ll be left at the `BrightSign>` prompt.

This will break out of the application running at the moment and redirect to the BrightSign prompt.

## Debugger Commands

The following Shell commands are currently available in the Debugger:

| Command                       | Description                                                |
| ----------------------------- | ---------------------------------------------------------- |
| `bt`                          | Print a backtrace of call-function context frames.         |
| `classes`                     | List all public classes.                                   |
| `cont` or `c`                 | Continue script execution.                                 |
| `counts`                      | List count of BrightScript Component instances.            |
| `da`                          | Show disassembly and bytecode for this function.           |
| `down` or `d`                 | Move one position down the function context chain.         |
| `exit`                        | Exit the debug shell.                                      |
| `gc`                          | Run the garbage collector and show collection statistics.  |
| `hash`                        | Print the internal hash-table histograms.                  |
| `last`                        | Show the last line that executed.                          |
| `methods <class>`             | List methods provided by specified class.                  |
| `methods <class>.<interface>` | List methods provided by the specified interface or class. |
| `list`                        | List the current source of the current function.           |
| `ld`                          | Show line data (source records)                            |
| `next`                        | Show the next line to execute.                             |
| `bsc`                         | List all allocated BrightScript Component instances.       |
| `stats`                       | Show statistics.                                           |
| `step` or `s`                 | Step one program statement.                                |
| `t`                           | Step one statement and show each executed opcode.          |
| `up` or `u`                   | Move one function up the context chain.                    |
| `var`                         | Display local variables and their types/values.            |
| `print` or `p` or `?`         | Print variable value or expression.\*                      |

\*BrightScript `print` messages are routed to the BrightSignOS which is accessible via the primary serial port or Telnet/SSH.

## Switch Between the Shell and the Debugger

From the `BrightSign>` prompt, type `script` to navigate to the Debugger:

```text
script
```

From the `BrightScript Debugger>` prompt, type `exit` to navigate to the BrightSign Shell:

```text
exit
```

## Telnet and SSH

The Debugger can be accessed with Telnet or SSH. More info can be found on [this page](docId\:FXXyu9jmocUtC6XE2p7l2).

## Debugging BrightScript Code

This section will cover how to debug BrightScript code on a BrightSign player assuming the Debugger has been enabled and is accessible.

See [BrightScript](docId\:R7Xc0_ZE4u0BR662lI2Sj) for information regarding BrightSign’s documentation for BrightScript. Our interpreter forked from Roku’s BrightScript language many years ago and have since diverged.

### How to Debug BrightScript

To begin stepping through or debugging BrightScript code, add a `stop` statement to the line of code you want to start debugging from.

A `stop` statement is a breakpoint in the BrightScript code. When the BrightSign player encounters a `stop` statement, it will break and enter the BrightScript Debugger when the debugger is enabled.

The BrightScript Debugger is similar to many other debuggers, e.g., gdb. It allows you to step through the code, inspect variables, and evaluate expressions.

Type `help` in the Debugger to see a list of available commands. Type `vars` to see the variables and their values.

### Debugging JavaScript or Node.js

To enable the Chrome Devtools and add BrightSign’s remote inspector, see [Debugging Webpages](docId:4qlK1krr1cnx7xypWXRY5).

Go to `chrome://inspect` adding the IP Address of your player on the same network as your computer.

## Troubleshooting

If you’re encountering difficulties connecting your terminal application to the BrightSign player, see the troubleshooting steps outlined on [this page](docId\:FXXyu9jmocUtC6XE2p7l2).

[title] LDWS Storage Endpoints
[path] Diagnostic Web Server APIs/Untitled/

## GET /v1/files/\:path/ 

Lists directories and files in the requested path.

**Segment**

- `:path` <font color="#704ae0">string</font>: The path to the directories or files

**Query String Parameter**

- `raw` <font color="#01a0af">optional</font>: If the path is for a storage device, this will return its raw contents. For example, the request below would be `GET /api/v1/files/sd/?raw`
- `contents` <font color="#01a0af">optional</font>: If a file is specified, this will return the contents of that file

**Request Example**

The example request parameters and headers are set as follows:

- `:path` is set to `/sd/autorun.brs/`

```text
GET /api/v1/files/sd/autorun.brs/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

:::hint{type="success"}
**Downloading a File From Player Storage&#xFEFF;**

To directly download a file from player storage, add `?contents&stream` to the end of the URL. Here is a sample workflow (assuming a base URL of *http\://192.168.0.00/api/v1*):

1. Create a snapshot on the SD card under the remote\_snapshots using POST /v1/snapshot
2. The response will be the name of the snapshot (for example, *img-2021-12-29-10-49-27.jpg*).
3. To directly download the snapshot created on the player: GET *http\://192.168.0.12/api/v1/files/sd/remote\_snapshots/img-2021-12-29-10-49-27.jpg?contents\&stream*
4. If you enter only `?contents`, you get the file in the base64 encoding.
:::

**Response Body**

This method returns the metadata for a directory or file (assuming the `raw` query string parameter is not set):

- `name` <font color="#704ae0">string</font>: Name of the directory or file
- `type` <font color="#704ae0">string</font>: Either a directory or file
- `path` <font color="#704ae0">string</font>: The path, for example, "sd"
- `mime` <font color="#704ae0">string</font>: mime type (available only for type "file")
- `stat` <font color="#704ae0">object</font>: Directory stats from the "fs" module
- `fileSize` <font color="#704ae0">int</font>: The size of the filesystem
- `streamable` <font color="#704ae0">bool</font>: This is always `true` for files. If the path is a directory, this is not returned
- `contents` <font color="#704ae0">string</font>: The contents of the specified file

**Response Example**

```json
{
    "data": {
        "result": {
            "name": "sd/autorun.brs",
            "type": "file",
            "path": "sd/autorun.brs",
            "mime": "application/octet-stream",
            "stat": {
                "dev": 45921,
                "mode": 33277,
                "nlink": 1,
                "uid": 0,
                "gid": 1003,
                "rdev": 0,
                "blksize": 32768,
                "ino": 40,
                "size": 1144340,
                "blocks": 2240,
                "atimeMs": 1699401600000,
                "mtimeMs": 1699423824000,
                "ctimeMs": 1699423824440,
                "birthtimeMs": 0,
                "atime": "2023-11-08T00:00:00.000Z",
                "mtime": "2023-11-08T06:10:24.000Z",
                "ctime": "2023-11-08T06:10:24.440Z",
                "birthtime": "1970-01-01T00:00:00.000Z"
            },
            "fileSize": 1144340,
            "streamable": true
        }
    }
}
```

**Response Example when Returning File Contents**

Note that once you have the data string, you will have to decode it (for example, with the `atob` method in JavaScript).

```json
{
  "data": {
    "result": {
        "mimeType": null,
        "name": "autorun.brs",
        "contents": "TGlicmFyeSAiYXV0b3B....<very-large-data-string>..."
    }
}
```

##

## POST /v1/files/\:path/ 

Renames a file in the path (which should include the file name).

**Segment**

- `:path` <font color="#704ae0">string</font>: The path to a file

**Request Body**

- `name` <font color="#704ae0">string</font>: The new file name

**Request Example**

The example request parameters and headers are set as follows:

- `:path` is set to `/sd/test.txt/`

```text
POST /api/v1/files/sd/test.txt/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
Content-Type: application/json
Content-Length: 21
```

This is the example request body:

```json
"name": "newname.txt"
```

**Response**

The player will return a <font color="#15803D">200</font> success or <font color="#B91C1C">404</font> or <font color="#B91C1C">500</font> error message.

**Success Response Body**

```json
{
  "data": {
    "result": {
      "success": true
    }
  }
}
```

## PUT /v1/files/\:path/ 

Uploads files or creates directories. The request body needs to be of type `multipart` /`form-data` (see [RFC 7578](https://datatracker.ietf.org/doc/html/rfc7578)). If you add one or more parameters of type `file` (the name of the parameter does not matter), it will upload the selected file(s). 

To create a directory, remove the `form-data` from the body, and add the directory as the URL parameter, `:path`. See the example below.

**Segment**

- `:path` <font color="#704ae0">string</font>: The path is the folder in which you want to upload the file.

**Request Body**

The files as form data, as shown in the example below.

**Request Example (File)**

The example request parameters and headers are set as follows:

- `path` is set to `sd`

```text
PUT /api/v1/files/sd/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Content-Length: 227
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="/path/to/file/test.txt"
Content-Type: text/plain

(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--
```

**Response Body**

- `success` <font color="#704ae0">bool</font>: A flag that indicates if the operation succeeded or not
- `results` <font color="#704ae0">string[]</font>: The names of the files that were successfully created

**Response Example (Plain Text File)**

```json
{
    "data": {
        "result": {
            "success": true,
            "results": [
                "test.txt"
            ]
        }
    }
}
```

**Request Example (Folder)**

```text
PUT /api/v1/files/sd/testfolder/
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json, application/vnd.bsn.error+json
```

**Response Example (Folder)**

```json
{
    "data": {
        "result": {
            "success": true
        }
    }
}
```

## DELETE /v1/files/\:path/ 

Removes a file or directory

**Segment**

- `:path` <font color="#704ae0">string</font>: The path to the file or directory

**Request Example**

The example request parameters and headers are set as follows:

- `:path` is set to `sd/test.txt`

```text
DELETE /api/v1/files/sd/test.txt/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

**Response**

The player will return a <font color="#15803D">200</font> success or <font color="#B91C1C">404</font> or <font color="#B91C1C">500</font> error message.

**Success Response Body**

```json
{
  "data": {
    "result": {
      "success": true
    }
  }
}
```

## PUT /v1/storage/encryption/ 

Encrypts the selected media storage. Note that reformatting the storage device will erase its contents. This endpoint is available in BOS version 9.0.197 and later.

**Request Body**

- `filePath` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The path to the media storage (for example, “/sd”)
- `settings` <font color="#704ae0">object</font>:
  - `type` <font color="#704ae0">string</font> <font color="#01a0af">required</font>: The encryption method. The options are: `‘brightsign-key'`, `'unique-key'`, `'password'`, and `'none'`. The options map to [devicecustomization StorageEncryptionOptions](docId\:WRjDIgxWn_0yNjrUjRm3d) (`'brightsign-key'` is `"brightsign_key"`, `'unique-key'` is `"generate_key"`, `'password'` is `"passphrase"`. `'none'` is `"none"`).
  - `password` <font color="#704ae0">string</font> <font color="#01a0af">optional</font>: The password used to encrypt media storage, if any. This field is required if `settings.type` is `“password“`.
  - `format` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Whether or not the storage device should be reformatted. By default, the storage will be reformatted.
  - `doProvision` <font color="#704ae0">bool</font> <font color="#01a0af">optional</font>: Whether the player should be automatically provisioned with BSN.Cloud. By default, the player will not be automatically provisioned.

**Request Example&#x20;**

The example request parameters and headers are set as follows:

```none
PUT /api/v1/storage/encryption/ HTTP/1.1
Host: {{playerIP}}
Authorization: {{DigestAuth}}
Accept: application/json
```

This is the example request body:

```json
{
  "filePath": "/sd",
  "settings": {
    "type": "password",
    "password": "abc",
    "format": true,
    "doProvision": true
  }
}
```

**Success** **Response Body and Example**

- `success` <font color="#704ae0">bool</font>: Indicates if the encryption succeeded or not
- `reboot` <font color="#704ae0">bool</font>: Whether or not the player will reboot

```json
{
    "data": {
        "result": {
            "success": true,
            "reboot": false
        }
    }
}
```

**Error Response Body and Example**

- `error` <font color="#704ae0">string</font>: Any error messages associated with the operation&#x20;

```json
{
    "data": {
        "error": {
            "status": 400,
            "message": "Storage is already encrypted. Please decrypt it first."
        }
    }
}
```


[title] HTML Content Restrictions
[path] HTML Development/HTML Best Practices/

These content restrictions are associated with HTML pages:

## Web Browsing

BrightSign players are *not* intended for use as general-purpose web browsers. It is best to think of BrightSign units as HTML players with interactive capabilities, not web-surfing tools: Each page should be thoroughly tested before being used as digital signage.

## Flash Content

BrightSign players do not support Flash content. Any HTML pages that have embedded flash content will not display correctly. Most Flash authoring applications, including the Adobe Creative Suite, have tools that allow you to export flash content as HTML.

## Video

See the [HTML Video](docId\:e6uJleH69Q0JmMv8kyTrp) page for usage rules regarding HTML video.

## 4K Graphics&#x20;

Many BrightSign models, such as the XD6, XS6, XT5, XT6 and XC5, can support a native 4K (3840x2160) HTML graphics plane. However the LS5, HD5, and XD5 models cannot render HTML at 4K. More details about player graphics limitations at this resolution are described below:

### XTx44, XTx43

The XTx44 and XTx43 models support a native 4K HTML graphics plane (see [this page](docId\:TJNw230KCx6i9tNihfCvD) for more details). Note the following performance restrictions when using native 4K HTML graphics:

- Animations will not exceed 20 FPS (and intensive animations may exhibit very low framerates).
- Non-HWZ video is likewise limited to 20 FPS, so [HWZ](docId\:e6uJleH69Q0JmMv8kyTrp) should be enabled for video elements in native 4K.
- We recommend displaying only one or two 4K images at a time (for example, a slideshow with one image displayed and next image preloaded). Images should not exceed 3840x2160 in size. 
- We recommend using [swap memory](docId\:M2dQxiY5mGorAOSA8MVNi) if possible. 
- Pages that use many layers may run out of memory in native 4K. Enabling the [gfxmemlarge](docId\:QQ734nQz0hCwNI0uNSdMP) setting may help mitigate this issue.

### XDx34, XDx33, HDx24, HDx23, LS424, LS423, 4Kx42

The Series 3 and 4 XD, HD, LS, and 4K models support graphics up to 1920x1200 (see [this page](docId\:TJNw230KCx6i9tNihfCvD) for more details), which can then be upscaled to a 4K video mode. Pages must be specified as 1920x1080 (or 2048x1080 for DCI 4K); they can then be upscaled to 4K.

## Pixel Sizes and Coordinates with 4K Modes

As noted above, webpages are often upscaled when outputting a 4K video mode. Relative CSS property values will scale automatically, but pixel values may need to be modified to account for differences between 4K video and graphics. See [this page](docId:3E73tPEmL1-OEbs2GoAUQ) for more information about using coordinates with upscaled video modes.

## Image Sizes

Images larger than 2048x1280x32bpp (or 3840x2160x32bpp for XT, 4K, XTx34, and XDx33 players) will not be displayed by default. If a 4K video mode is used, the player will upscale images from HD resolution accordingly (though native 4K graphics can be enabled on the XTx43). The default limit can be increased in BrightScript using the [roVideoMode.SetImageSizeThreshold()](docId\:QQ734nQz0hCwNI0uNSdMP) method.

Without altering the default maximum resolution, you can increase the maximum width of images by sacrificing height (e.g. using a 3840x640x32bpp image on non-4K players is allowed). You can also increase the maximum width/height by reducing the bpp value (e.g. using a 3840x2160x16bpp on non-4K players is allowed).

:::hint{type="info"}
For performance reasons, we recommend against downscaling images. This consumes considerably more resources than either displaying images at their native size or upscaling them.
:::

## Memory and Performance

The amount of memory available for HTML applications varies by model and player series:

**Series 5 Players**

Unlike Series 4 and older players, Series 5 players don’t have pre-allocated graphics and system memory. There are limitations on GPU memory in Chromium so that demanding GPU applications don’t deplete that memory.

**Series 4 and Older Players**

- **XTx43, XTx44**: 512MB for graphics; 512MB for JavaScript
- **XDx33, XDx34**: 256MB for graphics; 512MB for JavaScript
- **HDx24**: 460MB for graphics; JavaScript TBD
- **LS4x5**: 280MB for graphics; JavaScript TBD
- **HDx23/LS423/HO523**: 256MB for graphics; 128MB for JavaScript

**Notes**

- The memory available for graphics can be reduced by a number of factors, including the number of CSS layers, the complexity of animations, and the use of WebGL.
- The JavaScript memory is subject to a hard limit: If there is no JavaScript memory after garbage collection, Chromium will terminate the active process.
- Each HTML widget has its own JavaScript heap, so it's possible to overcommit JavaScript memory if multiple HTML widgets are active.

:::hint{type="success"}
Often, the best way to improve graphics performance is to ensure that images are scaled to the desired output resolution before they are rendered in HTML.
:::

:::hint{type="info"}
Use the [Chromium Web Inspector](docId:4qlK1krr1cnx7xypWXRY5) to determine the amount of resources being used by a webpage.
:::

## Web Fonts

If a font file is not included and referenced by the HTML page, text will be rendered using a default system font. While functional, the default font has little aesthetic appeal, so we recommend including font files for most digital-signage applications. Supported font types include TrueType Font files (*.ttf*), OpenType Font (*.otf*), and Web Open Font files (*.woff*).

### System Fonts

:::hint{type="info"}
If you are using BOS 9.1, you can use the `window.queryLocalFonts()` method to query the available fonts from the browser. See [this page](https://developer.mozilla.org/en-US/docs/Web/API/Window/queryLocalFonts) for more information.
:::

The following system fonts are supported on Series 5 players:

DejaVuSans-BoldOblique.ttf
DejaVuSans-Bold.ttf
DejaVuSansCondensed-BoldOblique.ttf
DejaVuSansCondensed-Bold.ttf
DejaVuSansCondensed-Oblique.ttf
DejaVuSansCondensed.ttf
DejaVuSans-ExtraLight.ttf
DejaVuSansMono-BoldOblique.ttf
DejaVuSansMono-Bold.ttf
DejaVuSansMono-Oblique.ttf
DejaVuSansMono.ttf
DejaVuSans-Oblique.ttf
DejaVuSans.ttf
DejaVuSerif-BoldItalic.ttf
DejaVuSerif-Bold.ttf
DejaVuSerifCondensed-BoldItalic.ttf
DejaVuSerifCondensed-Bold.ttf
DejaVuSerifCondensed-Italic.ttf
DejaVuSerifCondensed.ttf
DejaVuSerif-Italic.ttf
DejaVuSerif.ttf
FairfaxHD.ttf
unifont.ttf

[space] Fix (/fix)

[title] BrightSign Built-in
[path] /

BrightSign Built-in (BSBI) players are embedded boards, based on our HS and XS product lines, which convert a TV into a BrightSign display. BrightSign can troubleshoot software-related issues that your player is having, while the product vendor must be contacted for  hardware issues.&#x20;

# When to Contact BrightSign

If you can see a BrightSign logo or anything that you published on the display, then the problem is likely to be a software issue. BrightSign support can help you with an authoring or content issue, unless you are using a partner CMS in which case you should talk to the CMS partner.

Contact BrightSign support when the issue involves:

- Player software and content authoring (unless using a partner CMS).
- Player firmware issues (for example, player reboots).

# When to Contact the Vendor

Contact the vendor when the issue involves:

- Any display hardware problem (for example, no power, no display, screen lines).
- Physical repair of the integrated BrightSign player.

## Vendor Contact Information

### MOKA

- Contact [TCL support](https://support.tcl.com/) for hardware issues.
- See also [this page](docId\:H7HTRo-84LYoUgQrax_NV) on how to update the Moka firmware

### LGUV5N

- Contact [LG support](https://www.lg.com/us/support/contact) for hardware issues.
- See also [these LGUV5N FAQs](docId\:FlxzCFgWr98P1UrALtpCE)&#x20;

### Bluefin&#x20;

- Contact [Bluefin support](https://www.thebluefin.com/support) for hardware issues.

### Mimo

- Contact [Mimo support](https://www.mimomonitors.com/pages/customer-support?srsltid=AfmBOopd47b_dXMc3jYDVFRFW275sQsj3RhB1QYs45bFzhdmdq1EN6aI) for hardware issues.

### Praevar

- Contact [Praevar](https://www.praevar.com/) for hardware issue support

### XPO&#x20;

- Contact [XPO Screens](https://www.xposcreens.com/contact/support/) support for hardware issues
  -

[title] Accessories
[path] /

# USB touchscreen isn't working

BrightSign players currently support touch screens via the USB port only. First, check [this page](docId\:ACL5V8_jQiuq3SntxSNfO) to see if there are any known compatibility issues with your touchscreen model. 

**HID Drivers**

If you are not sure whether your touchscreen model is supported, check if it supports standard HID drivers: This means that the touchscreen will work with any device that has HID drivers installed, no matter the operating system of the device (Linux, Windows, OSX, etc.). HID drivers do not require any drivers from the manufacturer. Some manufacturers claim to support HID, but still use custom drivers that are not compatible with BrightSign players.

**Calibration**

If the touchscreen is not responding, or if the coordinates don't align properly with the contact screen area, you may need to run the calibration script attached below. The Calibration *.zip* file contains a Readme file describing how to use the calibration script.

**Further Steps**

If you are still having problems after calibrating the player, try these solutions:

1. Test your touch project using a USB mouse, which uses the same coordinate system as touchscreens. If the project doesn't work with a mouse, there is a problem with the playlist or script you're using to accept touch input.
2. If your project works properly with a mouse, we recommend using the Touch Capture script, which is included with the Calibration *.zip* file. Instructions for using the Touch Capture script are included in the Readme file. Once you have retrieved the logs generated by both the Calibration and Touch Capture scripts, contact [support@brightsign.biz](mailto\:support@brightsign.biz) and attach the logs to your support ticket.

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/ddsRNwk3YVPr4cUR1kLkU_touchscreen-calibration.zip" label="Touchscreen_Calibration.zip" isUploading="false"}

# USB keyboard/mouse isn't responding

BrightSign players work with many USB keyboard brands. If yours is not responding, test it by creating an interactive project that accepts keyboard input, then:

- Disconnect the keyboard/mouse from the player and reconnect it.
- Connect your keyboard/mouse to the player using a USB hub.
- Try a different USB keyboard/mouse.
- If you’re using a wireless mouse, reconnect the wireless transmitter and replace the batteries in the mouse.

[title] Players
[path] /

# Which publishing method are my players using?

See [Inherited Players](docId:4mArAZ9mF3ZEVhK-4eJPx) to find out which publishing method was used to set up your players.

# Multiple media files don't playback

If you are trying to play multiple audio and/or video files simultaneously, playback might fail if the files use differing audio sampling rates. Ensure that all audio and video files use the same audio sampling rate (for example, 44.1KHz or 48KHz).

Some player models allow **Mixed Audio PCM** or **Mixed Audio PCM / Compressed** audio settings, which allow you to mix different audio sampling rates. See [this page](docId\:a6Ali6u-szxHuansk6T3-) for more info.&#x20;

# "Please Insert Card" message

If you get this message when you boot the player:

1. Check that the card is inserted properly into the microSD card slot (you should hear a click).
2. If this is a new card, ensure that it is formatted as exFAT or FAT32.
3. Try a different brand and/or size card. We recommend using [BrightSign approved cards](https://www.brightsign.biz/digital-signage-products/accessories/sd-cards/).
4. If you are using the Standalone publishing method, verify that you published the presentation files (*autorun.brs*, *current-sync.xml*, etc.) to the root of the microSD card ("SD:\\").
5. SDXC cards do not work on HD110, HD210, HD410, HD810 or HD1010 players.
6. SDHC cards do not work on HD2000 players.

# VGA Output is discolored

A loose or damaged VGA cable or an incorrect resolution setting in the presentation can cause this. To troubleshoot:

1. Check that the VGA cable is securely fastened to the connector on the player and the display.
2. Verify that the **Screen resolution** of the presentation is set to a VGA resolution. You can set the **Screen resolution** in BrightSign Author in **Presentation > Layout Settings** and in BrightAuthor Classic in **File > Presentation Properties > Main**.
3. Test with a different VGA cable.
4. Test with a different display.
5. Test with a different player (if available).

# Player clock doesn't work

Networked BrightSign players synchronize their internal clocks with the BrightSign time server (*http\://time.bsn.cloud*) or can be configured to retrieve the time from an HTTP server during setup. If a home or small office router is being used as a switch and DHCP server and does not provide internet connectivity, it cannot determine the time and may provide an error page in response to the HTTP request. A player attempting to retrieve the time from this server will instead get an incorrect time from the redirect page. This can cause problems with schedules, events, and clock/date displays. Severe problems can occur if the router causes time to move backward on the internal player clock.

This issue may also occur with some router models when they lose internet connectivity, even if they are not being used as a network switch. If you cannot change the switch/DHCP configuration of the local network, disable the time server requests.

To do this in BrightSign Author:

1. Go to the **Admin** tab
2. Edit the existing Setup File in **Setup Library** (or create a new Setup File if you prefer)
3. Under **Network Configuration**, select **Include network configuration** and **Network Options.**
4. In the **Player** tab, remove the URL entered in the **Time server** field so that it is blank.
5. Select **Done** and **Save Setup.** Apply this Setup File to the player.

To do this in :

1. Go to **Tools > Setup BrightSign Unit**.
2. Locate the **Time server** field under **Network Properties**.
3. Remove the URL entered in the **Time server** field so that it is blank.
4. Specify other player settings in the **BrightSign Unit Setup** window as desired.
5. Click **Create Setup Files** to publish the files. Apply this Setup File to the player.

# Player can't get time from NTP

If your player is having trouble retrieving the time from a Network Time Protocol (NTP) server, it is likely that the firewall on the local network is blocking UDP communications. The Network Time Protocol uses UDP to communicate with time servers, and BrightSign players cannot route these requests through a proxy server like they can with HTTP/HTTPS communications. 

There are a few ways to fix this problem:

- Configure the firewall on the local network to allow NTP requests to pass through. The player will send NTP requests whether or not it is configured to use an HTTP/HTTPS proxy.
- Configure the player to use the HTTP Time Protocol (HTP), which can work through most proxies.
- Run an NTP server instance on the local network. Make sure the player is configured to use this NTP server in [BrightSign Author](docId\:gfqm5HVphjQijhZxb2NGy) or [BrightAuthor Classic](docId:1JY7zYsse5mKcZ5ZNs1Cu).

See [this page](docId\:bQlpaTl8jE-eewnT4JyRk) for more information about time servers on BrightSign players.

# Can the player connect to a wireless network?

You can connect to a wireless network using a WS105, WS104, or WS103 [wireless module](https://www.brightsign.biz/brightsign-players/accessories/).

BrightSign players support most commonly used wireless encryption formats: WEP (64 & 128), WPA (TKIP), and WPA2 (AES). WPA Enterprise is supported using EAP-TLS (with DER, PEM, or PKCS#12 certificates) and PEAPv0/MSCHAPv2 (with a username and passphrase). Wired authentication via 802.1x is also supported. 

See our [documentation](docId\:Ndebm_G_P6IEI3OkpSSmc) for WS105, WS104, and WS103 specs and installation instructions.

The wireless settings of a player are configured in [Network Options](docId\:gfqm5HVphjQijhZxb2NGy) in BrightSign Author or in [Unit Setup](docId\:pONeDyEXzfyG0oArUILLz) in  / .

Also, any networked model that doesn't have a wireless module can use a wireless bridge (game adapter) connected to the ethernet port. 

# Do I need to change my firewall?

Networked BrightSign players need to access certain ports and URLs. BrightSign Author desktop client access requirements are described [here](docId:6MBtfGmpjWoCqOmVC0oE5), and   /  requirements are documented [here](docId\:okiHHduWqhkKiKIVN5vs7).

# The audio quality is poor

Poor audio quality is normally caused by a problem with the file or bad encoding.

1. Try re-encoding the audio or video, or using a different application to encode the video.
2. If you're using high bitrate video (20Mbps or more), it's possible the flash card isn't fast enough to keep up. Try encoding at a lower bitrate.
3. If you are using MPEG-2 files, open your video using the Mpeg2VCR utility, and save it. Some videos have an uneven distribution of audio and video packets in the MPEG stream. This can cause audio drop outs, hiccups, or distortion. You can download a 30-day trial of [Mpeg2VCR](https://mpeg-vcr.en.softonic.com/) from Womble.

# Power light is on but there is no display

This problem is normally caused by an incompatible video signal or a problem with the content. To debug this:

Check whether the issue is with the resolution of the presentation:

1. If you are connected using VGA, verify that the presentation is not using an HDMI-only resolution like 1920x1080.
2. If you are using HDMI/Component for output, please verify that your display is set to the correct input.
3. If the presentation is currently set for 1080p output, try different 1920x1080 settings (e.g. 1080p30), as well as 720p. 
4. If your presentation is set to 1080 at 29.97p, this mode might not be supported by your display even if it supports 1080p.
5. If you are using the VGA, try using 1024x768 first, then try other VGA resolutions.

If you still can't get the presentation to display, test whether the issue is with the video/image files in the presentation:

1. Transfer other content files that work with your player to the root folder of the microSD card (without any other presentation or content files).
2. Insert the card into the player.
3. Reboot the player.

If any red/yellow LEDs are blinking, see [this page](docId\:MWojjf3NAA1ZMiqEL8mwX) to diagnose the problem.

# 1280x800x60p video is dropping frames

According to the VESA DMT standard, the 1280x800x60p video mode should be output to monitors using a vertical frequency of 59.810Hz, which is significantly slower than the 60Hz at which your video is encoded. This difference in speeds causes the video output to run slower than the video decode at the rate of 1 frame every 5 seconds, resulting in the dropped frames seen on screen.

This discrepancy can affect other VESA modes to a lesser extent. The following modes may exhibit a dropped frame once every 8-10 seconds: 1400x1050x75p, 1440x900x60p, 1680x1050x60p, 1920x1200x60p.

Because the frequency discrepancy is part of the standard, this issue cannot be fixed. If you wish to avoid dropped frames with your video, we recommend doing one of the following:

- Downscale the video to a TV mode at 60p (e.g. set the video output to 1280x720x60p).
- Upscale the video to a TV mode at 60p (e.g. set the video output to 1920x1080x60p).
- Re-encode the video so that it uses the exact refresh rate of the VESA mode (for example, 59.810Hz for 1280x800x60p). This is the only way to fix the dropped frames problem without changing the resolution. Note that this will cause video playback to be slightly slower, so any accompanying audio will need to be matched to the new refresh rate as well.

# Red error LED flashed 10 times

LED error codes are described in each player’s Theory of Operations page (for example, [XT5 Theory of Operation](docId\:C0P32JRlwg1F2eMJIMNjf)).  A red LED flashing 10 times indicates that a runtime error has occurred in the *autorun.brs* script.

Script errors can be caused by a problem with the content or a bug in the autorun script. To troubleshoot the problem:

1. Confirm that the Read-Only tab on the microSD card is not in the locked position.
2. If the player is running an older version of BrightSignOS, download and install the current version from the [Downloads](http://www.brightsign.biz/downloads/overview/) page. You can determine the current version of BrightSignOS by powering up the player without a storage device. The OS version will be displayed on the screen.
3. If you are using BrightSign Author or  to publish presentations, download and install the current version from the [Downloads](http://www.brightsign.biz/downloads/overview/) page.
4. Verify that the microSD card is formatted correctly. See [this page](docId\:mGdEFc6YvkIbeiUxH9J1O) for more details.
5. If you are using the older *autoplay.bsp* or *autoplay.csv* format, an old autorun file or errors in the playlists can cause this error. 

# Red error LED flashed three times

This indicates one of two common errors, depending on whether the player is set up for  or not:

**BrightSign Network (BSN)**

The player is trying to enter recovery mode. When you use a player with a BSN account, recovery information is stored in the registry to allow the player to fix itself in case of file system errors. The player will enter recovery mode if any of the following occurs:

- The storage device (e.g., microSD card) becomes corrupted.
- The player is booted up with no storage device (e.g., microSD card).
- The storage device has content, but no presentation script (i.e., *autorun.brs*).

If you wish to continue using BSN with the player, the player must contain a microSD card or other storage device and have a valid Internet connection. It will then automatically recover and download the presentation for its assigned group the next time it boots up.

If you do not want the player to enter recovery mode anymore, you will need to permanently remove the recovery settings from the player (including all BSN settings). To do this, either:

- Download the *registry-clean.zip* file below. Copy the *autroun.brs* file from the *.zip* folder onto the root folder of the SD card, insert the microSD card into the player, and power it up.
- Perform the Device Setup process again using . Set up the player for Standalone, Local File Network, or Simple File Network publishing.  

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/aWSa9L6vZ6OwsJagmeuQB_registry-clean.zip" label="registry-clean.zip" isUploading="false"}

**Other Configurations**

The player is indicating that there is no presentation script (i.e., *autorun.brs* file) on the microSD card or other attached storage device. You will see this error code if you power up the player without a storage device, or if the storage device does not contain an *autorun.brs* file or content files in its *root folder*.

To fix this issue, publish a presentation from  to the *root folder* of the storage device, insert it into the player, and reboot the player. Alternatively, you can include a set of content files in the *root folder* of the storage device--the player will display them as a simple looping playlist.

:::hint{type="info"}
Information about interpreting error LEDs on players is available in [here](docId\:MWojjf3NAA1ZMiqEL8mwX).
:::

# Ethernet link isn’t stable when using XD5/XD6 & Cisco Catalyst Switch

If your XD5/XD6 player is connected to power with the power adapter and plugged into ethernet in a PoE-enabled port, and either doesn’t link to the network or links briefly and then drops off, this may be an issue with the Cisco Catalyst Switch.

First, ensure that your player can get/maintain the link by plugging the player directly into the ethernet port on laptop or plugging ethernet from the player into a dumb switch or hub, and plugging that into the PoE switch. If your player can link to the network this way, try the following fixes:

1. Disable PoE on the port the player was using
2. Plug the player into a non-PoE switch
3. Remove the player’s dedicated power, and use PoE for power

# EAP-TLS is Failing on BOS 9.1 Players

Players running BOS 9.1 may fail 802.1X EAP-TLS authentication while other players on the same network using the same certificate configuration continue to work. This commonly affects deployments where a player has been upgraded from BOS 9.0 to 9.1, or where a new Series 6 player (Series 6 runs BOS 9.1 and later) has been added alongside older players.

BOS 9.1 replaced GnuTLS with OpenSSL, which enforces stricter certificate validation. Configurations that GnuTLS silently accepted, like an incorrect file in the CA Certificate field, will be rejected by OpenSSL. In this particular example, the field must contain only the root CA and optionally intermediate CA certificate(s) that signed the RADIUS server certificate, not the player's client certificate. A Windows certificate store export bundles all of these into a single PEM file, and it is easy to use the wrong one. OpenSSL will reject the handshake if the certificate chain contains a self-signed certificate or an unrecognized CA. To resolve this problem, provide a clean PEM file containing only the CA certificate(s) and redeploy it to the player (in BrightSign Author, use the **Select Additional CA Certificate** as shown below).

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/b6pPCdrMqbfl19-X2bwDR_image-20260710-001625.png" size="60" isUploading="false" width="849" height="856" darkWidth="849" darkHeight="856" showCaption="false"}




[title] Author
[path] /

:::hint{type="warning"}
Local access (i.e., access over the local network) of the Diagnostic Web Server (DWS) is *disabled* by default as of BrightSignOS 9.0.218 (on the 9.0 branch) and BrightSignOS 9.1.75 (on the 9.1 branch). In BrightSignOS versions prior to these, local access to the DWS was enabled by default. To enable local access to the DWS, see [DWS: Local Access](docId\:IAFCHERlJfjDJTWTtKpk5).

Note that some specially configured players have the external microSD card port and USB storage disabled at the factory (SKU: SVC-internal-storage-only). For these players, local access to the DWS remains enabled by default.

Remote access (i.e., access over the internet) of the DWS remains available for all internet-connected players registered with BrightSign Cloud.
:::

# Got "Access to \[IP address] denied"&#x20;

If you are using BrightSign Author to communicate with players over a Local File Network but can't publish to them because of this error, access to your players is blocked because a username/password is configured on the player Local Web Server (LWS). After entering the correct LWS credentials, BrightSign Author should immediately regain access to the player.

To resolve this error:

1. Open BrightSign Author
2. Select the gear icon next to the player (see Image 1, below)
3. Enter the LWS username and password under **Specify Username/Password**. If you can access the Local DWS, you can find these credentials in the Registry section under the fields **nlwsu** (username) and **nlwsp&#x20;**(password), or if you set up your player with bsn.Control and selected **Save to Library** in BrightSign Author, you can find the credentials under **Admin > Setup Library > Edit Applied LFN Setup– BSN.Cloud&#x20;**

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/pcITrqUM8AcqNneS3WwEH-20251203-194750.png" size="42" width="328" height="504" position="center" caption="Image 1" darkWidth="328" darkHeight="504" showCaption="true"}

# Why is my iPhone image rotated in the display?

This is a metadata issue. To fix it:

1. Open the images in Paint or a similar image editor.
2. Save As under a different name. This will overwrite the original file orientation.
3. Add the image to your presentation.

# My video looks wrong/distored

1. Try playing a different video to rule out a problem with the display, cables, hardware, etc.
2. Make sure that your video file extension and codec is supported by the player, and that your video does not exceed the maximum resolution for your player. Current players support 4K video except for LS players which only play HD video, and XC5 and XT5 players can also play 8K video.
   - Extension and resolution information is available on the [Video Formats & Codecs](docId\:knsFFwMTD4NswXm4BUP0I) page
   - You can use third-party software like [MediaInfo](https://mediaarea.net/en/MediaInfo) to determine the codec type.
3. Verify that your video uses the recommended constant bitrate (CBR). See [Optimize Video Quality](docId\:h730dRkSG_mJtZfmU-1gx) for details. 
4. Use FFmpeg or similar software to re-encode your video.

# My video is playing too fast

1. Make sure your video is not an MPEG elementary stream. If you are playing an MPEG elementary stream that's encoded at 25 fps, but the player is outputting 50 or 75 fps, it will play faster than normal.
2. Try re-encoding your video as an MPEG-2 program stream or transport stream. Some encoders require that you add a silent audio layer to create a program stream, or you can use one of several utilities such as Mpeg2Vcr to convert the video.

# My image isn't displaying

If your image isn't displaying, it might be an unsupported format or the image size may be too big for your player. See [this page](docId\:gZcaQrOoR8-ZaRNrEPKN1) for more information about supported formats and sizes.

:::hint{type="info"}
You can increase the maximum allowed width of images by sacrificing height (e.g. you can use a 4096x640x32bpp image on players that lack a 4K decoder is allowed). You can also increase the maximum width/height by reducing the bpp value (e.g. you can use a 4096x1280x16bpp image on players that lack a 4K decoder).
:::

# Google Analytics doesn’t display in a presentation

Chromium 87 does not work with Google Analytics, so you must upgrade to BrightSignOS 9.0.120 or greater and a newer Chromium version to display a presentation containing Google Analytics content.

**Upgrade Chromium on Series 5 Players**

1. Upgrade to BrightSignOS version 9.0.120 or greater (see the [Downloads page](https://www.brightsign.biz/resources/software-downloads/))&#x20;
2. Enter `registry write html widget_type chromium110` in the Local or Remote DWS, as shown in Image 1. This will update your Chromium version, as shown in Image 2. Note that with later BrightSignOS builds, this setting will enable Chromium 120 instead of 110.

![image-20241205-220813.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/p6HZpiK6dnuwKXmjaPdJy_image-20241205-220813.png "Image 1")

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/_3il9flCsvfmHSGJj3Lmt_image-20241205-221025-1.png" size="70" width="616" height="561" position="center" caption="Image 2" alt="image-20241205-221025 (1).png" darkWidth="616" darkHeight="561" showCaption="true"}

**Upgrade Chromium on Series 4 Players&#xA0;**

You can only upgrade to Chromium 120 on Series 4 players with BrightSignOS 9.1.x, which is available in an internal beta. This should only be used for testing, not for production, until it is officially released. If you would like to get this OS, please contact support.

[title] BSN.Cloud
[path] /

## How to recover my username and/or password?

### Username

Your BSN.Cloud username is your email address. If you are using plus-addressing to create a different email address that goes to the same inbox, be aware that each username is different to the system. Check your email for messages from BSN.Cloud (the sender will be [noreply-brightsign@brightsign.biz](mailto\:noreply-brightsign@brightsign.biz)) and check the To: field for the correct username.

### Password

1. In BrightSign Author, select **Connect to BSN.cloud** on the upper right
2. In the **Sign In** window, select **Forgot Password**.
3. Enter your email address and **Submit.** An email should arrive shortly from [noreply-brightsign@brightsign.biz](mailto\:noreply-brightsign@brightsign.biz) with a link to reset your password, so be sure to add that email address to your whitelist or contact list to ensure it does not go into spam/junk/quarantine.

## Can't connect because of cert validation error during TLS handshake

This sort of error typically occurs during player registration (it doesn’t happen later because the rule either exists or not, so if there is something wrong the player fails immediately). If this happens, you will see a purple screen with a -60 error code. You should then access the DWS, inspect the system log to find the entries that have the -60 error code, and look for the related certificate validation errors.&#x20;

These errors are usually either complaints that the certificate is self-signed, or indications that the certificate is issued to a different host. In both cases, the reason for the error is an intermediate server which acts as a man-in-the-middle between the player and the BrightSign Cloud. This server replaces the BSN.Cloud server certificate with its own in order to inspect the encrypted TLS traffic:&#x20;

- If you do not want the traffic to be inspected, find the intermediate server and configure it to pass through encrypted traffic to all BSN.cloud services referenced on [this page](docId:6MBtfGmpjWoCqOmVC0oE5) without inspection.&#x20;
- If traffic inspection is necessary, contact the support team (support\@brightsign.biz) and provide the information to create a new certificate based on your intermediate server certificate to register all the players connecting through that traffic inspector as trusted.

## My player status is red&#x20;

The player status will be red if it is not connected to BrightSign Cloud. Check the following to establish or restore your connection:

1. Is your player powered on?
2. Is the player physically connected to your network? For example, is the ethernet cable plugged in and are the ethernet LEDs blinking as expected?
3. Check your player connectivity. Can it reach the internet, and can it access these  [ports and URLs](docId:6MBtfGmpjWoCqOmVC0oE5)? Check this through your local [Diagnostic Web Server (DWS)](docId\:qXt4YHey7IEj_M9dH73wM):
   1. If the local DWS was not enabled on your player, follow the steps in [DWS: Local Access](docId\:IAFCHERlJfjDJTWTtKpk5) to enable it and/or access it through a web browser on a local network.
   2. In the local DWS, open the **Diagnostics&#x20;**&#x74;ab and check:
      - **Network Configuration >** **View**
      - **Network Diagnostics >** **Run Diagnostics**
   3. You can also use the **Log** tab to troubleshoot problems, though logs are only available a few minutes after your player comes online.

:::hint{type="warning"}
Players with a red status cannot be accessed through the remote DWS.
:::

## Why am I asked to reset my password despite logging in with SSO?

BSN.Cloud offers both [SSO](docId\:fNXkrJI357PE2YHWYAS7I) and legacy authentication (which is available for backwards compatibility), so users can have multiple available authentication methods. If you see the error message below, your account has a legacy authentication method unrelated to SSO. Since all stored passwords have an expiration period, you are being prompted to change the password for that legacy authentication method. If you don’t use these legacy credentials then you can just delete them after changing the password.

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/-lHGrc_LC6EsN7TFZf5PR-20251203-184701.png" size="64" width="1058" height="910" position="center" darkWidth="1058" darkHeight="910" showCaption="false"}

##


[title] Setup
[path] /

# My Activation Code doesn't work

1. **Your code is old:** The code may have already expired if you did not try activating until several minutes after the player was powered up and connected to the Internet. To fix this, reboot the player and use the displayed code immediately.&#x20;
2. **Double-check the code**: Make sure that there are no typos or errors in the code you are entering.
3. **Try an** **activation method that doesn’t require a code**:
   1. Activate the player via [the web browser](https://bsn.cloud/#/dashboard)&#x20;
   2. Use the QR code on the activation screen to activate the player.

# Got “Unable to access a player at that IP address"

If you get this message when publishing to a player set up with Local Network, these could be the reasons:

- The player has not been, or is no longer, configured for Local Network. Apply new Local Network setup files to the player:
  1. For Series 3 and newer players, clear the content of the player's storage device.
  2. [Factory reset](docId\:ynCF7P2PYZo2qedF1JYim) the player.
  3. Write a new Setup File to the player's storage (via [the DWS](docId\:OT72UBIsN4txl6tf0rCG6) or via [Provision](docId\:Cyl9kPm02CO5rgcB9WQQv)).
- You are using DHCP addressing without an address reservation for the player and the router, or the DHCP server rebooted or changed the player address. To resolve this:
  1. Get the player's IP address. See [this page](docId\:o5BjpU97OMMNBhodcjyEF) if you don't know how to do that.
  2. Refresh the player list in the **Network** tab to see if you get a new/updated player entry with the correct IP address,onsider adding an address reservation to the DHCP server so the player's address is predictable.
- The presentation or content has put the player into a reboot loop. The easiest way to bring a player out of a reboot loop is to apply the Setup to the player's storage again. This will clear the player's presentation schedule so the presentation won't run and crash the player again. If you cannot physically access the player, you can still recover if the Diagnostic Web Server (DWS) is accessible:
  - Keep trying to **Disable Autorun** from the **Diagnostics** tab of the player's local DWS (*http\://playerIPaddress/index.html* - replace *playerIPaddress* with the player's LAN IP address) or [remote DWS](docId\:XUE20rJXhFt-Lq0RDmJbW) until you get a response from the player. After you see the response, the player will reboot with the autorun disabled.
  - Check your presentation for invalid data feeds, out-of-spec media, and resource-hungry HTML sites.
  - Use the method on [this page](docId\:OT72UBIsN4txl6tf0rCG6) to create, package, and deliver a new Setup File to the player. After the Setup File is applied you should be able to publish to the player again, or if BrightSign Cloud is being used to reprovision the player, see [Provision](docId\:Cyl9kPm02CO5rgcB9WQQv).
  - Update the player OS.
- The player's storage device has been removed or is not readable. To resolve this, put the player's storage device in your computer and see if it can be recovered. Replace the storage device and write new Local Network configuration files to i&#x74;**.**
- If the player has been disconnected from the network or power, reconnect the player.
- Network access to the player on ports 80, 8008, and/or 8080 is blocked. To resolve this:
  - Consult with IT to ensure the computer that BrightSign Author is installed and can communicate with the player.
  - See if you can open *http\://playerIPaddress:8080/GetID* (replace *playerIPaddress* with the player's LAN IP address) from a web browser on the same network as the player.
- Access to ports 80, 8008, and/or 8080 is blocked. To resolve this:
  - Consult with IT to ensure the the computer that BrightSign Author is installed on  can communicate with the player.
  - Check any third-party antivirus / firewall / security software.&#x20;

# I can't publish to my player

Check your connection to the player:

- Make sure the player is powered on and can be pinged at its IP address. To do this, open a command line terminal and type ping followed by the IP address (for example, `ping 192.0.2.1`), then hit Enter.
- Certain ports and URLs must be open to connect to BrightSign applications. See [this page](docId:6MBtfGmpjWoCqOmVC0oE5) for a list of ports and URLs that are needed by BSN.Cloud, and [this page](docId\:okiHHduWqhkKiKIVN5vs7) for a list of ports and URLs that are needed if you are using our legacy  and  software.
- Your may need to factory reset the player or reprovision the player with a new setup. To factory reset a player, see [this page](docId\:ynCF7P2PYZo2qedF1JYim) and to reprovision a player, see [this page](docId\:Cyl9kPm02CO5rgcB9WQQv).

Check your presentation:

- Publish a simple image or video that you know worked in the past. If it works and your presentation does not, the presentation may have been corrupted.
- Check the codec and file types of the content that you are using in your presentation to make sure that they are supported. This information can be found in the [Supported Modes & Formats](docId\:ZjfwcRtCar2XLsycSqCnx) section, which contains information about supported audio, image, video and other formats and codecs.
- Your presentation may be too large for player's available storage. If you don't have enough (free-able) storage to publish the schedule, publish a small/simple presentation to the schedule so the current items are no longer in use, then publish the desired schedule (and the prior “actual” schedule's items can be freed from storage).&#x20;
- You cannot publish a file or files that are larger than 4GB to FAT32-formatted storage. To fix this, either reformat the storage as exFAT or Ext3/Ext4 (see [Format a microSD Card](docId\:BI1ClyWDiepZIOvRLOs0j) for instructions); or reduce the size of the files in the presentation so they are all (individually) less than or equal to 4GB in size.&#x20;

Other possible issues:

- Make sure the publishing has completed and that the associated files actually arrived on the player’s SD card.
- Your storage may have failed into read-only mode. (Local Network publish can still appear to complete without error, but nothing actually changes)&#x20;
- You may have selected a publishing type that doesn't work with your network/player setup. See [Quick Publishing using Author](docId\:CZGuHZ_OMw1rSbPfddPaH) for a discussion of different publishing types.

If you get any error messages, keep that information in case you need to contact support.

# My player’s serial number is already registered

If this error appears when adding a player from the **Provision** screen, the player already has an existing provisioning record under with BrightSign Cloud network.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/4lCTAaG4XPXJYjVyJJ3U5_image-2.png" size="70" width="629" height="365" position="center" darkWidth="629" darkHeight="365" showCaption="false"}

A player can only have one provisioning record, so the player’s existing provisioning record must be deleted and the player removed from its current network. To do this, follow the steps outlined [here](docId\:Cyl9kPm02CO5rgcB9WQQv). Only the owner of the network to which the player belongs can perform these functions so you may have to contact that person to request that they do this.

:::hint{type="info"}
Note that a factory reset of the player resets the settings of the player to its factory defaults but does **not** delete the player’s provisioning record. More info about that [here](docId\:ynCF7P2PYZo2qedF1JYim).
:::

# My players aren't in the Network tab

This is usually caused by a communication issue with BSN.Cloud servers (for example, a missing player setting or configuration or a network issue). Check the following:

1. Make sure that **Enable bsn.Control or bsn.Content** is selected in **Admin > Setup > Player Settings > Advanced** (older versions of BrightSign Author say **Enable BSN.cloud** or **Enable Control Cloud or Content Cloud**).
2. Make sure that the player was activated before or during the setup process. For more information, see [this page](docId\:OOf-RmqHqFVLhokXI8ypJ).
3. To communicate with players, the network must meet some basic requirements. See [this page](docId:6MBtfGmpjWoCqOmVC0oE5) for more details.
4. Players must be on BrightSignOS version 8.0.119 or later to run BSN.Cloud, so make sure your player OS is compatible with BSN.Cloud. See the next topic if you need instructions about how to update your OS.

# BrightSign Author won't open on a Mac (malicious software error)

1. Open to Apple Menu > **System Settings** (**System Preferences** on older OS versions)
2. Go to **Privacy & Security**
3. Scroll down to **Security**. If you just tried to open BrightSign Author, you should see a message like the one in the image below.
4. Select **Open Anyway** and **Open** in the following dialogue box.

![Screenshot 2024-05-01 at 11.56.50 AM.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/85yT-KnRkrWzYGuCeaJla_screenshot-2024-05-01-at-115650-am.png)

# Players aren't visible in BrightSign Author on a MacOS

Check your MacOS settings:

1. Open **System Settings**.
2. Go to **Privacy & Security**.
3. Go to **Local Network**.
4. Make sure the **Local** **Network** option is enabled for both "BA connected" and "BA connected Helper (Renderer)":

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-CxteXGNE1YAPn6TFF8Xe2-20250512-201043.png" size="82" width="1073" height="112" position="center" darkWidth="1073" darkHeight="112" showCaption="false"}

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-5q8xONPSD_5EaHb2PrAUH-20250512-201110.png" size="82" width="1073" height="112" position="center" darkWidth="1073" darkHeight="112" showCaption="false"}


[title] Appspace
[path] /

This page outlines how to troubleshoot common issues encountered when using Appspace with BrightSign.

# Appspace OS Requirement

In some cases, you will need to update BrightSignOS of a BrightSign player to meet the minimum requirement for the Appspace app.

- When updating a player, ensure the microSD card is formatted using FAT32.
- To determine the current BrightSignOS version of a player, power on the player without a microSD card inserted and view the version number on the display. You can also view the OS version number on the [DWS: Remote Access](docId\:XUE20rJXhFt-Lq0RDmJbW).

# Incorrect Network Config

The Appspace app will not work if network settings such as the static-IP/DHCP configuration, timeserver URL, or proxy-server configuration are incorrect. You can use the DWS to determine if the player is using the correct network settings.

Once you've logged in to the DWS, navigate to the **Log** tab and search for the "gw" keyword (indicating gateway). Check the network settings that are on the same line as "gw".

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/jkZZU9IvpSqS9bZLaSpB__dws-log.png)

You can use the **Diagnostics** tab on the DWS to test other network settings as well:

- For proxy settings, click **View** under **Network Configuration** in BrightSign Author or .
- To test connectivity to the Appspace server in BrightAuthor Classic, use the **Download Speed Test** to download a page from `https://cse.demo.appspace.com`. The test result will yield an error code if there's a connection issue.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/SG3RqsM4e_FeJVPZ8VV8s_dws-download-speed-test.png" size="60" width="912" height="286" position="center" darkWidth="912" darkHeight="286" showCaption="false"}

# Player RTC not set

If the player has not been powered on for some time, the battery for the real time clock (RTC) may be drained. The player will not connect to the Appspace server until the system clock has been re-adjusted. See [Set Time & Time Zone](docId\:ecLScmyIm8Vf9lLClm6Uw) for info about how to adjust the time/time zone, or to set the RTC time on the player in the BrightAuthor Classic DWS, navigate to the **Info** tab, and click **set** next to the player **Time**:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/Fqq6NbCujvA5YODkkt2-E_dws-info.png" size="60" width="972" height="786" position="center" darkWidth="972" darkHeight="786" showCaption="false"}

# Runtime Issues

If none of the above issues can be identified, check the **Log** tab on the DWS for obvious error messages. If nothing can be found on the DWS, the JavaScript console may indicate other errors with the HTML/CSS (e.g., some resources cannot be downloaded from the Appspace server). The JavaScript console can be accessed via `http://:2999`.

# Device Menu

To open the device menu, attach a USB keyboard to the player and press the CTRL key. This will open a menu that allows you to restart or reset the player.

If the Appspace application is playing a full-screen hardware-accelerated (HWZ) video, the device menu will not accessible.


[title] Web Folder
[path] /

:::hint{type="warning"}
[Web Folder Setup](docId\:CZiiGthX3J0k1cAIXC7cO) (formerly known as Simple File Networking) allows you to publish content to a player from an internal or external HTTP/web server. This server is the dedicated storage location for your presentation files, which the player then downloads via HTTP and plays. Setting up an HTTP server can be complex and BrightSign does not provide support for it. You may need to seek professional assistance or managed hosting services that handle server set up and maintenance.
:::

# How do I play a different presentation on each player?

To play a different presentation on each player, make sure that they each refer to a unique URL.

# My presentation schedule is not downloading

To ensure that your players can download presentation schedules successfully, make sure that your web server has the following MIME type definitions declared.

**MIME Type Definitions**

These definitions should be added, because they are usually not predefined:

| **File extension**           | **Type Definition**      | **Purpose**                                               |
| ---------------------------- | ------------------------ | --------------------------------------------------------- |
| .rok                         | application/octet-stream | Firmware update for legacy Series 0 (HDx10) players       |
| .bsfw                        | application/octet-stream | Firmware update for Series 1 and newer BrightSign players |
| .<br />*(no file extension)* | application/octet-stream | Asset pool files                                          |
| .brs                         | text/plain               | BrightScript files - autorun, plugins, etc                |

These MIME types are usually already defined, but should be added if they are not:

| **File extension** | **Type Definition** | **Purpose**                                   |
| ------------------ | ------------------- | --------------------------------------------- |
| .json              | application/json    | Data files for player operation               |
| .xml               | text/xml            | Sync specification files for player operation |

# Can I use cloud services for Web Folder publishing?

Dropbox, Google Drive, OneDrive and other similar cloud services can not be used for Web Folder publishing due to current authentication implementations.

# How can I troubleshoot my Web Folder Setup?

Before troubleshooting the Setup or network, publish a test presentation directly to the player via a microSD card and verify that it displays properly.

:::hint{type="success"}
When a player connects to your web server:

1. It checks for a *current-sync.json* file (if you are running BrightSign Author) or a *current-sync.xml* file (if you are running ) and downloads it.
2. It downloads all files listed in the *current-sync.json*/*current-sync.xml* file that are not already on local storage, including schedule, playlists, and media files.
3. It plays presentations according to the downloaded schedule.
:::

# My display is blank/presentations don't update

If your display is blank or the player hasn’t switched to the latest scheduled presentation, check the following:

1. The storage device (e.g., microSD card) must remain installed / attached to the player for it to play any presentations. With the Web Folder setup, content is not *streamed&#x20;*&#x66;rom the Web Folder. Rather, content is *retrieved / downloaded&#x20;*&#x66;rom the Web Folder to the player's storage device and played from the storage device.
2. When publishing your first presentation or any updated presentations, you must select **Web Folder** after selecting the **Publish** tab. Verify that Web Folder is selected and that your Web Folder URL matches the URL you used when setting up the player.
3. Test the web folder URL from your web browser. If your computer is also the web server, test the link from another computer. Assuming your server is `http://www.mysite.com/downloads/`, test the following (you can get the pool folder URL from the *current-sync.json* or *current-sync.xml* file):
   - `http://www.mysite.com/downloads/current-sync.json` or *current-sync.xml*
   - `http://www.mysite.com/downloads/autorun.brs` (to confirm that your MIME types are set up correctly)
   - `http://www.mysite.com/downloads//pool/sha1-6963EC2B20954C48716E9CEF96FC11F53DA3BBAA` (to confirm that your MIME types are set up correctly)

     Your web browser should be able to open/download the files from your web server using HTTP or HTTPS URLs. Check that you have enabled the MIME types if these files are not accessible.
4. If you are using :
   - Go to **Tools > Setup Unit**, and confirm that Simple File Networking (the BrightAuthor Classic name for Web Folder) was enabled for the Setup files you created.
   - In the same location, check that the URL for the web folder is correct and that it includes the correct port number for the web server, if applicable.
   - If you haven't already done so, publish the Setup files to a microSD card and insert the microSD card into the player.
   - Including a trailing slash in your URL may cause downloads to fail because BrightAuthor Classic automatically adds a slash to URLs. Some web servers don’t process URLs with a double slash. For example, if you originally entered `http://www.myfiles.com/downloads/` as the **URL for Web Folder**, try `http://www.myfiles.com/downloads` instead.
   - If you are using FTP to transfer the published files to your web server, verify that your FTP software is set to transfer using binary mode, and not auto or ASCII mode. Files may fail to download from your server if they are transferred using ASCII mode.
5. When a player encounters errors when downloading files, it will not restart and play the new content and the errors will not be displayed on the screen. You may encounter errors if you moved or renamed files in the web folder after you published the presentation, or if the files you uploaded were changed by the transfer process. To view an error log, you can connect the player to your computer using a serial cable or, if you checked **Enable diagnostic logging** during player set up, retrieve the log file from the microSD card.
6. If your project is scheduled to play all day every day, your project will play even if the player has no valid time set or if the time or time zone is incorrect. However, if you are using day parting (i.e., playing different presentations depending on the time or day), then nothing will play if the time isn’t valid.
   - Verify that the player has the correct time and that it can connect to the network. You can do this by creating a simple project that displays the time (via a Clock zone) and an RSS feed. If the player can connect to both the network and the Internet, you will see the RSS feed, and if you can reach the time server, you will see the time.
   - If UDP port 123 is blocked on the network, the player won't be able to set the time over the Internet.
7. If the player fails to resolve the name of the web server, then it will fail to download the *current-sync.json*/*current-sync.xml* file. If your server URL is something like `http://myserver/brightsign/downloads`, then you may need to add the domain to the server name for updates to function properly: `http://myserver.universityshop.net/brightsign/downloads`

# How do I set up my player/publish content?

Once your HTTP server is ready, see [Web Folder Setup](docId\:CZiiGthX3J0k1cAIXC7cO) to set up your player or [Quick Publish](docId\:CZGuHZ_OMw1rSbPfddPaH) to publish content.


[title] Fix / Troubleshoot
[path] /

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/vAEWy9PorHPJJwobBRKbW_troubleshoot-icon-lm.svg" size="20" isUploading="false" width="201" height="200" darkWidth="216" darkHeight="219" position="center" darkSrc="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/1897BMuEOkCWyRZwehPQt_troubleshoot-icon-dm.svg" showCaption="false"}

# Common Issues

::::VerticalSplit{layout="middle"}
:::VerticalSplitItem
- [I don't know my login](docId\:eQrdKoaOXVodhBi084Z4I)&#x20;
- [My player's serial number is already registered](docId\:Cyl9kPm02CO5rgcB9WQQv)&#x20;
- [I can't publish to my player](docId\:C61IniUWXLl9-_PXzxFZy)
- [Where is BSN.com and BrightAuthor Classic information?](docId\:JIo6L0kAjrcyJE4Y0gjz5)&#x20;
:::

:::VerticalSplitItem
- [My players are offline](docId\:eQrdKoaOXVodhBi084Z4I)&#x20;
- [Which publishing method does my player use?](docId\:CmGPUPd__UsjWqq_6JGfs)&#x20;
- [My Activation Code doesn't work](docId\:C61IniUWXLl9-_PXzxFZy)&#x20;
- [My video looks wrong/distored](docId\:ezkvz9WOoOWCY0mfQjn6m)&#x20;
:::
::::

# Categories

More questions and answers are organized into the categories below (these are also accessible from the left panel):

- [Setup](docId\:C61IniUWXLl9-_PXzxFZy)
- [Author](docId\:ezkvz9WOoOWCY0mfQjn6m)
- [BSN.Cloud](docId\:eQrdKoaOXVodhBi084Z4I)
- [Players](docId\:CmGPUPd__UsjWqq_6JGfs)
- [BrightSign Built-in](docId\:Xid1kUxTcmIwUrbkKpLHn)&#x20;
- [Accessories](docId\:gzRAHD_6QD1gojWbeR_xS)&#x20;
- [Appspace](docId\:t7p2YHIh6fdFGObLzjrRJ)&#x20;
- [Web Folder](docId\:wLEAAppYqa_4leMrn0E2z)&#x20;


[space] Hardware (/hardware)

[title] XC5 Theory of Operation
[path] Series 5 Players/XC2055, XC4055/

This section describes how specific components operate on the XC2055 and XC4055

# On-Board LEDs

The four on-board LEDs have the following indicators:

| **LED**                                                                                                                                                                | **Indication**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Green power (**Pwr**)                                                                                                                                                  | Displays when the board is powered up and not in reset mode. Flashes during firmware update process.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| Green file-system activity (**Bsy**)                                                                                                                                   | Flashes any time there is file-system activity (on any storage device)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| Blue (**WiFi**)                                                                                                                                                        | Illuminates when WiFi is connected and flashes when searching for a connection                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| Red status (**Err**)                                                                                                                                                   | Flashes a certain number of times to indicate which error is occurring. The flash codes are described below:<br />2: Unspecified error<br />3: Network recovery script is preparing to run on a device configured for network recovery<br />4: No upgrade file found<br />5: Failed to load kernel module<br />- 6: Board is not capable of running the current firmware version<br />- 7: A piece of on-board hardware is not working correctly<br />- 8: Problem related to the storage device (either the USB drive or MicroSD card)<br />- 9: Problem related to the registry/NAND<br />- 10: The autorun script encountered a load/run error<br />- 11: WiFi-related error<br />- 12: Unable to find bootable image |
| A solid error light is displayed during the micro-controller update in BOS 9.0.36. Updating from an earlier OS version to BOS 9.0.36 or later will trigger this light. |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |

# On-Board Switch / SVC Button

The SVC button is connected to the GPP\_D6 GPIO on the processor. The RESET button is also sent to the PMIC (support micro), which when the button is asserted for four seconds will initiate a hard reset.

# Reset Switch / GPIO Button

The RESET button is connected to the GPP\_D5 GPIO on the processor. The RESET button is also sent to the PMIC (support micro), which when the button is asserted for four seconds will initiate a hard reset.

# microSD Slot

The XC2055 and XC4055 have one MicroSD slot. High density memory cards with a capacity of up to 2TB, and SDR104 and microSC3.0 UHS-I ultra-high speed memory cards, are supported

# Wireless Module

The XC2055 and XC4055 both have a dual antenna connection to allow users to install a BrightSign wireless module without disassembling the unit. BrightSign modules are configured to work with 802.11.N or 802.11.AC access points. This connection has a Bluetooth option.


[title] XTx44 Hardware Interfaces
[path] Untitled/Untitled/

This section describes the characteristics and operation of all connectors on the XT244 and XT1144.

# Ethernet&#x20;

The RJ45 connector on the XT series supports 1000BASE-T networking, as well as Power over Ethernet (PoE) Type 1 and Type 2. Note that there are [operational restrictions](docId\:zZqJ3wEricKvnGDknFIii) when using PoE Type 1.

:::hint{type="warning"}
WiFi is always disabled when a player is powered by PoE.
:::

The maximum length for Cat 5E cable is 91 meters for PoE applications and 100 meters for non-PoE applications; the allowed length can be higher or lower depending on the quality of the cable.

802.1x is supported on the ethernet port, but not on USB-connected ethernet devices.

:::hint{type="danger"}
The equipment should be connected only to PoE networks without routing to the outside plant.
:::

# Power Connector

The power connector for the XT244 and XT1144 is rated for 12V\@3A. The plug is a right-side positive, locking 2-pin (1x2) connector.

# 3.5mm Serial 

The UART (asynchronous serial) interface is a 3.5mm (1/8") jack that uses RS-232 levels for communication. The receiver will tolerate input voltages between -30V and +30V, with anything below 3V interpreted as a logical 1. The transmitter drives +8V for logical 0 and -8V for logical 1. 

The default baud rate of the interface is 115200, with no parity, 8 data bits, and 1 stop bit. These settings can be configured in the software. The serial interface supports TX, RX, and ground only—RTS/CTS hardware flow control is not supported. The following diagram illustrates the behavior of the TX and RX signal:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/h1CQoZUQDO2Pu7XL3RGZa_bit-diagram1.png" size="90" width="777" height="230" position="center" darkWidth="777" darkHeight="230" showCaption="false"}

The 3.5mm serial port has the following configuration (from the perspective of the player):

- **Tip**: Receive
- **Ring**: Transmit
- **Sleeve**: Ground

BrightSign players are DCE devices, so communication with another DCE device that uses a 3.5mm port would require a null-modem cable or converter that transposes the TX/RX signals. If the device communicating with the player is a DTE device with a DE9 serial port (performing asynchronous transmission), the serial cable should be wired as shown in the following diagram:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/OKZUinXdthNHA3MRRcmlu_35mm-serial-cable-diagram.png" size="90" width="979" height="331" position="center" darkWidth="979" darkHeight="331" showCaption="false"}

# GPIO

The XT244 and XT1144 have a 12-pin GPIO switch and LED connector, which allows the player to control external LEDs or other devices requiring 24mA of current or less.

The GPIO port is a standard design manufactured by Phoenix Contact, Wurth Electronics, and others. Pluggable GPIO terminal blocks can be inserted into the GPIO connector to make bare-wire contacts (see [here](https://www.digikey.com/short/3101mw) for an example part). These terminal blocks can be purchased from the [BrightSign Store](https://www.brightsign.biz/digital-signage-products/accessories/GPIO-terminal-block). If you wish to source your own terminal blocks, make sure to use 4-pin or 6-pin blocks (12-pin blocks are extremely difficult to remove from the GPIO port).

Connect the LED outputs to the LED ANODE and connect the LED CATHODE to the ground. If you want to connect another device, then the output is capable of sourcing or sinking up to 3.3V at 24mA, but there is a series resistor of 100Ω in each line.

The GPIO also allows you to connect external contact closures to the ground. In order to connect a switch, connect one side of the switch to the switch input, and connect the other side to one of the ground pins on the GPIO connector. The connector can also supply 3.3V at up to 500mA to an external device. The 3.3V output is polyfuse-protected and can source up to 500mA.

If one BrightSign player is driving the inputs on another BrightSign player, then you can drive at most three inputs from one output. The following calculations explain this limitation:

:::hint{type="warning"}
The GPIO outputs have 100Ω series resistors; the GPIO inputs have 1K pullup resistors to 3.3V; and the input threshold is 2V high and .8V low. The high voltage is not problematic, but the low voltage can be if there are too many inputs connected to one output.
:::

|                    |                                                                                          |
| ------------------ | ---------------------------------------------------------------------------------------- |
| 1 out driving 1 in | V=3.3\*100/(100+1,000)=0.3                                                               |
| 1 out driving 2 in | V=3.3\*100/(100+500)=0.55                                                                |
| 1 out driving 3 in | V=3.3\*100/(100+333.3)=0.76                                                              |
| 1 out driving 4 in | V=3.3\*100/(100+250)=.94 (This is too high, so 1 output driving 3 inputs is the maximum) |

## GPIO Pinout 

The following table describes the pinout of the GPIO on the XT244 and XT1144: 

| **Pin** | **Function** | **Pin** | **Function** |
| ------- | ------------ | ------- | ------------ |
| 1       | GND          | 7       | GND          |
| 2       | 3.3V         | 8       | 3.3V         |
| 3       | BUTTON 0     | 9       | BUTTON 4     |
| 4       | BUTTON 1     | 10      | BUTTON 5     |
| 5       | BUTTON 2     | 11      | BUTTON 6     |
| 6       | BUTTON 3     | 12      | BUTTON 7     |

The following schematic illustrates the pinout of the GPIO connector:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/LjAjOXA5P8Sn6SVDPAdvW_12-pin-gpio-pinout.png" size="74" width="817" height="376" position="center" darkWidth="817" darkHeight="376" showCaption="false"}

## Example Diagrams

The following example diagrams demonstrate how LED buttons can be wired to the GPIO connector (in both 1- and 4-button configurations):

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/8wIzxihcmD46qw5ezmbtP_phoenix-1button-half-rev-b.pdf" label="phoenix_1button_half_(rev_b).pdf" isUploading="false"}

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/wN9n1aMvf7joSaE-bEzDW_phoenix-4buttons-rev-b.pdf" label="phoenix_4buttons_(rev_b).pdf" isUploading="false"}

# USB

The XT1144 has two USB 2.0 ports: one Type A and one Type C. The Type A connector can act as a dedicated charging port (DCP) when the two data pins are shorted together, and the Type C connector can operate as either a host or a device (i.e. a dual-role port).

The Type-A connector can supply up to 1.5A of power for peripherals, while the Type-C connector can supply up to 1A.  Note that these values are subject to a [total current restrictions of 2A](docId\:T8Fl8cAru0CbDgQueNGeJ) for peripherals.

Both ports are capable of transfer speeds up to 480 Mbit/s. The maximum length for a USB cable is 5 meters.

The following table illustrates the pinout of the USB 2.0 Type A host port:

| **Pin** | **Description** | **Pin** | **Description** |
| ------- | --------------- | ------- | --------------- |
| 1       | VBUS            | 2       | D-              |
| 3       | D+              | 4       | Ground          |

## USB 2.0 Type-C Pinout

The following table illustrates the pinout of the USB 2.0 Type-C host port:

::Iframely{originalUrl="https://docs.google.com/spreadsheets/d/1sLqt0HYIzdpvpqhY59M23xkV4jiqLwxo9Yp5PAOyW-Y/edit?usp=sharing" embedUrl="https://docs.google.com/spreadsheets/d/1sLqt0HYIzdpvpqhY59M23xkV4jiqLwxo9Yp5PAOyW-Y/edit?usp=sharing" title="USB 2.0 Type-C Pinout" html="<div style=&#x22;left: 0; width: 100%; height: 0; position: relative; padding-bottom: 77.2727%;&#x22;><iframe src=&#x22;https://docs.google.com/spreadsheets/d/1sLqt0HYIzdpvpqhY59M23xkV4jiqLwxo9Yp5PAOyW-Y/preview?usp=embed_googleplus&#x22; style=&#x22;top: 0; left: 0; width: 100%; height: 100%; position: absolute; border: 0;&#x22; allowfullscreen></iframe></div>"}

# 3.5mm Audio Connector

The XT244 and XT1144 have a combination analog/optical audio jack. To transmit a digital audio signal, use a TOSLINK optical audio cable with a 3.5mm connector. Analog and digital audio cannot be transmitted simultaneously.

The full-scale voltage output of the analog audio is 2V RMS. The minimum load impedance is 32Ω.

The analog audio connector has the following pinout:

- **Tip**: Left audio
- **Ring**: Right audio
- **Sleeve**: Ground for audio signal

# 3.5mm IR Input/Output

The IR blaster generates or receives a space-encoded NEC or Pronto Hex signal. The two transported bit values of the signal (0 and 1) are encoded using differing lengths of low-time IR pulses.

The 3.5mm IR in/out port has the following pinout:

- **Tip**: 3.3V\@50mA
- **Ring**: IR Input
- **Sleeve**: IR Output

:::hint{type="warning"}
The sleeve is used as a ground during input operations.
:::

# HDMI Output

The HDM&#x49;**®** out connector is used to send digital video and audio to HDMI-enabled sink devices. This connector is compatible with HDMI 2.0 devices, capable of outputting a maximum video resolution of 4096x2160x60p.

The following table illustrates the pinout of the HDMI connector:

| **Pin** | **Description**       | **Pin** | **Description** |
| ------- | --------------------- | ------- | --------------- |
| 1       | TX2p                  | 2       | Ground          |
| 3       | TX2n                  | 4       | TX1p            |
| 5       | Ground                | 6       | TX1n            |
| 7       | TX0p                  | 8       | Ground          |
| 9       | TX0n                  | 10      | TXCp            |
| 11      | Ground                | 12      | TXCn            |
| 13      | CEC                   | 14      | NC              |
| 15      | DDC SCL               | 16      | DDC SDA         |
| 17      | Ground                | 18      | +5V DDC         |
| 19      | HPD (Hot Plug Detect) | --      |                 |

# HDMI Input

The HDMI-in connector is used to receive digital video and audio from HDMI-enabled source devices. This connector is compatible with HDMI 2.0 devices and capable of accepting a maximum video resolution of 4096x2160x60p. The signaling also conforms with DVI 1.0, HDMI 1.4, and HDCP 1.4 standards.

The HDMI signaling has CEC (but no ARC or HEC) functionality. The CEC channel is electrically coupled to the corresponding signal on the HDMI output, and the CEC commands will pass through the player even when it does not have power.


[title] XS156 Theory of Operation
[path] Series 6 Players/XS156 (BrightSign Built-in )/

This section describes how specific components operate on the HD225 and HD1025.

# On-Board LEDs

The four on-board LEDs have the following indicators:

| **LED**                              | **Indication**                                                                                               |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------ |
| Green power (**Pwr**)                | Displays when the board is powered up and not in reset mode. Flashes during the firmware update process.     |
| Green file-system activity (**Bsy**) | Flashes any time there is file-system activity (on any storage device)                                       |
| Blue WiFi (**WiFi icon**)            | Flashes when the board is being updated                                                                      |
| Red status (**Err**)                 | Flashes a certain number of times to indicate which error is occurring. The flash codes are described below. |
|                                      | 2: Unspecified error                                                                                         |
|                                      | 3: Network recovery script is preparing to run on a device configured for network recovery.                  |
|                                      | 4: No upgrade file found                                                                                     |
|                                      | 5: Failed to load kernel module                                                                              |
|                                      | 6: Board is not capable of running the current firmware version                                              |
|                                      | 7: A piece of on-board hardware is not working correctly.                                                    |
|                                      | 8: Problem related to the storage device (either the USB drive or microSD card)                              |
|                                      | 9: Problem related to the registry/NAND                                                                      |
|                                      | 10: The autorun script encountered a load/run error.                                                         |
|                                      | 11: WiFi-related error                                                                                       |
|                                      | 12: Unable to find a bootable image                                                                          |

# On-Board Switch / SVC Button

The on-board switch is connected to the GPIO02, which is pulled low when the service (SVC) button is pressed. Conversely, a pull-up on the button normally sets the GPIO02 to be pulled high.

# Reset Switch / GPIO Button

The on-board switch is connected to the reset circuit. Pulling low on the Reset button for less than 2 seconds will initiate an orderly system reset under software control at the rising edge of the signal. If the Reset button is pulled low for more than 6 seconds, an immediate hard reset is performed.

# SDIO Slot

The XS156 provides one SD card interface capable of UHS-1 operation at up to DDR50 transfer rates. A +3.3V power supply is provided for the card. This power supply can be switched on and off by the firmware, allowing it to power-cycle the SD card.

# Wireless Module

The XS156 has an M.2 E Key for WiFi/Bluetooth modules.


[title] Hardware
[path] /

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/TYAqEnq_Txckpox4eAKHe-DeVuankxeGc7WnBuxhzwI-20250507-191419.svg" darkSrc="https://archbee-image-uploads.s3.amazonaws.com/TYAqEnq_Txckpox4eAKHe-0y11SP9WV4Iq55PMOII-9-20250507-191433.svg" size="26" width="300" height="163" darkWidth="300" darkHeight="163" position="center" showCaption="false"}

This section provides documentation for the BrightSign Series 5, 4, 3, 2, and 1 hardware platforms. It also includes info about accessories and add-ons / modules. Categories are listed below as well as in the left panel.

# [Series 6 Players](docId\:Y-jDCL2qJNmOcTN5XkBBz)&#x20;

Our latest media player.

# [Series 5 Players](docId\:s0sXrunSypt4t8f0VIVBa)

Our current line of media players.

# [Series 4 Players](docId\:HMFSy1acgP0xhHtXGDf0O)

Information about our older Series 4 players.&#x20;

# [Series 3 Players](docId\:wjh4C0SzOK_mz865NFhyr)

Information about our older Series 3 players.&#x20;

:::hint{type="info"}
Information about Series 2 and 1 players is in the [Legacy section](https://docs.brightsign.biz/legacy-docs).
:::

# [Model & Series Reference](docId:4ArbVudc4Bg08GkVeuXWa)

Matrix showing player series, models, and OS family.

# [Display Partners](docId\:ZnQEW1K653HfJWxLSPRTf)

Displays with BrightSign capabilities built-in.

# [Wi-Fi, SSD, & Cell Modem Info](docId:54O8NV8TSDVXiP35hf4cg)

Info on WiFi modules and SSDs to extend player capabilities.

# [Accessories](docId\:eGrqs-6dkUeNOkFwgN509)

Remote controls, BrightSign modem, and various controllers (GPIO, LED, buttons).

# [How-tos](docId:0QnNp5OZAcxj_qoS2Pix0)&#x20;

How-to guides for various player functions

# [FAQs](docId:3iSZ-xkhmpEsmL3RIvvTz)&#x20;

Frequently asked questions about BrightSign players and accessories


[title] XDx34 Theory of Operation
[path] Untitled/Untitled/

This section describes how specific components operate on the XD234 and XD1034.

# On-Board LEDs

There are four on-board LEDs that indicate the following:

| LED                                  | Indication                                                                                                                                                                                                                           |   |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | - |
| Green power (**Pwr**)                | Displays when the board is powered up and not in reset mode. Flashes during the firmware update process.                                                                                                                             |   |
| Green file-system activity (**Bsy**) | Flashes any time there is file-system activity (on any storage device)                                                                                                                                                               |   |
| Blue WiFi (**WiFi icon**)            | Flashes when the player is connecting to the wireless network. Displays when connected.                                                                                                                                              |   |
| Red status (**Err**)                 | Flashes a certain number of times to indicate which error is occurring. The flash codes are described below:                                                                                                                         |   |
|                                      | 2: Unspecified error                                                                                                                                                                                                                 |   |
|                                      | 3: Network recovery script is preparing to run on a device configured for network recovery.                                                                                                                                          |   |
|                                      | 4: No upgrade file found.                                                                                                                                                                                                            |   |
|                                      | 5: Failed to load kernel module.                                                                                                                                                                                                     |   |
|                                      | 6: Board is not capable of running the current firmware version.                                                                                                                                                                     |   |
|                                      | 7: A piece of on-board hardware is not working correctly.                                                                                                                                                                            |   |
|                                      | 8: Problem related to the storage device (either the USB drive or microSD card)                                                                                                                                                      |   |
|                                      | 9: Problem related to the registry/NAND                                                                                                                                                                                              |   |
|                                      | 10: The autorun script encountered a load/run error.                                                                                                                                                                                 |   |
|                                      | 11: WiFi-related error                                                                                                                                                                                                               |   |
|                                      | 12: Unable to find a bootable image.                                                                                                                                                                                                 |   |
|                                      | 13: The root file system has failed verification, which is used to detect whether the file system has been tampered with. You can recover a player that is showing this error code by performing a firmware update with secure boot. |   |
|                                      | 14: Boot loader failure                                                                                                                                                                                                              |   |
| Red alternate                        | The red status LED may give one long initial flash to preface an alternate code, described below:                                                                                                                                    |   |
|                                      | 2: Erase failed                                                                                                                                                                                                                      |   |
|                                      | 3: Write failed                                                                                                                                                                                                                      |   |
|                                      | 4: Verify failed                                                                                                                                                                                                                     |   |
|                                      | 5: Failed to find UBI partition                                                                                                                                                                                                      |   |
|                                      | 6: Attempt to write unsigned CFE to unit with secure boot enabled                                                                                                                                                                    |   |
|                                      | 7: Failed to find UBI partition                                                                                                                                                                                                      |   |
|                                      | 8: Failed to create/attach UBI partition                                                                                                                                                                                             |   |
|                                      | 9: Unexpected error                                                                                                                                                                                                                  |   |
|                                      | 10: Upgrade script exited abnormally                                                                                                                                                                                                 |   |
|                                      | 11: Upgrade took longer than expected                                                                                                                                                                                                |   |
|                                      | 12: Update completed but update file could not be deleted                                                                                                                                                                            |   |
|                                      | 13: Firmware update file could not be read (from firmware v5.1.40)                                                                                                                                                                   |   |



# Service Button

The Service (SVC) button provides a dedicated GPIO button (GPIO12) for the OS. Pressing the SVC button pulls the pin low. Conversely, releasing the button pulls the pin high.

# Reset Button

The Reset button is connected to the reset circuit. Pressing down the Reset button will send an initial signal to the system software, and holding the reset button low for approximately 4 seconds will cause a hard reset.

# microSD Slot

The XD234 and XD1034 have one microSD slot, which supports transfer modes up to UHS-1 DDR50 (50MB/s). There is no inherent limit on the storage capacity of microSD cards used with the player.

# Wireless Module

The XD234 and XD1034 have an internal M.2 slot (key E) for installing a compatible wireless module. The M.2 wireless module connects via cables to two external, attachable wireless antennas.

# SSD Module

The XD234 and XD1034 have an internal M.2 slot (key M) slot for PCIe (NVMe) SSD drives. See [this page](docId\:aEdGJ5B7OAO861a-oN62-) for a full list of SSD specifications.


[title] LS5 Environmental & Power
[path] Series 5 Players/Untitled/

# Environmental

The LS245 and LS445 are designed for sustained ambient temperatures between 0°C and 50°C, with transients up to 50°C (at 90% maximum relative humidity, non-condensing). Non-operational (transportation or storage) temperatures can range from -20°C to 85°C. Units should be allowed time to acclimate before being powered up.

Operating the players above 50°C ambient for prolonged periods may reduce the operational life of the product and result in intermittent resetting of the device.

:::hint{type="danger"}
Exposing a cold player to warm air at high relative humidity may cause water to condense inside the player, leading to component failure. Damage due to such internal condensation is not covered by warranty. If a player is cold, allow several hours for it to acclimatize to ambient conditions before applying power.
:::

# Power

The LS245 and LS445 are supplied with 12V\@1.5A power supply.


[title] LS5 Mounting
[path] Series 5 Players/Untitled/

Players can be mounted using the player's four mounting holes. Note that the player may have rubber plugs inserted in the mounting holes which must be removed before mounting.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LKUd1vqCnfbvL2DB-zpfs_image.png" size="50" width="840" height="770" position="center" caption="Remove the rubber plugs to access the mounting holes." showCaption="true"}

The mounting holes are compatible with the following screw sizes:

- Metric / ISO: M3.5 or M4
- US / Imperial: #6 or #8

:::hint{type="danger"}
Nails should not be used to mount the player.
:::


[title] XT5 Mounting
[path] Series 5 Players/Untitled/

Players can be mounted using the player's four mounting holes. Note that the player may have rubber plugs inserted in the mounting holes which must be removed before mounting.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LKUd1vqCnfbvL2DB-zpfs_image.png" size="50" width="840" height="770" position="center" caption="Remove the rubber plugs to access the mounting holes." showCaption="true"}

The mounting holes are compatible with the following screw sizes:

- Metric / ISO: M3.5 or M4
- US / Imperial: #6 or #8

:::hint{type="danger"}
Nails should not be used to mount the player.
:::


[title] HD5 Dimensions
[path] Series 5 Players/HD225, HD1025/

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/SSrC6yBABjbvnqzaVj6N0_praga-hd225-dimension2022-1025.png)


[title] XD5 Mounting
[path] Series 5 Players/XD235, XD1035/

Players can be mounted using the player's four mounting holes. Note that the player may have rubber plugs inserted in the mounting holes which must be removed before mounting.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LKUd1vqCnfbvL2DB-zpfs_image.png" size="50" width="840" height="770" position="center" caption="Remove the rubber plugs to access the mounting holes." showCaption="true"}

The mounting holes are compatible with the following screw sizes:

- Metric / ISO: M3.5 or M4
- US / Imperial: #6 or #8

:::hint{type="danger"}
Nails should not be used to mount the player.
:::


[title] XD235, XD1035
[path] Series 5 Players/

The BrightSign XD235 and XD1035 media players can be used to decode images, audio, and video (at video resolutions up to 3840x2160x60p) for digital-signage and kiosk applications. In addition to driving audio/video devices, these players can be controlled with various networked and built-in interfaces. The XD235 and XD1035 include a Real Time Clock (RTC) with a supercapacitor that backs up the clock settings when it is power cycled.

# Interfaces

## XD235

![XD235.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/CCAAIarQDwUs1Yv8AUCVd_xd235.png)

| **Front**                       | **Back**                        |
| ------------------------------- | ------------------------------- |
| WiFi antenna connector (1 of 2) | 12V\@3A power connector         |
| Audio out (combo, 3.5mm)        | Service button (SVC)            |
| IR in/out                       | Reset button (Reset)            |
| GPIO                            | HDMI® out                       |
| 4 Status LEDs                   | MicroSD card slot               |
| WiFi antenna connector (2 of 2) | PoE capable Ethernet (RJ45 LAN) |

## XD1035

![XD1035.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/s-I8KgdvO7pQ4C4abf4j2_xd1035.png)

| **Front**                       | **Back**                        |
| ------------------------------- | ------------------------------- |
| WiFi antenna connector (1 of 2) | 12V\@3A power connector         |
| 3.5mm audio out (combo)         | Service button (SVC)            |
| IR in/out                       | Reset button (Reset)            |
| 3.5mm serial                    | HDMI® out                       |
| GPIO                            | USB-C 2.0 port                  |
| 4 Status LEDs                   | USB-A 2.0 port                  |
| WiFi antenna connector (2 of 2) | MicroSD card slot               |
|                                 | PoE capable Ethernet (RJ45 LAN) |

# XD5 Hardware Manual (PDF)

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/Pc0uB0hvr6IAduaefVh0r-20260415-192530.pdf" label="XD5_manual.pdf"}


[title] XD5 Dimensions
[path] Series 5 Players/XD235, XD1035/

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/ZndxXYN25A1e-eVc-c37J_image2022-12-815-59-47.png)


[title] AU335 Hardware Interfaces
[path] Series 5 Players/Untitled/

This section describes the characteristics and operation of all connectors on the AU335.

## Ethernet

The AU335 has a connector for 100 Base-T networking. The maximum length for Cat 5E cable is 100 meters; the allowed length can be higher or lower depending on the quality of the cable.

802.1x is supported on the ethernet port, but not on USB-connected ethernet devices.

## Power Connector

The power connector for the AU335 is rated for 12V\@3A. The plug is a right-side positive, locking 2-pin (1x2) connector.

## HDMI

The AU335 has one standard micro-HDMI® connector.

Compressed or PCM audio can be routed over HDMI using ARC and eARC (Audio Return Channel and Enhanced Audio Return Channel). The ARC standard supports high-quality audio over an HDMI 2.1 connection (about 1Mb/second), and eARC supports a higher maximum audio bandwidth (37Mb/second), which allows users to send higher-quality audio.

The AU335 supports multichannel WAV files over the eARC interface, but not over the ARC interface. Sync is supported but Enhanced Sync is not, so users have to send a separate UDP trigger from a synchronized video wall to start audio on an AU335.

The HDMI Type D mini connector (ARC/eARC) delivers a standard 5V.

The HDMI eARC/ARC connection can also be used with CEC to send and receive commands. 

## GPIO Block

The AU335 has a 12-pin Phoenix GPIO port with 8 bi-directional GPIOs.

The GPIO port is a standard design manufactured by Phoenix Contact, Wurth Electronics, and others. Pluggable GPIO terminal blocks can be inserted into the GPIO connector to make bare-wire contacts (see [this page](https://www.digikey.com/short/3101mw) for an example part). These terminal blocks can be purchased from the [BrightSign Store](https://www.brightsign.biz/digital-signage-products/accessories/GPIO-terminal-block). If you wish to source your own terminal blocks, make sure to use 4-pin or 6-pin blocks (12-pin blocks are extremely difficult to remove from the GPIO port).

Connect the LED outputs to the LED ANODE and connect the LED CATHODE to the ground. If you want to connect another device, then the output is capable of sourcing or sinking up to 3.3V at 24mA, but there is a series resistor of 100Ω in each line.

The GPIO also allows for connecting of external contact closures to the ground. In order to connect a switch, connect one side of the switch to the switch input, and connect the other side to one of the ground pins on the GPIO connector. The connector can also supply 3.3V at up to 500mA to an external device. The 3.3V output is polyfuse-protected and can source up to 500mA.

If one BrightSign player is driving the inputs on another BrightSign player, then you can drive at most three inputs from one output. The following calculations explain this limitation:

:::hint{type="warning"}
The GPIO outputs have 100Ω series resistors; the GPIO inputs have 1K pullup resistors to 3.3V; and the input threshold is 2V high and .8V low. The high voltage is not problematic, but the low voltage can be if there are too many inputs connected to one output.
:::

|                    |                                                                                          |
| ------------------ | ---------------------------------------------------------------------------------------- |
| 1 out driving 1 in | V=3.3\*100/(100+1,000)=0.3                                                               |
| 1 out driving 2 in | V=3.3\*100/(100+500)=0.55                                                                |
| 1 out driving 3 in | V=3.3\*100/(100+333.3)=0.76                                                              |
| 1 out driving 4 in | V=3.3\*100/(100+250)=.94 (This is too high, so 1 output driving 3 inputs is the maximum) |

The following table describes the pinout of the GPIO on the AU335:

| Pin | Function | Pin | Function |
| --- | -------- | --- | -------- |
| 1   | GND      | 7   | GND      |
| 2   | 3.3V     | 8   | 3.3V     |
| 3   | BUTTON 0 | 9   | BUTTON 4 |
| 4   | BUTTON 1 | 10  | BUTTON 5 |
| 5   | BUTTON 2 | 11  | BUTTON 6 |
| 6   | BUTTON 3 | 12  | BUTTON 7 |

The following schematic illustrates the pinout of the GPIO connector:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/BFqOIW4cHRFs44Jw3w0yE_12-pin-gpio-pinout.png" size="80" width="817" height="376" position="center" darkWidth="817" darkHeight="376" showCaption="false"}

## Serial

The BrightSign AU335 audio-only player supports serial communication. However, the serial connection isn't a dedicated port - a USB-C to Serial converter cable is required to use a serial device with the AU335.&#x20;

:::hint{type="info"}
PN: CBL-USBC to USBA and 3.5mm Serial is only for LS3, LS4, and LS5 players. It will not provide serial connectivity to AU335 or other players.
:::

## Audio Output

The AU335 has one 3.5mm stereo mini jack for stereo audio output which delivers 1.6 volts peak to peak.  

The audio connector has the following pinout:

| Conductor | Signal        |
| --------- | ------------- |
| Tip       | Left Channel  |
| Ring      | Right Channel |
| Sleeve    | Audio Ground  |

## USB C Port

The AU335 has a USB 2.0 Type-C port, which is capable of transfer speeds up to 480 Mbit/s. The USB connector can supply up to 1A of power for peripherals. 

The USB also operates in host mode to update firmware on connected devices.


[title] HD5 Environmental & Power
[path] Series 5 Players/HD225, HD1025/

# Environmental

The HD225 and HD1025 are designed for sustained ambient temperatures between 0°C and 50°C, with transients up to 60°C (at 90% maximum relative humidity, non-condensing). Non-operational (transportation or storage) temperatures can range from -20°C to 85°C. Units should be allowed time to acclimate before being powered up.

Operating the players above 50°C ambient for prolonged periods may reduce the operational life of the product and result in intermittent resetting of the device.

:::hint{type="danger"}
Exposing a cold player to warm air at high relative humidity may cause water to condense inside the player, leading to component failure. Damage due to such internal condensation is not covered by warranty. If a player is cold, allow several hours for it to acclimatize to ambient conditions before applying power.
:::

# Power

The HD225 and HD1025 are supplied with 12V\@3A power supply.


[title] XT245, XT1145, XT2145
[path] Series 5 Players/

The BrightSign XT245, XT1145, and XT2145 media players can be used to decode images, audio, and video for digital-signage and kiosk applications. These players dramatically increase HTML performance, with full support for OpenGL. They also support multi-headed output and other applications. In addition to driving audio/video devices, these players can be controlled with various networked and built-in interfaces. These models include a Real Time Clock (RTC) with a supercapacitor that backs up the clock settings when it is power cycled.

# Interfaces

## XT245

![XT245final.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/6TI2guu0xB6u32yh9Hd8Z_xt245final.png)

| **Front**                                   | **Back**             |
| ------------------------------------------- | -------------------- |
| WiFi antenna connector (1 of 2)             | MicroSD card slot    |
| Audio out (combo, 3.5mm)                    | HDMI® out            |
| IR in/out (3.5 mm)                          | Service button (SVC) |
| GPIO                                        | Reset button (Reset) |
| 4 Status LEDs, also visible on the top case | PoE+Gigbit Ethernet  |
| 12V\@3A locking power connector             |                      |
| WiFi antenna connector (2 of 2)             |                      |

## XT1145

![XT1145final.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/WTp_A38SVBaqwsM6miOoA_xt1145final.png)

| **Front**                                   | **Back**             |
| ------------------------------------------- | -------------------- |
| WiFi antenna connector (1 of 2)             | MicroSD card slot    |
| Audio out (combo, 3.5mm)                    | HDMI in              |
| IR in/out (3.5 mm)                          | HDMI out             |
| Serial (3.5 mm)                             | USB-A 2.0 port       |
| GPIO                                        | USB-C port           |
| 4 Status LEDs, also visible on the top case | Service button (SVC) |
| 12V\@3A locking power connector             | Reset button (Reset) |
| WiFi antenna connector (2 of 2)             | PoE+Gigbit Ethernet  |

## XT2145

![XT2145final.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/Aye4F6YJn3K6HoM1HJNPu_xt2145final.png)

| **Front**                                   | **Back**             |
| ------------------------------------------- | -------------------- |
| WiFi antenna connector (1 of 2)             | MicroSD card slot    |
| Audio out (combo, 3.5 mm)                   | HDMI in              |
| IR in/out (3.5 mm)                          | HDMI out (2 outputs) |
| Serial (3.5 mm)                             | USB-A 2.0 port       |
| GPIO                                        | USB-C port           |
| 4 Status LEDs, also visible on the top case | Service button (SVC) |
| 12V\@3A locking power connector             | Reset button (Reset) |
| WiFi antenna connector (2 of 2)             | PoE+Gigbit Ethernet  |

# XT5 Hardware Manual (PDF)

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/FzC7zDo7g2TU5vWLsjeI1-20260415-191007.pdf" label="XT5_Manual.pdf"}


[title] XC5 Dimensions
[path] Series 5 Players/XC2055, XC4055/

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/K37k7sIuhWLQTQxQ_2Hii_brightsign-raptor-dimension2022-0607b.png)


[title] XT5 Dimensions
[path] Series 5 Players/Untitled/

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/UOXI4VlysonzLfpmuTWu__stratadimensions.png)


[title] HD6 Dimensions
[path] Series 6 Players/HD226, HD1026/

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/IgPKiecs_lLswxWRf4dru-20251022-220902.png)


[title] HD6 Mounting
[path] Series 6 Players/HD226, HD1026/

Players can be mounted using the player's four mounting holes. Note that the player may have rubber plugs inserted in the mounting holes which must be removed before mounting.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LKUd1vqCnfbvL2DB-zpfs_image.png" size="50" width="840" height="770" position="center" caption="Remove the rubber plugs to access the mounting holes." showCaption="true"}

The mounting holes are compatible with the following screw sizes:

- Metric / ISO: M3.5 or M4
- US / Imperial: #6 or #8

:::hint{type="danger"}
Nails should not be used to mount the player.
:::


[title] XD6 Mounting
[path] Series 6 Players/XD236, XD1036/

Players can be mounted using the player's four mounting holes. Note that the player may have rubber plugs inserted in the mounting holes which must be removed before mounting.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LKUd1vqCnfbvL2DB-zpfs_image.png" size="50" width="840" height="770" position="center" caption="Remove the rubber plugs to access the mounting holes." showCaption="true"}

The mounting holes are compatible with the following screw sizes:

- Metric / ISO: M3.5 or M4
- US / Imperial: #6 or #8

:::hint{type="danger"}
Nails should not be used to mount the player.
:::


[title] XS156 Mounting
[path] Series 6 Players/XS156 (BrightSign Built-in )/

The BrightSign Built-in should be mounted using three number M3 machine screws at the corners as shown in the diagram below. The fourth corner is supported by the M.2 host socket. It is important to select appropriate standoffs to match the height of the M.2 connector so that the PCB is parallel to the host PCB and not subject to mechanical stress.

:::hint{type="danger"}
Nails should not be used to mount the device.
:::

## BrightSign Built-in With Heatsink:

![](https://archbee-image-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-uVXKWlNWp0PGAmpYBC6jR-20250609-184512.png "Image 1")

## BrightSign Built-in Without Heatsink:

![](https://archbee-image-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-w8DGrnfI1fSnPybyshyam-20250609-184548.png "Image 2")


[title] XS156 (BrightSign Built-in)
[path] Series 6 Players/

This section describes XS156 (BrightSign Built-in) players.

The XS156 are BrightSign players in a flexible form factor, intended for integration with OEM commercial products. These modules are compatible with all BrightSign software, services, and supported CMS solutions.

# Interfaces (System I/O)

| **Type**       | **Description**                        |
| -------------- | -------------------------------------- |
| Power supply   | 12V (nominal)                          |
| Audio Out      | Analog stereo                          |
| SPDIF Out      | Digital audio                          |
| Ethernet       | 1000 BASE-T (excluding magnetics)      |
| SD/microSD     | 4-bit transfers, UHS-1 up to DDR50     |
| HDMI Out       | UHD 4K                                 |
| GPIO           | Four user-assignable signals           |
| USB 2.0 HS     |                                        |
| WiFi/Bluetooth | Keyed M.2 connector for WiFi/Bluetooth |
| IR In/Out      |                                        |
| UART           |                                        |

# XS6 Hardware Manual (PDF)

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/2C6edQxsBVjgqryt7aLGa-20260310-151113.pdf" label="XS6_Manual.pdf"}


[title] HD5 Mounting
[path] Series 5 Players/HD225, HD1025/

Players can be mounted using the player's four mounting holes. Note that the player may have rubber plugs inserted in the mounting holes which must be removed before mounting.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LKUd1vqCnfbvL2DB-zpfs_image.png" size="50" width="840" height="770" position="center" caption="Remove the rubber plugs to access the mounting holes." showCaption="true"}

The mounting holes are compatible with the following screw sizes:

- Metric / ISO: M3.5 or M4
- US / Imperial: #6 or #8

:::hint{type="danger"}
Nails should not be used to mount the player.
:::


[title] XS156 Environmental & Power
[path] Series 6 Players/XS156 (BrightSign Built-in )/

# Environmental

An XS156 with the thermally bonded aluminum plate design is designed for sustained ambient temperatures between 0°C and 50°C. An XS156 with the optional finned heatsink installed is designed for sustained ambient temperatures between 0°C and 40°C.&#x20;

Players should be allowed time to acclimate before being powered up.

Operating the respective players above 50°C/40°C ambient for prolonged periods may reduce the operational life of the product and result in intermittent resetting of the device.

:::hint{type="danger"}
Exposing a cold player to warm air at high relative humidity may cause water to condense inside the player, leading to component failure. Damage due to such internal condensation is not covered by warranty. If a player is cold, allow several hours for it to acclimatize to ambient conditions before applying power.
:::

# Power

The XS156 operates from a single input supply at nominal 12V +/- 10%. A remote shutdown input is provided.


[title] XD6 Hardware Interfaces
[path] Series 6 Players/XD236, XD1036/

This section describes the characteristics and operation of all connectors on the XD236 and XD1036.

# Ethernet/PoE

An RJ45 jack is provided for connection thatsupports 10/100/1000 Base-T operations, as well as Power over Ethernet (PoE). This ethernet connection delivers power on PoE type 2 and is rated to 25W, providing the upstream Ethernet power feed supports this higher power class.

A second RJ45 jack that supports 10/100/ Base-T operations provides a non-PoE network connection. It is intended to create an internal network amongst a number of screens for the purpose of screen identification and control. It is for screen control only (DNS relay is not supported). For examples of how this port can be used, see [this page](docId\:ipHfhbngquWhOd9kQEyF4).

802.1x is only supported on the primary ethernet port, and not on secondary ethernet ports or USB-connected ethernet devices.

# Power Connector

The power connector for the XD236/XD1036, which connects the power cord to the device, is rated for 12V @3A. When looking directly at the device's power socket, right-side positive power:

- Ground signal is the pin nearest to the edge of the product
- 12V power signal is the pin nearest the push buttons

# HDMI Output

The HDMI-out connector is used to send digital video and audio to HDMI-enabled sink devices. The HDM&#x49;**®** output on the XD236/XD1036 is HDMI 2.0a.CEC control is supported over the HDMI interface independently.

The XD236/XD1036 support HDR video as well as:

- 3840x2160x60p 10-bit video decode and display
- Dual 3840x2160x60p 10-bit video decode and playback
- 3840x2160x60p video rotation
- 3840x2160 graphics plane resolution support

# GPIO 

XD236/XD1036 players have a 12-pin GPIO switch and an LED connector, which allows the player to control external LEDs or other devices or other devices requiring 24mA of current or less.

The GPIO port is a standard design manufactured by Phoenix Contact, Wurth Electronics, and others. Pluggable GPIO terminal blocks can be inserted into the GPIO connector to make bare-wire contacts (see [here](https://digikey.com/en/products?keywords=elxp06100-nd) for an example part). These terminal blocks can be purchased from the [BrightSign Store](https://www.brightsign.biz/brightsign-players/accessories/). If you wish to source your own terminal blocks, make sure to use 4-pin or 6-pin blocks (12-pin blocks are extremely difficult to remove from the GPIO port).

Connect the LED outputs to the LED ANODE and connect the LED CATHODE to the ground. If you want to connect another device, then the output is capable of sourcing or sinking up to 3.3V at 24mA, but there is a series resistor of 100Ω in each line.

The GPIO also allows for connecting of external contact closures to the ground. In order to connect a switch, connect one side of the switch to the switch input, and connect the other side to one of the ground pins on the GPIO connector. The connector can also supply 3.3V at up to 500mA to an external device. The 3.3V output is polyfuse-protected and can source up to 500mA.

If one BrightSign player is driving the inputs on another BrightSign player, then you can drive at most three inputs from one output. The following calculations explain this limitation:

The GPIO outputs have 100Ω series resistors; the GPIO inputs have 1K pullup resistors to 3.3V; and the input threshold is 2V high and .8V low. The high voltage is not problematic, but the low voltage can be if there are too many inputs connected to one output.

|                    |                                                                                          |
| ------------------ | ---------------------------------------------------------------------------------------- |
| 1 out driving 1 in | V=3.3\*100/(100+1,000)=0.3                                                               |
| 1 out driving 2 in | V=3.3\*100/(100+500)=0.55                                                                |
| 1 out driving 3 in | V=3.3\*100/(100+333.3)=0.76                                                              |
| 1 out driving 4 in | V=3.3\*100/(100+250)=.94 (This is too high, so 1 output driving 3 inputs is the maximum) |

## GPIO Pinout

The following table illustrates the pinout of the GPIO on the XD236 and XD1036:

| **Pin** | **Function** | **Pin** | **Function** |
| ------- | ------------ | ------- | ------------ |
| 1       | GND          | 7       | GND          |
| 2       | 3.3V         | 8       | 3.3V         |
| 3       | BUTTON 0     | 9       | BUTTON 4     |
| 4       | BUTTON 1     | 10      | BUTTON 5     |
| 5       | BUTTON 2     | 11      | BUTTON 6     |
| 6       | BUTTON 3     | 12      | BUTTON 7     |

The following schematic illustrates the pinout of the GPIO connector.

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/AtCV33E1DuLBlBjgnrjbY-20251022-163821.png" size="74" width="2307" height="555" position="center" darkWidth="2307" darkHeight="555" showCaption="false"}

# IR Input / Output

The IR blaster generates or receives a space-encoded NEC or Pronto Hex signal. The two transported bit values of the signal (0 and 1) are encoded using differing lengths of low-time IR pulses.

The 3.5mm IR in/out port has the following pinout:

- **Tip**: 3.3V\@50mA
- **Ring**: IR Input
- **Sleeve**: IR Output

:::hint{type="warning"}
The sleeve is used as a ground during input operations.
:::

# Serial Input / Output

The XD1036 has a UART (asynchronous serial) interface in a 3.5 mm mini-jack that uses RS-232 levels for communication. This 3.5mm serial connector uses standard RS232 (signal) levels and polarities.

The default baud rate of the interface is 115200, with no parity, 8 data bits, and 1 stop bit. These settings can be configured in the software. The serial interface supports TX, RX, and ground only—RTS/CTS hardware flow control is not supported. The following diagram illustrates the behavior of the TX and RX signal:

::Image[]{src="https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/DAPwLCqqxp-7Tbks3Xqfe-20251022-170124.png" size="74" width="1692" height="510" position="center" darkWidth="1692" darkHeight="510" showCaption="false"}

The 3.5mm serial port has the following configuration (from the perspective of the player):

- **Tip**: Receive
- **Ring**: Transmit
- **Sleeve**: Ground

BrightSign players are DCE devices, so communication with another DCE device that uses a 3.5mm port would require a null-modem cable or converter that transposes the TX/RX signals. If the device communicating with the player is a DTE device with a DE9 serial port (performing asynchronous transmission), the serial cable should be wired as shown in the following diagram:

![](https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/A5cg53r1u3eL1LjI2fMwq-20251022-170649.png)

The XD236 does not support Serial I/O.

# Audio Connector

The XD236/XD1036 have a combination have a combination analog/optical audio jack. To transmit a digital audio signal, use a TOSLINK optical audio cable with a 3.5mm connector. Analog and digital audio cannot be transmitted simultaneously.

The full-scale voltage output of the analog audio is 2V RMS. The minimum load impedance is 32Ω.

The analog audio connector has the following pinout:

- **Tip**: Left audio
- **Ring**: Right audio
- **Sleeve**: Ground for audio signal

# USB

The XD1036 has one USB-A and one USB-C port to connect USB-compatible devices. The USB-C port supports both device and host mode and USB-C to any GPIO Panda device. Both ports meet USB 2.0 specifications.

The XD236 does not support USB ports.

# WiFi & Antennas

XD236/XD1036 players are equipped with an E-key M.2 connector which supports 2230 form factor M.2 cards for WiFi (PCIe interface) and Bluetooth\[CW1]  (USB interface) connectivity. The recommended card is sold separately as BrightSign WD-105 kit which includes two internal antenna cables and two external antennas which are fitted to the external SMA connectors. The internal cables are pre-attached to the card (IPEX4 MHF4 type) and must also be attached to the motherboard connectors (IPEX MHF 4L Type) behind the SMAs.&#x20;

# Cellular Modem

XD236/XD1036 players are fitted with a B-key M.2 connector which supports 4230 form factor M.2 cards for cellular modem (USB interface) connectivity. The recommended card is the Quectel EM05-G IoT/M2M-optimized LTE Cat 4 module. The external SMA connectors can be used to mount two 4G/5G antennas appropriate for the region of intended use. Two internal cables with appropriate connectors will need to be sourced to connect the card to the antennas.&#x20;

A nano size SIM card socket is located on the PCB Assembly. The player supports the EM05-G cellular module.

# SSD Interface&#x20;

XD236/XD1036 players will accept NVMe SSDs in M.2 2242 or 2280 (but not 2260) form factors of SX id type (single-sided form factor). Double-sided drives (DX id type)\* will not fit because the back side of the SSD is essentially flush against the motherboard. For example, a 2280-S1 module will fit a BrightSign player but a 2280-D2 module would not.

NVMe drives with heat sinks are not compatible with our players.
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

\*D4 drives may fit but have not been tested


[title] Series 6 Players
[path] /

Our latest line of media players. Information is organized by the categories below (also in the left panel).

## [HD226, HD1026](docId\:xCDtRnDDF8JICB4FIIc6D)

::Image[]{src="https://www.brightsign.biz/wp-content/uploads/2025/07/Series-6_HD6_265x272px_reflection_v2.png" size="40" width="265" height="272" isUploading="false" darkWidth="265" darkHeight="272" showCaption="false"}

## [XD236, XD1036](docId:7clQwcavABGPvY0GjvTg3)

::Image[]{src="https://www.brightsign.biz/wp-content/uploads/2025/07/Series-6_XD6_265x272px_reflection_v2.png" size="40" width="265" height="272" isUploading="false" darkWidth="265" darkHeight="272" showCaption="false"}

## [XS156 (BrightSign Built-in)](docId\:ZKgjM0EJ088XJijOibA5j)

::Image[]{src="https://www.brightsign.biz/wp-content/uploads/2025/12/xs6-updated-1200x600-1-750x440.png" size="60" width="750" height="440" isUploading="false" darkWidth="750" darkHeight="440" showCaption="false"}


[title] XT5 Theory of Operation
[path] Series 5 Players/Untitled/

This section describes how specific components operate on the XT245, XT1145, and XT2145.

# On-Board LEDs

The four on-board LEDs have the following indicators:

| **LED**                              | **Indication**                                                                                               |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------ |
|  Green power (**Pwr**)               | Displays when the board is powered up and not in reset mode. Flashes during the firmware update process.     |
| Green file-system activity (**Bsy**) | Flashes any time there is file-system activity (on any storage device)                                       |
| Blue WiFi (**WiFi icon**)            | Flashes when the board is being updated                                                                      |
| Red status (**Err**)                 | Flashes a certain number of times to indicate which error is occurring. The flash codes are described below. |
|                                      | 2: Unspecified error                                                                                         |
|                                      | 3: Network recovery script is preparing to run on a device configured for network recovery.                  |
|                                      | 4: No upgrade file found                                                                                     |
|                                      | 5: Failed to load kernel module                                                                              |
|                                      | 6: Board is not capable of running the current firmware version                                              |
|                                      | 7: A piece of on-board hardware is not working correctly.                                                    |
|                                      | 8: Problem related to the storage device (either the USB drive or microSD card)                              |
|                                      | 9: Problem related to the registry/NAND                                                                      |
|                                      | 10: The autorun script encountered a load/run error.                                                         |
|                                      | 11: WiFi-related error                                                                                       |
|                                      | 12: Unable to find a bootable image                                                                          |

# On-Board Switch / SVC Button

The on-board switch is connected to the GPIO02, which is pulled low when the service (SVC) button is pressed. Conversely, a pull-up on the button normally sets the GPIO02 to be pulled high.

# Reset Switch / GPIO Button

The on-board switch is connected to the reset circuit. Pressing down the reset button will send an initial signal to the system software and holding the reset button low for approximately four seconds will cause a hard reset.

# microSD Slot

The XT245, XT1145, and XT2145 have one MicroSD slot, which supports transfer modes up to UHS-1 DDR50 (50Mbit/s). There is a 2TB limit on the storage capacity of microSD cards used with the player.

# Wireless Module

The XT245, XT1145, and XT2145 have a dual antenna connection. This allows users to install a compatible wireless module without disassembling the unit. This connection has a Bluetooth option.


[title] XD5 Hardware Interfaces
[path] Series 5 Players/XD235, XD1035/

This section describes the characteristics and operation of all connectors on the XD235 and XD1035.

# Ethernet / PoE

A single RJ45 jack is provided for connection that supports 10/100/1000 Base-T operations, as well as Power over Ethernet (PoE). 

This ethernet connection delivers power on PoE Type 1 at up to 12.95W and as PoE Type 2 (PoE+) at up to 25.5W to the XD235 and/or XD1035 units.

802.1x is supported on the ethernet port, but not on USB-connected ethernet devices.

# Power Connector

The power connector for the XD235 and XD1035, which connects the power cord to the device, is rated for 12V @3A. The plug is a right-side positive, locking 2-pin (1x2) connector.

# HDMI Output

The HDM&#x49;**®**-out connector is used to send digital video and audio to HDMI-enabled sink devices. The HDMI output on the XD235 and XD1035 is HDMI 2.0a. CEC control is supported over the HDMI interface independently. This connector can output a maximum video resolution of 3840x2160x60p. 

The XD235 and XD1035 support HDR video, video rotation at 2160x3840x60p, and at least two simultaneous 1920x1080x60p decodes. 

# GPIO 

The XD235 and XD1035 have a 12-pin GPIO switch and an LED connector, which allows the player to control external LEDs or other devices. The port can supply 3.3V\@300mA to PWR pins and sink or source 24mA on each button pin. Auxiliary power is 1A.

The GPIO port is a standard design manufactured by Phoenix Contact, Wurth Electronics, and others. Pluggable GPIO terminal blocks can be inserted into the GPIO connector to make bare-wire contacts (see [here](https://www.digikey.com/short/3101mw) for an example part). These terminal blocks can be purchased from the [BrightSign Store](https://www.brightsign.biz/digital-signage-products/accessories/GPIO-terminal-block). If you wish to source your own terminal blocks, make sure to use 4-pin or 6-pin blocks (12-pin blocks are extremely difficult to remove from the GPIO port).

Connect the LED outputs to the LED ANODE and connect the LED CATHODE to the ground. If you want to connect another device, then the output is capable of sourcing or sinking up to 3.3V at 24mA, but there is a series resistor of 100Ω in each line.

The GPIO also allows for connecting of external contact closures to the ground. In order to connect a switch, connect one side of the switch to the switch input, and connect the other side to one of the ground pins on the GPIO connector.

If one BrightSign player is driving the inputs on another BrightSign player, then you can drive at most three inputs from one output. The following calculations explain this limitation:

The GPIO outputs have 100Ω series resistors; the GPIO inputs have 1K pullup resistors to 3.3V; and the input threshold is 2V high and .8V low. The high voltage is not problematic, but the low voltage can be if there are too many inputs connected to one output.

|                    |                                                                                          |
| ------------------ | ---------------------------------------------------------------------------------------- |
| 1 out driving 1 in | V=3.3\*100/(100+1,000)=0.3                                                               |
| 1 out driving 2 in | V=3.3\*100/(100+500)=0.55                                                                |
| 1 out driving 3 in | V=3.3\*100/(100+333.3)=0.76                                                              |
| 1 out driving 4 in | V=3.3\*100/(100+250)=.94 (This is too high, so 1 output driving 3 inputs is the maximum) |

## GPIO Pinout

The following table illustrates the pinout of the GPIO on the XD235 and XD1035:

| Pin | Function | Pin | Function |
| --- | -------- | --- | -------- |
| 1   | GND      | 7   | GND      |
| 2   | 3.3V     | 8   | 3.3V     |
| 3   | BUTTON 0 | 9   | BUTTON 4 |
| 4   | BUTTON 1 | 10  | BUTTON 5 |
| 5   | BUTTON 2 | 11  | BUTTON 6 |
| 6   | BUTTON 3 | 12  | BUTTON 7 |

The following schematic illustrates the pinout of the GPIO connector:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/bOqfZKt4fwc2czOW-toK5_12-pin-gpio-pinout.png" size="68" width="817" height="376" position="center" darkWidth="817" darkHeight="376" showCaption="false"}

# IR Input / Output

The IR blaster can transmit and receive a variety of common Consumer-IR formats including NEC and RC5. RC5 encoding is also supported. The two transported bit values of the signal (0 and 1) are encoded using differing lengths of low-time IR pulses.

The 3.5mm IR in/out port has the following pinout:

- **Tip**: 3V\@50mA
- **Ring**: IR Input
- **Sleeve**: IR Output/GND

For IR transmit:

- **Tip**: 3V\@50mA
- **Ring**: Not used
- **Sleeve**: IR Output

For IR receive:

- **Tip**: 3V\@50mA
- **Ring**: IR Input
- **Sleeve**: GND

# Serial

The XD1035 has a UART (asynchronous serial) interface in a 3.5mm mini-jack. This 3.5mm serial connector uses standard RS232 (signal) levels and polarities.&#x20;

The default baud rate of the interface is 115200, with no parity, 8 data bits, and 1 stop bit. These settings can be configured in the software. The serial interface supports TX, RX, and ground only—RTS/CTS hardware flow control is not supported. The following diagram illustrates the behavior of the TX and RX signal:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/_2giwGZ4CQeJBkDZRiG8S_image1.png" size="82" width="1370" height="491" position="center" darkWidth="1370" darkHeight="491" showCaption="false"}

This 3.5mm serial port has the following configuration (from the perspective of the player):

- **Tip**: Receive
- **Ring**: Transmit
- **Sleeve**: Ground

BrightSign players are DCE devices, so communication with another DCE device that uses a 3.5mm port would require a null-modem cable or converter that transposes the TX/RX signals. The diagram below shows how to provide a DE9 connector to the player (for example, the kind you would normally have on a PC):

![](https://archbee-image-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-H48J_-QGhzMbDSFCKH_wH-20250715-001054.png)

:::hint{type="info"}
For detailed Serial Adaptor instructions see this PDF:

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/Aiw58-3NpdDpGlgjiVvLS-38MXQCbkbYrwgYZ6jWmqe-20250714-224638.pdf" label="BrightSign Serial Adaptor Instructions_female.pdf"}
:::

# Audio Connector

The XD235 and XD1035 have a 3.5mm combination analog/optical audio jack. To transmit a digital audio signal, use a TOSLINK optical audio cable with a 3.5mm connector. Analog and digital audio cannot be transmitted simultaneously.

The full-scale voltage output of the analog audio is 2V RMS. The minimum load impedance is 32Ω.

The analog audio connector has the following pinout:

- **Tip**: Left audio
- **Ring**: Right audio
- **Sleeve**: Ground for audio signal

# USB

The XD1035 has one USB-A and one USB-C port to connect USB-compatible devices. The USB-C port supports both device and host mode and USB-C to any GP800-C device. Both ports meet USB 2.0 specifications.

The XD235 does not support USB ports.

# WiFi & Antennas

The XD235 and XD1035 models come equipped with an M.2 connector slot and two SMT-mounted SMA connectors. The M.2 slot supports M.2 PCIe cards for WiFi and Bluetooth connectivity (sold separately), while the SMA connectors facilitate the connection of external antennas.

# SSD Interface

XD5 players will accept NVMe SSDs in M.2 2242 or 2280 (but not 2260) form factors of SX id type (single-sided form factor). Double-sided drives (DX id type)\* will not fit because the back side of the SSD is essentially flush against the motherboard. For example, a 2280-S1 module will fit a BrightSign player but a 2280-D2 module would not.

NVMe drives with heat sinks are not compatible with our players.
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_

\*D4 drives may fit but have not been tested


[title] XD5 Environmental & Power
[path] Series 5 Players/XD235, XD1035/

# Environmental

The XD235 and XD1035 are designed for sustained ambient temperatures between 0°C and 50°C, with transients up to 60°C (at 90% maximum relative humidity, non-condensing). Non-operational (transportation or storage) temperatures can range from -20°C to 85°C. Units should be allowed time to acclimate before being powered up.

Operating the players above 50°C ambient for prolonged periods may reduce the operational life of the product and result in intermittent resetting of the device.

:::hint{type="danger"}
Exposing a cold player to warm air at high relative humidity may cause water to condense inside the player, leading to component failure. Damage due to such internal condensation is not covered by warranty. If a player is cold, allow several hours for it to acclimatize to ambient conditions before applying power.
:::

# Power

## Power Adapter

The XD235 and XD1035 are supplied with 12V\@3A power supply.

An additional 2A of power is available for peripherals connected to the player. The user should not connect any combination of peripherals that will exceed 2A draw. If more than 2A is drawn, the external power supply may shut down due to over-current conditions. The unit will not be damaged, but it may reboot or not operate properly until the overload is removed.

If the device is being powered by the power supply, the 2A can be shared in any way among the following connectors:

| **Connector**                    | **Maximum Power Usage**                                                  |
| -------------------------------- | ------------------------------------------------------------------------ |
| RJ-45                            | Approx. 180mA (when transferring data)                                   |
| USB 2.0 (Type C)                 | 1A                                                                       |
| USB 2.0 (Type A)                 | 1.5A                                                                     |
| GPIO 3.3V                        | 500mA                                                                    |
| HDMI® 5V                         | 70mA                                                                     |
| IR blaster output                | 85mA                                                                     |
| M.2 Wi-Fi Module, M.2 SSD Module | 3V3 - The combined power of these expansion ports should not exceed 3.5A |

## PoE Type 1 

When the player is powered via Type 1 PoE, the total available power is reduced to 12W. This means that each USB port supplies 100mA of power (one unit load for USB 2.0). This is sufficient for low-power devices such as memory sticks and mice. High-power devices such as hard disks will not operate.


[title] XD5 Theory of Operation
[path] Series 5 Players/XD235, XD1035/

This section describes how specific components operate on the XD235 and XD1035.

# On-Board LEDs

The four on-board LEDs have the following indicators:

| LED                                  | Indication                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Green power (**Pwr**)                | Displays when the board is powered up and not in reset mode. Flashes during firmware update process.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| Green file-system activity (**Bsy**) | Flashes any time there is file-system activity (on any storage device)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| Blue (**WiFi**)                      | Flashes when the player is connecting to the wireless network. Displays solid when connected.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| Red status (**Err**)                 | Flashes a certain number of times to indicate which error is occurring. The flash codes are described below:<br /><br />2: Unspecified error<br />3: Network recovery script is preparing to run on a device configured for network recovery<br />4: No upgrade file found<br />5: Failed to load kernel module<br />6: Board is not capable of running the current firmware version<br />7: A piece of on-board hardware is not working correctly<br />8: Problem related to the storage device (either the USB drive or MicroSD card)<br />9: Problem related to the registry/NAND<br />10: The autorun script encountered a load/run error<br />11: WiFi-related error<br />12: Unable to find bootable image |

# On-Board Switch / SVC Button

The Service (SVC) button provides a dedicated GPIO button (GPIO12) for the OS. Pressing the SVC button pulls the pin low. Conversely, releasing the button pulls the pin high.

# Reset Switch / GPIO Button

The Reset button is connected to the reset circuit. Pressing the Reset button will send an initial signal to the system software and holding the reset button low for approximately 4 seconds will cause a hard reset.

# microSD Slot

The XD235 and XD1035 each have one MicroSD slot, which supports transfer modes up to UHS-1 DDR50 (50MB/s). There is a 2TB limit on the storage capacity of microSD cards used with the player.

# Wireless Module

The XD235 and XD1035 have a dual antenna connection which allows users to install a BrightSign wireless module. BrightSign modules are configured to work with 802.11.N or 802.11.AC access points.

This connection has a Bluetooth option.


[title] Series 5 Players
[path] /

Our recent line of media players. Information is organized by the categories below (also in the left panel).

# [Feature Matrix](docId\:UXM-8f_TBrjsi9eMIRH_N)

Table showing the features for each family of players.

# [XC2055, XC4055](docId\:bmcSIi3GGR_V3sLgMy3JQ)&#x20;

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/PUvQWv5h5r6DWrpYvHx6i_image.png" size="30" width="265" height="272" position="center" showCaption="false"}

# [XT245, XT1145, XT2145](docId:2d7PN4WjHfcUzOZv4HpEC)

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/VHCdxGfRLngzF5Qmu98m7_image.png" size="30" width="265" height="272" position="center" showCaption="false"}

# [XD235, XD1035](docId\:xnejHxptpLVtKbEFdM_hh)

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/8oKE7T7rljLbryUvULq7k_image.png" size="30" width="265" height="272" position="center" showCaption="false"}

# [HD225, HD1025](docId\:DZ8UJpB7Vq4yF3I-KqGE8)

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LzkkkV0HNDjJHYdAJtD-1_image.png" size="30" width="265" height="272" position="center" showCaption="false"}

# [LS425, LS445](docId:5w6CC1T3BMfHtL-ZfgLFc)

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/_bS_01lWF_AROkosLjfKI_image.png" size="30" width="265" height="272" position="center" showCaption="false"}

# [AU335](docId:-PazRfEWUZnKOl9hEgrJ1)

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/Zy8d6d6vIKzBi6lNxo2C9_image.png" size="30" width="265" height="272" position="center" showCaption="false"}


[title] AU335 Environmental and Power Usage
[path] Series 5 Players/Untitled/

The AU335 is designed to be used between 0°C and 50°C at 90% maximum relative humidity, non-condensing, with transients up to 55°C (at 90% maximum relative humidity, non-condensing).

The AU335 requires a power supply at 12V +/- 10%.


[title] XC5 Mounting
[path] Series 5 Players/XC2055, XC4055/

Players can be mounted using the player's four mounting holes. Note that the player may have rubber plugs inserted in the mounting holes which must be removed before mounting.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LKUd1vqCnfbvL2DB-zpfs_image.png" size="50" width="840" height="770" position="center" caption="Remove the rubber plugs to access the mounting holes." showCaption="true"}

The mounting holes are compatible with the following screw sizes:

- Metric / ISO: M3.5 or M4
- US / Imperial: #6 or #8

:::hint{type="danger"}
Nails should not be used to mount the player.
:::


[title] XC5 Windows
[path] Series 5 Players/XC2055, XC4055/

The below XC5 models are available with Windows 11 or Windows 10 pre-installed:

XC2055-Win10
XC2055-Win11
XC4055-Win10
XC4055-Win11

The hardware specs for these players are identical to their corresponding BrightSignOS player. For example, the Windows-based XC2055-Win11 player has the same hardware specs as the BrightSignOS-based XC2055 player.

:::hint{type="warning"}
**Important note**: XC Windows players come with an M.2 SSD on which Windows is installed. Since there is only one M.2 slot, no additional M.2 SSDs can be installed.
:::

Answers to frequently asked questions regarding this product can be found in the [XC Windows FAQ](docId\:jVIRiK7eBr1a_Qo_1TfeO).

[title] LS424 Theory of Operation
[path] Untitled/Untitled/

This section describes how specific components operate on the LS424.

# On-Board LEDs

The LS424 has a single red LED to indicate that the power is on. The LED will flash during the firmware update process. It will also flash a certain number of times to indicate an error state. The flash codes are described below:

| **Flash code** | **Description**                                                                                                                                                                                                                  |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 2              | Unspecified error                                                                                                                                                                                                                |
| 3              | Network recovery script is preparing to run on a device configured for network recovery.                                                                                                                                         |
| 4              | No upgrade file found.                                                                                                                                                                                                           |
| 5              | Failed to load kernel module.                                                                                                                                                                                                    |
| 6              | Board is not capable of running the current firmware version.                                                                                                                                                                    |
| 7              | A piece of on-board hardware is not working correctly.                                                                                                                                                                           |
| 8              | Problem related to the storage device (either the USB drive or microSD card)                                                                                                                                                     |
| 9              | Problem related to the registry/NAND                                                                                                                                                                                             |
| 10             | The autorun script encountered a load/run error.                                                                                                                                                                                 |
| 11             | WiFi-related error                                                                                                                                                                                                               |
| 12             | Unable to find a bootable image.                                                                                                                                                                                                 |
| 13             | The root file system has failed verification, which is used to detect whether the file system has been tampered with. You can recover a player that is showing this error code by performing a firmware update with secure boot. |
| 14             | Boot loader failure                                                                                                                                                                                                              |

# Service Button

The Service (SVC) button provides a dedicated GPIO button (GPIO12) for the OS. Pressing the SVC button pulls the pin low. Conversely, releasing the button pulls the pin high.

# Reset Button

The Reset button is connected to the reset circuit. Pressing down the Reset button will send an initial signal to the system software, and holding the reset button low for approximately 4 seconds will cause a hard reset.

# microSD Slot

The LS424 has one microSD slot, which supports transfer modes up to UHS-1 DDR50 (50MB/s). There is no inherent limit on the storage capacity of microSD cards used with the player.

# Wireless Module

The LS424 has an internal M.2 slot for installing a compatible wireless module. The M.2 wireless module connects via cable to an external, attachable wireless antenna.


[title] HD224, HD1024
[path] Untitled/

The BrightSign HD224 and HD1024 media players can be used to decode images, audio, and video (at resolutions up to 3840x2160x60p) for digital-signage and kiosk applications. In addition to driving audio/video devices, these players can be controlled with various networked and built-in interfaces.

This manual specifies the hardware interfaces and operational theory of the HDx24 series.

# Block Diagram

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/cgYXZgaP0dQc7hvpZu4Xf_block-diagram-paganirevd.png)

# Interfaces

## HD224

| **Front**                        | **Back**               |
| -------------------------------- | ---------------------- |
| RJ45 LAN                         | WiFi antenna connector |
| microSD card slot                | 3.5mm IR in/out        |
| HDMI® out                        | 3.5mm audio out        |
| Service button (SVC)             | GPIO (12 pins)         |
| Reset button (Reset)             | Status LEDs            |
| 12V\@1.5A barrel power connector |                        |

## HD1024

| **Front**                        | **Back**               |
| -------------------------------- | ---------------------- |
| RJ45 LAN                         | WiFi antenna connector |
| microSD card slot                | 3.5mm audio out        |
| HDMI out                         | 3.5mm IR in/out        |
| USB 2.0 (Type A connector)       | 3.5mm RS-232 serial    |
| Service button (SVC)             | GPIO (12 pins)         |
| Reset button (Reset)             | Status LEDs            |
| 12V\@1.5A barrel power connector |                        |

# HD4 Hardware Manual (PDF)

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/zDVRN1Ae_c6ao7F3UL3GK-20260316-172702.pdf" label="HD4_Manual.pdf"}


[title] XTx44 Theory of Operation
[path] Untitled/Untitled/

This section describes how specific components operate on the XT244 and XT1144.

# On-Board LEDs

There are four on-board LEDs that indicate the following:

| **LED**                              | **Indication**                                                                                                                                                                                                                       |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Green power (**Pwr**)                | Displays when the board is powered up and not in reset mode. Flashes during the firmware update process.                                                                                                                             |
| Green file-system activity (**Bsy**) | Flashes any time there is file-system activity (on any storage device)                                                                                                                                                               |
| Blue WiFi (**WiFi icon**)            | Flashes when the player is connecting to the wireless network. Displays when connected.                                                                                                                                              |
| Red status (**Err**)                 | Flashes a certain number of times to indicate which error is occurring. The flash codes are described below:                                                                                                                         |
|                                      | 2: Unspecified error                                                                                                                                                                                                                 |
|                                      | 3: Network recovery script is preparing to run on a device configured for network recovery.                                                                                                                                          |
|                                      | 4: No upgrade file found.                                                                                                                                                                                                            |
|                                      | 5: Failed to load kernel module.                                                                                                                                                                                                     |
|                                      | 6: Board is not capable of running the current firmware version.                                                                                                                                                                     |
|                                      | 7: A piece of on-board hardware is not working correctly.                                                                                                                                                                            |
|                                      | 8: Problem related to the storage device (either the USB drive or microSD card)                                                                                                                                                      |
|                                      | 9: Problem related to the registry/NAND                                                                                                                                                                                              |
|                                      | 10: The autorun script encountered a load/run error.                                                                                                                                                                                 |
|                                      | 11: WiFi-related error                                                                                                                                                                                                               |
|                                      | 12: Unable to find a bootable image.                                                                                                                                                                                                 |
|                                      | 13: The root file system has failed verification, which is used to detect whether the file system has been tampered with. You can recover a player that is showing this error code by performing a firmware update with secure boot. |
|                                      | 14: Boot loader failure                                                                                                                                                                                                              |
| Red alternate                        | The red status LED may give one long initial flash to preface an alternate code, described below:                                                                                                                                    |
|                                      | 2: Erase failed                                                                                                                                                                                                                      |
|                                      | 3: Write failed                                                                                                                                                                                                                      |
|                                      | 4: Verify failed                                                                                                                                                                                                                     |
|                                      | 5: Failed to find UBI partition                                                                                                                                                                                                      |
|                                      | 6: Attempt to write unsigned CFE to unit with secure boot enabled                                                                                                                                                                    |
|                                      | 7: Failed to find UBI partition                                                                                                                                                                                                      |
|                                      | 8: Failed to create/attach UBI partition                                                                                                                                                                                             |
|                                      | 9: Unexpected error                                                                                                                                                                                                                  |
|                                      | 10: Upgrade script exited abnormally                                                                                                                                                                                                 |
|                                      | 11: Upgrade took longer than expected                                                                                                                                                                                                |
|                                      | 12: Update completed but update file could not be deleted                                                                                                                                                                            |
|                                      | 13: Firmware update file could not be read (from firmware v5.1.40)                                                                                                                                                                   |



# Service Button

The Service (SVC) button provides a dedicated GPIO button (GPIO12) for the OS. Pressing the SVC button pulls the pin low. Conversely, releasing the button pulls the pin high.

# Reset Button

The Reset button is connected to the reset circuit. Pressing down the Reset button will send an initial signal to the system software, and holding the reset button low for approximately 4 seconds will cause a hard reset.

# microSD Slot

The XT244 and XT1144 have one microSD slot, which supports transfer modes up to UHS-1 DDR50 (50MB/s). There is no inherent limit on the storage capacity of microSD cards used with the player.

# Wireless Module

The XT244 and XT1144 have an internal M.2 (key E) slot for installing a compatible wireless module. The M.2 wireless module connects via cables to two external, attachable wireless antennas.

# SSD Module

The XT244 and XT1144 have an internal M.2 slot (key M) slot for PCIe (NVMe) SSD drives. See [this page](docId\:aEdGJ5B7OAO861a-oN62-) for a full list of SSD specifications.


[title] XDx34 Environmental & Power
[path] Untitled/Untitled/

# Environmental

The XD234 and XD1034 are designed for sustained ambient temperatures between 0°C and 50°C, with transients up to 70°C (at 90% maximum relative humidity, non-condensing). Operating the players above 50°C ambient for prolonged periods may reduce the operational lifetime of the product.

:::hint{type="danger"}
Exposing a cold player to warm air at high relative humidity may cause water to condense inside the player, leading to component failure. Damage due to such internal condensation is not covered by warranty. If a player is cold, allow several hours for it to acclimatize to ambient conditions before applying power.
:::

# Power

The power supply for the XD234 and XD1034 is 36W (12V\@3A). The device will use approximately 1A of power when playing a 4096x2160x60p H.265 (HEVC) source file.

An additional 2A of power is available for peripherals connected to the player. The user should not connect any combination of peripherals that will exceed 2A draw. If more than 2A is drawn, the external power supply may shut down due to over-current conditions. The unit will not be damaged, but it may reboot or not operate properly until the overload is removed.

If the device is being powered by the power supply, the 2A can be shared in any way among the following connectors:

| **Connector**     | **Maximum Power Usage**                |
| ----------------- | -------------------------------------- |
| RJ-45             | Approx. 180mA (when transferring data) |
| USB 2.0 (Type C)  | 1A                                     |
| USB 2.0 (Type A)  | 1.5A                                   |
| GPIO 3.3V         | 500mA                                  |
| HDMI® 5V          | 70mA                                   |
| IR blaster output | 85mA                                   |


[title] XDx34 Hardware Interfaces
[path] Untitled/Untitled/

This section describes the characteristics and operation of all connectors on the XD234 and XD1034.

# Ethernet&#x20;

The RJ45 connector on the XDx34 series supports 1000BASE-T networking.

The maximum length for Cat 5E cable is 100 meters; the allowed length can be higher or lower depending on the quality of the cable.

802.1x is supported on the ethernet port, but not on USB-connected ethernet devices.

# Power Connector

The power connector for the XD234 and XD1034 is rated for 12V\@3A. The plug is a right-side positive, locking 2-pin (1x2) connector.

# 3.5mm Serial 

The UART (asynchronous serial) interface is a 3.5mm (1/8") jack that uses RS-232 levels for communication. The receiver will tolerate input voltages between -30V and +30V, with anything below 3V interpreted as a logical 1. The transmitter drives +8V for logical 0 and -8V for logical 1. 

The default baud rate of the interface is 115200, with no parity, 8 data bits, and 1 stop bit. These settings can be configured in the software. The serial interface supports TX, RX, and ground only—RTS/CTS hardware flow control is not supported. The following diagram illustrates the behavior of the TX and RX signal:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/QM3wErZGFlxFL1Hcvr____bit-diagram1.png" size="90" width="777" height="230" position="center" darkWidth="777" darkHeight="230" showCaption="false"}

The 3.5mm serial port has the following configuration (from the perspective of the player):

- **Tip**: Receive
- **Ring**: Transmit
- **Sleeve**: Ground

BrightSign players are DCE devices, so communication with another DCE device that uses a 3.5mm port would require a null-modem cable or converter that transposes the TX/RX signals. If the device communicating with the player is a DTE device with a DE9 serial port (performing asynchronous transmission), the serial cable should be wired as shown in the following diagram:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/ae0Tk8V1L32P8QMfFKyog_35mm-serial-cable-diagram.png" size="90" width="979" height="331" position="center" darkWidth="979" darkHeight="331" showCaption="false"}

# GPIO

The XD234 and XD1034 have a 12-pin GPIO switch and LED connector, which allows the player to control external LEDs or other devices requiring 24mA of current or less.

The GPIO port is a standard design manufactured by Phoenix Contact, Wurth Electronics, and others. Pluggable GPIO terminal blocks can be inserted into the GPIO connector to make bare-wire contacts (see [here](https://www.digikey.com/short/3101mw) for an example part). These terminal blocks can be purchased from the [BrightSign Store](https://www.brightsign.biz/digital-signage-products/accessories/GPIO-terminal-block). If you wish to source your own terminal blocks, make sure to use 4-pin or 6-pin blocks (12-pin blocks are extremely difficult to remove from the GPIO port).

Connect the LED outputs to the LED ANODE and connect the LED CATHODE to the ground. If you want to connect another device, then the output is capable of sourcing or sinking up to 3.3V at 24mA, but there is a series resistor of 100Ω in each line.

The GPIO also allows for connecting of external contact closures to the ground. In order to connect a switch, connect one side of the switch to the switch input, and connect the other side to one of the ground pins on the GPIO connector. The connector can also supply 3.3V at up to 500mA to an external device. The 3.3V output is polyfuse-protected and can source up to 500mA.

If one BrightSign player is driving the inputs on another BrightSign player, then you can drive at most three inputs from one output. The following calculations explain this limitation:

:::hint{type="warning"}
The GPIO outputs have 100Ω series resistors; the GPIO inputs have 1K pullup resistors to 3.3V; and the input threshold is 2V high and .8V low. The high voltage is not problematic, but the low voltage can be if there are too many inputs connected to one output.
:::

|                    |                                                                                          |
| ------------------ | ---------------------------------------------------------------------------------------- |
| 1 out driving 1 in | V=3.3\*100/(100+1,000)=0.3                                                               |
| 1 out driving 2 in | V=3.3\*100/(100+500)=0.55                                                                |
| 1 out driving 3 in | V=3.3\*100/(100+333.3)=0.76                                                              |
| 1 out driving 4 in | V=3.3\*100/(100+250)=.94 (This is too high, so 1 output driving 3 inputs is the maximum) |

## GPIO Pinout

The following table describes the pinout of the GPIO on the XD234 and XD1034: 

| **Pin** | **Function** | **Pin** | **Function** |
| ------- | ------------ | ------- | ------------ |
| 1       | GND          | 7       | GND          |
| 2       | 3.3V         | 8       | 3.3V         |
| 3       | BUTTON 0     | 9       | BUTTON 4     |
| 4       | BUTTON 1     | 10      | BUTTON 5     |
| 5       | BUTTON 2     | 11      | BUTTON 6     |
| 6       | BUTTON 3     | 12      | BUTTON 7     |

The following schematic illustrates the pinout of the GPIO connector:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/YZvsqtr9AvZyOPjPQudaC_12-pin-gpio-pinout.png" size="80" width="817" height="376" position="center" darkWidth="817" darkHeight="376" showCaption="false"}

## Example Diagrams

The following example diagrams demonstrate how LED buttons can be wired to the GPIO connector (in both 1- and 4-button configurations):

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/WH6o9C5ntR1TAy_gx7x5-_phoenix-4buttons-rev-b.pdf" label="phoenix_4buttons_(rev_b).pdf" isUploading="false"}

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/NqIXC9ybcH_tdM3mgxA2V_phoenix-1button-half-rev-b.pdf" label="phoenix_1button_half_(rev_b).pdf" isUploading="false"}

# USB

The XD1034 has two USB 2.0 ports: one Type A and one Type C. The Type A connector can act as a dedicated charging port (DCP) when the two data pins are shorted together, and the Type C connector can operate as either a host or a device (i.e. a dual-role port).

The Type-A connector can supply up to 1.5A of power for peripherals, while the Type-C connector can supply up to 1A.  Note that these values are subject to a [total current restriction of 2A](docId\:T8Fl8cAru0CbDgQueNGeJ) for peripherals.

Both ports are capable of transfer speeds up to 480 Mbit/s. The maximum length for a USB cable is 5 meters.

The following table illustrates the pinout of the USB 2.0 Type A host port:

| **Pin** | **Description** | **Pin** | **Description** |
| ------- | --------------- | ------- | --------------- |
| 1       | VBUS            | 2       | D-              |
| 3       | D+              | 4       | Ground          |

## USB 2.0 Type-C Pinout

The following table illustrates the pinout of the USB 2.0 Type-C host port:

::Iframely{originalUrl="https://docs.google.com/spreadsheets/d/1sLqt0HYIzdpvpqhY59M23xkV4jiqLwxo9Yp5PAOyW-Y/edit?usp=sharing" embedUrl="https://docs.google.com/spreadsheets/d/1sLqt0HYIzdpvpqhY59M23xkV4jiqLwxo9Yp5PAOyW-Y/edit?usp=sharing" title="USB 2.0 Type-C Pinout" html="<div style=&#x22;left: 0; width: 100%; height: 0; position: relative; padding-bottom: 77.2727%;&#x22;><iframe src=&#x22;https://docs.google.com/spreadsheets/d/1sLqt0HYIzdpvpqhY59M23xkV4jiqLwxo9Yp5PAOyW-Y/preview?usp=embed_googleplus&#x22; style=&#x22;top: 0; left: 0; width: 100%; height: 100%; position: absolute; border: 0;&#x22; allowfullscreen></iframe></div>"}

# 3.5mm Audio Connector

The XD234 and XD1034 have a combination analog/optical audio jack. To transmit a digital audio signal, use a TOSLINK optical audio cable with a 3.5mm connector. Analog and digital audio cannot be transmitted simultaneously.

The full-scale voltage output of the analog audio is 2V RMS. The minimum load impedance is 32Ω.

The analog audio connector has the following pinout:

- **Tip**: Left audio
- **Ring**: Right audio
- **Sleeve**: Ground for audio signal

# 3.5mm IR Input / Output

The IR blaster generates or receives a space-encoded NEC or Pronto Hex signal. The two transported bit values of the signal (0 and 1) are encoded using differing lengths of low-time IR pulses.

The 3.5mm IR in/out port has the following pinout:

- **Tip**: 3.3V\@50mA
- **Ring**: IR Input
- **Sleeve**: IR Output

:::hint{type="warning"}
The sleeve is used as a ground during input operations.
:::

# HDMI Output

The HDM&#x49;**®** out connector is used to send digital video and audio to HDMI-enabled sink devices. This connector is compatible with HDMI 2.0 devices, capable of outputting a maximum video resolution of 4096x2160x60p.

The following table illustrates the pinout of the HDMI connector:

| **Pin** | **Description**       | **Pin** | **Description** |
| ------- | --------------------- | ------- | --------------- |
| 1       | TX2p                  | 2       | Ground          |
| 3       | TX2n                  | 4       | TX1p            |
| 5       | Ground                | 6       | TX1n            |
| 7       | TX0p                  | 8       | Ground          |
| 9       | TX0n                  | 10      | TXCp            |
| 11      | Ground                | 12      | TXCn            |
| 13      | CEC                   | 14      | NC              |
| 15      | DDC SCL               | 16      | DDC SDA         |
| 17      | Ground                | 18      | +5V DDC         |
| 19      | HPD (Hot Plug Detect) | --      |                 |


[title] LS424 Environmental & Power
[path] Untitled/Untitled/

# Environmental

The LS424 is designed for sustained ambient temperatures between 0°C and 50°C, with transients up to 60°C (at 90% maximum relative humidity, non-condensing). Operating the player above 60°C ambient for prolonged periods may reduce the operational lifetime of the product.

:::hint{type="danger"}
Exposing a cold player to warm air at high relative humidity may cause water to condense inside the player, leading to component failure. Damage due to such internal condensation is not covered by warranty. If a player is cold, allow several hours for it to acclimatize to ambient conditions before applying power.
:::

# Power

The LS424 requires a power supply at 5V +/- 10%. If the LS424 is powered by the USB power adapter that it ships with, or by any USB port that identifies itself as a Dedicated Charging Port (DCP), it will provide up to 500mA of bus power to downstream devices on the USB Type-C port.

If the LS424 is powered by a USB port that does not identify itself as a DCP, it will limit available current of the USB Type-C port to 150mA to ensure that the total power drawn by the player does not exceed 1A.


[title] HDx24 Environmental & Power
[path] Untitled/Untitled/

# Environmental

The HD224 and HD1024 are designed for sustained ambient temperatures between 0°C and 50°C, with transients up to 70°C (at 90% maximum relative humidity, non-condensing). Operating the players above 50°C ambient for prolonged periods may reduce the operational lifetime of the product.

:::hint{type="danger"}
Exposing a cold player to warm air at high relative humidity may cause water to condense inside the player, leading to component failure. Damage due to such internal condensation is not covered by warranty. If a player is cold, allow several hours for it to acclimatize to ambient conditions before applying power.
:::

# Power

The power supply for the HD224 and HD1024 is 18W (12V\@1.5A). The device will use less than 11W of power when playing a 1920x1080x60p H.265 (HEVC) source file.

An additional 6W of power is available for peripherals connected to the player. This is sufficient to provide up to 1A at 5V on the USB 2.0 port and up to 0.5A at 3.3V on the GPIO 3.3V pin.


[title] XTx44 Environmental & Power
[path] Untitled/Untitled/

# Environmental

The XT244 and XT1144 are designed for sustained ambient temperatures between −20°C and 50°C, with transients up to 70°C (at 90% maximum relative humidity, non-condensing). Operating the players above 50°C ambient for prolonged periods may reduce the operational lifetime of the product.

:::hint{type="danger"}
Exposing a cold player to warm air at high relative humidity may cause water to condense inside the player, leading to component failure. Damage due to such internal condensation is not covered by warranty. If a player is cold, allow several hours for it to acclimatize to ambient conditions before applying power.
:::

# Power

## Power Adapter

The power supply for the XT244 and XT1144 is 36W (12V\@3A). The device will use approximately 1A of power when playing a 4096x2160x60p H.265 (HEVC) source file.

A power budget of 24Watts (or 2A\@12V) is available to be shared between peripherals connected to the player. The user should not connect any combination of peripherals that will exceed 2A draw. If more than 2A is drawn, the external power supply may shut down due to over-current conditions. The unit will not be damaged, but it may reboot or not operate properly until the overload is removed.

If the device is being powered by the power supply, the 2A can be shared in any way among the following connectors:

| **Connector**     | **Maximum Rated Output Currents**                                                                                                                                |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| USB 2.0 (Type C)  | 1A                                                                                                                                                               |
| USB 2.0 (Type A)  | 1.5A                                                                                                                                                             |
| GPIO 3.3V         | The nominal current rating for the polyfuse at room temperature is 500mA, although due to the characteristics of the polyfuse, it drops to nominal 330mA at 70C. |
| HDMI® 5V          | 70mA                                                                                                                                                             |
| IR blaster output | 85mA                                                                                                                                                             |

## PoE Type 1 

When the player is powered via Type 1 PoE, the total available power is reduced to 12W. This means that each USB port supplies 100mA of power (one unit load for USB 2.0). This is sufficient for low-power devices such as memory sticks and mice. High-power devices such as hard disks will not operate.

:::hint{type="info"}
WiFi is always disabled when a player is powered by PoE.
:::


[title] XD234, XD1034
[path] Untitled/

The BrightSign XD234 and XD1034 media players can be used to decode images, audio, and video (at resolutions up to 4096x2160x60p) for digital-signage and kiosk applications. In addition to driving audio/video devices, these players can be controlled with various networked and built-in interfaces.

This manual specifies the hardware interfaces and operational theory of the XDx34 series.

# Block Diagram

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/j6tfQiXPTt0WvnBQTLQ1G_block-diagram-xt4-xd4-revf.png)

# Interfaces

## XD234

| Front                | Back                            |
| -------------------- | ------------------------------- |
| microSD card slot    | WiFi antenna connector (1 of 2) |
| Status LEDs          | 3.5mm audio out                 |
| HDMI® out            | 3.5mm IR in/out                 |
| Service button (SVC) | GPIO (12 pins)                  |
| Reset button (Reset) | 12V\@3A Molex power connector   |
| RJ45 LAN             | WiFi antenna connector (2 of 2) |

## XD1034

| Front                      | Back                            |
| -------------------------- | ------------------------------- |
| microSD card slot          | WiFi antenna connector (1 of 2) |
| Status LEDs                | 3.5mm audio out                 |
| HDMI out                   | USB 2.0 (Type A connector)      |
| USB 2.0 (Type C connector) | 3.5mm IR in/out                 |
| GPIO service button (SVC)  | 3.5mm serial                    |
| GPIO reset button (Reset)  | GPIO (12 pins)                  |
| RJ45 LAN                   | 12V\@3A Molex power connector   |
|                            | WiFi antenna connector (2 of 2) |

:::hint{type="warning"}
When a USB hub is plugged into the USB 2.0 port on a XD1034, the player will only enumerate the first three ports on the hub automatically. Plugging a device into one of the first three ports will enumerate the remaining ports.
:::

# XD4 Hardware Manual (PDF)

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/shCe3-Tx9YAWEmWizAF5_-20260316-173840.pdf" label="XD4_Manual.pdf"}


[title] LS424 Mounting
[path] Untitled/Untitled/

Players can be mounted using the player's four mounting holes. Note that the player may have rubber plugs inserted in the mounting holes which must be removed before mounting.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LKUd1vqCnfbvL2DB-zpfs_image.png" size="50" width="840" height="770" position="center" caption="Remove the rubber plugs to access the mounting holes." showCaption="true"}

The mounting holes are compatible with the following screw sizes:

- Metric / ISO: M3.5 or M4
- US / Imperial: #6 or #8

:::hint{type="danger"}
Nails should not be used to mount the player.
:::


[title] XTx44 Mounting
[path] Untitled/Untitled/

Players can be mounted using the player's four mounting holes. Note that the player may have rubber plugs inserted in the mounting holes which must be removed before mounting.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LKUd1vqCnfbvL2DB-zpfs_image.png" size="50" width="840" height="770" position="center" caption="Remove the rubber plugs to access the mounting holes." showCaption="true"}

The mounting holes are compatible with the following screw sizes:

- Metric / ISO: M3.5 or M4
- US / Imperial: #6 or #8

:::hint{type="danger"}
Nails should not be used to mount the player.
:::


[title] HDx24 Mounting
[path] Untitled/Untitled/

Players can be mounted using the player's four mounting holes. Note that the player may have rubber plugs inserted in the mounting holes which must be removed before mounting.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LKUd1vqCnfbvL2DB-zpfs_image.png" size="50" width="840" height="770" position="center" caption="Remove the rubber plugs to access the mounting holes." showCaption="true"}

The mounting holes are compatible with the following screw sizes:

- Metric / ISO: M3.5 or M4
- US / Imperial: #6 or #8

:::hint{type="danger"}
Nails should not be used to mount the player.
:::


[title] Series 4 Players
[path] /

# [LS424](docId\:GBEqk-OJ-hdJZy7ZWc_O9)

# [HD224, HD1024](docId\:PUQYeRAOOAPsj1po64QXm)

# [XD234, XD1034](docId:1tVueuPW4ql4zz4_kT0wT)

# [XT244, XT1144](docId\:qxbl__hFraK6OjQtYd-pR)


[title] HDx23 Hardware Interfaces
[path] Untitled/HD223, HD1023/

This section describes the characteristics and operation of all connectors on the HD223 and HD1023.

# Ethernet

The HD223 and HD1023 have an RJ45 connector for 1000BASE-T networking. The maximum length for Cat 5E cable is 100 meters; the allowed length can be higher or lower depending on the quality of the cable.

802.1x is supported on the ethernet port, but not on USB-connected ethernet devices.

# Power Connector

The power connector for the HD223 and HD1023 is rated for 12V\@1.5A. The plug is a 3.5mm barrel power connector.

# 3.5mm Serial

The UART (asynchronous serial) interface is a 3.5mm (1/8") jack that uses TTL for communication. The receiver will tolerate input voltages between -30V and +30V, with anything below 3V interpreted as a logical 1. The transmitter drives +5V for logical 0 and 0V for logical 1. 

:::hint{type="warning"}
The serial transmit pin does not comply with voltage levels for RS-232 signaling (which requires a voltage below -3V for logical 1). In practice, the serial port can interoperate successfully with the majority of RS-232 receivers, but some devices (including some projectors and Crestron equipment) require strict conformance to RS-232 levels and will not accept 0V as logical 1. In these instances, you can connect the BrightSign player to the serial device using a USB-to-serial cable.
:::

The default baud rate of the interface is 115200, with no parity, 8 data bits, and 1 stop bit. These settings can be configured in the software. The serial interface supports TX, RX, and ground only—RTS/CTS hardware flow control is not supported. The following diagram illustrates the behavior of the TX and RX signal:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/B4AJAuDs6pi2dg7FCwotU_bit-diagram1.png" size="90" width="777" height="230" position="center" darkWidth="777" darkHeight="230" showCaption="false"}

The 3.5mm serial port has the following configuration (from the perspective of the player):

- **Tip**: Receive
- **Ring**: Transmit
- **Sleeve**: Ground

BrightSign players are DCE devices, so communication with another DCE device that uses a 3.5mm port would require a null-modem cable or converter that transposes the TX/RX signals. If the device communicating with the player is a DTE device with a DE-9 (more commonly referred to as DB-9) serial port (performing asynchronous transmission), the serial cable should be wired as shown in the following diagram:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/7xM62svdoeKThxTsJ1XMo_35mm-serial-cable-diagram.png" size="90" width="979" height="331" position="center" darkWidth="979" darkHeight="331" showCaption="false"}

# GPIO

The HD223 and HD1023 have a 12-pin GPIO switch and LED connector, which allows the player to control external LEDs or other devices requiring 24mA of current or less.

The GPIO port is a standard design manufactured by Phoenix Contact, Wurth Electronics, and others. Pluggable GPIO terminal blocks can be inserted into the GPIO connector to make bare-wire contacts (see [here](https://www.digikey.com/short/3101mw) for an example part). These terminal blocks can be purchased from the [BrightSign Store](https://www.brightsign.biz/digital-signage-products/accessories/GPIO-terminal-block). If you wish to source your own terminal blocks, make sure to use 4-pin or 6-pin blocks (12-pin blocks are extremely difficult to remove from the GPIO port).

If you are using the GPIO connector to drive LEDs, connect the LED outputs to the LED ANODE and connect the LED CATHODE to the ground. If you want to connect another device, then the output is capable of sourcing or sinking up to 3.3V at 24mA, but there is a series resistor of 100Ω in each line.

The GPIO also allows for connecting of external contact closures to the ground. In order to connect a switch, connect one side of the switch to the switch input, and connect the other side to one of the ground pins on the GPIO connector. The connector can also supply 3.3V at up to 500mA to an external device. The 3.3V output is polyfuse-protected and can source up to 500mA.

If one BrightSign player is driving the inputs on another BrightSign player, then you can drive at most three inputs from one output. The following calculations explain this limitation:

:::hint{type="warning"}
The GPIO outputs have 100Ω series resistors; the GPIO inputs have 1K pullup resistors to 3.3V; and the input threshold is 2V high and .8V low. The high voltage is not problematic, but the low voltage can be if there are too many inputs connected to one output.
:::

|                    |                                                                                          |
| ------------------ | ---------------------------------------------------------------------------------------- |
| 1 out driving 1 in | V=3.3\*100/(100+1,000)=0.3                                                               |
| 1 out driving 2 in | V=3.3\*100/(100+500)=0.55                                                                |
| 1 out driving 3 in | V=3.3\*100/(100+333.3)=0.76                                                              |
| 1 out driving 4 in | V=3.3\*100/(100+250)=.94 (This is too high, so 1 output driving 3 inputs is the maximum) |

The following table describes the pinout of the GPIO on the HD223 and HD1023:

| **Pin** | **Function** | **Pin** | **Function** |
| ------- | ------------ | ------- | ------------ |
| 1       | GND          | 7       | GND          |
| 2       | 3.3V         | 8       | 3.3V         |
| 3       | BUTTON 0     | 9       | BUTTON 4     |
| 4       | BUTTON 1     | 10      | BUTTON 5     |
| 5       | BUTTON 2     | 11      | BUTTON 6     |
| 6       | BUTTON 3     | 12      | BUTTON 7     |

The following schematic illustrates the pinout of the GPIO connector.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/0e31fMNVBbItZoDZj-iO6_12-pin-gpio-pinout.png" size="76" width="817" height="246" position="center" darkWidth="817" darkHeight="246" showCaption="false"}

# USB

The HD1023 has one USB 2.0 Type-A port, which is capable of transfer speeds up to 480 Mbit/s. 

The USB connector can supply up to 1A of power for peripherals. The maximum length for a USB cable is 5 meters.

The following table illustrates the pinout of the USB 2.0 Type A host port:

| **Pin** | **Description** | **Pin** | **Description** |
| ------- | --------------- | ------- | --------------- |
| 1       | VBUS            | 2       | D-              |
| 3       | D+              | 4       | Ground          |

# 3.5mm Audio Connector

The HD223 and HD1023 have a combination analog/optical audio jack. To transmit a digital audio signal, use a TOSLINK optical audio cable with a 3.5mm connector. Analog and digital audio cannot be transmitted simultaneously.

The full-scale voltage output of the analog audio is 2V RMS. The minimum load impedance is 32Ω.

The analog audio connector has the following pinout:

- **Tip**: Left audio
- **Ring**: Right audio
- **Sleeve**: Ground for audio signal

# HDMI Output

The HDMI® output is an HDMI 1.4a connector used to send digital video and audio to HDMI-enabled sink devices. It is capable of outputting a maximum video resolution of 1920x1080x60p.

The following table illustrates the pinout of the HDMI connector:

| **Pin** | **Description**       | **Pin** | **Description** |
| ------- | --------------------- | ------- | --------------- |
| 1       | TX2p                  | 2       | Ground          |
| 3       | TX2n                  | 4       | TX1p            |
| 5       | Ground                | 6       | TX1n            |
| 7       | TX0p                  | 8       | Ground          |
| 9       | TX0n                  | 10      | TXCp            |
| 11      | Ground                | 12      | TXCn            |
| 13      | CEC                   | 14      | NC              |
| 15      | DDC SCL               | 16      | DDC SDA         |
| 17      | Ground                | 18      | +5V DDC         |
| 19      | HPD (Hot Plug Detect) | --      |                 |


[title] LS423 Theory of Operation
[path] Untitled/LS423/

This section describes how specific components operate on the LS423.

# On-Board LEDs

The LS423 has a single <font color="#B91C1C">**red**</font> LED to indicate that the power is on. The LED will flash during the firmware update process. It will also flash a certain number of times to indicate an error state. The flash codes are described below:

| **Flash code** | **Description**                                                                                                                                                                                                                  |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 2              | Unspecified error                                                                                                                                                                                                                |
| 3              | Network recovery script is preparing to run on a device configured for network recovery.                                                                                                                                         |
| 4              | No upgrade file found.                                                                                                                                                                                                           |
| 5              | Failed to load kernel module.                                                                                                                                                                                                    |
| 6              | Board is not capable of running the current firmware version.                                                                                                                                                                    |
| 7              | A piece of on-board hardware is not working correctly.                                                                                                                                                                           |
| 8              | Problem related to the storage device (either the USB drive or microSD card)                                                                                                                                                     |
| 9              | Problem related to the registry/NAND                                                                                                                                                                                             |
| 10             | The autorun script encountered a load/run error.                                                                                                                                                                                 |
| 11             | WiFi-related error                                                                                                                                                                                                               |
| 12             | Unable to find a bootable image.                                                                                                                                                                                                 |
| 13             | The root file system has failed verification, which is used to detect whether the file system has been tampered with. You can recover a player that is showing this error code by performing a firmware update with secure boot. |
| 14             | Boot loader failure                                                                                                                                                                                                              |

# On-Board Switch

The on-board switch is connected to a GPIO12 pin that is pulled low when the service (SVC) button is pressed. Conversely, a pull-up on the button normally sets the GPIO12 pin to be pulled high.

# Reset Switch / GPIO Button

The on-board switch is connected to the reset circuit. Pressing down the reset button will send an initial signal to the system software, and holding the reset button low for approximately 4 seconds will cause a hard reset.

# microSD Slot

The LS423 has one microSD slot, which supports transfer modes up to UHS-1 DDR50 (50MB/s). There is no inherent limit on the storage capacity of microSD cards used with the player.

# Wireless Module

The LS423 has an internal M.2 slot for installing a compatible wireless module. The M.2 wireless module connects via cable to an external, attachable wireless antenna.


[title] HO523
[path] Untitled/

The BrightSign HO523 media player is an [Open Pluggable Standard](http://www.intel.com/content/www/us/en/intelligent-systems/digital-signage/open-pluggable-specification-simplify-digital-signage-development.html) (OPS) compatible module that can be used to decode images, audio, and video (at resolutions up to 1920x1080x60p) for digital-signage and kiosk applications. In addition to driving audio/video devices, these players can be controlled with various networked and built-in interfaces.

This manual specifies the hardware interfaces and operational theory of the HO523.

# Interfaces

| **Front**                       | **Back**           |
| ------------------------------- | ------------------ |
| WiFi antenna connector (1 of 2) | JAE TX25 (80 pins) |
| RJ45 LAN                        |                    |
| 2x USB 2.0 (Type A connector)   |                    |
| GPIO (6 pins)                   |                    |
| 3.5mm IR in/out                 |                    |
| 3.5mm audio out                 |                    |
| 3.5mm serial                    |                    |
| microSD card slot               |                    |
| Service button (SVC)            |                    |
| Reset button (Reset)            |                    |
| WiFi antenna connector (2 of 2) |                    |

# HO523 Hardware Manual (PDF)

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/B64e-IjAIB-yRUwWa5Ses-20260316-180016.pdf" label="HO523_Manual.pdf"}


[title] HO523 Mounting
[path] Untitled/HO523/

The HO523 mounts in any slot that meets OPS specifications. The player is secured in the OPS slot via lock holes on the player that mate with matching lock pins on the display.

:::hint{type="danger"}
The HO523 is not designed to be hot-swapped into an OPS socket. You should only mount/unmount the HO523 when the display is powered off.
:::


[title] HO523 Dimensions
[path] Untitled/HO523/

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/O-PPIPECDKCjA_kJv7ANu_ho523-mechanical-specification.png)


[title] HO523 Environmental & Power
[path] Untitled/HO523/

# Environmental

The HO523 is designed for sustained ambient temperatures between 0°C and 50°C, with transients up to 70°C (at 90% maximum relative humidity, non-condensing). Operating the player above 50°C ambient for prolonged periods may reduce the operational lifetime of the product.

:::hint{type="danger"}
Exposing a cold player to warm air at high relative humidity may cause water to condense inside the player, leading to component failure. Damage due to such internal condensation is not covered by warranty. If a player is cold, allow several hours for it to acclimatize to ambient conditions before applying power.
:::

# Power

The power supply for the HO523 is rated at 19W (19V\@1A). The device will use less than 11W of power when playing a 1920x1080x60p H.265 (HEVC) source file.

An additional 8W of power is available for peripherals connected to the player. This is sufficient to provide up to 1A at 5V on the USB 2.0 port and up to 0.5A at 3.3V on the GPIO 3.3V pin.


[title] LS423 Hardware Interfaces
[path] Untitled/LS423/

This section describes the characteristics and operation of all connectors on the LS423.

# Ethernet

The LS423 has an RJ45 connector for 100BASE-TX networking. The maximum length for Cat 5E cable is 100 meters; the allowed length can be higher or lower depending on the quality of the cable.

802.1x is supported on the ethernet port, but not on USB-connected ethernet devices.

# Power Connector

The power connector for the LS423 is a USB Micro-B port rated for 5V\@2A. The connector is used for power input only—it does not transfer data.

# USB

The LS423 has a USB 2.0 Type-C port, which is capable of transfer speeds up to 480 Mbit/s. 

The USB connector can supply up to 500mA of power for peripherals.  The maximum length for a USB cable is 5 meters.

The USB Type-C port will output analog audio if the CC1 or CC2 signal is shorted to ground via a 1K resistor. Analog output can also be enabled in system software. The Dp signal outputs right audio, and the Dn signal outpts left audio.

The following table illustrates the pinout of the USB 2.0 Type-C host port:

| **Pin** | **Signal Name** | **Description**                                         | **Mating Sequence** | **Pin** | **Signal Name** | **Description**                                         | **Mating Sequence** |
| ------- | --------------- | ------------------------------------------------------- | ------------------- | ------- | --------------- | ------------------------------------------------------- | ------------------- |
| A1      | GND             | Ground return                                           | First               | B12     | GND             | Ground return                                           | First               |
| A2      |                 |                                                         |                     | B11     |                 |                                                         |                     |
| A3      |                 |                                                         |                     | B10     |                 |                                                         |                     |
| A4      | VBUS            | Bus power                                               | First               | B9      | VBUS            | Bus power                                               | First               |
| A5      | CC1             | Configuration channel                                   | Second              | B8      |                 |                                                         |                     |
| A6      | Dp1             | Positive half of USB 2.0 differential pair – position 1 | Second              | B7      | Dn2             | Negative half of USB 2.0 differential pair – position 2 | Second              |
| A7      | Dn1             | Negative half of USB 2.0 differential pair – position 1 | Second              | B6      | Dp2             | Positive half of USB 2.0 differential pair – position 2 | Second              |
| A8      |                 |                                                         |                     | B5      | CC2             | Configuration channel                                   | Second              |
| A9      | VBUS            | Bus power                                               | First               | B4      | VBUS            | Bus power                                               | First               |
| A10     |                 |                                                         |                     | B3      |                 |                                                         |                     |
| A11     |                 |                                                         |                     | B2      |                 |                                                         |                     |
| A12     | GND             | Ground return                                           | First               | B1      | GND             | Ground return                                           | First               |

# HDMI Output

The HDMI® output is an HDMI 1.4a connector used to send digital video and audio to HDMI-enabled sink devices. It is capable of outputting a maximum video resolution of 1920x1080x60p.

The following table illustrates the pinout of the HDMI connector:

| **Pin** | **Description**       | **Pin** | **Description** |
| ------- | --------------------- | ------- | --------------- |
| 1       | TX2p                  | 2       | Ground          |
| 3       | TX2n                  | 4       | TX1p            |
| 5       | Ground                | 6       | TX1n            |
| 7       | TX0p                  | 8       | Ground          |
| 9       | TX0n                  | 10      | TXCp            |
| 11      | Ground                | 12      | TXCn            |
| 13      | CEC                   | 14      | NC              |
| 15      | DDC SCL               | 16      | DDC SDA         |
| 17      | Ground                | 18      | +5V DDC         |
| 19      | HPD (Hot Plug Detect) | --      |                 |


[title] LS423 Environmental & Power
[path] Untitled/LS423/

# Environmental

The LS423 is designed for sustained ambient temperatures between 0°C and 50°C, with transients up to 60°C (at 90% maximum relative humidity, non-condensing). Operating the player above 60°C ambient for prolonged periods may reduce the operational lifetime of the product.

:::hint{type="danger"}
Exposing a cold player to warm air at high relative humidity may cause water to condense inside the player, leading to component failure. Damage due to such internal condensation is not covered by warranty. If a player is cold, allow several hours for it to acclimatize to ambient conditions before applying power.
:::

# Power

The LS423 requires a power supply at 5V +/- 10%. If the LS423 is powered by the USB power adapter that it ships with, or by any USB port that identifies itself as a Dedicated Charging Port (DCP), it will provide up to 500mA of bus power to downstream devices on the USB Type-C port.

If the LS423 is powered by a USB port that does not identify itself as a DCP, it will limit available current of the USB Type-C port to 100mA to ensure that the total power drawn by the player does not exceed 1A.


[title] HDx23 Environmental & Power
[path] Untitled/HD223, HD1023/

# Environmental

The HD223 and HD1023 are designed for sustained ambient temperatures between 0°C and 50°C, with transients up to 70°C (at 90% maximum relative humidity, non-condensing). Operating the players above 50°C ambient for prolonged periods may reduce the operational lifetime of the product.

:::hint{type="danger"}
Exposing a cold player to warm air at high relative humidity may cause water to condense inside the player, leading to component failure. Damage due to such internal condensation is not covered by warranty. If a player is cold, allow several hours for it to acclimatize to ambient conditions before applying power.
:::

# Power

The power supply for the HD223 and HD1023 is 18W (12V\@1.5A). The device will use less than 11W of power when playing a 1920x1080x60p H.265 (HEVC) source file.

An additional 6W of power is available for peripherals connected to the player. This is sufficient to provide up to 1A at 5V on the USB 2.0 port and up to 0.5A at 3.3V on the GPIO 3.3V pin.


[title] LS423
[path] Untitled/

The BrightSign LS423 media player can be used to decode images, audio, and video (at resolutions up to 1920x1080x60p) for digital-signage and kiosk applications. In addition to driving audio/video devices, these players can be controlled with various networked and built-in interfaces.

This manual specifies the hardware interfaces and operational theory of the LS423.

# Block Diagram

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/pUdtDKloM11nmTFc4_GbZ_dart-block-diagram.png)

:::hint{type="warning"}
The LS423 player’s real-time clock (RTC) becomes inaccurate when the player enters an unpowered state. To avoid this issue, it is recommended to always leave LS423 players powered. In cases where this is not possible, the clock can be reset by establishing a connection to [NTP or HTTP servers](docId\:ecLScmyIm8Vf9lLClm6Uw).
:::

# Interfaces

| **Front**                  | **Back**                      |
| -------------------------- | ----------------------------- |
| RJ45 LAN                   | HDMI® out                     |
| USB 2.0 (Type-C connector) | Power connector (USB Micro-B) |
| microSD card slot          | Service button (SVC)          |
| Power and status LED (red) | Reset button (Reset)          |
|                            | WiFi antenna connector        |

# LS423 Hardware Manual (PDF)

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/pnozl1nCQjvVexY5-K4Ft-20260316-180743.pdf" label="LS423_Manual.pdf"}


[title] LS423 Mounting
[path] Untitled/LS423/

Players can be mounted using the player's four mounting holes. Note that the player may have rubber plugs inserted in the mounting holes which must be removed before mounting.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/LKUd1vqCnfbvL2DB-zpfs_image.png" size="50" width="840" height="770" position="center" caption="Remove the rubber plugs to access the mounting holes." showCaption="true"}

The mounting holes are compatible with the following screw sizes:

- Metric / ISO: M3.5 or M4
- US / Imperial: #6 or #8

:::hint{type="danger"}
Nails should not be used to mount the player.
:::


[title] Series 3 Players
[path] /

# [HO523](docId\:gy7rZ2QH7-VqoC-hOqCQW)

# [LS423](docId\:SUNy9MjG1bJy-ia-vWvHB)

# [HD223, HD1023](docId\:AA-xu2cFLYmRFwnhJo4I7)

# [XD233, XD1033](docId\:wuR0yCM60sheIiQveY9aX)

# [XT243, XT1143](docId\:v5GPknZv35uKRoN2Er7dr)


[title] HD5 Theory of Operation
[path] Series 5 Players/HD225, HD1025/

This section describes how specific components operate on the HD225 and HD1025.

# On-Board LEDs

The four on-board LEDs have the following indicators:

| LED                                  | Indication                                                                                                   |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------ |
| Green power (**Pwr**)                | Displays when the board is powered up and not in reset mode. Flashes during the firmware update process.     |
| Green file-system activity (**Bsy**) | Flashes any time there is file-system activity (on any storage device)                                       |
| Blue WiFi (**WiFi icon**)            | Flashes when the board is being updated                                                                      |
| Red status (**Err**)                 | Flashes a certain number of times to indicate which error is occurring. The flash codes are described below. |
|                                      | 2: Unspecified error                                                                                         |
|                                      | 3: Network recovery script is preparing to run on a device configured for network recovery.                  |
|                                      | 4: No upgrade file found                                                                                     |
|                                      | 5: Failed to load kernel module                                                                              |
|                                      | 6: Board is not capable of running the current firmware version                                              |
|                                      | 7: A piece of on-board hardware is not working correctly.                                                    |
|                                      | 8: Problem related to the storage device (either the USB drive or microSD card)                              |
|                                      | 9: Problem related to the registry/NAND                                                                      |
|                                      | 10: The autorun script encountered a load/run error.                                                         |
|                                      | 11: WiFi-related error                                                                                       |
|                                      | 12: Unable to find a bootable image                                                                          |

# On-Board Switch / SVC Button

The on-board switch is connected to the GPIO02, which is pulled low when the service (SVC) button is pressed. Conversely, a pull-up on the button normally sets the GPIO02 to be pulled high.

# Reset Switch / GPIO Button

The on-board switch is connected to the reset circuit. Pressing down the reset button will send an initial signal to the system software and holding the reset button low for approximately 4 seconds will cause a hard reset.

# microSD Slot

The HD225 and HD1025 have one MicroSD slot. There is a 2TB limit on the storage capacity of microSD cards used with the player.

# Wireless Module

The HD225 and HD1025 both have a dual antenna connection. This allows users to install a compatible wireless module without disassembling the unit. This connection has a Bluetooth option.


[title] LS425, LS445
[path] Series 5 Players/

The BrightSign LS425 and LS445 media players can be used to decode images, audio, and video for digital-signage and kiosk applications. In addition to driving audio/video devices, these players can be controlled with various networked and built-in interfaces. Both models include a Real Time Clock (RTC) with supercapacitor that backs up the clock settings when it is power cycled. The LS425 decodes Full HD video while the LS445 decodes 4K 8-bit at 60p or 4K 10-bit at 30p video.

These pages specify the hardware interfaces and operational theory of the LS425 and LS445.

# Interfaces

## LS425

![LS5final.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/hlb4RmmkeRoCaoYu_-ziX_ls5final.png)

| **Front**                          | **Back**             |
| ---------------------------------- | -------------------- |
| WiFi antenna connector (1 of 2)    | Ethernet 10/100      |
| IR via USB-C                       | HDMI® out (Full HD)  |
| microSD card slot                  | Service button (SVC) |
| Audio out (3.5mm analog and SPDIF) | Reset button (Reset) |
| 12V\@1.5A power connector          |                      |
| WiFi antenna connector (2 of 2)    |                      |

## LS445

![LS5final.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/hlb4RmmkeRoCaoYu_-ziX_ls5final.png)

| **Front**                          | **Back**             |
| ---------------------------------- | -------------------- |
| WiFi antenna connector (1 of 2)    | LAN/Ethernet 10/100  |
| IR via USB-C                       | HDMI® out (Full HD)  |
| microSD card slot                  | Service button (SVC) |
| Audio out (3.5mm analog and SPDIF) | Reset button (Reset) |
| 12V\@1.5A power connector          |                      |
| WiFi antenna connector (2 of 2)    |                      |

# LS5 Hardware Manual (PDF)

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/PyF9ZP4JKjllzpO4CltJd-20260415-222116.pdf" label="LS5_manual.pdf"}


[title] HDx24 Hardware Interfaces
[path] Untitled/Untitled/

This section describes the characteristics and operation of all connectors on the HD224 and HD1024.

# Ethernet&#x20;

The HD224 and HD1024 have an RJ45 connector for 1000BASE-T networking. The maximum length for Cat 5E cable is 100 meters; the allowed length can be higher or lower depending on the quality of the cable.

802.1x is supported on the ethernet port, but not on USB-connected ethernet devices.

# Power Connector

The power connector for the HD224 and HD1024 is rated for 12V\@1.5A. The plug is a 3.5mm barrel power connector.

# 3.5mm Audio Connector

The HD224 and HD1024 have a combination analog/optical audio jack. To transmit a digital audio signal, use an optical audio cable. Analog and digital audio cannot be transmitted simultaneously.

The full-scale voltage output of the analog audio is 2V RMS. The minimum load impedance is 32W.

The analog audio connector has the following pinout:

- **Tip**: Left audio
- **Ring**: Right audio
- **Sleeve**: Ground for audio signal

# 3.5mm IR Input / Output

The IR blaster generates or receives a space-encoded NEC or Pronto Hex signal. The two transported bit values of the signal (0 and 1) are encoded using differing lengths of low-time IR pulses.

The 3.5mm IR in/out port has the following pinout:

- **Tip**: 3.3V\@50mA
- **Ring**: IR Input
- **Sleeve**: IR Output

:::hint{type="warning"}
The sleeve is used as a ground during input operations.
:::

# 3.5mm RS-232 Serial

The UART (asynchronous serial) interface is a 3.5mm (1/8") jack that uses RS-232 levels for communication. The receiver will tolerate input voltages between -30V and +30V, with anything below 3V interpreted as a logical 1. The transmitter drives +8V for logical 0 and -8V for logical 1. 

The default baud rate of the interface is 115200, with no parity, 8 data bits, and 1 stop bit. These settings can be configured in the software. The serial interface supports TX, RX, and ground only—RTS/CTS hardware flow control is not supported. The following diagram illustrates the behavior of the TX and RX signal:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/A6QksBNGb8RLkjhkqThWq_bit-diagram1.png" size="90" width="777" height="230" position="center" darkWidth="777" darkHeight="230" showCaption="false"}

The 3.5mm serial port has the following configuration (from the perspective of the player):

- **Tip**: Receive
- **Ring**: Transmit
- **Sleeve**: Ground

BrightSign players are DCE devices, so communication with another DCE device that uses a 3.5mm port would require a null-modem cable or converter that transposes the TX/RX signals. If the device communicating with the player is a DTE device with a DE-9 (more commonly referred to as DB-9) serial port (performing asynchronous transmission), the serial cable should be wired as shown in the following diagram:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/EXaMFRasdRbCgyqP4kRxI_35mm-serial-cable-diagram.png" size="90" width="979" height="331" position="center" darkWidth="979" darkHeight="331" showCaption="false"}

# GPIO

The HD224 and HD1024 have a 12-pin GPIO switch and LED connector, which allows the player to control external LEDs or other devices requiring 24mA of current or less.

The GPIO port is a standard design manufactured by Phoenix Contact, Wurth Electronics, and others. Pluggable GPIO terminal blocks can be inserted into the GPIO connector to make bare-wire contacts (see [here](https://www.digikey.com/short/3101mw) for an example part). These terminal blocks can be purchased from the [BrightSign Store](https://www.brightsign.biz/digital-signage-products/accessories/GPIO-terminal-block). If you wish to source your own terminal blocks, make sure to use 4-pin or 6-pin blocks (12-pin blocks are extremely difficult to remove from the GPIO port).

Connect the LED outputs to the LED ANODE and connect the LED CATHODE to the ground. If you want to connect another device, then the output is capable of sourcing or sinking up to 3.3V at 24mA, but there is a series resistor of 100Ω in each line.

The GPIO also allows for connecting of external contact closures to the ground. In order to connect a switch, connect one side of the switch to the switch input, and connect the other side to one of the ground pins on the GPIO connector. The connector can also supply 3.3V at up to 500mA to an external device. The 3.3V output is polyfuse-protected and can source up to 500mA.

If one BrightSign player is driving the inputs on another BrightSign player, then you can drive at most three inputs from one output. The following calculations explain this limitation:

:::hint{type="warning"}
The GPIO outputs have 100Ω series resistors; the GPIO inputs have 1K pullup resistors to 3.3V; and the input threshold is 2V high and .8V low. The high voltage is not problematic, but the low voltage can be if there are too many inputs connected to one output.
:::

|                    |                                                                                          |
| ------------------ | ---------------------------------------------------------------------------------------- |
| 1 out driving 1 in | V=3.3\*100/(100+1,000)=0.3                                                               |
| 1 out driving 2 in | V=3.3\*100/(100+500)=0.55                                                                |
| 1 out driving 3 in | V=3.3\*100/(100+333.3)=0.76                                                              |
| 1 out driving 4 in | V=3.3\*100/(100+250)=.94 (This is too high, so 1 output driving 3 inputs is the maximum) |

## GPIO Pinout

The following table illustrates the pinout of the GPIO on the HD224 and HD1024:

| **Pin** | **Function** | **Pin** | **Function** |
| ------- | ------------ | ------- | ------------ |
| 1       | GND          | 7       | GND          |
| 2       | 3.3V         | 8       | 3.3V         |
| 3       | BUTTON 0     | 9       | BUTTON 4     |
| 4       | BUTTON 1     | 10      | BUTTON 5     |
| 5       | BUTTON 2     | 11      | BUTTON 6     |
| 6       | BUTTON 3     | 12      | BUTTON 7     |

The following schematic illustrates the pinout of the GPIO connector.

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/GR0VO6IPbYRkWRpmxN-Yf_12-pin-gpio-pinout.png" size="70" width="817" height="246" position="center" darkWidth="817" darkHeight="246" showCaption="false"}

## Example Diagrams

The following example diagrams demonstrate how LED buttons can be wired to the GPIO connector (in both 1- and 4-button configurations):

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/WbpSZy9KFAdIoanMmeL-c_phoenix-1button-half-rev-b.pdf" label="phoenix_1button_half_(rev_b).pdf" isUploading="false"}

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/sDSZtR-BOQ4499qd8vq9W_phoenix-4buttons-rev-b.pdf" label="phoenix_4buttons_(rev_b).pdf" isUploading="false"}

# USB

The HD1024 has one USB 2.0 Type-A port, which is capable of transfer speeds up to 480 Mbit/s. The maximum length for a USB cable is 5 meters.

The following table illustrates the pinout of the USB 2.0 Type A host port:

| pin | Description | pin | Description |
| --- | ----------- | --- | ----------- |
| 1   | VBUS        | 2   | D-          |
| 3   | D+          | 4   | Ground      |

# HDMI Output

The HDMI® out connector is used to send digital video and audio to HDMI-enabled sink devices. This connector is compatible with HDMI 2.0 devices, capable of outputting a maximum video resolution of  3840x2160x60p.

The following table illustrates the pinout of the HDMI connector:

| pin | Description           | pin | Description |
| --- | --------------------- | --- | ----------- |
| 1   | TX2p                  | 2   | Ground      |
| 3   | TX2n                  | 4   | TX1p        |
| 5   | Ground                | 6   | TX1n        |
| 7   | TX0p                  | 8   | Ground      |
| 9   | TX0n                  | 10  | TXCp        |
| 11  | Ground                | 12  | TXCn        |
| 13  | CEC                   | 14  | NC          |
| 15  | DDC SCL               | 16  | DDC SDA     |
| 17  | Ground                | 18  | +5V DDC     |
| 19  | HPD (Hot Plug Detect) | --  |             |


[title] XC2055, XC4055
[path] Series 5 Players/

The BrightSign XC2055 and XC4055 media players can be used to decode images, audio, and video (at video resolutions up to 7680x4320x60p) for digital-signage and kiosk applications. These players dramatically increase HTML performance compared to our older models, with full support for OpenGL. They also support multi-headed output and other applications. In addition to driving audio/video devices, these players can be controlled with various networked and built-in interfaces. The XC2055 and XC4055 include a Real Time Clock (RTC) with a supercapacitor that backs up the clock settings when it is power cycled.

# Interfaces

## XC2055

![2055final.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/GXCp8VHTbS71aDqI7D3Qe_2055final.png)

| **Front**                                   | **Back**                                    |
| ------------------------------------------- | ------------------------------------------- |
| MicroSD card slot                           | WiFi antenna connector (1 of 2)             |
| 4 Status LEDs, also visible on the top case | Audio out (3.5 mm)                          |
| 2 HDMI® outputs                             | USB-A 3.0 port                              |
| USB-C/DP 3.0 port                           | Serial (3.5mm)                              |
| Ethernet                                    | IR in/out (3.5mm)                           |
|                                             | GPIO (12 pins)                              |
|                                             | Service button (SVC)                        |
|                                             | Reset button (Reset)                        |
|                                             | Locking power connector to 19V power supply |
|                                             | WiFi antenna connector (2 of 2)             |

## XC4055

![4055final.png](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/fUPW8OloUE4p_wazSyfDQ_4055final.png)

| **Front**                                   | **Back**                                    |
| ------------------------------------------- | ------------------------------------------- |
| MicroSD card slot                           | WiFi antenna connector (1 of 2)             |
| 4 Status LEDs, also visible on the top case | Audio out (3.5 mm)                          |
| 4 HDMI outputs                              | USB-A 3.0 port                              |
| USB-C/DP 3.0 port                           | Serial (3.5 mm)                             |
| Ethernet                                    | IR in/out (3.5 mm)                          |
|                                             | GPIO (12 pins)                              |
|                                             | Service button (SVC)                        |
|                                             | Reset button (Reset)                        |
|                                             | Locking power connector to 19V power supply |
|                                             | WiFi antenna connector (2 of 2)             |

# XC5 Hardware Manual (PDF)

::File{src="https://archbee-doc-uploads.s3.amazonaws.com/0prk6SO2dy9LdU77jB8D1/-aXEO_7cx2joPAdK__LrO-20260415-185432.pdf" label="XC5_Manual.pdf"}


[title] HO523 Hardware Interfaces
[path] Untitled/HO523/

This section describes the characteristics and operation of all connectors on the HO523.

# Ethernet&#x20;

The HO523 has an RJ45 connector for 1000BASE-T networking. The maximum length for Cat 5E cable is 100 meters; the allowed length can be higher or lower depending on the quality of the cable.

802.1x is supported on the ethernet port, but not on USB-connected ethernet devices.

# USB

The HO523 has two USB 2.0 Type-A ports, which are capable of transfer speeds up to 480 Mbit/s. The maximum length for a USB cable is 5 meters.

The following table illustrates the pinout of the USB 2.0 Type A host ports:

| **Pin** | **Description** | **Pin** | **Description** |
| ------- | --------------- | ------- | --------------- |
| 1       | VBUS            | 2       | D-              |
| 3       | D+              | 4       | Ground          |

# GPIO

The HO523 has a 6-pin GPIO switch and LED connector, which allows the player to control external LEDs or other devices requiring 24mA of current or less.

The GPIO port is a standard design manufactured by Phoenix Contact, Wurth Electronics, and others. Pluggable GPIO terminal blocks can be inserted into the GPIO connector to make bare-wire contacts (see [here](https://www.digikey.com/short/3101mw) for an example part). These terminal blocks can be purchased from the [BrightSign Store](https://www.brightsign.biz/digital-signage-products/accessories/GPIO-terminal-block).

If you are using the GPIO connector to drive LEDs, connect the LED outputs to the LED ANODE and connect the LED CATHODE to the ground. If you want to connect another device, then the output is capable of sourcing or sinking up to 3.3V at 24mA, but there is a series resistor of 100Ω in each line.

The connector also allows the connecting of external contact closures to the ground. In order to connect a switch, connect one side of the switch to the switch input, and connect the other side to one of the ground pins on the GPIO connector. The connector can also supply 3.3V at up to 500mA to an external device. The 3.3V output is polyfuse-protected and can source up to 500mA.

If one BrightSign player is driving the inputs on another BrightSign player, then you can drive at most three inputs from one output. The following calculations explain this limitation:

:::hint{type="warning"}
The GPIO outputs have 100Ω series resistors; the GPIO inputs have 1K pullup resistors to 3.3V; and the input threshold is 2V high and .8V low. The high voltage is not problematic, but the low voltage can be if there are too many inputs connected to one output.
:::

|                    |                                                                                          |
| ------------------ | ---------------------------------------------------------------------------------------- |
| 1 out driving 1 in | V=3.3\*100/(100+1,000)=0.3                                                               |
| 1 out driving 2 in | V=3.3\*100/(100+500)=0.55                                                                |
| 1 out driving 3 in | V=3.3\*100/(100+333.3)=0.76                                                              |
| 1 out driving 4 in | V=3.3\*100/(100+250)=.94 (This is too high, so 1 output driving 3 inputs is the maximum) |

 The following table describes the pinout of the GPIO on the HO523:

| **Pin** | **Function** | **Pin** | **Function** |
| ------- | ------------ | ------- | ------------ |
| 1       | GND          | 4       | BUTTON 1     |
| 2       | 3.3V         | 5       | BUTTON 2     |
| 3       | BUTTON 0     | 6       | BUTTON 3     |

The following schematic illustrates the pinout of the GPIO connector:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/DYCtqkqPLw80LPtn0R7Fq_6-pin-gpio-pinout.png" size="50" width="433" height="224" position="center" darkWidth="433" darkHeight="224" showCaption="false"}

# 3.5mm IR Input / Output

The IR blaster generates or receives a space-encoded NEC or Pronto Hex signal. The two transported bit values of the signal (0 and 1) are encoded using differing lengths of low-time IR pulses.

The 3.5mm IR in/out port has the following pinout:

- **Tip**: 3.3V
- **Ring**: IR Input
- **Sleeve**: IR Output

:::hint{type="warning"}
The sleeve is used as a ground during input operations.
:::

# 3.5mm Audio Connector

The HO523 has a combination analog/digital audio jack. To transmit a digital audio signal, use a TOSLINK optical audio cable with a 3.5mm connector. Analog and digital audio cannot be transmitted simultaneously.

The full-scale voltage output of the analog audio is 2V RMS. The minimum load impedance is 32Ω.

The analog audio connector has the following pinout:

- **Tip**: Left audio
- **Ring**: Right audio
- **Sleeve**: Ground for audio signal

# 3.5mm Serial

The UART (asynchronous serial) interface is a 3.5mm (1/8") jack that uses TTL for communication. The receiver will tolerate input voltages between -30V and +30V, with anything below 3V interpreted as a logical 1. The transmitter drives +5V for logical 0 and 0V for logical 1. BrightSign players are DTE devices, so communication with other DTE devices requires a null-modem cable or converter that transposes the TX/RX signals from the 3.5mm port.

:::hint{type="warning"}
The serial transmit pin does not comply with voltage levels for RS-232 signaling (which requires a voltage below -3V for logical 1). In practice, the serial port can interoperate successfully with the majority of RS-232 receivers, but some devices (including some projectors and Crestron equipment) require strict conformance to RS-232 levels and will not accept 0V as logical 1. In these instances, you can connect the BrightSign player to the serial device using a USB-to-serial cable.
:::

The default baud rate of the interface is 115200, with no parity, 8 data bits, and 1 stop bit. These settings can be configured in the software. The serial interface supports TX, RX, and ground only—RTS/CTS hardware flow control is not supported.

The 3.5mm serial port has the following configuration (from the perspective of the player):

- **Tip**: Receive
- **Ring**: Transmit
- **Sleeve**: Ground

BrightSign players are DTE devices, so communication with another DTE device that uses a 3.5mm port would require a null-modem cable or converter that transposes the TX/RX signals. If the device communicating with the player uses a DE9 serial port, the serial cable should be wired as shown in the following diagram:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/Oa2dqTcCwtJMQBYDhtIQy_35mm-serial-cable-diagram-2.png" size="90" width="979" height="331" position="center" darkWidth="979" darkHeight="331" showCaption="false"}

The following diagram illustrates the behavior of the TX and RX signal:

::Image[]{src="https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/ao_OyxOTZnW-Mxwv2CcXx_bit-diagram1.png" size="90" width="777" height="230" position="center" darkWidth="777" darkHeight="230" showCaption="false"}

# JAE TX25

The HO523 features a single 80-pin JAE TX25 connector (part no. TX25-80P-LT-H1E) for interfacing with displays via the [Open Pluggable Specification](http://www.intel.com/content/www/us/en/intelligent-systems/digital-signage/open-pluggable-specification-simplify-digital-signage-development.html) (OPS) standard. This interface provides the following features:

- **Power**: DC IN 12V\~19V @ 8A max (1A per power pin)
- **Display Interface**: TMDS only
- **Audio**: Left and Right channel
- **USB**: 4x USB 2.0 (2 to external, 1 to WiFi, 1 to display)
- **UART**: Tx/Rx serial communication. 

:::hint{type="info"}
The JAE TX25 serial port enumerates as port 1 in BrightAuthor/BrightScript.&#x20;
:::

- **Control Signaling**: Pluggable Module Power Status, Power ON via display panel, Pluggable Board Detect, Consumer Electronics Control (CEC), System Fan Control

:::hint{type="warning"}
Bi-directional transmit/receive pairs for the LAN Media Dependent Interface (MDI) are not supported.
:::

JAE TX25 can connect to two compliant receptacle connectors: TX24-80R-LT-H1E (standard interface) and TX24A-80R-LT-H1E (high-speed interface). We recommend the TX24A-80R-LT-H1E interface for all applications.

# Pin Assignment

The following table describes the pin assignments of the JAE TX25 connector. The **I/O** column is from the perspective of the HO523 pluggable board.

| **Pin** | **Signal**     | **Description** | **I/O** | **Pin** | **Signal**     | **Description**             | **I/O**  |
| ------- | -------------- | --------------- | ------- | ------- | -------------- | --------------------------- | -------- |
| 40      | +12V\~+19V     | Power           | -       | 80      | GND            | Ground                      | -        |
| 39      | +12V\~+19V     | Power           | -       | 79      | GND            | Ground                      | -        |
| 38      | +12V\~+19V     | Power           | -       | 78      | GND            | Ground                      | -        |
| 37      | +12V\~+19V     | Power           | -       | 77      | GND            | Ground                      | -        |
| 36      | +12V\~+19V     | Power           | -       | 76      | GND            | Ground                      | -        |
| 35      | +12V\~+19V     | Power           | -       | 75      | GND            | Ground                      | -        |
| 34      | +12V\~+19V     | Power           | -       | 74      | PWR\_STATUS    | PowerGood                   | OUT (OC) |
| 33      | +12V\~+19V     | Power           | -       | 73      | PS\_ON#        | Pluggable Signal ON         | IN       |
| 32      | GND            | Ground          | -       | 72      | PB\_DET        | Pluggable Board Detect      | OUT      |
| 31      | DVI\_HPD       | HDMI\*\*®\*\*   | IN      | 71      | CEC            | Consumer Electronic Control | I/O      |
| 30      | DVI\_DDC\_CLK  | HDMI            | I/O     | 70      | AZ\_LINEOUT\_R | Audio-Rch                   | OUT      |
| 29      | DVI\_DDC\_DATA | HDMI            | I/O     | 69      | AZ\_LINEOUT\_L | Audio-Lch                   | OUT      |
| 28      | GND            | Ground          | -       | 68      | GND            | Ground                      | -        |
| 27      | TMDS2+         | HDMI            | OUT     | 67      | USB\_PP0       | USB 2.0                     | I/O      |
| 26      | TMDS2-         | HDMI            | OUT     | 66      | USB\_PN0       | USB 2.0                     | I/O      |
| 25      | GND            | Ground          | -       | 65      | GND            | Ground                      | -        |
| 24      | TMDS1+         | HDMI            | OUT     | 64      | -              | No Connect                  | -        |
| 23      | TMDS1-         | HDMI            | OUT     | 63      | -              | No Connect                  | -        |
| 22      | GND            | Ground          | -       | 62      | GND            | Ground                      | -        |
| 21      | TMDS0+         | HDMI            | OUT     | 61      | -              | No Connect                  | -        |
| 20      | TMDS0-         | HDMI            | OUT     | 60      | -              | No Connect                  | -        |
| 19      | GND            | Ground          | -       | 59      | GND            | Ground                      | -        |
| 18      | TMDS\_CLK+     | HDMI            | OUT     | 58      | -              | No Connect                  | -        |
| 17      | TMDS\_CLK-     | HDMI            | OUT     | 57      | -              | No Connect                  | -        |
| 16      | GND            | Ground          | -       | 56      | GND            | GND                         | -        |
| 15      | -              | No Connect      | -       | 55      | -              | No Connect                  | -        |
| 14      | -              | No Connect      | -       | 54      | -              | No Connect                  | -        |
| 13      | -              | No Connect      | -       | 53      | -              | No Connect                  | -        |
| 12      | GND            | Ground          | -       | 52      | UART\_TXD      | UART 3.3V                   | OUT      |
| 11      | -              | No Connect      | -       | 51      | UART\_RXD      | UART 3.3V                   | IN       |
| 10      | -              | No Connect      | -       | 50      | -              | No Connect                  | -        |
| 9       | GND            | Ground          | -       | 49      | -              | No Connect                  | -        |
| 8       | -              | No Connect      | -       | 48      | -              | No Connect                  | -        |
| 7       | -              | No Connect      | -       | 47      | -              | No Connect                  | -        |
| 6       | GND            | Ground          | -       | 46      | -              | No Connect                  | -        |
| 5       | -              | No Connect      | -       | 45      | -              | No Connect                  | -        |
| 4       | -              | No Connect      | -       | 44      | -              | No Connect                  | -        |
| 3       | GND            | Ground          | -       | 43      | -              | No Connect                  | -        |
| 2       | -              | No Connect      | -       | 42      | -              | No Connect                  | -        |
| 1       | -              | No Connect      | -       | 41      | -              | No Connect                  | -        |

:::hint{type="warning"}
See the OPS specification for further details on pin signaling for the JAE TX25.
:::

![](https://archbee-image-uploads.s3.amazonaws.com/511c8QBH-VHiwWnyzIwUb/KXCfJpFSqCgUKiyIltRRQ_jae-tx25-pin-diagram.png)


[title] XD236, XD1036
[path] Series 6 Players/

The BrightSign XD236 and XD1036 media players can be used to decode images, audio, and video for digital-signage and kiosk applications. They have the following new features:

- Improved video and graphics performance
- A 100 Base-T ethernet port (in addition to the standard 1000 Base-T port) for remote control of attached displays and identification\*
- An internal micro-SD card reader (in addition to the external reader) for greater security
- A SIM card slot&#x20;
- An SSD M.2 card slot
- An M.2 connector for WiFi&#x20;
- An M.2 connector for an internal cellular modem for wireless 4G player networking.&#x20;
  - Note that only one module can be fitted at a time since there is only one set of SMA antenna connections

The players can be controlled with various networked and built-in interfaces and include a Real Time Clock (RTC) with supercapacitor that backs up the clock settings when it is power cycled.

# Interfaces

## XD236

![](https://app.archbee.com/api/optimize/0prk6SO2dy9LdU77jB8D1/GJqC-6sFhZsSKFc7jeK_8-20251027-183134.png "Front")

| **Front**                                                  | **Back**                        |
| ---------------------------------------------------------- | ------------------------------- |
| WiFi antenna connector (1 of 2) for WiFi or cellular modem | 12V\@3A power connector         |
| Ethernet (Contr