Webhooks
Receive real-time notifications at your own HTTPS endpoint. Every event is signed with HMAC-SHA256 using the secret you copied when creating the webhook.
Event types
inspection.createdinspection.finalizedinspection.sentinspection.pe_sealedobservation.createdobservation.updatedreport.generatedreport.signedreport.deliveredreviewer.rejectedreviewer.approvedfinal_report.finalizedfinal_report.fileduser.inviteduser.joined
Envelope
{
"id": "c36b6e1f-...",
"type": "inspection.sent",
"created_at": "2026-04-22T14:02:11.091Z",
"data": {
"inspection_id": "...",
"project_name": "...",
"firm_name": "...",
"report_id": "..."
}
}Signature verification (Node)
import crypto from "crypto"
const expected = crypto
.createHmac("sha256", process.env.IV_WEBHOOK_SECRET)
.update(rawBody)
.digest("hex")
if (expected !== req.headers["x-inspectionvoice-signature"]) {
return res.status(401).end()
}Signature verification (Python)
import hmac, hashlib
expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(expected, signature):
abort(401)Retries
Delivery uses exponential backoff up to 5 attempts: 1 min → 5 min → 25 min → 2 hr → 12 hr. After 20 consecutive failed deliveries the webhook is automatically disabled and the admin is notified.