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.
The areas
Section titled “The areas”| Area | Paths | Scope |
|---|---|---|
| Media | /media, /media/{id}, /media/websites, /media/folders | media:* |
| Upload | /media/uploads, …/{id}/parts, …/{id}/complete | media: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/activate | devices:* |
| Device groups | /device-groups, /device-groups/{id} | devices:* |
| Reports | /reports/device-log/{deviceId}, /reports/media/{id}/… | reports:read |
| OAuth | /oauth/token | – |
Requests and responses
Section titled “Requests and responses”- JSON bodies with
Content-Type: application/json. Unknown fields are rejected with400 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.
PATCHonly changes the fields you send.nullremoves 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.
Pagination
Section titled “Pagination”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
Section titled “Errors”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:
| Status | Code | Meaning |
|---|---|---|
| 400 | VALIDATION_ERROR, INVALID_INPUT | Parameter or field is missing or invalid |
| 401 | UNAUTHORIZED, TOKEN_INVALID | Token is missing, unknown, revoked or expired |
| 403 | FORBIDDEN | Scope is missing – or, for media reports, the Reports plugin |
| 403 | SUBSCRIPTION_REQUIRED | the API plugin is not booked |
| 404 | NOT_FOUND | does not exist in your account |
| 409 | LICENSE_LIMIT_REACHED, PLAYER_LIMIT_REACHED | no free license for another player |
| 429 | QUOTA_EXCEEDED | Limit reached, see below |
| 502 / 503 | UPSTREAM_ERROR, SERVICE_UNAVAILABLE | temporary – try again later |
Every response carries the X-Correlation-Id header. Include it when you contact Support.
Limits
Section titled “Limits”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
Section titled “Reports”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).