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)
- Type —
discord,slack, orgeneric - 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 Type | Trigger |
|---|---|
print_complete | A print job finished successfully |
print_failed | A print job failed |
printer_error | A printer entered an error state (HMS errors, etc.) |
spool_low | A spool's weight dropped below its low-stock threshold |
maintenance_overdue | A scheduled maintenance task is past due |
job_submitted | A job was submitted (pending approval) |
job_approved | An operator approved a submitted job |
job_rejected | An operator rejected a submitted job |
spaghetti_detected | Vigil AI detected spaghetti |
first_layer_issue | Vigil AI detected a first layer defect |
detachment_detected | Vigil AI detected print detachment |
bed_cooled | Bed temperature dropped below the configured threshold |
queue_skipped | A queued job was skipped (printer incompatibility, etc.) |
queue_failed_start | A 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.
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
- Alerts & Notifications — SMTP, browser push, ntfy, Telegram channels
- MQTT Republish — event forwarding via MQTT protocol
- Multi-Org Management — per-org webhook configuration