Printago API
PATCH /v1/customizer/configs/{id}

Update customizer config

Update a customizer config.

Requires: customizer.manage

Path Parameters

id required
string

Request Body

CustomizerConfigUpdate
configJsonoptional
object
The configuration blob stored in `customizer_configs.config_json`. The shape is intentionally permissive — exact fields are owned by the customizer React app.
allowShapesoptional
boolean
When true (default), customers can add primitive shapes (rect, circle, triangle, line) alongside text + uploaded SVGs. Set false on simpler products where only text customization is desired.
backgroundSvgoptional
object
Uploaded background/mask SVG describing the printable surface. `widthMm` / `heightMm` are the real-world dimensions inferred at upload time — preferred over reading the raw `viewBox` as mm, because viewBox-only SVGs (no explicit width/height) carry user units, not millimetres. The customizer canvas should size off `widthMm` / `heightMm` so it matches what OpenSCAD reads downstream.
heightMmoptional
number
Real-world height in millimetres. Optional for backward compat with pre-inference uploads.
sourceBboxoptional
object
Natural position of the source DXF model in its own Y-up coord system. Set on the DXF intake path; absent for direct SVG uploads. Surfaced to the customer-app so every per-config export (background + layers) uses the same `${x} ${y} ${width} ${height}` viewBox and overlays in OpenSCAD without any merchant translate.
heightrequired
number
widthrequired
number
xrequired
number
yrequired
number
sourcePathoptional
string
Original uploaded filename / path. Used to detect DXF vs SVG intake in the admin UI.
storagePathrequired
string
viewBoxrequired
string
Raw `viewBox` string copied from the uploaded SVG (e.g. `-95 -55 189 127`).
widthMmoptional
number
Real-world width in millimetres. Optional for backward compat with pre-inference uploads.
colorsoptional
object[]
Available colors the customer can pick from. Each entry stores a hex value, optional merchant-defined display alias (e.g. "Jet" instead of "#000000"), and optional pointer back to the material variant the color was imported from.
aliasoptional
string
Optional display alias shown to customers.
sourceMaterialVariantIdoptional
string
When auto-imported from a material variant, the source variant id.
valuerequired
string
Hex code, e.g. `#FF0000`. The 8-char `#RRGGBBAA` form is also accepted.
colorsEnabledoptional
boolean
Toggle hiding the customer-facing color pickers entirely. Defaults to true.
constraintsoptional
Record<string, any>
Construct a type with a set of properties K of type T
defaultsoptional
Record<string, any>
Construct a type with a set of properties K of type T
enabledFontsoptional
object[]
Subset of the store font pool enabled for this SKU.
aliasoptional
string
familyrequired
string
sourcerequired
any
finishesoptional
string[]
Available finishes (e.g. `matte`, `gloss`).
instructionsTextoptional
string
Instructional text shown beneath the canvas.
maskPathoptional
string
SVG path describing the printable mask.
outlineoptional
object
Per-config outline defaults. Each text / SVG / shape layer can opt into an outline (rendered as a separate `<path stroke=... fill="none">` element in the exported SVG so downstream pipelines can color-code or extrude it as a distinct part).
defaultColoroptional
string
Default stroke color used by new layers.
defaultWidthMmoptional
number
Default stroke width in millimeters.
enabledByDefaultoptional
boolean
When true, new layers start with their outline turned on.
minWidthMmoptional
number
Floor on the per-layer outline width a customer can set, in millimeters. Customers can still DISABLE the outline entirely with the per-layer toggle — this minimum only applies when the outline is on. Typical: 0.4mm (one FDM nozzle pass).
shapesWarningoptional
string
Optional warning text shown under the shape-add row in the customer app. Shapes don't currently respect z-order — overlapping geometries may not output the way the customer expects, so a heads-up nudge is useful. Empty / undefined hides the warning entirely. Only renders when `allowShapes !== false`.
subtitleoptional
string
One-line subtitle / tagline rendered under the title.
texturesoptional
object
Per-config build-plate texture configuration. The actual list of available textures lives at the store level (`store_custom_textures` + the two built-ins `smooth`/`carbon`); this block only carries the merchant's per-config overrides — section label, default selection, and any hidden texture ids for this specific config.
defaultIdoptional
string
Id of the texture pre-selected on first load.
hiddenIdsoptional
string[]
Ids the merchant has hidden in this specific config.
labeloptional
string
Section label rendered in the customer UI (e.g. "Texture", "Finish").
themeoptional
object
Merchant theme colors driving the customer-facing UI. All three are optional; the React app falls back to its built-in defaults (`#121212` for heading + button, `#1262C9` for accent).
accentColoroptional
string
Selection rings, links, focus, "negative" buttons.
buttonColoroptional
string
Background of primary action buttons (Add Text, Add to Cart).
headingColoroptional
string
Title + section heading color.
titleoptional
string
Page title shown above the customizer canvas.
viewBoxoptional
string
nameoptional
string
Human-readable label for this configuration (e.g. "Motorcycle Plate Frames").
publishedoptional
boolean
shopifyVariantIdoptional
string
skuIdoptional
string
skuIdsoptional
string[]
When provided, replaces all existing SKU associations for this config.

Example Request

application/json
{
  "configJson": {
    "viewBox": "string",
    "maskPath": "string",
    "colors": [
      {
        "value": "string",
        "alias": "string",
        "sourceMaterialVariantId": "string"
      }
    ],
    "finishes": [
      "string"
    ],
    "constraints": {},
    "defaults": {},
    "enabledFonts": [
      {
        "family": "string",
        "alias": "string"
      }
    ],
    "title": "string",
    "subtitle": "string",
    "instructionsText": "string",
    "theme": {
      "headingColor": "string",
      "buttonColor": "string",
      "accentColor": "string"
    },
    "backgroundSvg": {
      "storagePath": "string",
      "viewBox": "string",
      "widthMm": 1,
      "heightMm": 1,
      "sourceBbox": {
        "x": 1,
        "y": 1,
        "width": 1,
        "height": 1
      },
      "sourcePath": "string"
    },
    "colorsEnabled": true,
    "allowShapes": true,
    "shapesWarning": "string",
    "outline": {
      "enabledByDefault": true,
      "defaultColor": "string",
      "defaultWidthMm": 1,
      "minWidthMm": 1
    },
    "textures": {
      "label": "string",
      "defaultId": "string",
      "hiddenIds": [
        "string"
      ]
    }
  },
  "published": true,
  "skuIds": [
    "string"
  ]
}

Response Schema

CustomizerConfig
configJsonrequired
object
The configuration blob stored in `customizer_configs.config_json`. The shape is intentionally permissive — exact fields are owned by the customizer React app.
allowShapesoptional
boolean
When true (default), customers can add primitive shapes (rect, circle, triangle, line) alongside text + uploaded SVGs. Set false on simpler products where only text customization is desired.
backgroundSvgoptional
object
Uploaded background/mask SVG describing the printable surface. `widthMm` / `heightMm` are the real-world dimensions inferred at upload time — preferred over reading the raw `viewBox` as mm, because viewBox-only SVGs (no explicit width/height) carry user units, not millimetres. The customizer canvas should size off `widthMm` / `heightMm` so it matches what OpenSCAD reads downstream.
heightMmoptional
number
Real-world height in millimetres. Optional for backward compat with pre-inference uploads.
sourceBboxoptional
object
Natural position of the source DXF model in its own Y-up coord system. Set on the DXF intake path; absent for direct SVG uploads. Surfaced to the customer-app so every per-config export (background + layers) uses the same `${x} ${y} ${width} ${height}` viewBox and overlays in OpenSCAD without any merchant translate.
heightrequired
number
widthrequired
number
xrequired
number
yrequired
number
sourcePathoptional
string
Original uploaded filename / path. Used to detect DXF vs SVG intake in the admin UI.
storagePathrequired
string
viewBoxrequired
string
Raw `viewBox` string copied from the uploaded SVG (e.g. `-95 -55 189 127`).
widthMmoptional
number
Real-world width in millimetres. Optional for backward compat with pre-inference uploads.
colorsoptional
object[]
Available colors the customer can pick from. Each entry stores a hex value, optional merchant-defined display alias (e.g. "Jet" instead of "#000000"), and optional pointer back to the material variant the color was imported from.
aliasoptional
string
Optional display alias shown to customers.
sourceMaterialVariantIdoptional
string
When auto-imported from a material variant, the source variant id.
valuerequired
string
Hex code, e.g. `#FF0000`. The 8-char `#RRGGBBAA` form is also accepted.
colorsEnabledoptional
boolean
Toggle hiding the customer-facing color pickers entirely. Defaults to true.
constraintsoptional
Record<string, any>
Construct a type with a set of properties K of type T
defaultsoptional
Record<string, any>
Construct a type with a set of properties K of type T
enabledFontsoptional
object[]
Subset of the store font pool enabled for this SKU.
aliasoptional
string
familyrequired
string
sourcerequired
any
finishesoptional
string[]
Available finishes (e.g. `matte`, `gloss`).
instructionsTextoptional
string
Instructional text shown beneath the canvas.
maskPathoptional
string
SVG path describing the printable mask.
outlineoptional
object
Per-config outline defaults. Each text / SVG / shape layer can opt into an outline (rendered as a separate `<path stroke=... fill="none">` element in the exported SVG so downstream pipelines can color-code or extrude it as a distinct part).
defaultColoroptional
string
Default stroke color used by new layers.
defaultWidthMmoptional
number
Default stroke width in millimeters.
enabledByDefaultoptional
boolean
When true, new layers start with their outline turned on.
minWidthMmoptional
number
Floor on the per-layer outline width a customer can set, in millimeters. Customers can still DISABLE the outline entirely with the per-layer toggle — this minimum only applies when the outline is on. Typical: 0.4mm (one FDM nozzle pass).
shapesWarningoptional
string
Optional warning text shown under the shape-add row in the customer app. Shapes don't currently respect z-order — overlapping geometries may not output the way the customer expects, so a heads-up nudge is useful. Empty / undefined hides the warning entirely. Only renders when `allowShapes !== false`.
subtitleoptional
string
One-line subtitle / tagline rendered under the title.
texturesoptional
object
Per-config build-plate texture configuration. The actual list of available textures lives at the store level (`store_custom_textures` + the two built-ins `smooth`/`carbon`); this block only carries the merchant's per-config overrides — section label, default selection, and any hidden texture ids for this specific config.
defaultIdoptional
string
Id of the texture pre-selected on first load.
hiddenIdsoptional
string[]
Ids the merchant has hidden in this specific config.
labeloptional
string
Section label rendered in the customer UI (e.g. "Texture", "Finish").
themeoptional
object
Merchant theme colors driving the customer-facing UI. All three are optional; the React app falls back to its built-in defaults (`#121212` for heading + button, `#1262C9` for accent).
accentColoroptional
string
Selection rings, links, focus, "negative" buttons.
buttonColoroptional
string
Background of primary action buttons (Add Text, Add to Cart).
headingColoroptional
string
Title + section heading color.
titleoptional
string
Page title shown above the customizer canvas.
viewBoxoptional
string
createdAtrequired
string
format: date-time
idrequired
string
pattern: ^[a-z0-9]{24}$
namerequired
string
Human-readable label for this configuration (e.g. "Motorcycle Plate Frames").
publishedrequired
boolean
shopifyVariantIdrequired
string
skuIdrequired
string
skuIdsrequired
string[]
Resolved list of SKU IDs attached to this config via the join table.
storeIdrequired
string
pattern: ^[a-z0-9]{24}$
updatedAtrequired
string
format: date-time

Example Response

200 OK — application/json
{
  "configJson": {
    "viewBox": "string",
    "maskPath": "string",
    "colors": [
      {
        "value": "string",
        "alias": "string",
        "sourceMaterialVariantId": "string"
      }
    ],
    "finishes": [
      "string"
    ],
    "constraints": {},
    "defaults": {},
    "enabledFonts": [
      {
        "family": "string",
        "alias": "string"
      }
    ],
    "title": "string",
    "subtitle": "string",
    "instructionsText": "string",
    "theme": {
      "headingColor": "string",
      "buttonColor": "string",
      "accentColor": "string"
    },
    "backgroundSvg": {
      "storagePath": "string",
      "viewBox": "string",
      "widthMm": 1,
      "heightMm": 1,
      "sourceBbox": {
        "x": 1,
        "y": 1,
        "width": 1,
        "height": 1
      },
      "sourcePath": "string"
    },
    "colorsEnabled": true,
    "allowShapes": true,
    "shapesWarning": "string",
    "outline": {
      "enabledByDefault": true,
      "defaultColor": "string",
      "defaultWidthMm": 1,
      "minWidthMm": 1
    },
    "textures": {
      "label": "string",
      "defaultId": "string",
      "hiddenIds": [
        "string"
      ]
    }
  },
  "published": true,
  "skuIds": [
    "string"
  ],
  "id": "string",
  "storeId": "string",
  "createdAt": "2026-08-24T03:58:55.376Z",
  "updatedAt": "2026-08-24T03:58:55.376Z"
}