Examples
The examples use curl and the variable $API_TOKEN. The base URL is https://cloud.viewneo.com/api/public/v1.
Upload a file
Section titled “Upload a file”Files don’t go through the API itself but directly into storage – via a pre-signed address. This makes even large videos fast.
# 1. Start the uploadcurl https://cloud.viewneo.com/api/public/v1/media/uploads -H "Authorization: Bearer $API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"filename":"speisekarte.jpg","mimeType":"image/jpeg","fileSize":'"$(wc -c < speisekarte.jpg)"'}'
# 2. Send the file to upload.url from the responsecurl -X PUT "$UPLOAD_URL" -H "Content-Type: image/jpeg" --data-binary @speisekarte.jpg
# 3. Complete it, with the MD5 checksumcurl https://cloud.viewneo.com/api/public/v1/media/uploads/$MEDIA_ID/complete -H "Authorization: Bearer $API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"md5":"'"$(openssl md5 -r speisekarte.jpg | cut -d' ' -f1)"'"}'Large files are uploaded as multipart: the response from step 1 then states the part size; you get the addresses of the parts with POST /media/uploads/{id}/parts.
After that, the content is ready. Videos are prepared for playback in the background. Some formats are converted and in the process replace the uploaded content: TIFF, BMP and HEIC become JPEG (or PNG with transparency), documents such as PDF or PowerPoint become one image per page in a new folder. You find the new IDs via GET /media?folderId=….
Bring content to the screen
Section titled “Bring content to the screen”# add the content to a playlist – on weekdays at lunchtimecurl https://cloud.viewneo.com/api/public/v1/playlists/$PLAYLIST_ID/entries \ -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \ -d '{"type":"media","mediaId":"'"$MEDIA_ID"'","durationSeconds":15, "schedule":{"rule":"scheduled","weekdays":["mon","tue","wed","thu","fri"],"startTime":"11:30","endTime":"14:30"}}'
# assign the playlist to a device (a group works the same way via /device-groups)curl -X PATCH https://cloud.viewneo.com/api/public/v1/devices/$DEVICE_ID \ -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \ -d '{"playlistId":"'"$PLAYLIST_ID"'"}'Show data from your system
Section titled “Show data from your system”Design a Template with placeholders once in the Designer. Your system creates content from it and updates it whenever the data changes:
# which placeholders does the template have?curl https://cloud.viewneo.com/api/public/v1/templates/$TEMPLATE_ID -H "Authorization: Bearer $API_TOKEN"
# create content from it – add its ID to a playlist like any media itemcurl https://cloud.viewneo.com/api/public/v1/templates/$TEMPLATE_ID/contents \ -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \ -d '{"name":"Mittagstisch","values":{"gericht":"Labskaus","preis":"12,50 €"}}'
# change the values the next day – the devices update themselvescurl -X PATCH https://cloud.viewneo.com/api/public/v1/template-contents/$CONTENT_ID \ -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \ -d '{"values":{"gericht":"Fischfrikadelle","preis":"11,90 €"}}'The names of the placeholders (here gericht and preis) come from your Template.
Copy a slide and change its texts and pictures
Section titled “Copy a slide and change its texts and pictures”Design the slide once in the designer and give its elements meaningful layer names. Your system copies it and sets its texts, images and videos – layout, colours and size stay as designed:
# find the slidecurl "https://cloud.viewneo.com/api/public/v1/media?type=slide" -H "Authorization: Bearer $API_TOKEN"
# copy it – the copy gets its own idcurl -X POST https://cloud.viewneo.com/api/public/v1/media/$SLIDE_ID/duplicate \ -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" -d '{}'
# which elements does the copy have? (note "version")curl https://cloud.viewneo.com/api/public/v1/slides/$COPY_ID/elements -H "Authorization: Bearer $API_TOKEN"
# change texts and the picture – all or nothingcurl -X PATCH https://cloud.viewneo.com/api/public/v1/slides/$COPY_ID/elements \ -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \ -d '{"ifVersion":"'"$VERSION"'","elements":[{"name":"Price","text":"3.99 €"},{"name":"Product","media":{"mediaId":"'"$IMAGE_ID"'"}}]}'- Address an element by its layer name (
name) or itsid. If a name occurs more than once on the slide, the answer lists the matching ids (candidates) – use theidthen. - A text in one style keeps it; with mixed styles (e.g. one bold word) the basic style of the text box applies.
- Clocks, counters and RSS fields update themselves and are not listed. A slide made from a template is changed through its placeholders.
Sync a playlist
Section titled “Sync a playlist”Send the complete content in one call. Entries you send with their id are kept, new ones are created, and all others are removed:
curl -X PUT https://cloud.viewneo.com/api/public/v1/playlists/$PLAYLIST_ID/entries \ -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \ -d '{"entries":[{"type":"media","mediaId":"'"$ANGEBOT_1"'"},{"type":"media","mediaId":"'"$ANGEBOT_2"'"}]}'Put a new player into operation
Section titled “Put a new player into operation”Start the player; it shows a six-character activation code. Activate it into a device group – every device belongs to one – and it immediately plays the group’s content:
curl https://cloud.viewneo.com/api/public/v1/devices/activate \ -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \ -d '{"activationCode":"AB3XZ7","name":"Lobby Empfang","groupId":"'"$GROUP_ID"'"}'Every player needs a license; licenses are never added automatically. Without a free license, the API responds with 409 LICENSE_LIMIT_REACHED.
Find offline devices
Section titled “Find offline devices”curl "https://cloud.viewneo.com/api/public/v1/devices?limit=100" -H "Authorization: Bearer $API_TOKEN" \ | jq '.data[] | select(.online == false) | {name, lastSeenAt}'Retrieve a day’s proof of play
Section titled “Retrieve a day’s proof of play”curl "https://cloud.viewneo.com/api/public/v1/reports/device-log/$DEVICE_ID?filter=playouts&from=2026-10-06T00:00:00Z&to=2026-10-07T00:00:00Z&limit=200" \ -H "Authorization: Bearer $API_TOKEN"Repeat the call with &cursor=<nextCursor> until nextCursor is null. For an entire month of a piece of content in one go, there is the CSV export GET /reports/media/{id}/playout-details/export.