Printago API
GET /v1/print-history

List print history

List print attempts: one row per time a job ran on a printer, with its outcome, timing and printer. Rows are written by Printago as attempts finish and cannot be edited. Filter with `field.operator=value` query parameters; pass `meta=true` to get a paginated envelope. `GET /v2/print-history` is easier to page through.

Requires: queue.view

Query Parameters

printJobId optional
string
Filter on printJobId. A bare value is an exact match (printJobId=value); use printJobId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
attemptNumber optional
string
Filter on attemptNumber. A bare value is an exact match (attemptNumber=value); use attemptNumber.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
taskId optional
string
Filter on taskId. A bare value is an exact match (taskId=value); use taskId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
finalStatus optional
string
Filter on finalStatus. A bare value is an exact match (finalStatus=value); use finalStatus.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
outcome optional
string
Filter on outcome. A bare value is an exact match (outcome=value); use outcome.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
partBuildId optional
string
Filter on partBuildId. A bare value is an exact match (partBuildId=value); use partBuildId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
partId optional
string
Filter on partId. A bare value is an exact match (partId=value); use partId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
partName optional
string
Filter on partName. A bare value is an exact match (partName=value); use partName.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
skuId optional
string
Filter on skuId. A bare value is an exact match (skuId=value); use skuId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
skuName optional
string
Filter on skuName. A bare value is an exact match (skuName=value); use skuName.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
label optional
string
Filter on label. A bare value is an exact match (label=value); use label.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
groupId optional
string
Filter on groupId. A bare value is an exact match (groupId=value); use groupId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
orderId optional
string
Filter on orderId. A bare value is an exact match (orderId=value); use orderId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
orderItemId optional
string
Filter on orderItemId. A bare value is an exact match (orderItemId=value); use orderItemId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
quantityIndex optional
string
Filter on quantityIndex. A bare value is an exact match (quantityIndex=value); use quantityIndex.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
quantityTotal optional
string
Filter on quantityTotal. A bare value is an exact match (quantityTotal=value); use quantityTotal.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
printerId optional
string
Filter on printerId. A bare value is an exact match (printerId=value); use printerId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
printerDeviceId optional
string
Filter on printerDeviceId. A bare value is an exact match (printerDeviceId=value); use printerDeviceId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
printerProvider optional
string
Filter on printerProvider. A bare value is an exact match (printerProvider=value); use printerProvider.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
printerName optional
string
Filter on printerName. A bare value is an exact match (printerName=value); use printerName.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
printerModelName optional
string
Filter on printerModelName. A bare value is an exact match (printerModelName=value); use printerModelName.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
printerVendorName optional
string
Filter on printerVendorName. A bare value is an exact match (printerVendorName=value); use printerVendorName.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
queuedAt optional
string
Filter on queuedAt. A bare value is an exact match (queuedAt=value); use queuedAt.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
assignmentStartedAt optional
string
Filter on assignmentStartedAt. A bare value is an exact match (assignmentStartedAt=value); use assignmentStartedAt.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
assignmentCompletedAt optional
string
Filter on assignmentCompletedAt. A bare value is an exact match (assignmentCompletedAt=value); use assignmentCompletedAt.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
printingStartedAt optional
string
Filter on printingStartedAt. A bare value is an exact match (printingStartedAt=value); use printingStartedAt.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
printingCompletedAt optional
string
Filter on printingCompletedAt. A bare value is an exact match (printingCompletedAt=value); use printingCompletedAt.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
cancelledAt optional
string
Filter on cancelledAt. A bare value is an exact match (cancelledAt=value); use cancelledAt.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
endedAt optional
string
Filter on endedAt. A bare value is an exact match (endedAt=value); use endedAt.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
printDurationSeconds optional
string
Filter on printDurationSeconds. A bare value is an exact match (printDurationSeconds=value); use printDurationSeconds.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
errorMessage optional
string
Filter on errorMessage. A bare value is an exact match (errorMessage=value); use errorMessage.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
materialUsageId optional
string
Filter on materialUsageId. A bare value is an exact match (materialUsageId=value); use materialUsageId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
totalUsed optional
string
Filter on totalUsed. A bare value is an exact match (totalUsed=value); use totalUsed.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
totalUsedGrams optional
string
Filter on totalUsedGrams. A bare value is an exact match (totalUsedGrams=value); use totalUsedGrams.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
usedBySlot optional
string
Flat slot id (amsIndex*4+slotIndex, negative for spools) -> mm extruded.
usedGramsBySlot optional
string
Flat slot id -> grams extruded, when a grams conversion was available.
slotMaterials optional
string
Flat slot id -> what was loaded there at capture time. Deliberately open: it is a verbatim snapshot of `material_usage.slot_materials`, whose shape has gained fields over time and must survive round-tripping unchanged.
materialMapping optional
string
Filter on materialMapping. A bare value is an exact match (materialMapping=value); use materialMapping.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
totalLayers optional
string
Filter on totalLayers. A bare value is an exact match (totalLayers=value); use totalLayers.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
completedLayers optional
string
Filter on completedLayers. A bare value is an exact match (completedLayers=value); use completedLayers.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
skippedObjects optional
string
Filter on skippedObjects. A bare value is an exact match (skippedObjects=value); use skippedObjects.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
estimatedPrintTimeSeconds optional
string
Filter on estimatedPrintTimeSeconds. A bare value is an exact match (estimatedPrintTimeSeconds=value); use estimatedPrintTimeSeconds.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
estimatedTotalWeightGrams optional
string
Filter on estimatedTotalWeightGrams. A bare value is an exact match (estimatedTotalWeightGrams=value); use estimatedTotalWeightGrams.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
estimatedMaterials optional
string
Filter on estimatedMaterials. A bare value is an exact match (estimatedMaterials=value); use estimatedMaterials.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
slicerVersion optional
string
Filter on slicerVersion. A bare value is an exact match (slicerVersion=value); use slicerVersion.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
overriddenProcessProfileId optional
string
Filter on overriddenProcessProfileId. A bare value is an exact match (overriddenProcessProfileId=value); use overriddenProcessProfileId.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
gcodeAnalysisSha256 optional
string
Filter on gcodeAnalysisSha256. A bare value is an exact match (gcodeAnalysisSha256=value); use gcodeAnalysisSha256.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
slicedGcodeUri optional
string
Filter on slicedGcodeUri. A bare value is an exact match (slicedGcodeUri=value); use slicedGcodeUri.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
thumbnailUri optional
string
Filter on thumbnailUri. A bare value is an exact match (thumbnailUri=value); use thumbnailUri.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
coloredThumbnailUri optional
string
Filter on coloredThumbnailUri. A bare value is an exact match (coloredThumbnailUri=value); use coloredThumbnailUri.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
cameraThumbnailUri optional
string
Filter on cameraThumbnailUri. A bare value is an exact match (cameraThumbnailUri=value); use cameraThumbnailUri.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
timelapseUri optional
string
Filter on timelapseUri. A bare value is an exact match (timelapseUri=value); use timelapseUri.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
logsUri optional
string
Filter on logsUri. A bare value is an exact match (logsUri=value); use logsUri.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
gatewayTelemetryUri optional
string
Filter on gatewayTelemetryUri. A bare value is an exact match (gatewayTelemetryUri=value); use gatewayTelemetryUri.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
fuseTelemetryUri optional
string
Filter on fuseTelemetryUri. A bare value is an exact match (fuseTelemetryUri=value); use fuseTelemetryUri.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
priority optional
string
Filter on priority. A bare value is an exact match (priority=value); use priority.<operator>=value for the other operators (ne, gt, gte, lt, lte, contains, startsWith, endsWith, in, notIn, isNull; which ones a field accepts depends on its type). See Querying Data.
id optional
string
Filter by record ID. A bare value is an exact match; use id.in=a,b,c for several (up to 100). See Querying Data.
storeId optional
string
Filter by store ID. Results are always limited to the store your API key belongs to, so this is rarely useful. See Querying Data.
createdAt optional
string
Filter by creation time. Pass an ISO 8601 timestamp with a comparison operator, e.g. createdAt.gte=2025-01-01T00:00:00Z. See Querying Data.
updatedAt optional
string
Filter by last-modified time. Pass an ISO 8601 timestamp with a comparison operator, e.g. updatedAt.gt=2025-01-01T00:00:00Z to fetch what changed since a checkpoint. See Querying Data.
sort optional
string
Comma-separated field:direction pairs, applied in order, e.g. createdAt:desc,name:asc. Direction is asc (the default) or desc. At most 5 clauses; JSON and array fields cannot be sorted on. See Querying Data.
limit optional
number
Maximum number of records to return, 1–1000. Defaults to 1000; larger values are capped at 1000. See Querying Data.
offset optional
number
Number of matching records to skip before returning results. Combine with limit to page through a list, and with meta=true to learn the total. See Querying Data.
fields optional
string
Comma-separated list of fields to return, e.g. id,name,updatedAt. Other fields are left out of each record. At most 50 fields. See Querying Data.
include optional
string
Comma-separated related records to embed in each result, e.g. linkedParts,linkedParts.part. At most 4 includes, each at most 2 levels deep; only the relations this endpoint supports are accepted, anything else is a 400. See Querying Data.
meta optional
boolean
Set to true to wrap the response as { data, meta }, where meta carries total, count, offset, limit, hasMore and executionTime. Without it the response is a bare array. See Querying Data.
hints optional
boolean
Set to true to add a hints array of suggested follow-up API calls to the response (aimed at AI agents). A list response is wrapped as { data, meta, hints }. See Querying Data.

Response Schema

PrintHistory[] | SearchResponse
assignmentCompletedAtrequirednullable
string
format: date-time
assignmentStartedAtrequirednullable
string
format: date-time
attemptNumberrequired
number
cameraThumbnailUrirequirednullable
string
cancelledAtrequirednullable
string
format: date-time
coloredThumbnailUrirequirednullable
string
completedLayersrequirednullable
number
createdAtrequired
string
format: date-time
endedAtrequired
string
format: date-time
errorMessagerequirednullable
string
estimatedMaterialsrequirednullable
object[]
coloroptional
string
indexrequired
number
materialTyperequired
string
usedGramsrequired
number
usedMetersrequired
number
estimatedPrintTimeSecondsrequirednullable
number
estimatedTotalWeightGramsrequirednullable
number
finalStatusrequired
enum
pendingassignedslicingslicedfinalizingwaiting-for-approvalready-for-printersending-to-printerprintingpausedcompletedfailedcancelled
fuseTelemetryUrirequirednullable
string
gatewayTelemetryUrirequirednullable
string
gcodeAnalysisSha256requirednullable
string
groupIdrequirednullable
string
idrequired
string
pattern: ^[a-z0-9]{24}$
labelrequirednullable
string
logsUrirequirednullable
string
materialMappingrequirednullable
object[]
amsIndexoptional
number
Visual AMS array index: -1 for spool, 0+ for AMS units
coloroptional
string
filamentSystemProfileIdoptionalnullable
number
filamentUserProfileIdoptionalnullable
string
pattern: ^[a-z0-9]{24}$
materialIdoptional
string
materialTypeoptional
string
nameoptional
string
skipoptional
boolean
slotoptional
number
slotIndexoptional
number
Slot within the AMS, or spool index for multiple spools
variantIdoptional
string
materialUsageIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
orderIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
orderItemIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
outcomerequired
"failed" | "completed" | "cancelled"
failedcompletedcancelled
overriddenProcessProfileIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
partBuildIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
partIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
partNamerequirednullable
string
printDurationSecondsrequirednullable
number
printerDeviceIdrequirednullable
string
printerIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
printerModelNamerequirednullable
string
printerNamerequirednullable
string
printerProviderrequirednullable
string
printerVendorNamerequirednullable
string
printingCompletedAtrequirednullable
string
format: date-time
printingStartedAtrequirednullable
string
format: date-time
printJobIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
priorityrequirednullable
number
quantityIndexrequirednullable
number
quantityTotalrequirednullable
number
queuedAtrequirednullable
string
format: date-time
skippedObjectsrequirednullable
object
excludedUsageoptional
object
Per-slot material excluded from an attempt because its object was skipped.
bySlotrequired
Record<string, number>
Construct a type with a set of properties K of type T
gramsBySlotoptional
Record<string, number>
Construct a type with a set of properties K of type T
objectIdsrequired
string[]
Skipped object ids the gcode analysis could actually attribute.
totalGramsoptional
number
totalMmrequired
number
objectsrequired
object[]
identifyIdrequired
string
namerequired
string
skippedrequired
boolean
pickImageUrioptional
string
runtimeSkipsoptional
object[]
Objects skipped at runtime (mid-print or at print start), as observed
atoptional
string
ISO timestamp when the skip was recorded
identifyIdrequired
string
Bambu label-object id (slice_info identify_id) as a decimal string
layerrequirednullable
number
Printer-reported layer when the skip was observed: material usage for the object is counted up to and including this layer. -1 means the skip was sent before printing began; null means the timing is unknown.
topImageUrioptional
string
skuIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
skuNamerequirednullable
string
slicedGcodeUrirequirednullable
string
slicerVersionrequirednullable
string
slotMaterialsrequirednullable
Record<string, any>
Construct a type with a set of properties K of type T
storeIdrequired
string
pattern: ^[a-z0-9]{24}$
taskIdrequirednullable
number
thumbnailUrirequirednullable
string
timelapseUrirequirednullable
string
totalLayersrequirednullable
number
totalUsedrequirednullable
number
totalUsedGramsrequirednullable
number
updatedAtrequired
string
format: date-time
usedBySlotrequirednullable
Record<string, number>
Construct a type with a set of properties K of type T
usedGramsBySlotrequirednullable
Record<string, number>
Construct a type with a set of properties K of type T
Variant 2SearchResponseStandardized search response with data, metadata, and query information
datarequired
Record<string, any>[]
Array of matching entities
metarequired
object
Pagination and result metadata
countrequired
number
Number of records returned in this response
executionTimerequired
number
Query execution time in milliseconds
hasMorerequired
boolean
Whether there are more records available
limitrequired
number
Maximum number of records requested
offsetrequired
number
Number of records skipped
totalrequired
number
Total number of matching records (before pagination)

Example Response

200 OK — application/json
[
  {
    "printJobId": "string",
    "attemptNumber": 1,
    "taskId": 1,
    "finalStatus": "pending",
    "outcome": "failed",
    "partBuildId": "string",
    "partId": "string",
    "partName": "string",
    "skuId": "string",
    "skuName": "string",
    "label": "string",
    "groupId": "string",
    "orderId": "string",
    "orderItemId": "string",
    "quantityIndex": 1,
    "quantityTotal": 1,
    "printerId": "string",
    "printerDeviceId": "string",
    "printerProvider": "string",
    "printerName": "string",
    "printerModelName": "string",
    "printerVendorName": "string",
    "queuedAt": "2025-01-15T12:00:00.000Z",
    "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",
    "cancelledAt": "2025-01-15T12:00:00.000Z",
    "endedAt": "2025-01-15T12:00:00.000Z",
    "printDurationSeconds": 1,
    "errorMessage": "string",
    "materialUsageId": "string",
    "totalUsed": 1,
    "totalUsedGrams": 1,
    "usedBySlot": {},
    "usedGramsBySlot": {},
    "slotMaterials": {},
    "materialMapping": [
      {
        "slot": 1,
        "amsIndex": 1,
        "slotIndex": 1,
        "skip": true,
        "variantId": "string",
        "materialId": "string",
        "materialType": "string",
        "name": "string",
        "color": "string",
        "filamentUserProfileId": "string",
        "filamentSystemProfileId": 1
      }
    ],
    "totalLayers": 1,
    "completedLayers": 1,
    "skippedObjects": {
      "objects": [
        {
          "identifyId": "string",
          "name": "string",
          "skipped": true
        }
      ],
      "topImageUri": "string",
      "pickImageUri": "string",
      "runtimeSkips": [
        {
          "identifyId": "string",
          "layer": 1,
          "at": "string"
        }
      ],
      "excludedUsage": {
        "objectIds": [
          "string"
        ],
        "bySlot": {},
        "gramsBySlot": {},
        "totalMm": 1,
        "totalGrams": 1
      }
    },
    "estimatedPrintTimeSeconds": 1,
    "estimatedTotalWeightGrams": 1,
    "estimatedMaterials": [
      {
        "index": 1,
        "usedGrams": 1,
        "usedMeters": 1,
        "materialType": "string",
        "color": "string"
      }
    ],
    "slicerVersion": "string",
    "overriddenProcessProfileId": "string",
    "gcodeAnalysisSha256": "string",
    "slicedGcodeUri": "string",
    "thumbnailUri": "string",
    "coloredThumbnailUri": "string",
    "cameraThumbnailUri": "string",
    "timelapseUri": "string",
    "logsUri": "string",
    "gatewayTelemetryUri": "string",
    "fuseTelemetryUri": "string",
    "priority": 1,
    "id": "string",
    "storeId": "string",
    "createdAt": "2025-01-15T12:00:00.000Z",
    "updatedAt": "2025-01-15T12:00:00.000Z"
  }
]