Skip to main content

Webhook events

Every delivery is a POST with a JSON body:

{
"id": "evt_01J9…",
"type": "job.printed",
"createdAt": "2026-09-29T12:00:00.000Z",
"organizationId": "org_01J8…",
"data": { "job": { "id": "job_01J9…", "state": "printed", "metadata": { "orderId": "10492" } } }
}

Headers: JodaPrint-Signature (see Webhooks to verify it), JodaPrint-Event-Id (the same id, stable across retries: use it to ignore duplicates) and User-Agent: JodaPrint-Webhooks/1.

Eventdata containsSent when
job.queuedjobA job was created (REST, dashboard, reprint) or went back to the queue.
job.printedjobThe agent reports that the printer accepted the whole job.
job.failedjobThe job failed for good: a non-retryable error, the last attempt, or its TTL passed.
job.cancelledjobThe job was cancelled before it printed.
printer.onlineprinterA printer is back online.
printer.offlineprinterA printer stopped answering.
printer.paper_outprinterA printer reports no paper.
printer.errorprinterA printer reports an open cover or another error.
device.onlinedeviceAn agent connected to the cloud.
device.offlinedeviceAn agent missed its heartbeats and is considered offline.
device.activateddeviceA new device was activated with an activation code.
alert.openedalertAn alert rule with the webhook channel fired (device or printer offline, paper out, failure rate).
alert.resolvedalertThe condition of an open alert ended.
webhook.testSent by Send test event in the dashboard. You cannot subscribe to it.

data.job has the same fields as GET /v1/jobs/{id}, data.printer as GET /v1/printers/{id} and data.device as GET /v1/devices/{id}.

This page is generated from apps/cloud/src/modules/webhooks/signing.ts.