preflightSchedule
const url = 'https://example.com/api/v1/schedules/preflight';const options = { method: 'POST', headers: { cookie: 'tilecast_session=<tilecast_session>', 'Content-Type': 'application/json' }, body: '{"scheduleId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","proposedSchedule":{"name":"example","description":"example","playlistId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","layoutId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","displayAction":{"type":"display_power_on","input":"example","volume":1,"brightness":1},"type":"one_time","timezone":"example","priority":1,"enabled":true,"startDate":"2026-04-15","endDate":"2026-04-15","oneTimeStart":"2026-04-15T12:00:00Z","oneTimeEnd":"2026-04-15T12:00:00Z","dailyStart":"example","dailyEnd":"example","daysOfWeek":[1],"targets":[{"type":"screen","id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","name":"example"}]}}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/api/v1/schedules/preflight \ --header 'Content-Type: application/json' \ --cookie tilecast_session=<tilecast_session> \ --data '{ "scheduleId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "proposedSchedule": { "name": "example", "description": "example", "playlistId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "layoutId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "displayAction": { "type": "display_power_on", "input": "example", "volume": 1, "brightness": 1 }, "type": "one_time", "timezone": "example", "priority": 1, "enabled": true, "startDate": "2026-04-15", "endDate": "2026-04-15", "oneTimeStart": "2026-04-15T12:00:00Z", "oneTimeEnd": "2026-04-15T12:00:00Z", "dailyStart": "example", "dailyEnd": "example", "daysOfWeek": [ 1 ], "targets": [ { "type": "screen", "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "name": "example" } ] } }'Read-only inspection of a proposed schedule. Requires an authenticated user with the read scope; every role may call it, and the targets must be inside the caller’s screen scope. The server expands every targeted screen and Display Group, finds the draft’s next occurrence in its own timezone, and evaluates precedence on each screen at that instant with the same resolver Players use. A draft that is disabled is simulated as enabled; draftEnabled reports its real state. Counts describe the whole target set; the screens and competitors lists are bounded. Pass scheduleId when editing a saved schedule so its stored copy does not compete with the draft. A scoped account sees a competing schedule’s name and ID only when all of that schedule’s targets are inside its scope; other competitors keep their counts and reasons but carry no name and a placeholder ID. The result describes the next occurrence only, never every future occurrence. Use previewSchedule to inspect one exact screen at an exact time.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”object
object
A bounded Display Control action. A schedule may contain one action instead of a playlist or Layout. The server validates that only the field belonging to the selected type is present.
object
object
Responses
Section titled “ Responses ”Aggregated next-occurrence precedence result
object
object
The instant evaluated. Absent when the draft never runs again.
True when checkedAt is the current time inside an occurrence that has already started.
object
Screens where the draft does not win, bounded. Wins are counted in winningScreenCount, never listed.
object
object
Example
{ "data": { "competitors": [ { "presentationType": "playlist", "reason": "active_takeover" } ], "screens": [ { "outcome": "superseded", "reason": "active_takeover" } ], "issues": [ { "code": "display_control_unsupported", "severity": "blocking" } ] }}Malformed body or an unknown field
Authentication required
Scope or target scope requirement not met
A referenced Playlist, Layout, or target was not found
The presentation conflicts with a target
Schedule or target validation failed