This document provides a comprehensive REST endpoint reference for Solaris Control API v1, including state query endpoints, Granular Security masking rules (ApiPermissionsFilter), per-monitor resolution via Friendly Slugs, and complete documentation for all 26 Action Control System commands (POST /api/v1/control).
- State Query Endpoints & Granular Data Privacy
GET /api/v1/health(Unrestricted Liveness Probe)GET /api/v1/status(Full State Snapshot & Masking)GET /api/v1/presets(Partial Presets Masking)GET /api/v1/solarGET /api/v1/sleep/sessions
- Per-Monitor Endpoints & Slug Resolver
GET /api/v1/monitorsGET /api/v1/monitors/:slugPOST /api/v1/monitors/:slug/brightnessPOST /api/v1/monitors/:slug/temperaturePOST /api/v1/monitors/:slug/control
- Action Control System (
POST /api/v1/control) - Webhook & Legacy Sleep Endpoints
/api/v1/webhooks*/api/sleep/*
Lightweight health check endpoint. Useful for liveness probes, load balancers, and status pinging.
- Authentication: Not required / Optional.
- Granular Security Note: This endpoint is a public Liveness Probe. It remains 100% accessible under all security configurations, even when
isReadOnly = true,requireLocalToken = true, or all read flags are disabled. - Response (HTTP 200 OK):
{
"status": "ok",
"version": "1.2.0",
"uptime_seconds": 14250,
"timestamp": "2026-07-25T14:30:00.000Z"
}Returns the complete application state graph: connected monitors, hardware brightness/temperature readings, active presets, solar elevation/azimuth, weather adjustments, sleep tracking engine status, smart circadian state, and LAN API server configuration.
-
Authentication: Required (
X-API-KeyorAuthorization: Bearer). IfrequireLocalToken = trueis enabled in GUI, requests without a token (even on127.0.0.1) returnHTTP 401 Unauthorized. -
Granular Masking Rules (
ApiPermissionsFilter):- If
allowReadMonitors = false: Root sectionmonitorsis completely omitted. - If
allowReadSolar = false: Root sectionsolaris omitted. - If
allowReadWeather = false: Root sectionweatheris omitted. Allweather_*adjustment fields insideautomationare stripped. - If
allowReadSleep = false: Root sectionsleepis omitted. - If
allowReadCircadian = false: Root sectionsmart_circadianis omitted. Allcircadian_*fields insideautomationare stripped. - Sub-filtering of
smart_circadian: WhenallowReadCircadian = truebutallowReadSleep = false, thesmart_circadianblock remains present with day phases, but sensitive sleep metrics (sleep_pressure,sleep_debt) and submodules (sleep_pressure_master,sleep_debt_master) are automatically stripped. - If category
systemis disabled inallowedCategories: Root sectionserveris omitted.
- If
-
Response (HTTP 200 OK):
{
"version": "1.2.0",
"uptime_seconds": 14250,
"timestamp": "2026-07-25T14:30:00.000Z",
"monitors": [
{
"id": "\\\\.\\DISPLAY1",
"name": "LG UltraGear 27GP850",
"friendly_name": "LG UltraGear A1F9",
"slug": "display-1",
"hardware_slug": "lg-ultragear-a1f9",
"is_primary": true,
"brightness": {
"current": 80,
"target": 80.0,
"offset": 0.0,
"mode": "auto",
"active_preset": "bright",
"active_user_preset": null
},
"temperature": {
"enabled": true,
"current": 5500,
"target": 5500,
"mode": "auto",
"active_preset": "cool",
"active_user_preset": null
}
}
],
"solar": {
"elevation": 42.5,
"azimuth": 185.3,
"zenith": 47.5,
"progress": 0.65,
"current_phase": "day",
"next_event": {
"type": "sunset",
"in_seconds": 18400
},
"uv_index": 4.2,
"spectral_intensity": 0.88
},
"weather": {
"temperature_celsius": 24.5,
"condition": "Clear",
"is_day": true,
"brightness_adjustment_active": true,
"temperature_adjustment_active": false,
"intensity": 0.2
},
"sleep": {
"is_sleeping": false,
"last_session_end": "2026-07-24T06:30:00.000Z"
},
"automation": {
"auto_brightness": true,
"auto_temperature": true,
"game_mode": false
},
"smart_circadian": {
"enabled": true,
"current_phase": "day"
},
"server": {
"port": 45321,
"lan_access_enabled": false
}
}Returns all built-in brightness presets, color temperature presets, and custom user-defined presets.
-
Granular Filtering:
- If
allowReadMonitors = false: Sectionbrightnessis omitted. - If
allowReadCircadian = false: Sectiontemperatureis omitted. - If BOTH
allowReadMonitors = falseANDallowReadCircadian = false: ReturnsHTTP 403 Forbidden(Read Access Prohibited).
- If
-
Response (HTTP 200 OK):
{
"brightness_presets": [
{ "type": "brightest", "value": 100.0 },
{ "type": "bright", "value": 80.0 },
{ "type": "dim", "value": 40.0 },
{ "type": "dimmest", "value": 15.0 }
],
"temperature_presets": [
{ "type": "coolest", "kelvin": 6500 },
{ "type": "cool", "kelvin": 5500 },
{ "type": "warm", "kelvin": 4500 },
{ "type": "warmest", "kelvin": 3300 }
],
"user_presets": []
}Returns real-time solar tracking parameters, elevation, azimuth, zenith angle, day phase, and upcoming solar events (sunset/sunrise).
- Granular Security: Returns
HTTP 403 Forbidden(Read Access Prohibited) ifallowReadSolar = false.
Returns paginated sleep tracking sessions stored in the SQLite database.
- Query Parameters:
limit(optional, default10, max100): Number of sessions to return.offset(optional, default0): Pagination offset.
- Granular Security: Returns
HTTP 403 Forbidden(Read Access Prohibited) ifallowReadSleep = false. - Example:
GET /api/v1/sleep/sessions?limit=5&offset=0 - Response (HTTP 200 OK):
{
"total": 44,
"limit": 5,
"offset": 0,
"sessions": [
{
"id": "session_1721800000",
"start_time": "2026-07-23T22:30:00.000Z",
"end_time": "2026-07-24T06:30:00.000Z",
"duration_minutes": 480,
"efficiency": 0.94
}
]
}Solaris Control API features a Friendly Slug Resolver (MonitorSlugResolver) allowing monitors to be targeted by easy-to-read identifiers instead of long Windows device paths (\\\\.\\DISPLAY1).
- Ordinal Slugs:
display-1,display-2,display-3(Recommended) - Friendly Name Slugs:
lg-ultragear-a1f9,dell-u2720q-e34b(Generated from Monitor Name + 4-char Device ID hash) - Keyword Slugs:
primary,main(Resolves to primary display),all(Targets all displays).
Returns a list of all currently connected physical monitors with their calculated slugs.
- Granular Security: Rejects with
HTTP 403 ForbiddenifallowReadMonitors = false. - Per-Monitor Preset Isolation: Each monitor object inside the
monitorsarray returns its specificactive_presetandactive_user_preset. WhenALL MONITORSmode is active, all connected displays automatically synchronize with the unified global preset ('all').
Returns detailed status for a single monitor identified by :slug (e.g. display-1 or lg-ultragear-a1f9).
- Granular Security: Rejects with
HTTP 403 ForbiddenifallowReadMonitors = false.
Important
Payload Field Name: Point-mutation endpoints require the field name "value" (number). Passing "brightness" or "temperature" as key name will result in HTTP 400 Bad Request.
POST /api/v1/monitors/:slug/brightness: Body{"value": 75.0}(double,0.0..100.0)POST /api/v1/monitors/:slug/temperature: Body{"value": 5000}(integer Kelvin,3300..6500)POST /api/v1/monitors/:slug/control: Executes an action command targeting:slug. Alias forPOST /api/v1/controlwithmonitor_idpre-filled.- Granular Security: Blocked with
HTTP 403 ForbiddenifisReadOnly = trueor if categorymonitorsis disabled inallowedCategories.
POST /api/v1/monitors/display-1/brightness HTTP/1.1
Content-Type: application/json
X-API-Key: sol_sec_ae1302d9e99a8b6aad30264417a64cec8ac1b17c20f5abc5cea38b5dea368eae
{
"value": 70.0
}{
"status": "accepted",
"action": "set_monitor_brightness",
"slug": "display-1",
"target_monitor": "\\\\.\\DISPLAY1",
"queued": {
"value": 70.0
},
"timestamp": "2026-07-25T14:30:00.000Z"
}The Action Control System provides a unified mutation gateway supporting 25 canonical action types and 17 convenience aliases for controlling all aspects of Solaris.
Before permission evaluation (ApiPermissionsChecker.checkAction), every incoming action string is normalized via ApiPermissionsConfig.getCanonicalAction(action):
| Incoming Action / Shortcut Alias | Canonical Action Key | Parent Category | Auto-Injected Payload Parameters |
|---|---|---|---|
set_monitor_brightness |
set_brightness |
monitors |
— |
set_monitor_temperature |
set_temperature |
monitors |
— |
brightest, bright, dim, dimmest |
set_brightness_preset |
presets |
preset: "<alias>" |
coolest, cool, warm, warmest |
set_temperature_preset |
presets |
preset: "<alias>" |
toggle_auto_brightness |
set_auto_brightness |
circadian |
— |
toggle_auto_temperature, set_color_temperature_enabled |
set_auto_temperature |
circadian |
— |
openmeteo, weatherapi, auto |
set_weather_provider |
environment |
provider: "<alias>" |
clear_failed_webhooks |
manage_webhooks |
system |
— |
Tip
Convenience Shortcut Execution: Sending {"action": "brightest"} or {"action": "openmeteo"} automatically injects the required preset or provider fields into mutablePayload and routes cleanly without requiring manual nested parameters.
Non-mutating system broadcast events (on_system_resume, on_hardware_error) cannot be invoked externally via POST /api/v1/control. Attempts to execute them are rejected with HTTP 422 Unprocessable Entity ("Unknown Action").
{
"action": "set_brightness",
"value": 85.0,
"monitor_id": "display-1"
}Batch payloads allow executing multiple commands in a single HTTP request.
actions(array of action objects): List of actions to execute sequentially.mode(string, optional:"fail_fast"or"continue", default"fail_fast"): Batch execution strategy.fail_fast(boolean, optional, legacy alias): Iftrue, batch execution stops immediately on the first error.
{
"mode": "fail_fast",
"actions": [
{ "action": "set_brightness", "value": 75.0 },
{ "action": "set_temperature", "value": 5000 }
]
}Important
Pre-flight ACL Batch Pass (mode = "fail_fast"): BEFORE executing any state mutation (safeStateMutator), the server performs a Pre-flight ACL pass over the entire actions array (including alias normalization). If ANY command or alias in the batch belongs to a prohibited action/category, the ENTIRE request is rejected immediately with HTTP 403 Forbidden at line 0, ensuring 100% atomic rollback without partial state application.
Mode "continue": In continue mode, prohibited commands return individual 403 error objects in the results array while valid commands execute cleanly.
Note
HTTP Status Codes for Actions:
Actions that apply hardware-level DDC/CI adjustments or debounced smooth transitions return HTTP 202 Accepted. Immediate state toggles return HTTP 200 OK.
Any request payload containing keys apiPermissions, permissions, or nested access control toggles is rejected with HTTP 403 Forbidden (Privilege Escalation Prohibited).
Sets manual monitor brightness level (0.0 to 100.0%). Automatically disables Auto Brightness.
- HTTP Status:
202 Accepted - Permission Category:
ApiActionCategory.monitors - Fields:
value(double,0.0..100.0, required),monitor_id(string, optional, default"all"). - Payload:
{ "action": "set_brightness", "value": 80.0, "monitor_id": "display-1" }Enables or disables automatic brightness adjustment based on solar/circadian algorithm.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.circadian - Fields:
enabled(boolean, required). - Payload:
{ "action": "set_auto_brightness", "enabled": true }Toggles automatic brightness mode on/off.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.circadian - Payload:
{ "action": "toggle_auto_brightness" }Sets manual color temperature in Kelvin (3300 K to 6500 K). Automatically disables Auto Temperature.
- HTTP Status:
202 Accepted - Permission Category:
ApiActionCategory.monitors - Fields:
value(integer Kelvin,3300..6500, required),monitor_id(string, optional). - Payload:
{ "action": "set_temperature", "value": 4500 }Master toggle for color temperature software/hardware filtering.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.circadian - Fields:
enabled(boolean, required). - Payload:
{ "action": "set_color_temperature_enabled", "enabled": true }Enables or disables automatic color temperature curve adjustments.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.circadian - Fields:
enabled(boolean, required). - Payload:
{ "action": "set_auto_temperature", "enabled": true }Toggles automatic color temperature mode on/off.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.circadian - Payload:
{ "action": "toggle_auto_temperature" }Applies a built-in brightness preset.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.presets - Fields:
preset(string:"brightest","bright","dim","dimmest", required). - Payload:
{ "action": "set_brightness_preset", "preset": "bright" }Applies a built-in color temperature preset.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.presets - Fields:
preset(string:"coolest","cool","warm","warmest", required). - Payload:
{ "action": "set_temperature_preset", "preset": "warm" }Applies a custom user-created preset by ID.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.presets - Fields:
id(string, required). - Payload:
{ "action": "set_user_preset", "id": "preset_work_mode" }Cycles to the next or previous preset in sequence.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.presets - Fields:
direction(string:"next"or"previous", optional, default"next"). - Payload:
{ "action": "cycle_preset", "direction": "next" }Enables or disables Gaming Mode override manually.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.gaming - Fields:
enabled(boolean, required). - Payload:
{ "action": "set_game_mode", "enabled": true }Configures target brightness level applied during Gaming Mode activation.
- HTTP Status:
202 Accepted - Permission Category:
ApiActionCategory.gaming - Fields:
value(double,0.0..100.0, required). - Payload:
{ "action": "set_game_mode_brightness", "value": 90.0 }Adds or removes executable process names from automatic Gaming Mode detection whitelist.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.gaming - Fields:
op(string:"add"or"remove", required),app(string process name e.g."cyberpunk2077.exe", required). - Payload:
{ "action": "manage_game_mode_whitelist", "op": "add", "app": "cyberpunk2077.exe" }Applies a relative brightness offset (-50.0% to +50.0%) to a specific monitor.
- HTTP Status:
202 Accepted - Permission Category:
ApiActionCategory.monitors - Fields:
offset(double,-50.0..50.0, required),monitor_id(string, optional). - Payload:
{ "action": "set_monitor_offset", "monitor_id": "display-2", "offset": -10.0 }Toggles weather-driven brightness and temperature dynamic compensation.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.environment - Fields:
brightness(boolean, optional),temperature(boolean, optional). - Payload:
{ "action": "set_weather_adjustment", "brightness": true, "temperature": false }Toggles temperature weather compensation specifically.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.environment - Fields:
enabled(boolean, required). - Payload:
{ "action": "set_weather_temperature_adjustment", "enabled": true }Configures weather adjustment intensity factor (0.0 to 1.0).
- HTTP Status:
202 Accepted - Permission Category:
ApiActionCategory.environment - Fields:
value(double,0.0..1.0, required). - Payload:
{ "action": "set_weather_intensity", "value": 0.5 }Master toggle for Smart Circadian rhythm engine.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.circadian - Fields:
enabled(boolean, required). - Payload:
{ "action": "set_smart_circadian", "enabled": true }Toggles individual sub-modules of the Smart Circadian algorithm.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.circadian - Fields:
wind_down(bool),time_shift(bool),sleep_pressure(bool),sleep_debt(bool). - Payload:
{
"action": "set_smart_circadian_submodules",
"wind_down": true,
"sleep_pressure": true
}Controls map GUI particle weather animation effects.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.system - Fields:
rain(bool),snow(bool),thunder(bool),cloud(bool). - Payload:
{ "action": "set_map_animations", "rain": true, "snow": false }Sets manual geographic coordinates for solar calculations.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.environment - Fields:
latitude(double,-90.0..90.0, required),longitude(double,-180.0..180.0, required). - Payload:
{ "action": "set_manual_location", "latitude": 50.4501, "longitude": 30.5234 }Configures weather data provider service.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.environment - Fields:
provider(string:"openMeteo","weatherApi","auto", required). - Payload:
{ "action": "set_weather_provider", "provider": "openMeteo" }Forces immediate recalculation and API refetch for solar position and weather.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.environment - Payload:
{ "action": "trigger_sun_sync" }Pushes sleep state relay status from external tracking applications (e.g. mobile app, smart watch, Home Assistant) without polluting SQLite session history.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.sleep - Fields:
is_sleeping(boolean, required). - Payload:
{ "action": "push_sleep_status", "is_sleeping": true }Clears dead-letter queue (DLQ) entries for a specific webhook ID.
- HTTP Status:
200 OK - Permission Category:
ApiActionCategory.system - Fields:
webhook_id(string, required). - Payload:
{ "action": "clear_failed_webhooks", "webhook_id": "wh_123456" }GET /api/v1/webhooks,GET /api/v1/webhooks/dlq: Requires categorysysteminallowedCategories.POST /api/v1/webhooks: Creates webhook. Response:HTTP 201 Createdwith body{"status": "created", "webhook": {...}}.DELETE /api/v1/webhooks/:id,POST /api/v1/webhooks/:id/test,POST /api/v1/webhooks/dlq/retry: RequiresisReadOnly = falseAND categorysystem. Rejects withHTTP 403 Forbiddenif restricted.
GET /api/sleep/status: RequiresallowReadSleep = true.POST /api/sleep/sessions,POST /api/sleep/status: RequiresisReadOnly = falseand categorysleeporsystem. Rejects withHTTP 403 Forbiddenif restricted.