POSTDelivered by Asetavo when the rule fires · HTTPS only · no redirects · short timeout, up to 3 attempts
POST https://erp.northfield.example/hooks/asetavo
Content-Type: application/json
X-Asetavo-Event: asset_manager.alert
X-Asetavo-Signature: 3b9e0f…c41d (hex HMAC-SHA256 of the raw body)
{ "alert_id": 311, "rule_id": 4,
"rule_name": "Forklifts stay inside Dallas DC",
"condition": "left_zone", "type": "left_zone",
"asset_id": 118, "asset_tag": "NF-00118",
"reader_id": 3, "zone_id": 2, "event_id": 90211,
"direction": "out",
"observed_at": "2026-09-28 14:02:11",
"fired_at": "2026-09-28 14:02:12" }NodeVerify the signature before you trust the payload
import crypto from 'node:crypto';
app.post('/hooks/asetavo', express.raw({ type: 'application/json' }), (req, res) => {
const expected = crypto.createHmac('sha256', process.env.ASETAVO_WEBHOOK_SECRET)
.update(req.body).digest('hex'); // raw bytes, not re-serialised JSON
const given = String(req.get('X-Asetavo-Signature') || '');
const ok = given.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected));
if (!ok) return res.sendStatus(401);
queue.push(JSON.parse(req.body)); // respond fast, process later
res.sendStatus(204);
});