<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>API changelog | Screenly</title><description>Changes to the Screenly API, newest first. The same entries as the Screenly release notes, for anyone who only follows the API.</description><link>https://www.screenly.io/releases/api/</link><language>en</language><atom:link href="https://www.screenly.io/releases/api/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Fri, 09 Oct 2026 00:00:00 +0000</lastBuildDate><item><title>Screenly 26.10.3: Screen reports on the API include hardware and software health</title><link>https://www.screenly.io/releases/screenly/26.10.3/screen-reports-api-fields/</link><guid isPermaLink="true">https://www.screenly.io/releases/screenly/26.10.3/screen-reports-api-fields/</guid><pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate><category>release</category><category>monitoring</category><category>developers</category><category>api</category><description>&lt;p&gt;Screen reports on API v4.1 (&lt;code&gt;GET /v4.1/screens/reports&lt;/code&gt;) now return much more of what a player
reports about itself. From your own tools, you can watch a fleet for an SD card or a disk that&amp;rsquo;s
starting to fail, keep an eye on temperatures, or check which model and software a player runs,
without opening each screen in the dashboard.&lt;/p&gt;
&lt;p&gt;Storage:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sd_card_health&lt;/code&gt;: errors on a Raspberry Pi&amp;rsquo;s SD card, and whether the card has turned read-only.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;smart_disk_data&lt;/code&gt;: a S.M.A.R.T. summary of the SSD or NVMe drive on an x86 player, including its
temperature, power-on hours, and how much of its life is used.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;storage_info&lt;/code&gt;: the identity of a Raspberry Pi&amp;rsquo;s SD card: name, manufacturer, and date.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;disk_usage&lt;/code&gt;: total, used, and free space on the player&amp;rsquo;s data storage, in bytes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;disk_stats&lt;/code&gt;: read and write counters for each disk since the player started.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hardware:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sensors&lt;/code&gt;: temperature and other sensor readings, such as a Raspberry Pi&amp;rsquo;s chip temperature.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x86_stats&lt;/code&gt;: hardware temperatures on Screenly Player and Screenly Player Max.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mem_info&lt;/code&gt;: total, free, and available memory, in kB.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;raspi_rev&lt;/code&gt; and &lt;code&gt;raspi_serial&lt;/code&gt;: a Raspberry Pi&amp;rsquo;s board revision and serial number.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Software and security:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;installed_snaps&lt;/code&gt;: every software package on the player, with its version.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;device_model&lt;/code&gt; and &lt;code&gt;validation_sets&lt;/code&gt;: the ScreenlyOS image a player runs, and the exact package
versions it&amp;rsquo;s held to.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;secure_boot&lt;/code&gt;, &lt;code&gt;full_disk_encryption&lt;/code&gt;, and &lt;code&gt;mtls_enabled&lt;/code&gt;: whether the player uses secure boot,
an encrypted data partition, and a client certificate for its connection to Screenly.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;is_wayland&lt;/code&gt;: whether the player draws through the newer display stack.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Display, network, and running state:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;display_data&lt;/code&gt;: each connected display&amp;rsquo;s make, model, size, and supported resolutions.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;screen_resolution&lt;/code&gt;: the resolution content is shown at.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bluetooth&lt;/code&gt;: &lt;code&gt;on&lt;/code&gt;, &lt;code&gt;off&lt;/code&gt;, or &lt;code&gt;unknown&lt;/code&gt;. &lt;code&gt;off&lt;/code&gt; also covers a player with no Bluetooth at all.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;probe_diagnostics&lt;/code&gt;: the results of the player&amp;rsquo;s own network checks, refreshed about once a day.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;player_uptime&lt;/code&gt;: seconds since the player&amp;rsquo;s content started, which restarts once a day.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;local_time&lt;/code&gt;: the player&amp;rsquo;s clock when it sent the report.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fields fill in from each player&amp;rsquo;s next report, and some apply only to certain hardware: a field a
player doesn&amp;rsquo;t report is empty. These are additions, so existing responses keep every field they
had.&lt;/p&gt;</description></item><item><title>Screenly 26.10.2: A new editor for screen notes, with room for much longer notes</title><link>https://www.screenly.io/releases/screenly/26.10.2/screen-notes-tab/</link><guid isPermaLink="true">https://www.screenly.io/releases/screenly/26.10.2/screen-notes-tab/</guid><pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate><category>improvement</category><category>device-management</category><category>developers</category><category>api</category><description>&lt;p&gt;Screen notes are easy to overlook, but they&amp;rsquo;re a good place to keep what you know about a screen:
which cabinet its player sits in, who has the key, which port on the switch it&amp;rsquo;s plugged into. We&amp;rsquo;d
like more teams to use them, so this release gives them room to be useful. Until now they were a
small text box on the screen&amp;rsquo;s Settings tab, capped at 255 characters and shown as plain text.&lt;/p&gt;
&lt;p&gt;Notes now have a tab of their own, under Screens &amp;gt; a screen &amp;gt; Notes, and an editor with a formatting
toolbar. They show as formatted text, with headings, bullet and numbered lists, quotes, and links
you can click, and Markdown you paste in keeps its formatting. Notes can run to 65,536 characters.&lt;/p&gt;
&lt;h2 id="for-developers"&gt;For developers&lt;/h2&gt;
&lt;p&gt;On API v4.1, notes are the screen&amp;rsquo;s &lt;code&gt;description&lt;/code&gt; field, which now takes up to 65,536 characters,
up from 255.&lt;/p&gt;</description></item><item><title>Screenly 26.10.0: API v3's screens, playlists, groups, and assets endpoints are switched off</title><link>https://www.screenly.io/releases/screenly/26.10.0/api-v3-endpoints-switched-off/</link><guid isPermaLink="true">https://www.screenly.io/releases/screenly/26.10.0/api-v3-endpoints-switched-off/</guid><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><category>removed</category><category>developers</category><category>api</category><description>&lt;p&gt;API v3 has reached the date we &lt;a href="https://www.screenly.io/blog/2026/07/10/sunsetting-api-v3/"&gt;announced in July&lt;/a&gt;. From
October 1, 2026, the v3 endpoints for managing screens, playlists, groups, and assets no longer
work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Requests to &lt;code&gt;/api/v3/assets/&lt;/code&gt;, &lt;code&gt;/api/v3/groups/&lt;/code&gt;, &lt;code&gt;/api/v3/playlists/&lt;/code&gt;, and &lt;code&gt;/api/v3/screens/&lt;/code&gt;
get a &lt;code&gt;410 Gone&lt;/code&gt; response, with an error that points to the API reference.&lt;/li&gt;
&lt;li&gt;The URLs for a single item under those paths, such as &lt;code&gt;/api/v3/screens/&amp;lt;id&amp;gt;/&lt;/code&gt;, no longer work
either.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2 calls keep working for now, so older versions of the Screenly CLI can still add and remove
screens: &lt;code&gt;POST /api/v3/screens/&lt;/code&gt; adds a screen, and &lt;code&gt;DELETE /api/v3/screens/&amp;lt;id&amp;gt;/&lt;/code&gt; removes one.&lt;/p&gt;
&lt;p&gt;The same data is in API v4.1, at &lt;code&gt;/v4.1/assets&lt;/code&gt;, &lt;code&gt;/v4.1/labels&lt;/code&gt; (what v3 called groups),
&lt;code&gt;/v4.1/playlists&lt;/code&gt;, and &lt;code&gt;/v4.1/screens&lt;/code&gt;. The &lt;a href="https://developer.screenly.io/api/" target="_blank" rel="noopener noreferrer nofollow"&gt;API reference&lt;/a&gt;
covers each one.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If an integration still calls these v3 endpoints:&lt;/strong&gt; its requests fail from October 1, 2026.
Move them to the API v4.1 endpoints above.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Screenly 26.9.8: Playlists on API v4 and v4.1 include when they were created</title><link>https://www.screenly.io/releases/screenly/26.9.8/playlist-created-at-api/</link><guid isPermaLink="true">https://www.screenly.io/releases/screenly/26.9.8/playlist-created-at-api/</guid><pubDate>Thu, 24 Sep 2026 00:00:00 +0000</pubDate><category>improvement</category><category>content-management</category><category>developers</category><category>api</category><description>&lt;p&gt;Playlists returned by &lt;code&gt;/v4/playlists&lt;/code&gt; and &lt;code&gt;/v4.1/playlists&lt;/code&gt; now carry a &lt;code&gt;created_at&lt;/code&gt; field with
the time the playlist was created, such as &lt;code&gt;2023-05-30T11:19:22+00:00&lt;/code&gt;. You can filter on it like
any other field, so &lt;code&gt;created_at=gte.2026-09-01&lt;/code&gt; lists the playlists made since September 1, 2026.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s the same date the Playlists page shows in its new Created column.&lt;/p&gt;</description></item><item><title>Screenly 26.8.3: The label type field on the API now has three values instead of nine</title><link>https://www.screenly.io/releases/screenly/26.8.3/label-type-api-values/</link><guid isPermaLink="true">https://www.screenly.io/releases/screenly/26.8.3/label-type-api-values/</guid><pubDate>Mon, 17 Aug 2026 00:00:00 +0000</pubDate><category>removed</category><category>developers</category><category>api</category><description>&lt;p&gt;Labels on API v4 and v4.1 carry a &lt;code&gt;type&lt;/code&gt;, and that field described how a label was maintained.
With Screenly
&lt;a href="https://www.screenly.io/releases/screenly/26.8.3/system-labels-are-now-ordinary-labels/"&gt;no longer maintaining any label automatically&lt;/a&gt;,
6 of its 9 values no longer exist: &lt;code&gt;landscape&lt;/code&gt;, &lt;code&gt;portrait&lt;/code&gt;, &lt;code&gt;full_hd&lt;/code&gt;, &lt;code&gt;uhd&lt;/code&gt;, &lt;code&gt;anywhere&lt;/code&gt; and &lt;code&gt;virtual&lt;/code&gt;. What remains is
&lt;code&gt;all-screens&lt;/code&gt;, &lt;code&gt;manual&lt;/code&gt; and &lt;code&gt;screen&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Labels that reported one of the removed types now report &lt;code&gt;manual&lt;/code&gt;, since that is what they have
become, and keep their id. The exception is a workspace that already had a label of its own with
the same name, such as its own Landscape: the two were merged into that existing label, and the
former automatic label&amp;rsquo;s id no longer exists.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If this affects you:&lt;/strong&gt; an integration that filters labels by &lt;code&gt;type=landscape&lt;/code&gt;, or any of the
other five, now gets an error back, because the value is no longer valid for the field. Filter
by label name instead, or read the screen&amp;rsquo;s own resolution and orientation where you were using
the label as a proxy for hardware. If you stored the id of an automatic label, look the label up
by name again.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Screenly 26.8.2: last_ping is no longer null for a screen that has never connected</title><link>https://www.screenly.io/releases/screenly/26.8.2/last-ping-never-null/</link><guid isPermaLink="true">https://www.screenly.io/releases/screenly/26.8.2/last-ping-never-null/</guid><pubDate>Fri, 14 Aug 2026 00:00:00 +0000</pubDate><category>improvement</category><category>monitoring</category><category>developers</category><category>api</category><description>&lt;p&gt;A screen&amp;rsquo;s &lt;code&gt;last_ping&lt;/code&gt; used to be null until the screen first checked in, which made null a
usable signal for &amp;ldquo;this screen has never connected&amp;rdquo;. It is now always a timestamp: screens start
with theirs set to when the screen was created, and existing screens that never checked in were
given their creation time.&lt;/p&gt;
&lt;p&gt;This affects &lt;code&gt;last_ping&lt;/code&gt; on the v4 &lt;code&gt;screens&lt;/code&gt; resource. The field&amp;rsquo;s type and the response shape
are unchanged, only the values.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If this affects you:&lt;/strong&gt; an integration treating a null &lt;code&gt;last_ping&lt;/code&gt; as &amp;ldquo;never connected&amp;rdquo; loses
that signal. A screen created in the last four hours can also report &lt;code&gt;Online&lt;/code&gt; in its &lt;code&gt;status&lt;/code&gt;
before the device has ever reached us, because the seeded timestamp is recent. The closest
check is comparing &lt;code&gt;last_ping&lt;/code&gt; with the screen&amp;rsquo;s &lt;code&gt;created_at&lt;/code&gt;: a screen that has never checked
in still carries the timestamp it was created with.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Screenly 26.7.1: Screens with nothing scheduled no longer report Inactive</title><link>https://www.screenly.io/releases/screenly/26.7.1/screen-statuses-api-change/</link><guid isPermaLink="true">https://www.screenly.io/releases/screenly/26.7.1/screen-statuses-api-change/</guid><pubDate>Mon, 27 Jul 2026 00:00:00 +0000</pubDate><category>improvement</category><category>monitoring</category><category>developers</category><category>api</category><description>&lt;p&gt;The screen &lt;code&gt;status&lt;/code&gt; value changed on both v4 and v4.1. A screen that is reachable and in sync but
has nothing scheduled used to report &lt;code&gt;Inactive&lt;/code&gt;. It now reports &lt;code&gt;Online&lt;/code&gt;. Nothing else about the
field changed: &lt;code&gt;Out of sync&lt;/code&gt;, &lt;code&gt;Offline&lt;/code&gt; and the rest behave as they did, and a disabled screen
still reports &lt;code&gt;Inactive&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If this affects you:&lt;/strong&gt; an integration that reads &lt;code&gt;status == &amp;quot;Inactive&amp;quot;&lt;/code&gt; to find screens with
nothing to play will now find none of them. Check for an empty playlist directly rather than
reading it off the status.&lt;/p&gt;
&lt;/blockquote&gt;</description></item></channel></rss>