Two tracks to go from zero to live in under fifteen minutes.
Track 1 takes you from a fresh account to your first API call. Track 2 takes you from the official app skeleton to a published app on a screen. Pick whichever matches your project.
Track 1: First API call
Track 2: First published app
What you need
A ScreenWay account
studio.screenway.com. Owner or account member role works for both tracks.A shell with curl
requests.Track 1 · First API call
Goal: make a successful GET /api/v1/screens request and send a notification to all screens the key can reach.
1. Create an API key
- Open
Settings → API Keysin Studio. - Click "Create API key", give it a clear name and a scope.
- Copy the
swk_…token immediately. It is shown once.
Treat keys like passwords
2. Set the env var
Keeping the token out of your shell history (and out of git) starts here.
# Paste the key shown once after creation
export SCREENWAY_API_KEY=swk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx3. Make your first call
Pick the language you already use. All three examples hit the same endpoint and print a short summary of your account.
curl https://studio.screenway.com/api/v1/screens \
-H "Authorization: Bearer $SCREENWAY_API_KEY"Expected response shape
200 response contains a data array of screens and a meta object with pagination. Empty accounts return an empty array, which is normal.4. Send a notification
Notifications are the safest write to start with: no permanent state, immediate visible feedback on any screen that is online.
curl -X POST https://studio.screenway.com/api/v1/notifications \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $SCREENWAY_API_KEY" \
-d '{
"title": "Hello from the API",
"message": "First request worked.",
"category": "INFO",
"priority": "NORMAL",
"duration_seconds": 15
}'- Notifications without an explicit targets array use the API key scope
- A 403 means your targets are outside the key scope. Narrow the request or widen the key
- A 404 with "No screens found" means the key has no online screens to reach
- You can include action_url and action_label for a tap-through CTA on touch kiosks
Track 2 · Publish an app
Goal: take the official skeleton, give it your branding, test locally, package it, upload it as a new app in Studio.
1. Download the skeleton
The skeleton already ships the universal app scaler, a postMessage-wired config.html, German and English locales, and a safe-default boot pattern. Use it; it removes hours of plumbing work.
# In a fresh folder
unzip ~/Downloads/app-skeleton.zip -d my-first-app
cd my-first-app2. Rename and configure
Edit app.json: pick a stable slug, set version to 1.0.0, and decide on the config fields users will edit in Studio.
{
"name": "Lobby Welcome",
"slug": "lobby-welcome",
"version": "1.0.0",
"category": "utility",
"is_free": true,
"config_schema": {
"fields": [
{ "key": "title", "type": "text", "default": "Welcome", "required": true }
]
}
}Move every visible string into locales/de.json. German is the universal fallback; every other locale falls back to it for missing keys.
{
"description": "Friendly welcome screen for lobbies.",
"featured": {
"title": "A warm hello on every display",
"description": "Editable title, transparent overlay, ready in minutes."
},
"config_schema": {
"fields": {
"title": { "label": "Headline" }
}
},
"runtime": {
"fallback": { "title": "Welcome", "subtitle": "Configure in app settings." }
}
}Slug is permanent
3. Test locally
Start any static file server in the app folder. With no Studio iframe around it, the skeleton uses its inline defaults, and your URL parameters override them.
python3 -m http.server 8000
# Open http://localhost:8000/ for the runtime
# Open http://localhost:8000/config.html for the settings form
# URL params override defaults: ?title=Hi&fontSize=180- index.html renders the runtime UI
- config.html renders the settings form (Studio normally wraps it in an iframe)
- URL params change config without rebuilding
- window.APP_CONFIG is undefined in standalone mode (the intended path)
4. Package and submit
Bump version in app.json, place your banner.png (1200×400) and featured.png (1920×1080) at the bundle root, then pack a flat ZIP from inside the app folder.
# From inside the app folder. build.sh ships with the skeleton
cd my-first-app
./build.sh --bump-patch
# → my-first-app-v1.0.1.zip in the current directorySubmit the ZIP to apps@screenway.com with your app slug, target locales, and a one-line summary. The ScreenWay team validates the bundle, uploads it to the catalogue, and replies with the live link.
Self-service uploads are on the roadmap