Supported events
Creating a subscription
secret that is shown only once:
Filtering: which alerts you receive
A subscription delivers an alert only if it matches both filters.severity_min sets the minimum severity (inclusive):
decision_types restricts delivery to alerts arising from specific decision types. Omit it (or pass an empty array) to receive alerts from every decision type. A critical-only, type-scoped subscription is the typical shape for paging on-call:
SSRF protection. The webhook URL must be HTTPS in production and its host must resolve to a publicly-routable address. URLs that resolve to private, loopback, link-local, cloud-metadata, or otherwise reserved ranges are rejected — both when you create the subscription and again at delivery time. If a legitimate endpoint is being rejected, this is operator-only allowlist configuration, never self-service — contact us.
Payload format
When an event fires, MeshQu sends aPOST request to your URL:
Request headers
Every webhook request includes these headers:Verifying signatures
Each delivery is signed with HMAC-SHA256. The signature header has the format:- Concatenate the timestamp and payload:
{timestamp}.{json_body} - Compute HMAC-SHA256 using your webhook secret.
- Compare with the signature in the header.
- Reject requests where the timestamp is more than 5 minutes old (replay protection).
Retry behaviour
If your endpoint returns a non-2xx status or times out, MeshQu retries with exponential backoff:
After the maximum attempts are exhausted, the delivery moves to a dead-letter queue and the failure reason is recorded on the delivery record.
Inspecting and replaying deliveries
Every delivery attempt is persisted, so you can monitor and debug without trawling logs. Each delivery has one of these statuses:failed or dead — for example after you fixed an outage on your side — you can force an immediate retry. This resets the attempt count and schedules delivery right away:
delivered returns 400 ALREADY_DELIVERED; retrying one still pending returns 400 STILL_PENDING.
Timeout
Your endpoint must respond within 10 seconds. Longer processing should be handled asynchronously (accept the webhook, enqueue, process later).Handling a webhook end to end
A robust handler verifies the signature against the raw body, responds fast, and processes out of band:Managing subscriptions
Best practices
- Return 200 quickly. Acknowledge receipt and process asynchronously.
- Verify signatures. Always validate
X-MeshQu-Signaturebefore trusting the payload. - Handle duplicates. Use
X-MeshQu-Delivery-Idto deduplicate if your handler is not idempotent. - Monitor delivery stats. Check the
/deliveries/statsendpoint periodically to catch failures early.