Create a widget theme

post/v1/widget/presets

Saves a new widget theme. Every colour, a name and a launcher label are required; roundness defaults to 100.

Private keyapi.v1.widget.presets.createNo demo

Request body

application/jsonrequired
namestringrequired

Shown in the theme builder. At most 100 characters.

maxLength: 100
buttonLabelstringrequired

The launcher button's text. At most 40 characters.

maxLength: 40
buttonColorstringrequired

Launcher button background. A hex colour, like #FFFFFF or #FFF, with or without alpha.

buttonHoverColorstringrequired

Launcher button background on hover. A hex colour, like #FFFFFF or #FFF, with or without alpha.

buttonTextColorstringrequired

Launcher button text. A hex colour, like #FFFFFF or #FFF, with or without alpha.

typingDotColorstringrequired

Typing indicator dots. A hex colour, like #FFFFFF or #FFF, with or without alpha.

accentColorstringrequired

Selected options, links and emphasis. A hex colour, like #FFFFFF or #FFF, with or without alpha.

accentHoverColorstringrequired

Accent on hover. A hex colour, like #FFFFFF or #FFF, with or without alpha.

mutedTextColorstringrequired

Labels, placeholders and secondary text. A hex colour, like #FFFFFF or #FFF, with or without alpha.

primaryTextColorstringrequired

What the stylist says, product names, prices. A hex colour, like #FFFFFF or #FFF, with or without alpha.

pageColorstringrequired

The background the conversation sits on. A hex colour, like #FFFFFF or #FFF, with or without alpha.

surfaceColorstringrequired

Product cards, look panels and question cards. A hex colour, like #FFFFFF or #FFF, with or without alpha.

borderColorstringrequired

Card outlines and dividers. A hex colour, like #FFFFFF or #FFF, with or without alpha.

inputColorstringrequired

The shopper's own messages and the message box. A hex colour, like #FFFFFF or #FFF, with or without alpha.

footerColorstringrequired

The strip behind the message box. A hex colour, like #FFFFFF or #FFF, with or without alpha.

roundnessinteger

Corner roundness for the whole widget, 0 (square) to 100 (as shipped).

default: 100min: 0max: 100

Response

201The saved theme.
WidgetPresetrequired

A saved widget theme, as stored.

idstring (uuid)required

Pass it to the embed, or to preflight, as themeId.

namestringrequired

Shown in the theme builder.

objectrequired

The colours, grouped as stored.

createdstring (date-time)required

When it was saved first.

modifiedstring (date-time)required

When it was last changed.

Errors

23

Every error is JSON with a single error string unless noted. Match on the status code; the message is for humans.

400
Request body must be valid JSON.

The body is not parseable JSON.

400
Request body must be a JSON object.

The body is empty, an array, or a JSON primitive.

422
Validation failed.

More than one field is missing or invalid. details names each one.

{
  "error": "Validation failed.",
  "details": [
    {
      "path": "pageColor",
      "message": "pageColor is required."
    },
    {
      "path": "accentColor",
      "message": "Accent colour must be a hex colour, like"
    }
  ]
}
422
name is required.

name is missing and nothing else is wrong. Each field has its own message, the same as in details.

curl -X POST "https://stylor.ai/api/v1/widget/presets" \
  -H "Authorization: Bearer $STYLOR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Ranch",
  "buttonLabel": "Ask a stylist",
  "buttonColor": "#2D2926",
  "buttonHoverColor": "#000000",
  "buttonTextColor": "#FFFFFF",
  "typingDotColor": "#999999",
  "accentColor": "#B5651D",
  "accentHoverColor": "#8A4B12",
  "mutedTextColor": "#6B6B6B",
  "primaryTextColor": "#2D2926",
  "pageColor": "#FBF8F3",
  "surfaceColor": "#FFFFFF",
  "borderColor": "#E6E1DA",
  "inputColor": "#F3EFE9",
  "footerColor": "#FBF8F3",
  "roundness": 60
}'
Response · 201
{
  "preset": {
    "id": "7e6d5c4b-3a2f-4e1d-9c8b-7a6f5e4d3c2b",
    "name": "Ranch",
    "options": {
      "button": {
        "label": "Ask a stylist",
        "color": "#2D2926",
        "hoverColor": "#000000",
        "textColor": "#FFFFFF"
      },
      "widget": {
        "typingDotColor": "#999999",
        "accentColor": "#B5651D",
        "accentHoverColor": "#8A4B12",
        "mutedTextColor": "#6B6B6B",
        "primaryTextColor": "#2D2926",
        "pageColor": "#FBF8F3",
        "surfaceColor": "#FFFFFF",
        "borderColor": "#E6E1DA",
        "inputColor": "#F3EFE9",
        "footerColor": "#FBF8F3",
        "roundness": 60
      }
    },
    "created": "2026-10-04T18:20:03.001Z",
    "modified": "2026-10-04T18:20:03.001Z"
  }
}