API Introduction
The Digital Signage RDS public REST API lets you integrate third parties with your account, automate tasks, or build your own dashboard.
- Base URL:
https://rds.digitalsignagerds.com/api/v1 - Version:
v1(stable) - Format: JSON over HTTPS
1. Three steps to start
- Open your Profile and go to the API tab.
- Create a new key with a name (e.g.
Zapier), pick an expiration and the permissions (read only or read + write). - Copy the token (
rds_live_…). It will not be shown again. If you lose it, create another one.
2. Authentication
Pass the token in the Authorization header as a Bearer token:
curl -H "Authorization: Bearer rds_live_xxxxx" \
https://rds.digitalsignagerds.com/api/v1/me
A good first test is GET /me: it returns the key and the associated
account.
Permissions (scopes)
Each key carries a set of permissions:
| Scope | What it allows |
|---|---|
read |
List and read resources (GET) |
write |
Upload content and modify resources (POST) |
Read-only keys cannot upload images/videos or modify anything; they
will return 403 insufficient_scope.
Expiration and revocation
Keys may auto-expire (30 days, 90 days, 1 year or "No expiration"). You
can also revoke them manually from your profile. An expired or
revoked key returns 401 Token has expired or 401 Token has been revoked.
3. Rate limit
60 requests per minute per token. When you go over, you get a
429 Too Many Requests with a Retry-After: <seconds> header telling
you how long to wait.
4. Responses
Single resource
{
"object": "device",
"id": 1138,
"code": "RDSDF25",
"...": "..."
}
Lists (cursor pagination)
{
"object": "list",
"url": "/api/v1/devices",
"data": [ { ... }, { ... } ],
"has_more": true,
"next_cursor": "1142"
}
To fetch the next page, pass the next_cursor as starting_after:
GET /api/v1/devices?starting_after=1142&limit=20
Accepted list parameters:
| Parameter | Value | Default |
|---|---|---|
limit |
1–100 | 20 |
starting_after |
integer id | 0 (first result) |
Errors
{
"error": {
"type": "unauthorized",
"message": "Invalid token"
}
}
Common error types:
| Code | Type | When |
|---|---|---|
| 401 | unauthorized |
Missing, malformed, unknown, revoked or expired token |
| 403 | insufficient_scope |
The key lacks the required permission |
| 403 | quota_exceeded |
Account device / image / video cap reached |
| 404 | not_found |
Resource does not exist or is not visible to your account |
| 405 | method_not_allowed |
HTTP method not allowed on this path |
| 413 | file_too_large |
Uploaded file exceeds the limit |
| 415 | unsupported_media_type |
File extension or content not supported |
| 429 | rate_limited |
Over 60 requests per minute |
| 500 | server_error |
Unexpected server error |
5. Available endpoints
Account
| Method | Path | Description |
|---|---|---|
| GET | /me |
Key info (auth smoke test) |
| GET | /account |
Account: address, contact, limits, usage and subscription |
| GET | /subscription |
Subscription: current cycle, counters and next payment |
| GET | /invoices |
Invoices (Stripe), newest first |
Devices
| Method | Path | Description |
|---|---|---|
| GET | /devices |
List devices (retired devices excluded) |
| GET | /devices/{id_or_code} |
A device (accepts integer id or RDSxxx code) |
| GET | /devices?code=RDSF8B8 |
Filter list by exact code |
Each device exposes is_online, last_seen_at, playlist_id +
playlist_name, workspace_id + workspace_name (+ parent if it's a
sub-workspace), kiosk_mode, kiosk_whitelist, branch_*, contract
dates and more.
Workspaces
| Method | Path | Description |
|---|---|---|
| GET | /workspaces |
List (workspaces and sub-workspaces) |
| GET | /workspaces/{id} |
A workspace with tags, default content and map |
Playlists
| Method | Path | Description |
|---|---|---|
| GET | /playlists |
List of playlists |
| GET | /playlists/{id} |
Playlist with device / image / video counts |
Images
| Method | Path | Description |
|---|---|---|
| GET | /images |
List |
| GET | /images/{id} |
An image (includes url to fetch the binary) |
| POST | /images |
Upload (requires write scope) |
Videos
| Method | Path | Description |
|---|---|---|
| GET | /videos |
List |
| GET | /videos/{id} |
A video (includes url to fetch the binary) |
| POST | /videos |
Upload (requires write scope) |
6. Uploading content
POST /images and POST /videos accept multipart/form-data with two
parts: file (binary, required) and name (optional text — the
customer-facing title).
curl -X POST https://rds.digitalsignagerds.com/api/v1/images \
-H "Authorization: Bearer rds_live_xxxxx" \
-F "name=Christmas banner" \
-F "file=@/path/to/banner.png"
Image constraints:
- Allowed extensions:
jpg,jpeg,png,gif,webp,avif,bmp - Max size: 256 MB
- Validated by content (magic bytes), not the client-provided MIME header
- Per-account cap: see
account.limits.max_images
Video constraints:
- Allowed extensions:
mp4,mkv,webm,mov,avi - Max size:
account.limits.max_video_size_mb(default 200 MB) - Per-account cap: see
account.limits.max_videos
A successful POST returns 201 Created with the newly created resource
(including id, filename, url, and crc).
7. Interactive reference
To try every endpoint live, see the exact response schemas, and grab the OpenAPI YAML, go to Reference (Swagger).