Printago API
POST /v1/sku-variants/props

Create a new variant property

Create a variant property: something an option's value controls on the print. Each property has a type:

type Set per option value as Used by a linked part through
material materialValue: material specs a materialAssignments entry { "propertyId": "<property ID>" }
text textValue: a string parameterBindings: { "<parameter name>": "<property ID>" }
plate_quantities plateQuantitiesValue: copies per 3MF plate plateQuantitiesBinding: "<property ID>"

Leave bindingId unset for a global property that every SKU bound to the option shares. Set bindingId to a SKU's binding ID (from POST /v1/sku-variants/bindings) to make the property local to that SKU. For a property that depends on a combination of options, such as a material chosen by both Color and Finish, also set bindingId2 (and bindingId3) to the bindings of the other options.

After creating a property, set its value for each option value with POST /v1/sku-variants/prop-values.

Requires: sku.edit

Request Body

- Variant property data

CreateSkuOptionPropertyRequest
bindingIdoptionalnullable
string

null (or omitted) for a global property. A SKU binding ID to scope the property to that SKU.

pattern: ^[a-z0-9]{24}$
bindingId2optionalnullable
string
For compound local properties: 2nd source binding
pattern: ^[a-z0-9]{24}$
bindingId3optionalnullable
string
For compound local properties: 3rd source binding
pattern: ^[a-z0-9]{24}$
namerequired
string
optionIdrequired
string

The option whose values set this property.

pattern: ^[a-z0-9]{24}$
typerequired
"text" | "material" | "plate_quantities"

material, text or plate_quantities. Decides which field of a property value is used and how linked parts reference the property.

textmaterialplate_quantities

Example Request

application/json
{
  "optionId": "string",
  "bindingId": "string",
  "bindingId2": "string",
  "bindingId3": "string",
  "name": "string",
  "type": "text"
}

Examples

Create a Filament property on Color

Request
{
  "optionId": "v2a6r0i4a8n1t5c9o3l7o2r6",
  "name": "Filament",
  "type": "material"
}
Response
{
  "id": "f1l4m7n0t3p6r9q2w5e8r1t4",
  "storeId": "k3m9x2p7q8r4t6v1w5y0z3a2",
  "optionId": "v2a6r0i4a8n1t5c9o3l7o2r6",
  "bindingId": null,
  "bindingId2": null,
  "bindingId3": null,
  "name": "Filament",
  "type": "material",
  "order": 0,
  "createdAt": "2026-09-23T16:26:48.213Z",
  "updatedAt": "2026-09-23T16:26:48.213Z"
}

Response Schema

SkuOptionProperty
bindingIdoptionalnullable
string

null (or omitted) for a global property. A SKU binding ID to scope the property to that SKU.

pattern: ^[a-z0-9]{24}$
bindingId2optionalnullable
string
pattern: ^[a-z0-9]{24}$
bindingId3optionalnullable
string
pattern: ^[a-z0-9]{24}$
createdAtrequired
string
format: date-time
idrequired
string
pattern: ^[a-z0-9]{24}$
namerequired
string
optionIdrequired
string

The option whose values set this property.

pattern: ^[a-z0-9]{24}$
orderrequired
number
storeIdrequired
string
pattern: ^[a-z0-9]{24}$
typerequired
"text" | "material" | "plate_quantities"

material, text or plate_quantities. Decides which field of a property value is used and how linked parts reference the property.

textmaterialplate_quantities
updatedAtrequired
string
format: date-time

Example Response

201 OK — application/json
{
  "optionId": "string",
  "bindingId": "string",
  "bindingId2": "string",
  "bindingId3": "string",
  "name": "string",
  "type": "text",
  "order": 1,
  "id": "string",
  "storeId": "string",
  "createdAt": "2025-01-15T12:00:00.000Z",
  "updatedAt": "2025-01-15T12:00:00.000Z"
}