/v2/builds
Create and queue prints
Queue parts and SKUs for printing. One request can mix any number of individual parts (parts) and SKUs (skus). Every entry becomes a part build, and every part build expands into print jobs in your queue.
Send Authorization: ApiKey <your-api-key> with every request.
How quantities become print jobs
| What you send | Print jobs created |
|---|---|
A single-file part (STL, STEP, OpenSCAD, ...) with quantity: 3 |
3 |
A 3MF or GCODE 3MF part with quantity: 2 and no plateQuantities |
2 per plate in the file |
A 3MF or GCODE 3MF part with plateQuantities: { "1": 2, "3": 1 } |
2 of plate 1, 1 of plate 3 (quantity is ignored) |
A SKU with quantity: 2 |
For each linked part: its quantity in the SKU (plate quantities for a 3MF linked part), or the linkedPartConfigs override, multiplied by 2 |
What happens after the call
The response comes back as soon as the builds are recorded, with each part build in status: "pending". The rest is asynchronous:
- Parts that need rendering first (OpenSCAD, CadQuery and build123d models, STEP files, 3MF files with text parameters) are rendered.
- The print jobs are added to the queue with
status: "pending", and the part build'sstatusbecomessuccess. - Printago matches each job to a compatible idle printer, slices it for that printer (
assigned,slicing,sliced) and sends it (sending-to-printer,printing).
To follow the jobs a build created, list them with GET /v1/print-jobs?partBuildId=<partBuild.id>. Jobs created for a SKU also carry skuId, so GET /v1/print-jobs?skuId=<skuId> works too.
Customizing a SKU print
optionsselects variant values for the SKU's variant options, by optionidorname. The value can be a value name ("Red") or a value ID. Selected values drive the parameter, material and plate-quantity bindings you set up on the SKU's linked parts (seePOST /v1/sku-variants).linkedPartConfigsoverrides settings for individual linked parts. It is keyed by the linked part ID (theidof an entry in the SKU'slinkedParts, fromGET /v1/skus/{id}), not by the part ID.
Call POST /v2/builds/preview with the same body first to see exactly which jobs (labels, plates, counts) a request will create, without queueing anything.
Every part must have finished file processing. A part whose processingStatus is "processing" or "failed" makes the whole request fail with 400. A SKU referenced by an unknown sku code is skipped rather than rejected, so check that skuBuilds in the response contains every SKU you sent.
Request Body
- Build configuration specifying parts and SKUs to include
Individual parts to print. Each entry becomes one part build. Get part IDs from GET /v1/parts.
Pack this build's copies onto shared plates instead of printing one copy per job. Off unless enabled is true. partSpacingMm and plateMarginMm override your store's spacing settings for this build, and bedSize sets the target plate (defaults to the smallest bed among your printers).
Label shown on the print jobs in the queue. Defaults to the part name. For 3MF and GCODE 3MF parts, the plate name is appended.
Material to use per filament channel, keyed by the channel index from the part's materials[].index (0 for a single-material part). Each value is a list of material specs in order of preference, each one of { "variantId": ... } (an exact material and color), { "materialId": ... }, { "groupId": ... } or { "materialType": "PLA" }. Channels you leave out keep the part's own material assignments.
Parameter overrides for parametric parts, as { "name": value } pairs. Names match the part's parameters[].name.
ID of the part to print, from GET /v1/parts. The part must have finished file processing (processingStatus is null).
3MF and GCODE 3MF parts only. Per-plate label overrides keyed by plate ID. A job for that plate is labeled <label> - <plateLabels[plateId]> instead of using the plate name from the file.
3MF and GCODE 3MF parts only. Copies to print per plate, keyed by plate ID (for example { "1": 2, "3": 1 }). Only the listed plates are printed, and quantity is ignored. Plate IDs are in the part's metadata.plates.
Where the new jobs go within their priority tier: "back" (default) or "front".
100 (normal, the default) or 1000 (low). Normal-priority jobs are printed before low-priority ones.
Number of copies, 0 to 500, default 1. For a 3MF or GCODE 3MF part, every plate in the file is printed this many times. Ignored when plateQuantities is set.
Bambu printers only. Objects to skip per plate, keyed by plate ID, as lists of identifyId strings from metadata.plates[].sliced.objects[]. The print starts normally and the listed objects are skipped once the printer reports it has started.
Printer-matching tags added to the job's required printer tags. Jobs only go to printers whose tags satisfy them.
SKUs (products) to print. Identify each one by skuId or by its SKU code in sku. Each entry can also set quantity (complete units, 1 to 500, default 1), options (variant selections as { "name": "Color", "value": "Red" } or { "id": "<optionId>", "value": "Red" }; the value can be a value name or a value ID), linkedPartConfigs (overrides keyed by linked part ID, accepting the same quantity, parameters, label, tags, plateQuantities, plateLabels, skipObjects and materials fields as a part entry), priority, position, consolidation and tags. Every linked part of the SKU gets its own part build.
Example Request
{
"parts": [
{
"partId": "string",
"priority": 100,
"position": "front",
"consolidation": {
"enabled": true,
"partSpacingMm": 1,
"plateMarginMm": 1,
"bedSize": {
"x": 1,
"y": 1,
"z": 1
}
},
"quantity": 0,
"parameters": {},
"label": "string",
"tags": {
"printer.provider": "string",
"printer.id": "string",
"printer.nozzleDiameter": "string",
"printer.modelName": "string",
"filament.type": "string",
"user.tags": "string"
},
"plateQuantities": {},
"plateLabels": {},
"materials": {},
"skipObjects": {}
}
],
"skus": [
{
"skuId": "string",
"quantity": 1,
"linkedPartConfigs": {},
"tags": {
"printer.provider": "string",
"printer.id": "string",
"printer.nozzleDiameter": "string",
"printer.modelName": "string",
"filament.type": "string",
"user.tags": "string"
},
"priority": 100,
"position": "front",
"consolidation": {
"enabled": true,
"partSpacingMm": 1,
"plateMarginMm": 1,
"bedSize": {
"x": 1,
"y": 1,
"z": 1
}
},
"skuInstanceStart": 1,
"order": {
"orderId": "string",
"orderItemId": "string"
},
"options": [
{
"id": "string",
"value": "string"
}
]
}
]
}
Examples
Print copies of a part
Queue three copies of an STL part. The response contains one part build; its three print jobs appear in the queue moments later.
{
"parts": [
{
"partId": "p8f2k6m1q9w3e7r5t0y4u2i6",
"quantity": 3
}
]
}
{
"partBuilds": [
{
"id": "b7v3c9x1z5n2m8k4j0h6g3f1",
"storeId": "k3m9x2p7q8r4t6v1w5y0z3a2",
"partId": "p8f2k6m1q9w3e7r5t0y4u2i6",
"partCopy": {
"id": "p8f2k6m1q9w3e7r5t0y4u2i6",
"name": "Benchy",
"type": "stl"
},
"label": "Benchy",
"quantity": 3,
"status": "pending",
"printStatus": "pending",
"parameterOverrides": [],
"materialAssignments": null,
"priority": 100,
"position": "back",
"skuBuildId": null,
"skuId": null,
"skuName": null,
"orderId": null,
"orderItemId": null,
"linkedPartId": null,
"outputFiles": null,
"dismissed": false,
"createdAt": "2026-09-23T14:05:12.418Z",
"updatedAt": "2026-09-23T14:05:12.418Z"
}
],
"skuBuilds": []
}
Print selected plates of a 3MF in a specific color
Print plate 1 twice and plate 3 once, force filament channel 0 to a specific material variant, and put the jobs at the front of the queue.
{
"parts": [
{
"partId": "d4n7c2v8b1x5z9m3q6w0e4r8",
"label": "Desk Organizer",
"plateQuantities": {
"1": 2,
"3": 1
},
"materials": {
"0": [
{
"variantId": "m6a0t4v8a2r5i9a3n7t1j2w4"
}
]
},
"position": "front"
}
]
}
{
"partBuilds": [
{
"id": "b2x6c0v4b8n1m5k9j3h7g2f6",
"storeId": "k3m9x2p7q8r4t6v1w5y0z3a2",
"partId": "d4n7c2v8b1x5z9m3q6w0e4r8",
"label": "Desk Organizer",
"quantity": 1,
"status": "pending",
"printStatus": "pending",
"extensions": {
"3mf": {
"plateQuantities": {
"1": 2,
"3": 1
}
}
},
"materialAssignments": {
"0": [
{
"variantId": "m6a0t4v8a2r5i9a3n7t1j2w4"
}
]
},
"priority": 100,
"position": "front",
"createdAt": "2026-09-23T14:07:40.102Z",
"updatedAt": "2026-09-23T14:07:40.102Z"
}
],
"skuBuilds": []
}
Print a SKU by code with a variant selection
Build two units of the SKU BENCHY in red. Each SKU build is returned with the part builds created for its linked parts.
{
"skus": [
{
"sku": "BENCHY",
"quantity": 2,
"options": [
{
"name": "Color",
"value": "Red"
}
]
}
]
}
{
"partBuilds": [],
"skuBuilds": [
{
"id": "u6y2t8r4e0w5q1a7s3d9f2g4",
"storeId": "k3m9x2p7q8r4t6v1w5y0z3a2",
"skuId": "s5h1j7k3l9a2s6d0f4g8h2j5",
"skuCopy": {
"id": "s5h1j7k3l9a2s6d0f4g8h2j5",
"sku": "BENCHY",
"title": "Benchy"
},
"status": "pending",
"priority": 100,
"selectedOptions": {
"v2a6r0i4a8n1t5c9o3l7o2r6": "Red"
},
"orderId": null,
"orderItemId": null,
"createdAt": "2026-09-23T14:09:03.551Z",
"updatedAt": "2026-09-23T14:09:03.551Z",
"partBuilds": [
{
"id": "b5n9m3k7j1h4g8f2d6s0a5q9",
"partId": "p8f2k6m1q9w3e7r5t0y4u2i6",
"skuBuildId": "u6y2t8r4e0w5q1a7s3d9f2g4",
"skuId": "s5h1j7k3l9a2s6d0f4g8h2j5",
"skuName": "BENCHY",
"label": "Benchy",
"quantity": 2,
"numPartsPerSku": 1,
"status": "pending",
"materialAssignments": {
"0": [
{
"variantId": "m6a0t4v8a2r5i9a3n7t1j2w4"
}
]
},
"priority": 100,
"position": "back"
}
]
}
]
}
Override one linked part inside a SKU
Print one unit of a SKU but make three copies of one of its linked parts, with a parameter override. The key in linkedPartConfigs is the linked part ID from the SKU's linkedParts.
{
"skus": [
{
"skuId": "s5h1j7k3l9a2s6d0f4g8h2j5",
"linkedPartConfigs": {
"l2k8j4h0g6f1d7s3a9p5o1i7": {
"quantity": 3,
"parameters": {
"name_text": "Ada"
}
}
}
}
]
}
{
"partBuilds": [],
"skuBuilds": [
{
"id": "u1i5o9p3a7s2d6f0g4h8j3k7",
"skuId": "s5h1j7k3l9a2s6d0f4g8h2j5",
"status": "pending",
"priority": 100,
"partBuilds": [
{
"id": "b8m2n6b0v4c7x1z5a9s3d7f1",
"partId": "p8f2k6m1q9w3e7r5t0y4u2i6",
"skuBuildId": "u1i5o9p3a7s2d6f0g4h8j3k7",
"label": "Benchy",
"quantity": 3,
"numPartsPerSku": 3,
"parameterOverrides": [
{
"name": "name_text",
"value": "Ada",
"type": "string"
}
],
"status": "pending"
}
]
}
]
}
Response Schema
Part builds created for the entries in parts. Part builds created for SKUs are nested under each SKU build instead.
One SKU build per resolved entry in skus, each with the part builds created for its linked parts in partBuilds.
Example Response
{
"partBuilds": [
{
"partId": "string",
"skuBuildId": "string",
"skuId": "string",
"skuName": "string",
"label": "string",
"partCopy": {
"name": "string",
"type": "scad",
"description": "string",
"fileUris": [
"string"
],
"fileHashes": [
"string"
],
"thumbnailUri": "string",
"parameters": [
{
"default": 1,
"options": [
{
"value": "string",
"label": "string"
}
],
"description": "string",
"min": 1,
"max": 1,
"step": 1,
"acceptedContentTypes": [
"string"
],
"multiple": true,
"defaultUri": "string",
"label": "string",
"serialReuse": "share",
"sizing": "stretch",
"name": "string",
"type": "number",
"value": 1
}
],
"printTags": {
"printer.provider": "string",
"printer.id": "string",
"printer.nozzleDiameter": "string",
"printer.modelName": "string",
"filament.type": "string",
"user.tags": "string"
},
"overriddenProcessProfileId": "string",
"folderId": "string",
"materials": [
{
"index": 0,
"color": "string",
"type": "string",
"skip": true,
"name": "string",
"identifier": "string"
}
],
"slicerOverride": "string",
"metadata": {
"printerModel": "string",
"filamentType": [
"string"
],
"filamentColors": [
"string"
],
"filamentDensities": [
1
],
"filamentDiameters": [
1
],
"nozzleDiameter": "string",
"profileCompat": {
"sliced": "string",
"compatible": [
"string"
],
"safe": [
"string"
]
},
"slicerVersion": {
"engine": "orcaslicer",
"version": "string"
},
"plates": [
{
"id": 1,
"name": "string",
"locked": true,
"filamentMapMode": "string",
"filamentMaps": [
1
],
"gcodeFile": "string",
"thumbnailFile": "string",
"thumbnailUploadedUri": "string",
"thumbnailRenderedUri": "string",
"thumbnailNoLightFile": "string",
"thumbnailData": "string",
"topFile": "string",
"pickFile": "string",
"topData": "string",
"pickData": "string",
"topUploadedUri": "string",
"pickUploadedUri": "string",
"patternBboxFile": "string",
"sliced": {
"index": 1,
"extruderType": "string",
"nozzleVolumeType": "string",
"printerModelId": "string",
"nozzleDiameters": "string",
"timelapseType": "string",
"prediction": 1,
"weight": 1,
"outside": true,
"supportUsed": true,
"labelObjectEnabled": true,
"filamentMaps": "string",
"objects": [
{}
],
"filaments": [
{}
],
"warnings": [
{}
],
"layerFilamentLists": [
{}
]
},
"filamentIds": [
"string"
]
}
],
"filamentIds": [
"string"
],
"textSlots": [
{
"key": "string",
"label": "string",
"text": "string",
"volumeCount": 1,
"fontName": "string",
"fontVersion": "string",
"surfaceType": 1,
"occurrences": [
{
"plateId": 1,
"objectId": "string",
"instanceId": 1,
"identifyId": "string"
}
]
}
],
"plateRenderSourceHash": "string"
},
"slicingEstimate": {
"estimatedPrintTimeSeconds": 1,
"materials": [
{
"index": 1,
"usedGrams": 1,
"usedMeters": 1,
"materialType": "string",
"color": "string"
}
],
"totalWeightGrams": 1,
"profiles": {
"machineProfileId": "string",
"machineProfileName": "string",
"processProfileId": "string",
"processProfileName": "string",
"filamentProfileIds": [
"string"
],
"filamentProfileNames": [
"string"
]
},
"slicedAt": "string",
"slicerVersion": "string",
"plates": [
{
"plateId": 1,
"estimatedPrintTimeSeconds": 1,
"materials": [
{
"index": 1,
"usedGrams": 1,
"usedMeters": 1,
"materialType": "string",
"color": "string"
}
],
"totalWeightGrams": 1
}
]
},
"use3MFProcessProfile": true,
"arrangeable": true,
"userTags": [
"string"
],
"gcodePlateUris": {},
"meshUri": "string",
"meshSourceHash": "string",
"meshError": "string",
"uploadedAt": "string",
"customMetadata": {},
"source": "google-drive",
"processingStatus": "processing",
"processing": {
"workflowKey": "string",
"fileHash": "string",
"attempt": 1,
"startedAt": "string",
"finishedAt": "string",
"failedStage": "fetch",
"error": "string",
"stages": [
{
"key": "fetch",
"status": "running",
"attempts": 1,
"error": "string"
}
]
},
"id": "string",
"storeId": "string",
"createdAt": "string",
"updatedAt": "string"
},
"requiredPrinterTags": {
"printer.provider": "string",
"printer.id": "string",
"printer.nozzleDiameter": "string",
"printer.modelName": "string",
"filament.type": "string",
"user.tags": "string"
},
"quantity": 0,
"numPartsPerSku": 1,
"skuInstanceStart": 1,
"parameterOverrides": [
{
"name": "string",
"type": "number",
"value": 1
}
],
"status": "pending",
"outputFiles": [
"string"
],
"thumbnailUri": "string",
"assignmentStartedAt": "2025-01-15T12:00:00.000Z",
"assignmentCompletedAt": "2025-01-15T12:00:00.000Z",
"printingStartedAt": "2025-01-15T12:00:00.000Z",
"printingCompletedAt": "2025-01-15T12:00:00.000Z",
"printStatus": "pending",
"extensions": {
"3mf": {
"plateQuantities": {},
"skipObjects": {},
"plateLabels": {}
},
"createdBy": {
"actorId": "string",
"actorType": "user",
"actorEmail": "string",
"apiKeyId": "string"
},
"orderInfo": {
"linkedPartId": "string",
"linkedPartQuantity": 1
},
"boundingBox": {
"x": 1,
"y": 1,
"z": 1
},
"mergedPlate": {
"childJobIds": [
"string"
],
"layout": [
{
"jobId": "string",
"x": 1,
"y": 1,
"rotationDeg": 0
}
],
"bedSize": {
"x": 1,
"y": 1,
"z": 1
},
"mode": "manual",
"policy": "same-order",
"objectManifest": {},
"machineName": "string",
"excludeAreas": [
{
"x": 1,
"y": 1,
"width": 1,
"height": 1
}
],
"filamentCount": 1,
"filamentColours": [
"string"
],
"processOverrides": {},
"childProcessSettings": {},
"slicerVersionId": "string",
"failure": {
"message": "string"
}
},
"consolidation": {
"enabled": true,
"partSpacingMm": 1,
"plateMarginMm": 1,
"bedSize": {
"x": 1,
"y": 1,
"z": 1
}
},
"customizer": {
"unresolvedChannels": [
{
"index": 1,
"hex": "string"
}
]
},
"serials": [
{
"sequenceId": "string",
"sequenceName": "string",
"parameterName": "string",
"value": 1,
"serial": "string",
"target": {
"plateId": 1,
"objectId": "string",
"instanceId": 1,
"identifyId": "string"
}
}
],
"sequenceFanout": {
"groupId": "string",
"unitIndex": 1,
"unitCount": 1,
"buildIds": [
"string"
],
"queueOrder": 1
}
},
"materialAssignments": {},
"priority": 100,
"position": "front",
"orderId": "string",
"orderItemId": "string",
"linkedPartId": "string",
"dismissed": true,
"customMetadata": {},
"id": "string",
"storeId": "string",
"createdAt": "2025-01-15T12:00:00.000Z",
"updatedAt": "2025-01-15T12:00:00.000Z"
}
],
"skuBuilds": [
{
"skuId": "string",
"skuCopy": {
"sku": "string",
"title": "string",
"description": "string",
"externalId": "string",
"externalProvider": "etsy",
"folderId": "string",
"totalCogs": 1,
"customMetadata": {},
"id": "string",
"storeId": "string",
"createdAt": "string",
"updatedAt": "string"
},
"status": "pending",
"skuInstanceStart": 1,
"orderId": "string",
"orderItemId": "string",
"priority": 100,
"selectedOptions": {},
"id": "string",
"storeId": "string",
"createdAt": "2025-01-15T12:00:00.000Z",
"updatedAt": "2025-01-15T12:00:00.000Z"
}
]
}