Настройка webhook
В Настройки → Интеграции → Разработчикам → Уведомления о заказах можно добавить сразу несколько каналов одновременно — например, Home Assistant и Discord вместе. У каждого канала свой формат тела запроса:
- 3D Print Pricing / HA — общий JSON с HMAC-подписью, см. раздел ниже.
- Discord / Slack — их родной формат incoming webhook (без подписи — весь секрет уже зашит в самом URL, который выдаёт Discord/Slack).
Добавьте канал, вставьте URL приёмника, включите — 3D Print Pricing покажет секрет один раз (только у формата «3D Print Pricing / HA»), скопируйте его сразу. Кнопка «Отправить тестовое событие» у каждого канала шлёт синтетическое событие webhook.test прямо сейчас, не дожидаясь реального заказа.
События order.created / order.status_changed
3D Print Pricing отправляет POST с JSON-телом на ваш URL при создании заказа и при каждой смене workflow_status. Доставка — best-effort (без повторных попыток при ошибке в MVP), поэтому не полагайтесь только на webhook — для сверки используйте GET /print-jobs.
POST <ваш URL>
Content-Type: application/json
X-3DP-Event: order.status_changed
X-3DP-Signature: sha256=<hex-подпись тела запроса>
{
"event": "order.status_changed",
"occurred_at": "2026-08-27T18:32:10.000Z",
"data": {
"id": "b6b6c8b0-...",
"model_name": "Кронштейн",
"quantity_pieces": 4,
"material_name": "PETG",
"color_hex": "#000000",
"material_grams": 86.0,
"print_hours": 3.5,
"due_date": "2026-09-01",
"order_notes": "",
"workflow_status": "assigned",
"printer_id": null,
"printer_name": null
}
}Проверка подписи (псевдокод)
signature_header = "sha256=" + hex(HMAC_SHA256(webhook_secret, raw_request_body))
if signature_header != request.headers["X-3DP-Signature"]:
reject() # тело подделано или секрет не совпадаетДругие события (по подписке)
Каждый канал выбирает нужные события (чекбоксы в карточке канала или массив events в API). Существующие каналы по-прежнему получают только order.created и order.status_changed; события ниже — по подписке. Конверт и HMAC-подпись у всех событий одинаковые.
printer.print_finished/printer.print_failed— принтер закончил печать / сообщил об ошибке во время печатиfilament.low_stock— остаток катушки дошёл до порога (задаётся в карточке филамента)lead.created— новая заявка с профиля в каталоге мастеровinvoice.paid— счёт оплачен онлайн (needs_review — повторная оплата или по устаревшей сумме)
// printer.print_finished / printer.print_failed
{ "event": "printer.print_finished", "occurred_at": "2026-10-01T12:00:00+00:00",
"data": { "printer_id": "9d1c...", "printer_name": "Bambu P1S", "filename": "bracket.3mf", "at": "2026-10-01T12:00:00+00:00" } }
// filament.low_stock
{ "event": "filament.low_stock", "occurred_at": "...",
"data": { "filament_id": "5a2e...", "name": "PETG black", "remaining_grams": 180.0, "threshold_grams": 200.0 } }
// lead.created
{ "event": "lead.created", "occurred_at": "...",
"data": { "lead_id": "c0f4...", "description": "Need 20 brackets", "contact": "@client", "client_email": "client@example.com",
"budget": "up to 3000", "deadline": "next week", "has_file": true, "created_at": "..." } }
// invoice.paid
{ "event": "invoice.paid", "occurred_at": "...",
"data": { "document_id": "7b3a...", "number": "INV-12", "amount": 4500.0, "paid_at": "...",
"order_ids": ["b6b6c8b0-..."], "needs_review": false } }API: POST /webhook-subscriptions и PUT /webhook-subscriptions/{id} принимают "events": ["order.created", "printer.print_finished", ...] (минимум одно; неизвестные имена — 422).
Управление подписками через API
То же самое, что карточка Настройки → Интеграции → Разработчикам, но программно — например, чтобы n8n/скрипт сам завёл канал при первом запуске, не заходя в веб-интерфейс. Максимум 10 каналов на аккаунт.
/webhook-subscriptionsСписок подписок
Все каналы аккаунта (без секретов — они отдаются только один раз, при создании/пересоздании).
/webhook-subscriptionsСоздать подписку
Секрет (для формата «3D Print Pricing / HA») вернётся в ответе один раз — сохраните его сразу.
/webhook-subscriptions/{id}/testОтправить тестовое событие
Шлёт синтетическое событие webhook.test на URL уже существующей подписки — реальные заказы не трогает.
/webhook-subscriptions/{id}/deliveriesИстория доставок
Последние 20 попыток отправки по этой подписке (статус, ошибка, время).
/webhook-subscriptions/{id}Удалить подписку
Использует то же id подписки, что и поля выше.