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.
| Event | data contains | Sent when |
|---|---|---|
job.queued | job | A job was created (REST, dashboard, reprint) or went back to the queue. |
job.printed | job | The agent reports that the printer accepted the whole job. |
job.failed | job | The job failed for good: a non-retryable error, the last attempt, or its TTL passed. |
job.cancelled | job | The job was cancelled before it printed. |
printer.online | printer | A printer is back online. |
printer.offline | printer | A printer stopped answering. |
printer.paper_out | printer | A printer reports no paper. |
printer.error | printer | A printer reports an open cover or another error. |
device.online | device | An agent connected to the cloud. |
device.offline | device | An agent missed its heartbeats and is considered offline. |
device.activated | device | A new device was activated with an activation code. |
alert.opened | alert | An alert rule with the webhook channel fired (device or printer offline, paper out, failure rate). |
alert.resolved | alert | The condition of an open alert ended. |
webhook.test | Sent 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.