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).
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/sessionsGET /api/v1/monitorsGET /api/v1/monitors/:slugPOST /api/v1/monitors/:slug/brightnessPOST /api/v1/monitors/:slug/temperaturePOST /api/v1/monitors/:slug/controlPOST /api/v1/control)
/api/v1/webhooks*/api/sleep/*GET /api/v1/healthLightweight health check endpoint. Useful for liveness probes, load balancers, and status pinging.
isReadOnly = true, requireLocalToken = true, or all read flags are disabled.{
"status": "ok",
"version": "1.2.0",
"uptime_seconds": 14250,
"timestamp": "2026-07-25T14:30:00.000Z"
}
GET /api/v1/statusReturns 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.
X-API-Key or Authorization: Bearer). If requireLocalToken = true is enabled in GUI, requests without a token (even on 127.0.0.1) return HTTP 401 Unauthorized.ApiPermissionsFilter):
allowReadMonitors = false: Root section monitors is completely omitted.allowReadSolar = false: Root section solar is omitted.allowReadWeather = false: Root section weather is omitted. All weather_* adjustment fields inside automation are stripped.allowReadSleep = false: Root section sleep is omitted.allowReadCircadian = false: Root section smart_circadian is omitted. All circadian_* fields inside automation are stripped.smart_circadian: When allowReadCircadian = true but allowReadSleep = false, the smart_circadian block remains present with day phases, but sensitive sleep metrics (sleep_pressure, sleep_debt) and submodules (sleep_pressure_master, sleep_debt_master) are automatically stripped.system is disabled in allowedCategories: Root section server is omitted.{
"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
}
}
GET /api/v1/presetsReturns all built-in brightness presets, color temperature presets, and custom user-defined presets.
allowReadMonitors = false: Section brightness is omitted.allowReadCircadian = false: Section temperature is omitted.allowReadMonitors = false AND allowReadCircadian = false: Returns HTTP 403 Forbidden (Read Access Prohibited).{
"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": []
}
GET /api/v1/solarReturns real-time solar tracking parameters, elevation, azimuth, zenith angle, day phase, and upcoming solar events (sunset/sunrise).
HTTP 403 Forbidden (Read Access Prohibited) if allowReadSolar = false.GET /api/v1/sleep/sessionsReturns paginated sleep tracking sessions stored in the SQLite database.
limit (optional, default 10, max 100): Number of sessions to return.offset (optional, default 0): Pagination offset.HTTP 403 Forbidden (Read Access Prohibited) if allowReadSleep = false.GET /api/v1/sleep/sessions?limit=5&offset=0{
"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).
display-1, display-2, display-3 (Recommended)lg-ultragear-a1f9, dell-u2720q-e34b (Generated from Monitor Name + 4-char Device ID hash)primary, main (Resolves to primary display), all (Targets all displays).GET /api/v1/monitorsReturns a list of all currently connected physical monitors with their calculated slugs.
HTTP 403 Forbidden if allowReadMonitors = false.monitors array returns its specific active_preset and active_user_preset. When ALL MONITORS mode is active, all connected displays automatically synchronize with the unified global preset ('all').GET /api/v1/monitors/:slugReturns detailed status for a single monitor identified by :slug (e.g. display-1 or lg-ultragear-a1f9).
HTTP 403 Forbidden if allowReadMonitors = false.[!IMPORTANT] Payload Field Name: Point-mutation endpoints require the field name
"value"(number). Passing"brightness"or"temperature"as key name will result inHTTP 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 for POST /api/v1/control with monitor_id pre-filled.HTTP 403 Forbidden if isReadOnly = true or if category monitors is disabled in allowedCategories.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"
}
POST /api/v1/control)The Action Control System provides a unified mutation gateway supporting 25 canonical action types and 17 convenience aliases for controlling all aspects of Solaris.
getCanonicalAction)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 requiredpresetorproviderfields intomutablePayloadand 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): If true, 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 entireactionsarray (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": Incontinuemode, prohibited commands return individual403error 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 returnHTTP 200 OK.
Any request payload containing keys apiPermissions, permissions, or nested access control toggles is rejected with HTTP 403 Forbidden (Privilege Escalation Prohibited).
set_brightnessSets manual monitor brightness level (0.0 to 100.0%). Automatically disables Auto Brightness.
202 AcceptedApiActionCategory.monitorsvalue (double, 0.0..100.0, required), monitor_id (string, optional, default "all").{ "action": "set_brightness", "value": 80.0, "monitor_id": "display-1" }
set_auto_brightnessEnables or disables automatic brightness adjustment based on solar/circadian algorithm.
200 OKApiActionCategory.circadianenabled (boolean, required).{ "action": "set_auto_brightness", "enabled": true }
toggle_auto_brightnessToggles automatic brightness mode on/off.
200 OKApiActionCategory.circadian{ "action": "toggle_auto_brightness" }
set_temperatureSets manual color temperature in Kelvin (3300 K to 6500 K). Automatically disables Auto Temperature.
202 AcceptedApiActionCategory.monitorsvalue (integer Kelvin, 3300..6500, required), monitor_id (string, optional).{ "action": "set_temperature", "value": 4500 }
set_color_temperature_enabledMaster toggle for color temperature software/hardware filtering.
200 OKApiActionCategory.circadianenabled (boolean, required).{ "action": "set_color_temperature_enabled", "enabled": true }
set_auto_temperatureEnables or disables automatic color temperature curve adjustments.
200 OKApiActionCategory.circadianenabled (boolean, required).{ "action": "set_auto_temperature", "enabled": true }
toggle_auto_temperatureToggles automatic color temperature mode on/off.
200 OKApiActionCategory.circadian{ "action": "toggle_auto_temperature" }
set_brightness_presetApplies a built-in brightness preset.
200 OKApiActionCategory.presetspreset (string: "brightest", "bright", "dim", "dimmest", required).{ "action": "set_brightness_preset", "preset": "bright" }
set_temperature_presetApplies a built-in color temperature preset.
200 OKApiActionCategory.presetspreset (string: "coolest", "cool", "warm", "warmest", required).{ "action": "set_temperature_preset", "preset": "warm" }
set_user_presetApplies a custom user-created preset by ID.
200 OKApiActionCategory.presetsid (string, required).{ "action": "set_user_preset", "id": "preset_work_mode" }
cycle_presetCycles to the next or previous preset in sequence.
200 OKApiActionCategory.presetsdirection (string: "next" or "previous", optional, default "next").{ "action": "cycle_preset", "direction": "next" }
set_game_modeEnables or disables Gaming Mode override manually.
200 OKApiActionCategory.gamingenabled (boolean, required).{ "action": "set_game_mode", "enabled": true }
set_game_mode_brightnessConfigures target brightness level applied during Gaming Mode activation.
202 AcceptedApiActionCategory.gamingvalue (double, 0.0..100.0, required).{ "action": "set_game_mode_brightness", "value": 90.0 }
manage_game_mode_whitelistAdds or removes executable process names from automatic Gaming Mode detection whitelist.
200 OKApiActionCategory.gamingop (string: "add" or "remove", required), app (string process name e.g. "cyberpunk2077.exe", required).{ "action": "manage_game_mode_whitelist", "op": "add", "app": "cyberpunk2077.exe" }
set_monitor_offsetApplies a relative brightness offset (-50.0% to +50.0%) to a specific monitor.
202 AcceptedApiActionCategory.monitorsoffset (double, -50.0..50.0, required), monitor_id (string, optional).{ "action": "set_monitor_offset", "monitor_id": "display-2", "offset": -10.0 }
set_weather_adjustmentToggles weather-driven brightness and temperature dynamic compensation.
200 OKApiActionCategory.environmentbrightness (boolean, optional), temperature (boolean, optional).{ "action": "set_weather_adjustment", "brightness": true, "temperature": false }
set_weather_temperature_adjustmentToggles temperature weather compensation specifically.
200 OKApiActionCategory.environmentenabled (boolean, required).{ "action": "set_weather_temperature_adjustment", "enabled": true }
set_weather_intensityConfigures weather adjustment intensity factor (0.0 to 1.0).
202 AcceptedApiActionCategory.environmentvalue (double, 0.0..1.0, required).{ "action": "set_weather_intensity", "value": 0.5 }
set_smart_circadianMaster toggle for Smart Circadian rhythm engine.
200 OKApiActionCategory.circadianenabled (boolean, required).{ "action": "set_smart_circadian", "enabled": true }
set_smart_circadian_submodulesToggles individual sub-modules of the Smart Circadian algorithm.
200 OKApiActionCategory.circadianwind_down (bool), time_shift (bool), sleep_pressure (bool), sleep_debt (bool).{
"action": "set_smart_circadian_submodules",
"wind_down": true,
"sleep_pressure": true
}
set_map_animationsControls map GUI particle weather animation effects.
200 OKApiActionCategory.systemrain (bool), snow (bool), thunder (bool), cloud (bool).{ "action": "set_map_animations", "rain": true, "snow": false }
set_manual_locationSets manual geographic coordinates for solar calculations.
200 OKApiActionCategory.environmentlatitude (double, -90.0..90.0, required), longitude (double, -180.0..180.0, required).{ "action": "set_manual_location", "latitude": 50.4501, "longitude": 30.5234 }
set_weather_providerConfigures weather data provider service.
200 OKApiActionCategory.environmentprovider (string: "openMeteo", "weatherApi", "auto", required).{ "action": "set_weather_provider", "provider": "openMeteo" }
trigger_sun_syncForces immediate recalculation and API refetch for solar position and weather.
200 OKApiActionCategory.environment{ "action": "trigger_sun_sync" }
push_sleep_statusPushes sleep state relay status from external tracking applications (e.g. mobile app, smart watch, Home Assistant) without polluting SQLite session history.
200 OKApiActionCategory.sleepis_sleeping (boolean, required).{ "action": "push_sleep_status", "is_sleeping": true }
clear_failed_webhooksClears dead-letter queue (DLQ) entries for a specific webhook ID.
200 OKApiActionCategory.systemwebhook_id (string, required).{ "action": "clear_failed_webhooks", "webhook_id": "wh_123456" }
/api/v1/webhooks*)GET /api/v1/webhooks, GET /api/v1/webhooks/dlq: Requires category system in allowedCategories.POST /api/v1/webhooks: Creates webhook. Response: HTTP 201 Created with body {"status": "created", "webhook": {...}}.DELETE /api/v1/webhooks/:id, POST /api/v1/webhooks/:id/test, POST /api/v1/webhooks/dlq/retry: Requires isReadOnly = false AND category system. Rejects with HTTP 403 Forbidden if restricted./api/sleep/*)GET /api/sleep/status: Requires allowReadSleep = true.POST /api/sleep/sessions, POST /api/sleep/status: Requires isReadOnly = false and category sleep or system. Rejects with HTTP 403 Forbidden if restricted.