Skip to content
CtrlK

Endpoints

All paths start with https://cloud.viewneo.com/api/public/v1. The parameters and responses of each endpoint are described in the interactive reference.

AreaPathsScope
Media/media, /media/{id}, /media/websites, /media/foldersmedia:*
Upload/media/uploads, …/{id}/parts, …/{id}/completemedia:write
Templates/templates, /templates/{id}, /templates/{id}/contents, /template-contents/{id}media:*
Playlists/playlists, /playlists/{id}playlists:*
Playlist entries/playlists/{id}/entries, …/entries/order, …/entries/{entryId}playlists:*
Devices/devices, /devices/{id}, /devices/activatedevices:*
Device groups/device-groups, /device-groups/{id}devices:*
Reports/reports/device-log/{deviceId}, /reports/media/{id}/…reports:read
OAuth/oauth/token–
  • JSON bodies with Content-Type: application/json. Unknown fields are rejected with 400 VALIDATION_ERROR – so typos are noticed immediately.
  • Times are ISO 8601 in UTC, e.g. 2026-10-05T14:30:00.000Z.
  • IDs are UUIDs; don’t parse them.
  • PATCH only changes the fields you send. null removes an optional reference – such as a device’s own playlist, so that the device then plays its group’s playlist.
  • Devices pick up changes by themselves; you don’t need to publish anything.

Lists of media, playlists and devices are paginated: ?page=2&limit=50 (limit 1–100, default 50). The response contains pagination with page, limit, total and totalPages.

Reports work with a cursor: pass the returned nextCursor as ?cursor=. nextCursor: null means you have everything.

Errors always have the same form:

{
"success": false,
"error": { "code": "VALIDATION_ERROR", "message": "Request validation failed",
"details": [{ "field": "limit", "errors": ["limit must not be greater than 100"] }] },
"correlationId": "7986ab46-9ccb-43c1-86b3-1abefa3bab98"
}

Evaluate error.code, not the text. The most important codes:

StatusCodeMeaning
400VALIDATION_ERROR, INVALID_INPUTParameter or field is missing or invalid
401UNAUTHORIZED, TOKEN_INVALIDToken is missing, unknown, revoked or expired
403FORBIDDENScope is missing – or, for media reports, the Reports plugin
403SUBSCRIPTION_REQUIREDthe API plugin is not booked
404NOT_FOUNDdoes not exist in your account
409LICENSE_LIMIT_REACHED, PLAYER_LIMIT_REACHEDno free license for another player
429QUOTA_EXCEEDEDLimit reached, see below
502 / 503UPSTREAM_ERROR, SERVICE_UNAVAILABLEtemporary – try again later

Every response carries the X-Correlation-Id header. Include it when you contact Support.

Each token may make 60 requests per minute. The headers X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset show the status. Beyond that, the API responds with 429 QUOTA_EXCEEDED and the Retry-After header (seconds). Spread large jobs over time instead of sending them in parallel.

Reports only contain data from devices on which Reports is turned on (off by default). The device log goes back 7 days; media reports require the Reports plugin and go back 90 days, with the Extended option 365 days. Without from/to, the current day applies (from 00:00 UTC).