Printago API
PATCH /v1/parts

Bulk update parts

Update the same fields on multiple parts at once

Requires: part.edit

Request Body

Part IDs and shared update data

UpdateManyRequestPartUpdateWithMaterials
idsrequired
string[]
updaterequired
object
Make all properties in T optional
arrangeableoptional
boolean
assignedMaterialsoptional
Record<string, object[]>
customMetadataoptional
Record<string, any>
Construct a type with a set of properties K of type T
descriptionoptional
string
fileUrisoptional
string[]
min items: 1
folderIdoptional
string
nameoptional
string
overriddenProcessProfileIdoptional
string
parametersoptional
object[]
acceptedContentTypesoptional
string[]
File-parameter-only fields (populated when `type === PartParameterVariableType.File`). Kept optional on the shared interface so scalar-parameter call sites do not need union-narrowing. See `FilePartParameter` for the strict shape. `acceptedContentTypes` is intentionally an OPEN `string[]` (not a narrow union). The customizer emits SVG, but Etsy attachments and direct API order ingestion can carry ANY mime type (PNG / JPG / PDF / AI / etc). Builders enforce kind constraints; the shared type stays open.
defaultoptional
number | string | boolean
defaultUrioptional
string
Optional fallback file URI (e.g. a known SVG in storage).
descriptionoptional
string
labeloptional
string
What the parameter is shown under wherever a customer or an operator fills it in; `name` stays the key everything binds by (SKU options, order inputs, build overrides, and — for a 3MF text slot — the text volume the substitution travels to). A parameter without one is shown under its name. This interface is the one the API's request validators are generated from, and it is a second declaration of the shape in `../part/parameter`. A field added to only one of them is accepted by the code and then pruned off the wire.
maxoptional
number
minoptional
number
multipleoptional
boolean
Whether the slot accepts >1 file. Reserved for forward compat — the Phase 5 resolver assumes single-file per slot for v1.
namerequired
string
optionsoptional
object[]
labeloptional
string
valuerequired
string | number
serialReuseoptional
any
For a 3MF text-slot parameter bound to a sequence: whether occurrences repeated on one plate share a serial or each consume the next one. Absent means {@link TextSlotSerialReuse.Share }, today's duplicate-name meaning.
sizingoptional
any
3MF text placeholders only: how a substituted value is sized against the bounds of the text volume it replaces. Absent means "fit within bounds", which is what every part declared before the setting existed carries. Declared on this shape as well as on `../part/parameter` for the reason `label` is — the API's request validators are generated from this one, and a field on only the other is pruned off the wire.
stepoptional
number
typerequired
any
valueoptional
number | string | boolean
printTagsoptional
object
filament.typeoptional
string
printer.idoptional
string
printer.modelNameoptional
string
printer.nozzleDiameteroptional
string
printer.provideroptional
string
user.tagsoptional
string
slicerOverrideoptional
string
typeoptional
any
use3MFProcessProfileoptional
boolean
Slice this part with the process profile embedded in its 3MF rather than the matched printer's. Omit it when creating a 3MF part and it is turned on for you, unless you also send an `overriddenProcessProfileId`; send `false` to slice with the printer's profile instead. Ignored for every other part type.
userTagsoptional
string[]
max items: 10

Example Request

application/json
{
  "ids": [
    "string"
  ],
  "update": {
    "name": "string",
    "description": "string",
    "fileUris": [
      "string"
    ],
    "parameters": [
      {
        "options": [
          {
            "label": "string"
          }
        ],
        "description": "string",
        "min": 1,
        "max": 1,
        "step": 1,
        "acceptedContentTypes": [
          "string"
        ],
        "multiple": true,
        "defaultUri": "string",
        "label": "string",
        "name": "string"
      }
    ],
    "printTags": {
      "printer.provider": "string",
      "printer.id": "string",
      "printer.nozzleDiameter": "string",
      "printer.modelName": "string",
      "filament.type": "string",
      "user.tags": "string"
    },
    "customMetadata": {},
    "use3MFProcessProfile": true,
    "arrangeable": true,
    "userTags": [
      "string"
    ],
    "assignedMaterials": {}
  }
}

Response Schema

Response
value
object[]

Example Response

200 OK — application/json
[
  {
    "name": "string",
    "description": "string",
    "fileUris": [
      "string"
    ],
    "fileHashes": [
      "string"
    ],
    "parameters": [
      {
        "options": [
          {
            "label": "string"
          }
        ],
        "description": "string",
        "min": 1,
        "max": 1,
        "step": 1,
        "acceptedContentTypes": [
          "string"
        ],
        "multiple": true,
        "defaultUri": "string",
        "label": "string",
        "name": "string"
      }
    ],
    "printTags": {
      "printer.provider": "string",
      "printer.id": "string",
      "printer.nozzleDiameter": "string",
      "printer.modelName": "string",
      "filament.type": "string",
      "user.tags": "string"
    },
    "use3MFProcessProfile": true,
    "arrangeable": true,
    "userTags": [
      "string"
    ],
    "customMetadata": {},
    "id": "string",
    "storeId": "string",
    "createdAt": "2026-09-09T20:31:46.854Z",
    "updatedAt": "2026-09-09T20:31:46.854Z"
  }
]