Skip to content
Try the API

Send events to webhooks

Register an HTTPS endpoint that Elastio calls when an alert fires, check that deliveries succeed, and stand up a small receiver that authenticates and stores incoming events.

  • Use a token with the integrations category: read to list webhooks and deliveries, write to create, update or delete them. See Automate personal access tokens.
  • A webhook on its own sends nothing. Events reach it when an alert lists the webhook in its channels.webhooks. See Configure alerts.
  • Webhook names must be unique per tenant.

Give the webhook a name and an endpoint URL, and choose how Elastio authenticates to your endpoint with authentication.type:

type Fields you send
none Nothing else
basic_auth username, password
bearer_token token
api_key key (the key name, for example X-API-Key), value
custom_headers custom_headers, an object of header name → value
POST
/gateway/integration/v1/webhooksCreate a new webhook
Try it
Terminal window
curl -X POST "https://acme.app.elastio.com/gateway/integration/v1/webhooks" \
-H "Authorization: Bearer $ELASTIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "SOAR intake",
"description": "Forwards Elastio alerts to the SOAR platform",
"endpoint": "https://hooks.example.com/elastio",
"authentication": {
"type": "custom_headers",
"custom_headers": { "X-Hook-Secret": "'"$HOOK_SECRET"'" }
}
}'

The response is 201, with the webhook wrapped in data. Sensitive values (password, token, value) are write-only and never returned:

{
"status": 201,
"data": {
"id": "660e8400-e29b-41d4-a716-446655440000",
"name": "SOAR intake",
"description": "Forwards Elastio alerts to the SOAR platform",
"endpoint": "https://hooks.example.com/elastio",
"status": "active",
"authentication": { "type": "custom_headers" },
"created_at": "2026-10-12T09:30:00Z"
}
}

The list uses cursor pagination: pageSize (1–100, default 50) and pageToken from the previous response’s pagination.next_page_token. Each webhook includes used_in_alert_rules, success_rate and last_triggered_at.

GET
/gateway/integration/v1/webhooksList all webhooks for a tenant
Try it
Terminal window
curl "https://acme.app.elastio.com/gateway/integration/v1/webhooks?pageSize=50" \
-H "Authorization: Bearer $ELASTIO_TOKEN"
{
"webhooks": [
{
"id": "660e8400-e29b-41d4-a716-446655440000",
"name": "SOAR intake",
"endpoint": "https://hooks.example.com/elastio",
"status": "active",
"authentication": { "type": "custom_headers" },
"used_in_alert_rules": 3,
"success_rate": 98.5,
"last_triggered_at": "2026-10-12T10:28:00Z",
"created_at": "2026-10-12T09:30:00Z",
"updated_at": "2026-10-12T09:30:00Z"
}
],
"pagination": { "next_page_token": null, "prev_page_token": null, "total_count": 1 }
}

PUT is a partial update: send only the fields to change. Set status to inactive to pause a webhook, or send a new authentication object to rotate its secret.

PUT
/gateway/integration/v1/webhooks/{webhook_id}Update a webhook
Try it
Terminal window
curl -X PUT "https://acme.app.elastio.com/gateway/integration/v1/webhooks/660e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer $ELASTIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"authentication": {
"type": "custom_headers",
"custom_headers": { "X-Hook-Secret": "'"$NEW_HOOK_SECRET"'" }
}
}'

Check whether events are reaching your endpoint. The per-webhook deliveries list accepts period (for example 24h, 7d, 30d; default 7d), status (all, delivered, failed, in_progress, scheduled, retryable), and the same pageSize/pageToken pagination. Each delivery includes the event payload that was sent and a reason when it failed.

GET
/gateway/integration/v1/webhooks/{webhook_id}/deliveriesGet delivery history for a specific webhook
Try it
Terminal window
curl "https://acme.app.elastio.com/gateway/integration/v1/webhooks/660e8400-e29b-41d4-a716-446655440000/deliveries?period=24h&status=failed" \
-H "Authorization: Bearer $ELASTIO_TOKEN"
{
"deliveries": [
{
"id": "1f2e3d4c-5b6a-4798-8a9b-0c1d2e3f4a5b",
"webhook_id": "660e8400-e29b-41d4-a716-446655440000",
"webhook_name": "SOAR intake",
"event_type": "…",
"status": "failed",
"event": { … },
"reason": "…",
"created_at": "2026-10-12T10:28:00Z",
"updated_at": "2026-10-12T10:28:05Z"
}
],
"pagination": { "next_page_token": null, "prev_page_token": null, "total_count": 1 }
}

Related views:

  • GET /gateway/integration/v1/webhooks/deliveries: deliveries across all webhooks, filterable by name as well as period and status.
  • GET /gateway/integration/v1/webhooks/{webhook_id}/invocations: invocation history including http_status_code, response_time_ms, request_payload and response_body, useful for debugging your endpoint’s replies.
  • GET /gateway/integration/v1/webhooks/statistics: tenant-wide totals (total_webhooks, active_webhooks, successful_deliveries, failed_deliveries, …) for a period.

Your receiver needs to do three things: check the credential you configured in authentication, read the JSON body, and reply with a 2xx quickly. Do heavy processing asynchronously.

What the spec does and doesn’t define:

  • Authentication. Elastio authenticates to your endpoint with the credential you set on the webhook (basic auth, bearer token, API key or custom headers). The spec doesn’t define a payload signature or signing secret, so this credential plus HTTPS is the verification mechanism.
  • Payload. The event body is a JSON object, but the spec doesn’t publish its field-level schema. Each delivery record exposes the exact body sent as event (and request_payload on invocations), alongside the event_type. Inspect real deliveries before you depend on specific fields, and parse defensively.

The minimal receivers below check the X-Hook-Secret custom header from the example above, store each body as one JSON line, and reply 204. Put them behind a TLS-terminating proxy or load balancer so Elastio reaches them over HTTPS.

Terminal window
# Simulate a delivery against your local receiver
curl -i -X POST "http://localhost:8080/elastio" \
-H "Content-Type: application/json" \
-H "X-Hook-Secret: $HOOK_SECRET" \
-d '{"example": true}'
# Expect: HTTP/1.0 204 No Content (401 with a wrong or missing secret)
  1. Run the receiver and expose it at the HTTPS URL you registered as endpoint.
  2. Attach the webhook to an alert’s channels.webhooks (Configure alerts).
  3. After the alert fires, compare the stored body with the delivery’s event field from the deliveries list to confirm nothing was lost.