Printago API
GET
/v1/print-jobs/{id}/telemetry
Get print job telemetry
Get normalized telemetry for one attempt of a print job: temperature and progress samples, layer markers, printer events (errors, state changes, AI failure alerts), timelapse frames and filament usage. Defaults to the latest attempt.
Path Parameters
id
required
string
The print job ID
Query Parameters
attempt
optional
number
Attempt number to render; defaults to the latest attempt.
source
optional
"fuse" | "auto" | "gateway"
Which telemetry series to render; defaults to `auto`.
Response Schema
TelemetryResponse
attemptrequired
object
attemptNumberrequired
number
completedLayersrequirednullable
number
durationSecondsrequirednullable
number
Measured wall-clock print time (start → finish).
endedAtrequirednullable
number
errorMessagerequirednullable
string
estimatedDurationSecondsrequirednullable
number
Slicer's predicted print time, for a measured-vs-estimate comparison.
finalStatusrequirednullable
string
outcomerequirednullable
string
startedAtrequirednullable
number
Epoch milliseconds.
taskIdrequirednullable
number
totalLayersrequirednullable
number
availablerequired
object
Which artifacts exist for this attempt, so the UI can offer a toggle.
fuserequired
boolean
gatewayrequired
boolean
eventsrequired
object[]
aiAlertoptional
object
Present on AI failure alerts: what the timeline shows on hover.
actionrequirednullable
"notify" | "stop" | "pause"
notifystoppause
eventIdrequired
string
`printer_events.id` of the alert, which is also the feedback key.
imageUrlrequirednullable
string
Signed URL of the frame that tripped the detector, when it was uploaded.
scorerequirednullable
number
coderequirednullable
string
Extracted salient code (HMS/print-error hex, new state, …) when present.
messagerequired
string
Human-readable one-line summary for the timeline/tooltip.
severityrequired
"error" | "info" | "warning"
errorinfowarning
trequired
number
Epoch milliseconds.
typerequired
string
Raw `printer-events.*` type string.
framesrequired
object[]
Timelapse frames for this attempt, oldest first. Empty unless the attempt
has a Fuse recording (the gateway series carries no frames) and timelapse
capture was on.
idxrequired
number
Zero-based index of the frame within the timelapse.
layerrequirednullable
number
Layer being printed when the frame was captured, when known.
trequired
number
Epoch milliseconds when the frame was captured.
videoSecondsrequired
number
Playback position of the frame in the encoded MP4.
jobIdrequired
string
layerMarkersrequired
object[]
layerrequired
number
trequired
number
Epoch milliseconds.
materialsrequired
object[]
Filament used per slot/color for the attempt.
colorHexrequirednullable
string
Hex (may include alpha or be a `;`-joined gradient); null → unknown.
materialIdrequirednullable
string
materialNamerequirednullable
string
materialTyperequirednullable
string
serialrequirednullable
string
Serial of the physical roll this slot held, null when it had none.
serialSourcerequirednullable
"tag" | "manual" | "integration"
tagmanualintegration
slotLabelrequired
string
Human slot label, e.g. "AMS A Slot 2" or "Ext. Spool".
stockDrawrequirednullable
object
The ledger row a slot's usage drew from: the variant's bulk or a roll.
adjustmentIdrequired
string
consumedGramsrequired
number
What the slot used. Larger than `-deltaGrams` when stock ran short.
deltaGramsrequired
number
What came off, as the ledger records it: negative, or 0 on empty stock.
instanceIdrequirednullable
string
The roll drawn; null on bulk, and without the spool-tracking add-on.
labelCoderequirednullable
string
serialrequirednullable
string
The roll's serial and label code when the print drew it, for naming it.
Null wherever `instanceId` is.
sourcerequired
"bulk" | "roll"
Whether the slot drew the variant's bulk or a tracked roll.
bulkroll
variantIdrequired
string
usedGramsrequirednullable
number
usedMmrequirednullable
number
Millimetres extruded, shown when a grams conversion wasn't available.
variantIdrequirednullable
string
Ids so the client can render names the same way the rest of the app does.
samplesrequired
object[]
errorrequirednullable
number
Printer-reported print-error code (0/absent = none).
fansrequired
Record<string, number>
Construct a type with a set of properties K of type T
layerrequirednullable
number
percentrequirednullable
number
staterequirednullable
string
trequired
number
Epoch milliseconds.
tempsrequired
object
bedoptional
object
crequirednullable
number
Current temperature in °C, or null when the printer didn't report one.
tgtrequirednullable
number
Target temperature in °C, or null when unset.
chamberoptional
object
crequirednullable
number
Current temperature in °C, or null when the printer didn't report one.
tgtrequirednullable
number
Target temperature in °C, or null when unset.
nozzleoptional
object
crequirednullable
number
Current temperature in °C, or null when the printer didn't report one.
tgtrequirednullable
number
Target temperature in °C, or null when unset.
timeRemainingrequirednullable
number
totalLayersrequirednullable
number
skippedObjectsrequired
object[]
Objects skipped during this job (with the layer they were skipped at).
identifyIdrequired
string
layerrequirednullable
number
Printer layer at skip; null = excluded before printing, -1 also = up front.
namerequirednullable
string
sourcerequirednullable
"fuse" | "gateway"
Source actually rendered; null when no telemetry artifact exists yet.
fusegateway
totalUsedGramsrequirednullable
number
Example Response
200 OK — application/json
{
"jobId": "string",
"source": "fuse",
"available": {
"gateway": true,
"fuse": true
},
"attempt": {
"attemptNumber": 1,
"taskId": 1,
"startedAt": 1,
"endedAt": 1,
"durationSeconds": 1,
"estimatedDurationSeconds": 1,
"totalLayers": 1,
"completedLayers": 1,
"finalStatus": "string",
"outcome": "string",
"errorMessage": "string"
},
"samples": [
{
"t": 1,
"layer": 1,
"totalLayers": 1,
"percent": 1,
"timeRemaining": 1,
"state": "string",
"error": 1,
"temps": {
"nozzle": {
"c": 1,
"tgt": 1
},
"bed": {
"c": 1,
"tgt": 1
},
"chamber": {
"c": 1,
"tgt": 1
}
},
"fans": {}
}
],
"layerMarkers": [
{
"layer": 1,
"t": 1
}
],
"frames": [
{
"t": 1,
"idx": 1,
"videoSeconds": 1,
"layer": 1
}
],
"events": [
{
"t": 1,
"type": "string",
"code": "string",
"severity": "error",
"message": "string",
"aiAlert": {
"eventId": "string",
"imageUrl": "string",
"score": 1,
"action": "notify"
}
}
],
"materials": [
{
"slotLabel": "string",
"materialName": "string",
"materialType": "string",
"variantId": "string",
"materialId": "string",
"colorHex": "string",
"usedGrams": 1,
"usedMm": 1,
"serial": "string",
"serialSource": "tag",
"stockDraw": {
"adjustmentId": "string",
"variantId": "string",
"source": "bulk",
"instanceId": "string",
"serial": "string",
"labelCode": "string",
"deltaGrams": 1,
"consumedGrams": 1
}
}
],
"totalUsedGrams": 1,
"skippedObjects": [
{
"name": "string",
"identifyId": "string",
"layer": 1
}
]
}