Skip to content
All docs
API reference5 min read

Webhooks

Receive real-time events from Ion in your own backend.

Configuring webhooks

Go to Workspace settings → Webhooks → Add endpoint. Enter your URL and select which events you want to receive.

Event types

  • automation.run — an automation finished running (success or failure).
  • automation.failed — an automation failed and couldn't recover.
  • integration.connected — a new integration was connected.
  • integration.disconnected — an integration was disconnected (manually or due to auth failure).
  • member.invited — a new member was invited to the workspace.
  • member.joined — an invited member accepted.

Payload format

{
  "id": "evt_abc123",
  "type": "automation.run",
  "created_at": "2026-08-01T10:30:00Z",
  "data": {
    "automation_id": "aut_xyz",
    "automation_name": "PR merged notification",
    "status": "success",
    "duration_ms": 1240
  }
}

Verifying signatures

Every webhook is signed with your endpoint's signing secret. Verify the X-Ion-Signature header:

import crypto from "crypto";

function verifySignature(payload: string, signature: string, secret: string) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(payload)
    .digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signature)
  );
}

Retries

If your endpoint returns a non-2xx response, we retry with exponential backoff: 1min, 5min, 30min, 2hr, 6hr. After 5 failed attempts, the webhook is disabled and you'll get an email.