Skip to main content

Webhooks

O.D.I.N. sends HTTP POST webhooks when alerts are dispatched. Webhooks support Discord, Slack, and any generic HTTP endpoint. System-level webhooks apply to all events; per-organization webhooks scope delivery to events from that organization's printers.


Overview

Webhooks deliver alert payloads in real time as events occur — print completions, failures, spool low alerts, AI detections, and more. Webhook URLs are Fernet-encrypted at rest in the database.


System-Level Webhooks

Configure global webhooks under Settings → Notifications → Webhooks (admin only).

Multiple webhooks can be configured. Each webhook has:

  • Name — descriptive label
  • URL — delivery endpoint (Fernet-encrypted at rest)
  • Typediscord, slack, or generic
  • Alert Types — which events trigger this webhook (leave empty for all)
  • Enabled toggle

Per-Organization Webhooks

Organizations (Enterprise license) can have their own webhook. Only events from that organization's printers trigger the org-level webhook.

Configure under Settings → Access → [Org Name] → Settings → Webhook URL.


Webhook Event Types

All 14 alert types can trigger webhooks:

Event TypeTrigger
print_completeA print job finished successfully
print_failedA print job failed
printer_errorA printer entered an error state (HMS errors, etc.)
spool_lowA spool's weight dropped below its low-stock threshold
maintenance_overdueA scheduled maintenance task is past due
job_submittedA job was submitted (pending approval)
job_approvedAn operator approved a submitted job
job_rejectedAn operator rejected a submitted job
spaghetti_detectedVigil AI detected spaghetti
first_layer_issueVigil AI detected a first layer defect
detachment_detectedVigil AI detected print detachment
bed_cooledBed temperature dropped below the configured threshold
queue_skippedA queued job was skipped (printer incompatibility, etc.)
queue_failed_startA queued job failed to start

Payload Formats

Generic JSON Payload

{
"type": "print_complete",
"severity": "info",
"title": "Print Complete: Benchy (X1C)",
"message": "Job #142 completed on X1C after 1h 23m.",
"printer_id": 3,
"printer_name": "X1C",
"timestamp": 1740480000.0
}

Discord Embed Payload

For webhooks of type discord, O.D.I.N. sends the payload as a Discord embed:

{
"embeds": [{
"title": "Print Complete: Benchy (X1C)",
"description": "Job #142 completed on X1C after 1h 23m.",
"color": 65280,
"footer": {"text": "O.D.I.N. Alert"},
"timestamp": "2026-02-25T14:00:00Z"
}]
}

Color codes: green (65280) for success events, red (16711680) for failures, orange (16753920) for warnings.

Slack Block Kit Payload

For webhooks of type slack, O.D.I.N. sends a Slack Block Kit message:

{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*Print Complete: Benchy (X1C)*\nJob #142 completed on X1C after 1h 23m."
}
}
]
}

Quiet Hours Behavior

When quiet hours are active (system-level or per-org), webhook delivery is suppressed. Alerts are still saved to the database during quiet hours. After the quiet period ends, a digest is generated summarizing suppressed alerts.


Use Generic Webhooks with Zapier or n8n

The generic webhook type works with any HTTP POST endpoint. Connect O.D.I.N. to Zapier, n8n, Make (Integromat), or any workflow automation tool to build custom workflows triggered by print events — send to SMS, create Trello cards, update spreadsheets, or notify on PagerDuty.


See Also