API Endpoints
Complete reference for all Screenzzie REST API endpoints
REST API Access
Integrate with the Screenzzie API to automate your digital signage. Available on the Growth plan.
API Endpoints Reference
Complete documentation for all available REST API endpoints.
Organization & Introspection
Get information about your current API context and organization.
Get Current Context
GET /api/v1/me
Returns information about your API key, organization, rate limits, and available features. This endpoint does not count against your rate limit.
Example Request:
curl -X GET "https://www.screenzzie.com/api/v1/me" \
-H "Authorization: Bearer sk_live_xxx"
Example Response:
{
"success": true,
"data": {
"apiKey": {
"id": "uuid",
"name": "My API Key",
"keyPrefix": "sk_live_abc123",
"scopes": ["screens:read", "screens:write", "playlists:read"],
"expiresAt": null,
"lastUsedAt": "2024-01-15T10:30:00Z"
},
"organization": {
"id": "uuid",
"name": "My Company",
"planId": "growth",
"subscriptionStatus": "active",
"trialEndsAt": null,
"maxScreensAllowed": 50,
"activeScreensCount": 12
},
"rateLimits": {
"limit": 100000,
"used": 45,
"remaining": 99955,
"resetAtMs": 1704153600000
},
"features": {
"sequences": true,
"schedules": true,
"api": true
}
}
}
List Organizations
GET /api/v1/organizations
Returns the organizations accessible with your API key. Currently, each API key belongs to exactly one organization.
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
page | number | Page number (default: 1) |
limit | number | Items per page (default: 20, max: 100) |
Example Request:
curl -X GET "https://www.screenzzie.com/api/v1/organizations" \
-H "Authorization: Bearer sk_live_xxx"
Example Response:
{
"success": true,
"data": {
"items": [
{
"id": "uuid",
"name": "My Company",
"planId": "growth",
"subscriptionStatus": "active",
"maxScreensAllowed": 50,
"activeScreensCount": 12,
"createdAt": "2024-01-01T00:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 1,
"totalPages": 1,
"hasMore": false
}
}
}
Screens
Manage your digital signage screens.
List Screens
GET /api/v1/screens
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
page | number | Page number (default: 1) |
limit | number | Items per page (default: 20, max: 100) |
isActive | boolean | Filter by active status |
isOnline | boolean | Filter by online status |
screenGroupId | uuid | Filter by screen group |
workspaceId | uuid | Filter by workspace |
Example Request:
curl -X GET "https://www.screenzzie.com/api/v1/screens?isOnline=true&limit=10" \
-H "Authorization: Bearer sk_live_xxx"
Example Response:
{
"success": true,
"data": {
"items": [
{
"id": "uuid",
"name": "Lobby Display",
"description": "Main entrance screen",
"isActive": true,
"isOnline": true,
"lastSeenAt": "2024-01-01T12:00:00Z",
"orientation": "landscape",
"rotation": "0",
"timezone": "Europe/Madrid",
"location": "Building A, Floor 1",
"cityName": "Madrid",
"latitude": 40.4168,
"longitude": -3.7038,
"workspaceId": "uuid",
"screenGroupId": null,
"currentPlaylistId": "uuid",
"currentSequenceId": null,
"defaultPlaylistId": "uuid",
"defaultSequenceId": null,
"createdAt": "2024-01-01T00:00:00Z",
"updatedAt": "2024-01-01T12:00:00Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 25,
"totalPages": 3,
"hasMore": true
}
}
}
Get Screen
GET /api/v1/screens/:screenId
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
screenId | uuid | The screen ID |
Example Response:
Returns a single screen object with the same structure as the list response.
Create Screen
POST /api/v1/screens
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Screen name (max 100 chars) |
description | string | No | Screen description (max 500 chars) |
orientation | string | No | landscape or portrait (default: landscape) |
rotation | string | No | 0, 90, 180, or 270 (default: 0) |
timezone | string | No | IANA timezone (e.g., Europe/Madrid) |
location | string | No | Physical location description (max 200 chars) |
screenGroupId | uuid | No | Screen group membership |
workspaceId | uuid | No | Workspace assignment |
Playlist and sequence assignments cannot be set during creation. Use the Update Screen endpoint to assign content after creation.
Example Request:
curl -X POST "https://www.screenzzie.com/api/v1/screens" \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Conference Room A",
"orientation": "landscape",
"rotation": "0",
"timezone": "Europe/Madrid",
"location": "Building B, Room 101"
}'
Example Response:
{
"success": true,
"data": {
"id": "uuid",
"name": "Conference Room A",
"description": null,
"isActive": true,
"isOnline": false,
"lastSeenAt": null,
"orientation": "landscape",
"rotation": "0",
"timezone": "Europe/Madrid",
"location": "Building B, Room 101",
"cityName": null,
"latitude": null,
"longitude": null,
"workspaceId": null,
"screenGroupId": null,
"currentPlaylistId": null,
"currentSequenceId": null,
"defaultPlaylistId": null,
"defaultSequenceId": null,
"createdAt": "2024-01-01T00:00:00Z",
"updatedAt": "2024-01-01T00:00:00Z"
}
}
Update Screen
PATCH /api/v1/screens/:screenId
All fields are optional. Only include fields you want to update.
Request Body:
| Field | Type | Description |
|---|---|---|
name | string | New screen name (max 100 chars) |
description | string | New description (null to clear) |
orientation | string | landscape or portrait |
rotation | string | 0, 90, 180, or 270 |
timezone | string | IANA timezone |
location | string | Physical location (null to clear) |
workspaceId | uuid | Workspace ID (null to remove) |
screenGroupId | uuid | Screen group ID (null to remove) |
currentPlaylistId | uuid | Current playlist (null to remove) |
currentSequenceId | uuid | Current sequence (null to remove) |
defaultPlaylistId | uuid | Default playlist (null to remove) |
defaultSequenceId | uuid | Default sequence (null to remove) |
Example Request:
curl -X PATCH "https://www.screenzzie.com/api/v1/screens/abc123" \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated Display Name",
"currentPlaylistId": "playlist-uuid"
}'
Playlists
Manage content playlists for your screens.
List Playlists
GET /api/v1/playlists
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
page | number | Page number (default: 1) |
limit | number | Items per page (default: 20, max: 100) |
workspaceId | uuid | Filter by workspace |
Example Response:
{
"success": true,
"data": {
"items": [
{
"id": "uuid",
"name": "Main Content",
"description": "Primary playlist for lobby screens",
"itemCount": 5,
"totalDuration": 120,
"workspaceId": null,
"createdBy": "user-uuid",
"createdAt": "2024-01-01T00:00:00Z",
"updatedAt": "2024-01-01T12:00:00Z"
}
],
"pagination": { ... }
}
}
Get Playlist
GET /api/v1/playlists/:playlistId
Returns the playlist with its items. Items are always included in the response.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
playlistId | uuid | The playlist ID |
Example Response:
{
"success": true,
"data": {
"id": "uuid",
"name": "Main Content",
"description": "Primary playlist for lobby screens",
"itemCount": 2,
"totalDuration": 45,
"workspaceId": null,
"createdBy": "user-uuid",
"createdAt": "2024-01-01T00:00:00Z",
"updatedAt": "2024-01-01T12:00:00Z",
"items": [
{
"id": "item-uuid-1",
"position": 0,
"duration": 15,
"itemType": "media",
"mediaId": "media-uuid",
"config": null,
"createdAt": "2024-01-01T00:00:00Z"
},
{
"id": "item-uuid-2",
"position": 1,
"duration": 30,
"itemType": "website",
"mediaId": null,
"config": { "url": "https://example.com" },
"createdAt": "2024-01-01T00:00:00Z"
}
]
}
}
Create Playlist
POST /api/v1/playlists
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Playlist name (max 100 chars) |
description | string | No | Playlist description (max 500 chars) |
workspaceId | uuid | No | Workspace assignment |
Example Request:
curl -X POST "https://www.screenzzie.com/api/v1/playlists" \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Holiday Promotions",
"description": "Seasonal content for December"
}'
Update Playlist
PATCH /api/v1/playlists/:playlistId
Request Body:
| Field | Type | Description |
|---|---|---|
name | string | New playlist name |
description | string | New description (null to clear) |
workspaceId | uuid | Workspace ID (null to remove) |
Delete Playlist
DELETE /api/v1/playlists/:playlistId
Returns 204 No Content on success.
Media
Access and register media files in your library.
List Media
GET /api/v1/media
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
page | number | Page number (default: 1) |
limit | number | Items per page (default: 20, max: 100) |
type | string | Filter by type: image or video |
folderId | uuid | Filter by folder |
workspaceId | uuid | Filter by workspace |
Example Response:
{
"success": true,
"data": {
"items": [
{
"id": "uuid",
"name": "promo-video.mp4",
"type": "video",
"fileUrl": "https://...",
"thumbnailUrl": "https://...",
"fileSize": 15728640,
"duration": 30,
"folderId": null,
"workspaceId": null,
"uploadedBy": "user-uuid",
"createdAt": "2024-01-01T00:00:00Z",
"updatedAt": "2024-01-01T00:00:00Z"
}
],
"pagination": { ... }
}
}
Get Media
GET /api/v1/media/:mediaId
Returns a single media object with the same structure as the list response.
Register Media
POST /api/v1/media
Registers a media file that has already been uploaded to storage. This endpoint does not handle file uploads directly - use the web dashboard for file uploads.
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Media name (max 200 chars) |
type | string | Yes | image or video |
fileUrl | string | Yes | URL of the uploaded file |
thumbnailUrl | string | No | URL of the thumbnail |
fileSize | number | No | File size in bytes |
duration | number | No | Duration in seconds (for videos) |
folderId | uuid | No | Folder assignment |
workspaceId | uuid | No | Workspace assignment |
Example Request:
curl -X POST "https://www.screenzzie.com/api/v1/media" \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Company Logo",
"type": "image",
"fileUrl": "https://your-storage.com/logo.png",
"thumbnailUrl": "https://your-storage.com/logo-thumb.png",
"fileSize": 102400
}'
Direct file upload is not available via the REST API. Upload files through the web dashboard, or upload to your own storage and register the URL using this endpoint.
Delete Media
DELETE /api/v1/media/:mediaId
Returns 204 No Content on success.
Schedules
Schedules are only available on the Growth plan and above.
Schedule content to play at specific times.
List Schedules
GET /api/v1/schedules
Query Parameters:
| Parameter | Type | Description |
|---|---|---|
page | number | Page number (default: 1) |
limit | number | Items per page (default: 20, max: 100) |
workspaceId | uuid | Filter by workspace |
screenId | uuid | Filter by screen |
isActive | boolean | Filter by active status |
Example Response:
{
"success": true,
"data": {
"items": [
{
"id": "uuid",
"name": "Weekend Promotions",
"playlistId": "playlist-uuid",
"sequenceId": null,
"screenId": null,
"screenGroupId": null,
"targetType": "all_screens",
"dayOfWeek": [0, 6],
"startTime": "09:00",
"endTime": "21:00",
"startDate": null,
"endDate": null,
"priority": 10,
"isActive": true,
"color": "#3B82F6",
"workspaceId": null,
"createdAt": "2024-01-01T00:00:00Z",
"updatedAt": "2024-01-01T00:00:00Z"
}
],
"pagination": { ... }
}
}
Get Schedule
GET /api/v1/schedules/:scheduleId
Returns a single schedule object with the same structure as the list response.
Create Schedule
POST /api/v1/schedules
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Schedule name (max 100 chars) |
playlistId | uuid | No* | Playlist to schedule |
sequenceId | uuid | No* | Sequence to schedule |
targetType | string | Yes | screen, screen_group, all_screens, or multiple_screens |
screenId | uuid | Conditional | Required if targetType is screen |
screenGroupId | uuid | Conditional | Required if targetType is screen_group |
dayOfWeek | number[] | No | Days of week (0=Sun, 6=Sat) |
startTime | string | No | Start time in HH:MM format |
endTime | string | No | End time in HH:MM format |
startDate | string | No | Start date in ISO format |
endDate | string | No | End date in ISO format |
priority | number | No | Priority 0-100 (default: 0) |
isActive | boolean | No | Whether active (default: true) |
color | string | No | Display color (e.g., #3B82F6) |
workspaceId | uuid | No | Workspace assignment |
*Either playlistId or sequenceId should be provided to schedule content.
Target Type Conditional Requirements:
| targetType | Required Fields |
|---|---|
screen | screenId |
screen_group | screenGroupId |
all_screens | None |
multiple_screens | None (use separate endpoint to add screens) |
Example Request:
curl -X POST "https://www.screenzzie.com/api/v1/schedules" \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Weekend Promotions",
"playlistId": "abc123",
"targetType": "all_screens",
"dayOfWeek": [0, 6],
"startTime": "09:00",
"endTime": "21:00",
"priority": 10,
"color": "#3B82F6"
}'
Update Schedule
PATCH /api/v1/schedules/:scheduleId
All fields are optional. Uses the same field definitions as Create Schedule.
Delete Schedule
DELETE /api/v1/schedules/:scheduleId
Returns 204 No Content on success.
HTTP Status Codes
| Code | Description |
|---|---|
200 | Success |
201 | Created |
204 | No Content (successful deletion) |
400 | Bad Request (validation error) |
401 | Unauthorized (invalid API key) |
403 | Forbidden (insufficient permissions or plan) |
404 | Not Found |
429 | Too Many Requests (rate limited) |
500 | Internal Server Error |