Webhooks
Receive real-time notifications when risk thresholds trip, anomalies surface, or changes are detected.
Event Types
| Event | Description | Schema |
|---|---|---|
risk.threshold_exceeded | A risk score crossed the configured threshold. | Payload → |
anomaly.detected | A new anomaly was detected in a subscribed AOI. | Payload → |
change.detected | A change event was detected within an AOI. | Payload → |
usage.threshold.80 | Your quota reached 80% for the current billing period. | Payload → |
usage.threshold.90 | Your quota reached 90% for the current billing period. | Payload → |
Payload Schema
{
"id": "evt_abc123",
"type": "risk.threshold_exceeded",
"created_at": "2026-07-08T12:00:00Z",
"data": {
"aoi_id": "aoi_42",
"peril": "flood",
"risk_score": 0.81,
"threshold": 0.75,
"confidence": 0.94,
"model_version": "flood-v2.3.1"
}
}Retry Logic
Failed deliveries (non-2xx response or timeout after 10 s) are retried up to 3 times with exponential backoff: 30 s, 5 min, 30 min. After the final retry, the event is written to your dead-letter queue and can be replayed from the developer portal.
Signature Verification
Every request carries an X-EOSYN-Signature header — HMAC SHA-256 of the raw request body signed with your webhook secret.
import crypto from "crypto";
export function verifySignature(rawBody, signatureHeader, secret) {
const expected = crypto
.createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
const sig = Buffer.from(signatureHeader, "hex");
const exp = Buffer.from(expected, "hex");
return sig.length === exp.length && crypto.timingSafeEqual(sig, exp);
}Managing Webhooks
Create, edit, and delete webhooks from the customer portal or programmatically viaPOST /v1/webhooks. Rotate the signing secret any time — the previous secret remains valid for 24 h.