Printago API
POST /v1/print-jobs/{id}/send-to-printer

Send job directly to a printer

Send a specific pending job directly to a chosen printer, skipping the global queue matcher. The printer does not need to be marked ready — marking ready re-runs queue matching, which is the side effect this endpoint exists to avoid. The atomic printer claim and the standard compatibility checks still apply (bypass with `force=true` at your own risk).

Requires: queue.manage

Path Parameters

id required
string
The print job ID

Request Body

Target printer and optional force flag

SendPrintJobToPrinterRequest
bypassStaggeredStartoptional
boolean
When true, dispatch even if the printer's Staggered Start group is at capacity. This is an explicit, audited operator override (action B) — it still claims a hold and consumes a slot; it only overrides the block. Leave false to get a predictable "Held by staggered start" 409 when the group is full.
forceoptional
boolean
When true, bypass the printer-job match check. The server still enforces the atomic "printer not currently busy" claim and the part-existence guard. Use sparingly — a forced mismatch will likely fail at slice/print time.
printerIdrequired
string
pattern: ^[a-z0-9]{24}$

Example Request

application/json
{
  "printerId": "string",
  "force": true,
  "bypassStaggeredStart": true
}

Response Schema

SendPrintJobToPrinterResponse
printJobrequired
object
assignedPrinterIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
assignmentCompletedAtrequirednullable
string
format: date-time
assignmentStartedAtrequirednullable
string
format: date-time
attemptNumberrequired
number
1-based counter of print attempts (bumped on requeue once the attempt printed or reached a terminal state). Keys per-attempt media/telemetry objects and aligns with `print_history.attemptNumber`.
boundingBoxrequirednullable
object
{x,y,z} mm bounding box of what this job prints. Null until computed.
xrequired
number
yrequired
number
zrequired
number
buildThumbnailUrirequirednullable
string

A URL to a recolored thumbnail that reflects any material customizations applied to the print job. Populated after material assignments are made, giving a more accurate preview of the expected output colors.

cameraThumbnailUrirequirednullable
string
Camera-captured snapshot from the moment Fuse detected the last layer of the print. Persisted to the files bucket. Null unless Fuse successfully captured and uploaded.
cancelledAtrequirednullable
string
format: date-time
coloredThumbnailUrirequirednullable
string

A URL to a thumbnail recolored to match the specific filament loaded in the assigned printer. Populated once the print job is assigned to a printer, and cleared if the job is unassigned.

createdAtrequired
string
format: date-time
createdByActorIdrequirednullable
string
Who queued this job — see the column comments on `print_jobs`.
createdByLabelrequirednullable
string
createdByTyperequirednullable
string
customMetadataoptionalnullable
Record<string, any>
Construct a type with a set of properties K of type T
errorMessagerequirednullable
string
extensionsoptionalnullable
object
3mfoptional
object
gcodeFilerequired
string
plateIdrequired
number
mergedPlateoptional
object
Present on merged-plate parent jobs (see MergedPlateExtension).
bedSizeoptional
object
{x,y,z} mm build volume of the target plate.
childJobIdsoptional
string[]
Committed layout mirrored onto the parent row so the web app can render a live silhouette thumbnail from durable data. The authoritative copy lives on the synthetic build's MergedPlateExtension, but success-status builds are archived out of client caches — the parent job row lives exactly as long as the queue entry. Absent on parents created before the stamp shipped (clients fall back to the server-authored layout SVG).
filamentColoursoptional
string[]
The plate's filament colours, indexed by slot (gaps null), mirrored for the same reason as `layout`: a merged parent has no part to read them from, so this is what lets the queue report every filament the plate demands instead of only the first. Absent on single-color plates, which carry exactly one assignment and already render correctly.
footprintsoptional
Record<string, object>
Construct a type with a set of properties K of type T
layoutoptional
object[]
processOverridesoptional
Record<string, string>
Construct a type with a set of properties K of type T
slicerVersionIdoptional
string
SlicerVersion.id the plate optimizer chose for this merged plate (from the store's slicer-compatibility policy). Honored at dispatch so the plate slices with that version instead of the store default. Absent = store slicer.
serialsoptional
object[]
Serials embedded in what this job prints, stamped at job creation. A merged-plate parent aggregates its children's serials so the queue row that is actually shown carries the full list.
parameterNamerequired
string
sequenceIdrequired
string
pattern: ^[a-z0-9]{24}$
sequenceNamerequired
string
serialrequired
string
targetoptional
object
The physical item a serial was allocated for, recorded so queue and history views can explain which item received which number. A plate-aware share-mode stamp carries only the plate (the value applies to every matching occurrence there); an increment-mode stamp pins the exact object instance in the 3MF's stable `(object_id, instance_id)` identity.
valuerequired
number
filesToPrintrequired
string[]
fuseTelemetryUrirequirednullable
string
Fuse flight-recorder artifact for the current attempt (gzipped JSONL under the permanent `telemetry/` prefix). Confirmed asynchronously by Fuse after the print ends, like `timelapseUri`.
gcodeAnalysisSha256requirednullable
string
SHA256 hash of analyzed gcode content — stable key for extrusion lookup
groupIdrequirednullable
string
Group identifier for visually-collapsed print-queue rows. Assigned at emission (one per plate cluster within a build). Split mints fresh groupIds for non-first buckets. May be null for legacy rows that predate the grouping feature.
pattern: ^[a-z0-9]{24}$
hiddenrequired
boolean
idrequired
string
pattern: ^[a-z0-9]{24}$
isGcodeCachedrequired
boolean
labelrequired
string
linkedPartIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
logsUrirequirednullable
string
materialAssignmentsrequirednullable
Record<string, object[]>
Construct a type with a set of properties K of type T
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
orderIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
orderItemIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
overriddenProcessProfileIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
parameterOverridesrequired
object[]
namerequired
string
typerequired
"number" | "string" | "boolean" | "file"
numberstringbooleanfile
valueoptional
number | string | boolean
parentJobIdrequirednullable
string
Set on jobs merged onto a shared plate; points at the merged (parent) job. Children mirror the parent's status and are excluded from independent matching.
pattern: ^[a-z0-9]{24}$
partBuildIdrequired
string
pattern: ^[a-z0-9]{24}$
partIdrequirednullable
string
pattern: ^[a-z0-9]{24}$
partNamerequired
string
printingCompletedAtrequirednullable
string
format: date-time
printingStartedAtrequirednullable
string
format: date-time
priorityrequired
100 | 1000
1001000
profileUrisrequirednullable
string[]
quantityIndexrequired
number
quantityTotalrequired
number
queueOrderrequired
number
min: 0
requiredPrinterTagsrequired
object
filament.typeoptional
string
printer.idoptional
string
printer.modelNameoptional
string
printer.nozzleDiameteroptional
string
printer.provideroptional
string
user.tagsoptional
string
sendFailureCountrequired
number
Consecutive send-give-up cycles (EnsureJobStarted exhausted its retries without the printer starting). Reset on retry from a terminal state.
skipObjectIdsoptionalnullable
string[]
User-selected objects to skip on this job's plate, as identifyId strings (resolved at queue time from the part's plate object list). When the print starts, a Bambu `skip_objects` command is auto-sent for these. Null/empty means print everything. Stored as strings; converted to integer obj_list at send time.
skipObjectsDataoptionalnullable
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}$
skuInstancerequirednullable
number
skuNamerequirednullable
string
slicedGcodeUrirequirednullable
string
slicerInputHashrequirednullable
string
statusrequired
enum
pendingassignedslicingslicedfinalizingwaiting-for-approvalready-for-printersending-to-printerprintingpausedcompletedfailedcancelled
storeIdrequired
string
pattern: ^[a-z0-9]{24}$
taskIdrequired
number
thumbnailUrirequirednullable
string

A URL to the part's original thumbnail image, carried over from the part at the time the print job was created.

timelapseUrirequirednullable
string
MP4 timelapse Fuse encoded from frames captured during the print and uploaded to the snapshots bucket under the `timelapses/` prefix. Null unless the store has timelapses enabled and Fuse uploaded successfully.
updatedAtrequired
string
format: date-time

Example Response

201 OK — application/json
{
  "printJob": {
    "partBuildId": "string",
    "quantityIndex": 1,
    "quantityTotal": 1,
    "thumbnailUri": "string",
    "coloredThumbnailUri": "string",
    "buildThumbnailUri": "string",
    "cameraThumbnailUri": "string",
    "timelapseUri": "string",
    "fuseTelemetryUri": "string",
    "attemptNumber": 1,
    "sendFailureCount": 1,
    "filesToPrint": [
      "string"
    ],
    "slicerInputHash": "string",
    "isGcodeCached": true,
    "slicedGcodeUri": "string",
    "partId": "string",
    "partName": "string",
    "createdByActorId": "string",
    "createdByType": "string",
    "createdByLabel": "string",
    "skuId": "string",
    "skuName": "string",
    "parameterOverrides": [
      {
        "name": "string",
        "type": "number",
        "value": 1
      }
    ],
    "orderId": "string",
    "label": "string",
    "orderItemId": "string",
    "linkedPartId": "string",
    "skuInstance": 1,
    "queueOrder": 0,
    "priority": 100,
    "requiredPrinterTags": {
      "printer.provider": "string",
      "printer.id": "string",
      "printer.nozzleDiameter": "string",
      "printer.modelName": "string",
      "filament.type": "string",
      "user.tags": "string"
    },
    "overriddenProcessProfileId": "string",
    "taskId": 1,
    "profileUris": [
      "string"
    ],
    "assignedPrinterId": "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",
    "cancelledAt": "2025-01-15T12:00:00.000Z",
    "status": "pending",
    "errorMessage": "string",
    "hidden": true,
    "logsUri": "string",
    "extensions": {
      "3mf": {
        "plateId": 1,
        "gcodeFile": "string"
      },
      "mergedPlate": {
        "processOverrides": {},
        "slicerVersionId": "string",
        "childJobIds": [
          "string"
        ],
        "layout": [
          {
            "jobId": "string",
            "x": 1,
            "y": 1,
            "rotationDeg": 0
          }
        ],
        "bedSize": {
          "x": 1,
          "y": 1,
          "z": 1
        },
        "footprints": {},
        "filamentColours": [
          "string"
        ]
      },
      "serials": [
        {
          "sequenceId": "string",
          "sequenceName": "string",
          "parameterName": "string",
          "value": 1,
          "serial": "string",
          "target": {
            "plateId": 1,
            "objectId": "string",
            "instanceId": 1,
            "identifyId": "string"
          }
        }
      ]
    },
    "skipObjectsData": {
      "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
      }
    },
    "skipObjectIds": [
      "string"
    ],
    "materialMapping": [
      {
        "slot": 1,
        "amsIndex": 1,
        "slotIndex": 1,
        "skip": true,
        "variantId": "string",
        "materialId": "string",
        "materialType": "string",
        "name": "string",
        "color": "string",
        "filamentUserProfileId": "string",
        "filamentSystemProfileId": 1
      }
    ],
    "materialAssignments": {},
    "gcodeAnalysisSha256": "string",
    "groupId": "string",
    "parentJobId": "string",
    "boundingBox": {
      "x": 1,
      "y": 1,
      "z": 1
    },
    "customMetadata": {},
    "id": "string",
    "storeId": "string",
    "createdAt": "2025-01-15T12:00:00.000Z",
    "updatedAt": "2025-01-15T12:00:00.000Z"
  }
}