Docs API reference
Getting started
From a new workspace to a screen that plays: the setup checklist, and quick starts that make a news feed story, a TV channel story, or headlines followed by a few minutes of TV — ordinary stories and scenes you can change afterwards.
Every call needs an API key in the Authorization header. New to the API? Start with
the API overview.
Read the setup checklist
/setup stagesWhat the workspace still needs before a screen plays, in order: a venue, a stage, a connected screen, a story, something on the screen; TV channels are optional.
Responses
- 200 The checklist.
- 401 Missing or invalid API key.
- 403 The key lacks the scope, or the role is read-only.
Response fields (200)
doneboolean requiredA screen is connected and has something to play.
factsobjectThe counts the steps read.
stepsobject[] required6 fields in
stepsstepstringOne of
venue,stage,screen,story,play,channelstitlestringdonebooleanoptionalbooleanblockedstring or nullThe step before it is missing.
whatstring
curl "https://www.wunderframe.com/api/v1/setup" \
-H "Authorization: Bearer $WUNDERFRAME_API_KEY"{
"done": false,
"facts": {
"venues": 1,
"stages": 1,
"screens": 0,
"stories": 0,
"onScreen": 0,
"channels": 0
},
"steps": [
{
"step": "venue",
"title": "Add a venue",
"done": true,
"optional": false,
"blocked": null,
"what": "The place your screens are in…"
},
{
"step": "screen",
"title": "Connect the screen",
"done": false,
"optional": false,
"blocked": null,
"what": "Open the Wunderframe app on the TV…"
}
]
}Error example
{
"error": {
"code": "unauthorized",
"message": "Missing or invalid API key."
}
}News from a feed
/quick-starts/news authoringA collection fed by the feed (read now, then every 15 minutes), a Headline template and a story that rolls through the newest items, per_pass (default 5) each round. Needs authoring and data.
Request body required
urlstring requiredRSS, Atom, JSON Feed — or a news website.
namestringper_passinteger1–20
stage_idstringOptional: put the story on this stage (its story whenever nothing is booked). Needs the
stagesscope too.
Responses
- 201 What was made.
- 400 The request is invalid —
details.fieldnames the field when there is one. - 401 Missing or invalid API key.
- 403 The key lacks the scope, or the role is read-only.
Response fields (201)
storyIdstring requiredThe story made — GET /stories/{id}.
scenesobject[] requiredThe designs made, to edit (the headline template, the TV scene).
2 fields in
scenesidstringlabelstring
collectionIdstringThe feed’s collection, when there is one.
itemsintegerFeed items read so far.
syncErrorstring or nullWhy the feed could not be read yet.
normalStoryIdstringSomeone in front: the story the stage plays the rest of the time.
stageIdstringSomeone in front: the stage set up — try it in its preview.
curl -X POST "https://www.wunderframe.com/api/v1/quick-starts/news" \
-H "Authorization: Bearer $WUNDERFRAME_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.srf.ch/news/bnf/rss/1646",
"name": "News",
"per_pass": 5
}'{
"storyId": "sto_1",
"scenes": [
{
"id": "scn_1",
"label": "the headline design"
}
],
"collectionId": "col_news",
"items": 40,
"syncError": null
}Error example
{
"error": {
"code": "invalid",
"message": "The request is invalid — `details.field` names the field when there is one."
}
}A TV channel
/quick-starts/tv authoringA scene with the channel full screen, its name and a clock, alone in a story — it plays and stays, never restarting.
Request body required
channel_idstring requiredA channel id (GET /channels), or
"stage"for the stage’s channel (PUT /stages/{id}/channel switches it).default_channel_idstringWith "stage": shown until the stage’s channel is set.
titlestringstage_idstringOptional: put the story on this stage (its story whenever nothing is booked). Needs the
stagesscope too.
Responses
- 201 What was made.
- 400 The request is invalid —
details.fieldnames the field when there is one. - 401 Missing or invalid API key.
- 403 The key lacks the scope, or the role is read-only.
Response fields (201)
storyIdstring requiredThe story made — GET /stories/{id}.
scenesobject[] requiredThe designs made, to edit (the headline template, the TV scene).
2 fields in
scenesidstringlabelstring
collectionIdstringThe feed’s collection, when there is one.
itemsintegerFeed items read so far.
syncErrorstring or nullWhy the feed could not be read yet.
normalStoryIdstringSomeone in front: the story the stage plays the rest of the time.
stageIdstringSomeone in front: the stage set up — try it in its preview.
curl -X POST "https://www.wunderframe.com/api/v1/quick-starts/tv" \
-H "Authorization: Bearer $WUNDERFRAME_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"channel_id": "stage",
"default_channel_id": "ch_srf1",
"title": "TV"
}'{
"storyId": "sto_1",
"scenes": [
{
"id": "scn_1",
"label": "the headline design"
}
],
"collectionId": "col_news",
"items": 40,
"syncError": null
}Error example
{
"error": {
"code": "invalid",
"message": "The request is invalid — `details.field` names the field when there is one."
}
}News, then TV
/quick-starts/news-then-tv authoringThe news feed and Headline template, the TV scene, and a story: per_pass headlines, then the channel for tv_minutes (default 2), round and round. Change the TV time later with PATCH /chapters/{id} play_for_ms. Needs authoring and data.
Request body required
urlstring requiredchannel_idstring requiredA channel id (GET /channels), or
"stage"for the stage’s channel (PUT /stages/{id}/channel switches it).default_channel_idstringnamestringtv_minutesnumberAt least 0.5
per_passinteger1–20
stage_idstringOptional: put the story on this stage (its story whenever nothing is booked). Needs the
stagesscope too.
Responses
- 201 What was made.
- 400 The request is invalid —
details.fieldnames the field when there is one. - 401 Missing or invalid API key.
- 403 The key lacks the scope, or the role is read-only.
Response fields (201)
storyIdstring requiredThe story made — GET /stories/{id}.
scenesobject[] requiredThe designs made, to edit (the headline template, the TV scene).
2 fields in
scenesidstringlabelstring
collectionIdstringThe feed’s collection, when there is one.
itemsintegerFeed items read so far.
syncErrorstring or nullWhy the feed could not be read yet.
normalStoryIdstringSomeone in front: the story the stage plays the rest of the time.
stageIdstringSomeone in front: the stage set up — try it in its preview.
curl -X POST "https://www.wunderframe.com/api/v1/quick-starts/news-then-tv" \
-H "Authorization: Bearer $WUNDERFRAME_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.srf.ch/news/bnf/rss/1646",
"channel_id": "ch_srf1",
"tv_minutes": 2,
"per_pass": 5
}'{
"storyId": "sto_1",
"scenes": [
{
"id": "scn_1",
"label": "the headline design"
}
],
"collectionId": "col_news",
"items": 40,
"syncError": null
}Error example
{
"error": {
"code": "invalid",
"message": "The request is invalid — `details.field` names the field when there is one."
}
}Someone in front of the screen
/quick-starts/attract authoringThe stage plays normal all day and attract while someone stands close to it: its camera is turned on (MediaPipe face detection on the screen; nothing is recorded), normal becomes its all-day story and the rule goes first in its list. A lobby: news, then a welcome while someone is there; a TV: a channel, then the news. distance: close ≈ 1 m (default), near ≈ 2 m, room ≈ 4 m; leave_s: keep playing after they leave (default 10). Needs authoring, data and stages.
Request body required
stage_idstring requiredA single screen (not a wall).
normalobject required{ kind: "news", url, name? }·{ kind: "tv", channel_id, default_channel_id? }·{ kind: "story", story_id }·{ kind: "welcome", headline, line? }.8 fields in
normalkindstring requiredOne of
news,tv,story,welcomeurlstringnamestringchannel_idstringA channel id (GET /channels), or
"stage"for the stage’s channel (PUT /stages/{id}/channel switches it).default_channel_idstringstory_idstringheadlinestringlinestring
attractobject required{ kind: "news", url, name? }·{ kind: "tv", channel_id, default_channel_id? }·{ kind: "story", story_id }·{ kind: "welcome", headline, line? }.8 fields in
attractkindstring requiredOne of
news,tv,story,welcomeurlstringnamestringchannel_idstringA channel id (GET /channels), or
"stage"for the stage’s channel (PUT /stages/{id}/channel switches it).default_channel_idstringstory_idstringheadlinestringlinestring
distancestringOne of
close,near,roomleave_snumber1–600
Responses
- 201 What was made.
- 400 The request is invalid —
details.fieldnames the field when there is one. - 401 Missing or invalid API key.
- 403 The key lacks the scope, or the role is read-only.
- 404 Not found in this workspace.
Response fields (201)
storyIdstring requiredThe story made — GET /stories/{id}.
scenesobject[] requiredThe designs made, to edit (the headline template, the TV scene).
2 fields in
scenesidstringlabelstring
collectionIdstringThe feed’s collection, when there is one.
itemsintegerFeed items read so far.
syncErrorstring or nullWhy the feed could not be read yet.
normalStoryIdstringSomeone in front: the story the stage plays the rest of the time.
stageIdstringSomeone in front: the stage set up — try it in its preview.
curl -X POST "https://www.wunderframe.com/api/v1/quick-starts/attract" \
-H "Authorization: Bearer $WUNDERFRAME_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"stage_id": "stg_lobby",
"normal": {
"kind": "news",
"url": "https://www.srf.ch/news/bnf/rss/1646"
},
"attract": {
"kind": "welcome",
"headline": "Welcome",
"line": "Reception is on your left"
},
"distance": "close"
}'{
"storyId": "sto_1",
"scenes": [
{
"id": "scn_1",
"label": "the headline design"
}
],
"collectionId": "col_news",
"items": 40,
"syncError": null
}Error example
{
"error": {
"code": "invalid",
"message": "The request is invalid — `details.field` names the field when there is one."
}
}