Settings¶
Settings are your saved preferences: brightness, colors, clock and date format, transitions, volume, and the look of the built-in apps. This page lists every settings key.
| Read | GET /api/v1/settings – returns all settings keys |
| Write | PATCH /api/v1/settings – any subset; either all keys are applied or none; returns all settings keys |
| Reset | POST /api/v1/settings/reset – deletes the stored settings and restarts |
Settings survive a restart. Durations are whole milliseconds. Colors come back as "#RRGGBB" and
can be sent in several forms. If you send a Content-Type, it must be application/json. These
rules apply to the whole API and are described once under Conventions.
Restoring a backup skips settings that this clock does not have.
Reading the settings¶
{
"autoBrightness": false,
"brightness": 120,
"autoTransition": true,
"textColor": "#FFFFFF",
"transitionEffect": "Rain",
"transitionDurationMs": 1000,
"appDurationMs": 7000,
"timeMode": 1,
"timeColor": null,
"volume": 60,
"gamma": 1.9,
"colorCorrection": null
}
(shortened – the real response contains all settings keys)
You can send back exactly what GET returns: every value GET returns is accepted by PATCH.
Updating settings¶
Send any subset of the keys with PATCH. Keys you leave out stay as they are.
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"brightness": 200, "transitionEffect": "Fade", "timeSeparatorMode": "pulse"}'
AWTRIX checks the whole request before it changes anything. If one key is not valid, it answers
422, nothing changes, and the answer names the first wrong key:
So a PATCH is applied completely or not at all. AWTRIX reports only the first problem, in the
order of the keys in your request. Fix it and send again to find the next one.
The tables below list every settings key. Any other key is rejected with 422 and
"message": "unknown field".
A successful PATCH answers 200 with all settings, already updated – you do not need a
second GET. Every change takes effect at once; no setting needs a restart.
Resetting to defaults¶
This deletes the stored settings and restarts AWTRIX with the defaults listed on this page.
Wi-Fi, display wiring, pin map and your scripts stay. To reset everything, use
POST /api/v1/device/factory-reset – see HTTP API.
Brightness¶
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
autoBrightness |
boolean | - | false |
- | Let the light sensor (LDR) set the brightness. No effect on a device without a light sensor. |
brightness |
integer | 0–255 | 120 |
raw level | Display brightness. Not a percentage. Ignored while autoBrightness is true on a device with a light sensor. |
With autoBrightness on, the measured light sets the brightness and brightness is ignored. The
light level is measured and reported in both cases – see
Brightness & sensors. On a device without a light sensor
(sensors.light is false in GET /api/v1/capabilities) you
can still set and read autoBrightness, but the display always uses brightness.
Color¶
These four keys change how the whole display looks – apps, icons, notifications, the mood light and
Art-Net alike. They do not change the picture that
GET /api/v1/display/screen returns.
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
saturation |
integer | 0-100 | 100 |
% | How colourful the display is. 100 keeps colors as they are, 0 shows everything in gray. |
gamma |
number | > 0 | 1.9 |
- | Gamma correction for the display. Must be greater than 0 – 0 is rejected. No upper limit. |
colorCorrection |
color or null |
- | null |
- | A color that every pixel is multiplied with. null = off. |
colorTint |
color or null |
- | null |
- | A second color that every pixel is multiplied with, on top of colorCorrection. null = off. |
colorTint is an RGB color, not a Kelvin value. To make the display warmer, send for example
"#FFD6AA", not 2700. null switches the tint off.
What each of these looks like on the display is described under Display colors.
Panel size and wiring – panelWidth, panels, panelStart, panelWiring, panelColorOrder,
panelSerpentine, mirror and rotate – are part of the system configuration, not settings. See
Panel and orientation.
Global text¶
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
textColor |
color | - | "#FFFFFF" |
- | The default text color. Cannot be null. Every per-app color that is null uses this one. |
uppercase |
boolean | - | true |
- | Show the text of pushed apps and notifications in capitals. A payload's own textCase overrides it. |
scroll |
object | see below | - | - | How text moves in pushed apps and notifications. A payload's own scroll overrides it field by field. |
scroll¶
These are the values a payload uses when it leaves out the matching field.
| Field | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
mode |
string | static · wrap · loop · bounce |
"wrap" |
- | static never moves and cuts off what does not fit · wrap scrolls the text off the edge and starts again · loop scrolls continuously without a gap at the end · bounce moves back and forth and pauses at both ends. |
direction |
string | left · right |
"left" |
- | Scroll direction. right mirrors the whole movement. |
entry |
string | inline · offscreen |
"inline" |
- | offscreen starts the text outside the display and skips the first pause. |
whenFits |
string | static · scroll |
"static" |
- | Whether text that fits on the display still moves. |
speed |
integer | ≥ 0 | 100 |
percent | Percentage of the base speed of 21 px/s. 0 stops the text, higher is faster, no upper limit. On an 8 px high display, text stays sharp up to about 200. |
gap |
integer | ≥ 0 | 8 |
pixels | loop only – the space between one repetition and the next. |
holdMs |
integer | ≥ 0 | 1000 |
ms | How long the text pauses before it starts moving, and at each end in bounce. 0 = no pause. |
PATCH changes only the fields you send: {"scroll":{"mode":"loop"}} changes the mode and keeps
the speed. A plain string sets only the mode: {"scroll":"loop"} means the same. An unknown field,
an unknown value or a negative number is rejected with 422 validationFailed, and field names
the key, for example scroll.speed.
A change here also affects apps you have already pushed, unless their payload set that field.
# Continuous scrolling everywhere, a little slower than normal
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"scroll": {"mode": "loop", "speed": 80}}'
App rotation¶
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
autoTransition |
boolean | - | true |
- | Switch to the next app automatically. With false the app changes only on a button press or an API call. |
appDurationMs |
integer | ≥ 0 | 7000 |
ms | How long each app is shown. Also the default duration of a notification. No upper limit. |
transitionEffect |
string | see below | "Rain" |
- | The animation between two apps. |
transitionDirection |
string | normal · reverse |
"normal" |
- | Reverses the movement of transitions that have a direction. The app order stays the same. |
transitionDurationMs |
integer | 0–2147483647 | 1000 |
ms | Length of the animation. 0 = instant. |
The apps rotate only when there are at least two in the list. With one app, AWTRIX stays on it
whatever autoTransition says.
transitionEffect values¶
A name, not a number. Upper and lower case do not matter – "Ripple", "ripple" and
"RIPPLE" are the same. There are 22 transitions; their names and what they look like are in
Visual reference → Transitions. GET /api/v1/capabilities returns the
same list.
Any other value is rejected with a message that starts with must be one of: and then lists the
valid names.
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"transitionEffect": "Ripple", "transitionDirection": "reverse", "transitionDurationMs": 800}'
With normal, automatic and Next transitions move in their usual direction. reverse flips
that movement; Previous always moves the other way. Transitions without a direction, such as
Fade, look the same either way.
Which apps rotate¶
No setting decides that. The rotation is one list, set with PUT /api/v1/apps/order. Built-in apps
(Time, Date, Temperature, Humidity, Battery) are treated exactly like pushed apps and scripts: order sets the order, and disabled
switches an app off. Enabled apps missing from order are added at the end. Until you change it,
all available apps rotate. See
Pushed apps – Reordering, switching off and duplicating.
Humidity and Battery need the hardware. On a board without a humidity sensor or without a
battery pin, the app does not exist: it is missing from GET /api/v1/apps and cannot be added to
the rotation. See Power & battery.
The keys below change how these apps look. They never add or remove an app.
Clock app¶
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
timeMode |
integer | 0–6 | 1 |
- | The clock style. See the table below. |
timeColor |
color or null |
- | null |
- | Clock text color. null = use textColor. In mode 5 this is the background color around the black digits. |
calendarHeaderColor |
color | - | "#FF0000" |
- | The top bar of the calendar box in timeMode 1 and 2. |
calendarTextColor |
color | - | "#000000" |
- | The day number in the calendar box (timeMode 1–4). |
calendarBodyColor |
color | - | "#FFFFFF" |
- | The calendar box background (timeMode 1–4). |
timeMode styles¶
Only these seven exist. Any other number is rejected with 422 "out of range".
| Value | Style |
|---|---|
0 |
Time in the middle, weekday bar across the full width |
1 |
Calendar box (day of month) with a top bar, time on the right, weekday bar at the bottom |
2 |
Like 1, weekday bar at the top |
3 |
Calendar box with notched corners (no top bar), weekday bar at the bottom |
4 |
Like 3, weekday bar at the top |
5 |
Big clock – large black digits on a colored background |
6 |
Binary clock – six bits each for hours (red), minutes (green) and seconds (blue) |
Not everything fits in every style. timeMode 1–4 use the left nine columns for the calendar box,
so seconds and AM/PM are not shown there. Modes 5 and 6 also ignore timeShowSeconds and
timeShowAmPm. The keys keep their stored values; they simply have no effect in these modes.
Clock text¶
These keys format the time in timeMode 0–4 and, where there is room, on the big clock.
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
time24h |
boolean | - | true |
- | 24-hour clock. false = 12-hour clock (midnight and noon show as 12). |
timeLeadingZero |
boolean | - | true |
- | Show the hour with two digits. Minutes and seconds always have two digits. |
timeShowSeconds |
boolean | - | false |
- | Add :SS. |
timeShowAmPm |
boolean | - | false |
- | Add AM / PM. Needs time24h: false, and is not shown while seconds are shown. |
timeSeparatorMode |
string | steady | blink | pulse |
"pulse" |
- | How the : between hours and minutes behaves. |
If AM/PM is not shown for one of these reasons, that is not an error: the key keeps its value.
timeSeparatorMode values¶
Upper and lower case do not matter. One of:
| Value | Behavior |
|---|---|
steady |
Always fully on. |
blink |
On and off, once per second. |
pulse |
Fades smoothly down and up again, once every two seconds. |
The colon keeps its space while it is dark, so the digits do not move.
Date text¶
These keys format the built-in Date app.
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
dateOrder |
string | dayMonthYear | monthDayYear | yearMonthDay |
"dayMonthYear" |
- | Order of day, month and year. |
dateSeparator |
string | dot | slash | dash |
"dot" |
- | The character between the parts: . / -. Ignored when dateMonthNames is true. |
dateYearMode |
string | none | twoDigit | fourDigit |
"twoDigit" |
- | none hides the year, twoDigit shows 26, fourDigit shows 2026. |
dateShowWeekday |
boolean | - | false |
- | Put a three-letter English weekday (Sun…Sat) and a space in front. |
dateMonthNames |
boolean | - | false |
- | Use three-letter English month names (Jan…Dec) with spaces instead of a number: 31 Dec instead of 31.12. |
dateColor |
color or null |
- | null |
- | Date text color. null = use textColor. |
Upper and lower case do not matter for the three name values. Day and month always have two digits.
With dateOrder: "dayMonthYear", dateSeparator: "dot" and dateYearMode: "none", the date ends
with a dot – 31.12. – the usual German short form. No other combination adds one.
# Sat 31/12/2026
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"dateShowWeekday": true, "dateSeparator": "slash",
"dateYearMode": "fourDigit"}'
Weekday bar¶
The row of seven small segments below (or above) the clock and the date, one per weekday.
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
weekdayBar |
object | see below | - | - | The clock's weekday bar. A PATCH with it sets the Date app's bar too. |
dateWeekdayBar |
object | see below | - | - | The Date app's weekday bar. A PATCH with it sets only this bar, also when weekdayBar is in the same request. |
weekdayBar and dateWeekdayBar¶
Each segment is either a workday or a weekend day, and either today or not. The four colors cover these four cases.
| Field | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
show |
boolean | - | true |
- | Show the bar. On the clock its position follows timeMode: bottom for 0, 1 and 3, top for 2 and 4, no bar in modes 5 and 6. On the Date app it is always at the bottom. |
startOnMonday |
boolean | - | true |
- | Monday is the first segment. false starts the week on Sunday. This changes only the order shown, not which day a segment stands for. |
weekendDays |
array of strings | sunday · monday · tuesday · wednesday · thursday · friday · saturday |
["sunday","saturday"] |
- | Which days are weekend. Any selection, in any order; [] means no weekend. Lowercase names only. |
activeColor |
color | - | "#FFFFFF" |
- | Today, when today is a workday. Cannot be null. |
inactiveColor |
color | - | "#666666" |
- | Other workdays. Cannot be null. |
weekendActiveColor |
color | - | "#FFFFFF" |
- | Today, when today is a weekend day. Cannot be null. |
weekendInactiveColor |
color | - | "#666666" |
- | Other weekend days. Cannot be null. |
PATCH changes only the fields you send: {"weekdayBar":{"weekendDays":["friday","saturday"]}}
moves the weekend and keeps the other six fields. An unknown field, a wrong type or a day name that
is not one of the seven is rejected with 422 validationFailed, and field names the key, for
example weekdayBar.weekendDays or weekdayBar.startOnMonday. Nothing in the request is applied.
startOnMonday never changes which days are weekend. weekendDays is always returned in calendar
order, Sunday first.
The weekend colors start with the same values as the workday colors, so the bar looks the same for all days until you change them.
# A Friday/Saturday weekend, shown in amber
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"weekdayBar": {"weekendDays": ["friday", "saturday"],
"weekendActiveColor": "#FFAA00",
"weekendInactiveColor": "#664400"}}'
dateWeekdayBar.show is not the same as dateShowWeekday: the first shows the segment
bar in Date, the second puts a weekday name in front of the date text.
Sensor apps¶
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
useCelsius |
boolean | - | true |
- | Show temperature in °C. false shows °F. Affects the Temperature app only. |
temperatureColor |
color or null |
- | null |
- | Temperature app text color. null = use textColor. |
humidityColor |
color or null |
- | null |
- | Humidity app text color. null = use textColor. |
batteryColor |
color or null |
- | null |
- | Battery app text color. null = use textColor. |
Sound¶
The clock has one master volume and three groups. Who plays a sound decides its group:
- radio: every internet radio station.
- app: everything a script plays.
- alert: notification sounds,
POST /api/v1/audio/playandcmd/audio/play.
What you hear is volume × group volume / 100. With
volume at 50 and alertVolume at 60, an alert plays at 30. A change applies at once, also to
sounds that are playing. 0 is silence, and volume: 0 silences every sound.
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
volume |
integer | 0–100 | 60 |
% | The master volume. Every group is a share of it. |
radioVolume |
integer | 0–100 | 80 |
% | The radio group: internet radio. |
appVolume |
integer | 0–100 | 100 |
% | The app group: everything a script plays. |
alertVolume |
integer | 0–100 | 100 |
% | The alert group: notification sounds and the other alerts listed above. |
The web UI shows the four volumes as the Mixer on the Audio tab. The Radio slider shows only when the clock can play radio: the I2S pins are set and the board has PSRAM.
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H 'Content-Type: application/json' \
-d '{"volume":50,"alertVolume":40}'
See Sound.
Buttons¶
| Key | Type | Range | Default | Units | Meaning |
|---|---|---|---|---|---|
blockNavigation |
boolean | - | false |
- | With true, the left and right buttons do not change apps, a double press on select does not switch the display, and holding select does not open the menu. Presses still reach scripts, buttonCallback and MQTT. |
Value types¶
Colors¶
Colors come back as uppercase "#RRGGBB". When you send a color, you can use any form listed
under Conventions → Colors: "RRGGBB", "#RGB", [r, g, b],
["HSV", h, s, v], or a number.
There are two kinds of color keys:
- Required colors –
textColor,calendarHeaderColor,calendarTextColor,calendarBodyColorand the four colors inweekdayBar.nullis rejected with422. - Optional colors –
timeColor,dateColor,temperatureColor,humidityColor,batteryColor(nullmeans usetextColor) andcolorCorrection,colorTint(nullmeans off). All seven default tonull.
Black and white are real colors, not "unset". "#000000" on an optional text color is stored as
black and read back as "#000000", not null. "#FFFFFF" on colorCorrection or colorTint is
stored as white and looks the same as off, because white changes nothing. Only JSON null means
use textColor or off.
# Give the clock its own colour, and let the date use textColor again
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"timeColor": "#00AAFF", "dateColor": null}'
Name strings¶
transitionEffect, transitionDirection, timeSeparatorMode, dateOrder, dateSeparator and
dateYearMode take names, never numbers. Upper and lower case do not matter – "pulse",
"Pulse" and "PULSE" are the same. GET /api/v1/capabilities lists the names for
transitionEffect; the others are in the tables on this page. GET /api/v1/settings always returns
that spelling. A number gets the same error as a wrong name:
curl -X PATCH http://<awtrix-ip>/api/v1/settings \
-H "Content-Type: application/json" \
-d '{"timeSeparatorMode": 1}'
{ "error": { "code": "validationFailed",
"message": "must be one of: steady blink pulse",
"field": "timeSeparatorMode" } }
The day names in weekdayBar.weekendDays are different: they must be lowercase, exactly as listed.
Numbers¶
Integer keys reject decimals and booleans – {"brightness": 120.5} and {"brightness": true} both
fail with "must be an integer". gamma is the only key that takes a decimal number. It also
accepts a whole number, so 2 is a valid gamma.
An upper limit of 2147483647 just means "no real limit".
Validation errors¶
Every problem is answered with 422, the standard error body and the wrong key in field. Unknown
keys are rejected too, so a typo fails instead of being silently ignored – and nothing in the
request is applied. A request that is not valid JSON gets 400 invalidJson.
All messages this route can return: Errors – PATCH /api/v1/settings.
Related¶
- Conventions – color formats and rules for the whole API
- Visual reference – transitions, effects and how the display colors look
- System configuration – Wi-Fi, MQTT, time zone, display wiring and other device keys
- Brightness & sensors
- Sound