coolercontrol-api
Use this skill when the user asks about CoolerControl, fan curves, fan management, cooling profiles, or controlling fans on their system. Provides complete API reference for the CoolerControl daemon.
SKILL.md
| Name | coolercontrol-api |
| Description | Use this skill when the user asks about CoolerControl, fan curves, fan management, cooling profiles, or controlling fans on their system. Provides complete API reference for the CoolerControl daemon. |
name: CoolerControl API description: Use this skill when the user asks about CoolerControl, fan curves, fan management, cooling profiles, or controlling fans on their system. Provides complete API reference for the CoolerControl daemon. version: 0.1.0
CoolerControl API Reference
CoolerControl manages fan curves and cooling devices via a REST API served by the coolercontrold daemon.
Connection
- Base URL:
http://127.0.0.1:11987 - Authentication: HTTP Basic Auth
- Username:
CCAdmin - Default password:
coolAdmin
- Username:
- Login:
POST /loginwithAuthorization: Basic <base64(CCAdmin:coolAdmin)>header- Returns a session cookie — use
-cand-bwith curl cookie jar
- Returns a session cookie — use
- All mutating endpoints require authentication (GET endpoints are public)
Authentication Pattern
Always authenticate before making changes:
# Create cookie jar and login
AUTH=$(echo -n "CCAdmin:coolAdmin" | base64)
COOKIES=/tmp/cc-cookies.txt
curl -s -c $COOKIES -X POST http://127.0.0.1:11987/login -H "Authorization: Basic $AUTH"
# Use cookie jar for subsequent requests
curl -s -b $COOKIES -X POST http://127.0.0.1:11987/profiles ...
Core Endpoints
Device Discovery
GET /devices — List all devices with channels and temp sensors
Response structure:
{
"devices": [
{
"name": "NVIDIA GeForce RTX 5060",
"type": "GPU",
"type_index": 1,
"uid": "7796e4ec...",
"info": {
"channels": {
"fan1": {
"label": "fan1",
"speed_options": { "min_duty": 0, "max_duty": 100, "fixed_enabled": true }
}
},
"temps": {
"GPU Temp": { "label": "GPU Temp", "number": 1 }
},
"profile_max_length": 17,
"profile_min_length": 2,
"temp_min": 0,
"temp_max": 150
}
}
]
}
Key fields:
uid: Unique device identifier (SHA256 hash), used in all device-specific endpointsinfo.channels: Fan channels withspeed_options(null = not controllable, e.g. freq sensors)info.temps: Available temperature sensors — usetemp_namein profile'stemp_source- Only channels with non-null
speed_optionsare controllable fans
Status Monitoring
POST /status — Get current device statuses (temps, fan speeds, duties)
Request body: {} for latest snapshot, or {"all": true} for full history.
Response:
{
"devices": [
{
"type": "GPU",
"type_index": 1,
"uid": "7796e4ec...",
"status_history": [
{
"timestamp": "2026-02-04T21:15:49.040780763-05:00",
"temps": [{ "name": "GPU Temp", "temp": 48.0 }],
"channels": [
{ "name": "fan1", "rpm": 0, "duty": 0.0 },
{ "name": "fan2", "rpm": 0, "duty": 0.0 }
]
}
]
}
]
}
Profiles (Fan Curves)
Profiles define fan behavior — either a fixed speed or a temperature-based curve.
GET /profiles — List all profiles POST /profiles — Create a new profile (requires auth) PUT /profiles — Update an existing profile (requires auth)
Profile structure for a fan curve:
{
"uid": "my-profile-id",
"name": "Silent GPU",
"p_type": "Graph",
"speed_fixed": null,
"speed_profile": [[55, 0], [65, 30], [75, 45], [82, 65], [88, 85], [92, 100]],
"temp_source": {
"device_uid": "<device-uid>",
"temp_name": "GPU Temp"
},
"function_uid": "<function-uid>",
"member_profile_uids": [],
"mix_function_type": null
}
Key fields:
uid: Unique profile identifier (user-defined string)p_type:"Graph"for curve,"Default"for default behavior,"Fixed"for fixed speedspeed_profile: Array of[temperature_celsius, duty_percent]pairs (2-17 points)temp_source: Which temp sensor drives the curve —device_uid+temp_namefunction_uid: References a function that controls response behavior
For a fixed speed profile:
{
"uid": "fixed-50",
"name": "Fixed 50%",
"p_type": "Fixed",
"speed_fixed": 50,
"speed_profile": null,
"temp_source": null,
"function_uid": "0"
}
Functions
Functions modify how duty values from profiles are applied (minimum duty, response delay, etc.).
GET /functions — List all functions POST /functions — Create a new function (requires auth) PUT /functions — Update an existing function (requires auth)
Function structure:
{
"uid": "my-function",
"name": "Silent Function",
"f_type": "Identity",
"duty_minimum": 1,
"duty_maximum": 100,
"step_size_min_decreasing": 0,
"step_size_max_decreasing": 0,
"response_delay": null,
"deviance": null,
"only_downward": null,
"sample_window": null,
"threshold_hopping": true
}
Key fields:
duty_minimum: Minimum duty % (must be >= 1). When curve says 0%, CoolerControl uses device auto-mode for zero-RPMduty_maximum: Maximum duty %threshold_hopping: If true, jumps between defined curve points instead of interpolatingresponse_delay: Seconds to wait before changing speed (prevents rapid cycling)- The default function (uid
"0") uses Identity with duty_minimum=1
Assigning Profiles to Fan Channels
PUT /devices/{device_uid}/settings/{channel_name}/profile — Assign a profile to a fan channel
Request body:
{ "profile_uid": "my-profile-id" }
Example:
curl -s -b $COOKIES \
-X PUT "http://127.0.0.1:11987/devices/$GPU_UID/settings/fan1/profile" \
-H "Content-Type: application/json" \
-d '{"profile_uid": "gpu-silent"}'
To reset to default: assign profile_uid "0".
Device Settings
GET /settings/devices/{device_uid} — Get device settings (labels, disabled channels) PUT /settings/devices/{device_uid} — Update device settings
Structure:
{
"uid": "<device-uid>",
"name": "device name",
"disable": false,
"extensions": { "direct_access": false, "delay_millis": 0 },
"channel_settings": {
"fan1": { "label": "fan1", "disabled": false, "extension": null }
}
}
Modes
Modes are named presets that save a collection of device/channel profile assignments.
GET /modes — List all modes POST /modes — Create a new mode PUT /modes — Update a mode POST /modes-active/{mode_uid} — Activate a mode POST /modes/order — Reorder modes
Mode structure:
{
"uid": "silent-mode",
"name": "Silent Mode",
"device_channel_profiles": {
"<device_uid>": {
"<channel_name>": "<profile_uid>"
}
}
}
Alerts
GET /alerts — List all alerts (not from /status, separate endpoint) POST /alerts — Create alert PUT /alerts — Update alert
Daemon Settings
GET /settings — Get daemon settings PUT /settings — Update daemon settings
Settings include: apply_on_boot, startup_delay, poll_rate, liquidctl_integration, etc.
Other Endpoints
- GET /handshake — Returns
{"shake": true}to verify connection - GET /functions — List all functions
- POST /functions/order — Reorder functions
- POST /profiles/order — Reorder profiles
- PUT /devices/{uid}/settings/{channel}/manual — Set manual/fixed speed
- POST /shutdown — Shutdown daemon
- POST /logout — End session
Common Patterns
Creating a complete fan curve setup
- Create a function (controls duty min/max and response behavior)
- Create a profile with
speed_profilecurve points andtemp_source - Assign the profile to a device fan channel
NVIDIA GPU zero-RPM
NVIDIA GPUs have a minimum manual fan speed (typically 30%). When CoolerControl tries to set 0%, it automatically switches to GPU auto-mode which enables the card's built-in zero-RPM feature. This is the correct behavior.
NCT6775/NCT6798 motherboard fans
These Super I/O chips have hardware-level auto fan curves (5 points, set via sysfs). CoolerControl overrides them with software control. The nct6775 kernel module must be loaded for fan detection. Key sysfs paths:
/sys/class/hwmon/hwmonX/pwmN— PWM duty (0-255)/sys/class/hwmon/hwmonX/pwmN_enable— Control mode/sys/class/hwmon/hwmonX/fanN_input— Fan RPM reading
Systemd service
CoolerControl daemon runs as: coolercontrold.service
- Config file:
/etc/coolercontrol/config.toml - Modes file:
/etc/coolercontrol/modes.json - Alerts file:
/etc/coolercontrol/alerts.json