Webhooks

Subscribe HTTPS endpoints to shop events. Deliveries use Standard Webhooks signing. Manage endpoints via the REST API or Settings → API / Agent.

Event types

  • call.completed
  • job.created
  • job.booked
  • emergency.triggered
  • usage.low
  • webhook_endpoint.disabled

Payload shape

Each delivery POSTs a JSON body:

{
  "id": "evt_…",
  "type": "call.completed",
  "created_at": "2026-10-15T12:00:00.000Z",
  "api_version": "2026-10-15",
  "shop_id": "shp_…",
  "data": { … event-specific payload … }
}

Event-specific data:

  • call.completed — { object: CallSummary }
  • job.created / job.booked — { object: Job }
  • emergency.triggered — { call_id: "call_…" }
  • usage.low — { credit_balance: number }
  • webhook_endpoint.disabled — { endpoint_id, url, reason }

Verify signatures

Headers: webhook-id, webhook-timestamp, webhook-signature. Secret format: whsec_ + base64 (shown once at create or rotate).

JAVASCRIPT
import { Webhook } from "standardwebhooks";

const wh = new Webhook(process.env.EDISON_WEBHOOK_SECRET);

export async function POST(req) {
  const body = await req.text();
  wh.verify(body, {
    "webhook-id": req.headers.get("webhook-id"),
    "webhook-timestamp": req.headers.get("webhook-timestamp"),
    "webhook-signature": req.headers.get("webhook-signature"),
  });
  const event = JSON.parse(body);
  // handle event.type / event.data
  return new Response("ok", { status: 200 });
}

Retries

Failed deliveries (non-2xx or timeout) retry with backoff: 1 min, 5 min, 30 min, 2 h, 6 h, 12 h, 24 h (seven attempts). Edison records status on each delivery row.

Auto-disable

If an endpoint fails continuously for 3 days, Edison disables it and sends email to the shop owner. You receive webhook_endpoint.disabled. Fix your URL, then re-enable via PATCH /v1/webhook-endpoints/{id} with { "enabled": true } or in Settings.

Replay

Use POST /v1/events/{id}/redeliver to queue another delivery for an existing event. List events with GET /v1/events when debugging.

Test delivery

POST /v1/webhook-endpoints/{id}/test queues a synthetic event to your receiver.