Skip to content

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

curl http://<awtrix-ip>/api/v1/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:

{ "error": { "code": "validationFailed", "message": "out of range", "field": "brightness" } }

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

curl -X POST http://<awtrix-ip>/api/v1/settings/reset

This deletes the stored settings and restarts AWTRIX with the defaults listed on this page. Wi-Fi 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 - No effect: the clock has no light sensor. You can still set and read it.
brightness integer 0–255 120 raw level Display brightness. Not a percentage. The knob sets it too.

Color

These four keys change how the whole display looks – apps, icons, notifications and the mood light 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.


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. The clock face ignores it and always writes weekday and month names in capitals.
scroll object see below - - How text moves in pushed apps and notifications. A payload's own scroll overrides it field by field.
enlargeApps boolean - true - true: pushed apps and notifications are drawn at double size, as if the display were 26×8. An app or a notification with an icon bigger than 26×8 keeps its size. Apps and notifications with a layout, scripts and the built-in apps keep their size too.

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. In an app drawn at double size (enlargeApps), a pixel is a 2×2 square, so the text crosses 42 display pixels per second in steps of two.
gap integer ≥ 0 8 pixels loop only – the space between one repetition and the next. At double size each of these pixels is two display pixels wide.
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 and Status) 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.

The keys below change how these apps look. They never add or remove an app.


Clock app

Key Type Range Default Units Meaning
clockFace string sheet | ring | flap | month | big "sheet" - The clock face. See Clock faces.
timeMode integer 0–6 1 - No effect. clockFace picks the face.
timeColor color or null - null - Clock text color. null = use textColor.
calendarHeaderColor color - "#FF0000" - The top of the sheet, the weekends in the month grid and the weekday on the big face.
calendarTextColor color - "#000000" - The day on the sheet and the workdays in the month grid.
calendarBodyColor color - "#FFFFFF" - The paper of the sheet.
calendarAnimation boolean - true - true: the calendar sheet is torn off when the clock appears and at midnight. false: the sheet shows today right away.

Clock faces

The clock is made for its 52×16 display. clockFace picks one of five faces:

Value Face
sheet A tear-off calendar sheet with month and day, the time next to it and the weekday bar below the time. With the weekday bar off, the sheet shows the weekday instead of the month.
ring The same sheet on two rings, with the day but without the month.
flap The sheet with weekday and day; hours and minutes on two split-flap cards that flip at each full minute.
month The whole month as a grid of dots on the sheet: weekends in the header color, past days dimmed, today in blue.
big The time across the whole display, with weekday and date below.

timeShowSeconds shows seconds on the big face only; next to a sheet there is no room. timeShowAmPm and dateShowWeekday have no effect on the clock faces. The calendar colors paint every sheet. The big face shows the weekday in calendarHeaderColor and the date in dateColor, formatted with dateOrder, dateSeparator, dateYearMode and dateMonthNames. If the date is too wide, it drops the century first, then the year. Weekday and month names are always in capitals, whatever uppercase says.

When the clock appears, the sheet slides in showing yesterday and then falls off to show today. This also happens when the clock comes back after a notification, the mood light or a dark display, and at midnight. Switch off Calendar animation (calendarAnimation) and the sheet shows today right away.


Clock text

These keys format the time on the clock faces, where there is room.

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 date on the big clock face.

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 the time, one per weekday.

Key Type Range Default Units Meaning
weekdayBar object see below - - The clock's weekday bar.
dateWeekdayBar object see below - - No effect: the clock has no Date app.

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. The clock shows it below the time on the sheet and ring faces.
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"}}'

Sensor apps

useCelsius, temperatureColor, humidityColor and batteryColor are in the settings, but have no effect: the clock has no temperature, humidity or battery app.


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/play and cmd/audio/play, POST /api/v1/audio/clip, the boot sound and the answer of Home Assistant Voice.

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 90 % The master volume. Every group is a share of it. The knob sets 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.
bootSound boolean - true - The sound when the clock starts. It plays at the alert volume.
musicSource string auto, playback, microphone auto — What music visualizers and pitch react to. playback = what the speaker plays, microphone = what the microphone hears, auto = the speaker while something plays, otherwise the microphone.

The web UI shows the four volumes as the Mixer on the Audio tab.

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. The knob sets neither brightness nor volume and does not start Home Assistant Voice. Presses still reach scripts, buttonCallback and MQTT, and knob turns still reach 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, calendarBodyColor and the four colors in weekdayBar. null is rejected with 422.
  • Optional colors – timeColor, dateColor, temperatureColor, humidityColor, batteryColor (null means use textColor) and colorCorrection, colorTint (null means off). All seven default to null.

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.