Product Keys
Total Keys
—
Active
—
Disabled
—
Online Now
—
| Profile | Key | Status | Sessions | Active | Created | Actions |
|---|---|---|---|---|---|---|
| Loading… | ||||||
Artists
| Name | Product Key | Data (JSON) | Created | Actions |
|---|---|---|---|---|
| Loading… | ||||
Projects
| Name | Product Key | Artist | Data (JSON) | Created | Actions |
|---|---|---|---|---|---|
| Loading… | |||||
API Documentation
Public endpoints for client applications. Authenticate with your product key via X-Product-Key header or body.key.
Check Key
no session
GET /api/check/:key
POST /api/check // key in body when keeping it out of URL logs
// POST body:
{ "key": "your-product-key-uuid" }
// Response:
{
"valid": true,
"profile": "Artist Name",
"key": "your-product-key-uuid",
"max_sessions": 1
}
Get Settings
no session
GET /api/settings
Header: X-Product-Key: your-product-key-uuid
// Response:
{
"settings": { "theme": "dark", "feature_x": true, ... }
}
Sync Settings
writes
POST /api/settings/sync
// Merges incoming fields into stored settings (use replace:true to overwrite)
// Body — key in header:
Header: X-Product-Key: your-product-key-uuid
{ "settings": { "last_opened": "2026-07-20", "version": "2.1" } }
// Body — key in body:
{ "key": "your-product-key-uuid", "settings": { ... }, "replace": false }
// Response — full merged result:
{
"settings": { "theme": "dark", "last_opened": "2026-07-20", "version": "2.1" }
}
Ping / Heartbeat
registers session
POST /api/ping
// Call every 1–2 minutes. Returns settings on each ping.
{ "key": "uuid", "device_id": "unique-device-id", "device_name": "My PC" }
// Valid response:
{ "valid": true, "profile": "Artist Name", "settings": { ... } }
// Error responses:
{ "valid": false, "reason": "invalid_key" }
{ "valid": false, "reason": "key_disabled" }
{ "valid": false, "reason": "session_limit_reached", "limit": 1 }
Session Lifecycle
• Sessions expire automatically after 3 minutes without a ping (Redis TTL)
• max_sessions limits how many devices can be active simultaneously
• The same device_id always refreshes its own session (no double-counting)
• Settings synced via /api/settings/sync are returned on the next /api/ping