Use the ScreenWay Studio REST API.
The public API is organized around account API keys and /api/v1 REST endpoints. Use it to automate screens, media, programs, apps, Designer projects, notifications, and analytics.
Authentication
Create an API key in Studio under Settings → API Keys. Keys start with swk_, are shown once, and can be scoped to an account, spaces, groups, or individual screens. Send every request with an Authorization: Bearer swk_… header.
curl https://studio.screenway.com/api/v1/screens \
-H "Authorization: Bearer swk_your_api_key_here"Key scopes
Each key carries a list of targets. Notifications and other target-aware endpoints honour those scopes: a request whose targets fall outside the key's allowed set is rejected with 403. All endpoints are account-scoped, so a key can never read or modify data in another account.
Target types
workspacescopespacescopegroupscopescreenscopeStore keys securely
Errors
All errors return a JSON body with a single error string and an appropriate HTTP status. Validation messages are human-readable and tell you what to fix.
{
"error": "Invalid command type. Allowed: content:program, content:media, system:restart, system:reload, playback:jump"
}Cross-account lookups return 404
Pagination & responses
List endpoints return data plus meta. Pagination uses limit (default 50, maximum 200) and offset (default 0). Single-resource endpoints return a single data object without meta.
GET /api/v1/screens?limit=100&offset=200
{
"data": [ ... ],
"meta": { "total": 412, "limit": 100, "offset": 200 }
}Common query parameters
limitintegeroffsetintegerspace_iduuidRate limits & retries
The v1 API does not enforce hard rate limits today, but the underlying Supabase and storage backends can throttle abusive traffic. Treat 500 responses as retryable with exponential backoff. Media uploads (POST /media, /from-url, /from-data) are the most expensive; keep concurrency low.
Idempotent reads
Mutations
Bulk operations
/programs/{id}/assign, notifications, app-instances) instead of looping over single calls.Endpoint map
Screens
/api/v1/screensList screens in the account, sorted by creation date.
Query parameters
space_iduuidstatusstringlimitintegeroffsetinteger{
"data": [
{
"id": "9e6e…",
"name": "Lobby Display",
"status": "online",
"space_id": "a3b1…",
"space_name": "Berlin HQ",
"device_id": "dev_…",
"is_paired": true,
"paired_at": "2026-04-12T08:14:22Z",
"last_seen_at": "2026-05-13T09:02:11Z",
"player_version": "1.42.0",
"os_version": "Android 13",
"resolution": "1920x1080",
"location": {
"street_address": "Friedrichstr. 1",
"postal_code": "10117",
"city": "Berlin",
"country": "DE"
},
"rotation": 0,
"created_at": "2026-03-01T11:00:00Z",
"updated_at": "2026-05-13T09:02:11Z"
}
],
"meta": { "total": 1, "limit": 50, "offset": 0 }
}/api/v1/screens/{id}/commandsSend a command to a single screen. The command is persisted in screen_commands and broadcast via Supabase Realtime.
Body
typerequiredstringcontent:program, content:media, system:restart, system:reload, playback:jump.payload.programIduuidtype=content:program.payload.mediaIduuidtype=content:media.{
"type": "content:program",
"payload": { "programId": "prog_…" }
}{
"data": {
"id": "cmd_…",
"screen_id": "9e6e…",
"type": "content:program",
"status": "sent",
"created_at": "2026-05-13T09:14:55Z"
}
}Media & folders
/api/v1/mediaList media items in the account, newest first.
Query parameters
space_iduuidtypestringfolder_iduuid | "__root__"__root__ for media without a folder.limit / offsetinteger/api/v1/media/from-urlImport an image or video from a public HTTP(S) URL. Localhost and private network ranges are rejected.
Body
space_idrequireduuidurlrequiredstringnamestringfolder_iduuidfolder_namestringparent_folder_iduuid{
"space_id": "a3b1…",
"url": "https://example.com/poster.png",
"name": "Spring poster",
"folder_name": "Posters"
}/api/v1/media/from-dataUpload a data URL or base64 payload. Useful for AI-generated assets or QR codes.
Body
space_idrequireduuiddata_urlstringdata_url or base64_data is required.base64_datastringmime_typestringfile_namestring{
"space_id": "a3b1…",
"data_url": "data:image/png;base64,iVBORw0KGgo...",
"file_name": "qr.png"
}Programs
/api/v1/programsList programs in the account.
Query parameters
space_iduuidlimit / offsetinteger/api/v1/programs/{id}/assignAssign a program to one or more screens. Stores the assignment and broadcasts a content:program command in one shot.
Body
screen_idsrequireduuid[]{
"screen_ids": ["9e6e…", "12b3…"]
}The response splits the input list into assigned_screen_ids and skipped_screen_ids. Invalid or foreign IDs are skipped silently.
Apps & app instances
/api/v1/appsList active ScreenWay apps. Use the slug to find a specific one.
Query parameters
slugstringcategorystringsearchstringlimit / offsetinteger/api/v1/app-instancesCreate a configured app instance in a space.
Body
app_idrequireduuidspace_idrequireduuidnamerequiredstringconfigobject | stringtransparent_backgroundbooleanDesigner projects
/api/v1/designer-projects/{id}/renderRender a Designer project's exported HTML to an image data URL. Optionally write the result back as the project thumbnail.
Body
format"png" | "jpeg"width / heightintegerqualityinteger (0-100)wait_msintegerupdate_thumbnailbooleanbase_urlstring{
"format": "png",
"width": 1920,
"height": 1080,
"update_thumbnail": false
}Render requires exported_html
exported_html respond with 400. Save the project in Designer once to generate it.Notifications
/api/v1/notificationsBroadcast a notification overlay to screens. Omitting targets uses the API key's configured target list.
Body
titlerequiredstringmessagerequiredstringcategoryrequiredenumpriorityrequiredenumiconstringaction_urlstringaction_labelstringduration_secondsnumbertargetsTarget[]{
"title": "Service desk",
"message": "Counter 4 is now open",
"category": "INFO",
"priority": "NORMAL",
"duration_seconds": 30,
"action_url": "https://studio.screenway.com/dashboard",
"action_label": "Open dashboard"
}{
"data": {
"id": "0a7e…",
"screens_notified": 4,
"targets": [{ "type": "workspace", "id": "ws_…" }],
"resolved_screen_ids": ["9e6e…", "12b3…", "44dd…", "8f1c…"]
}
}Analytics
/api/v1/analyticsAccount-wide analytics rollup. Defaults to the last 7 days.
Query parameters
fromdate (YYYY-MM-DD)todate (YYYY-MM-DD)space_iduuidThe response includes screen counts (total / online / offline), average uptime, total items played, a per-screen breakdown, and the top 10 played items.
Common workflows
Media automation
/media/from-url, organize them with folders, then push them onto screens with /screens/{id}/commands (type=content:media).Playback control
/programs/{id}/assign to switch many screens at once instead of sending individual commands.Designer pipeline
update_thumbnail=true, then assign the project to a program slot in Studio.Notifications
targets for a finer scope.Reporting
/analytics on a schedule into your BI tool, then group by space with space_id.Key hygiene
Account scoping
workspace_id manually.Designer + Apps
/app-instances and /designer-projects to assemble layered, scheduled content without ever opening Studio.