Docs
Webhooks & API

Event Types

The complete catalog of webhook events you can subscribe to, grouped by resource, which ones actually fire, and example payloads.

These are every event key defined in the platform's event catalog and selectable when creating a webhook. Every delivery uses the standard payload envelope; the per-event fields below appear inside data.object.

Not every event listed here is actually dispatched yet. Events marked Reserved are defined and selectable in the webhook-creation checkboxes, but no code path triggers them today — subscribing won't error, you'll simply never receive a delivery for them. Only Live events are guaranteed to fire.


Forms

EventStatusFired when
form.submission.createdLiveA form is successfully submitted.
form.submission.status_changedReservedWould fire when a submission's status changes (e.g. marked spam or archived) — no such status-change flow dispatches it today.
{
  "id": "evt_e798e4f1-6712-4f38-a15d-8be167cdfa77",
  "event": "form.submission.created",
  "created": "2026-06-06T12:00:00.000Z",
  "apiVersion": "2026-05-01",
  "workspaceId": "ws_abc123",
  "siteId": "site_xyz456",
  "data": {
    "object": {
      "id": "sub_9f2",
      "formId": "form_77",
      "workspaceId": "ws_abc123",
      "siteId": "site_xyz456",
      "pageId": "page_5",
      "data": {
        "full_name": "Jane Doe",
        "email": "[email protected]",
        "message": "Hello!"
      },
      "status": "NEW",
      "ipAddress": "203.0.113.10",
      "userAgent": "Mozilla/5.0...",
      "referrer": "https://google.com",
      "submittedAt": "2026-06-06T12:00:00.000Z"
    }
  }
}

Sites

EventStatusFired when
site.createdLiveA new site is created.
site.updatedLiveSite configuration changes.
site.deletedLiveA site is deleted.
site.publishedReservedWould fire when a page on the site is published — the real publish flow doesn't dispatch it today.
{
  "id": "evt_d6a8a4f1-8172-4d38-b15d-9be267cdfa11",
  "event": "site.updated",
  "created": "2026-06-06T12:00:00.000Z",
  "apiVersion": "2026-05-01",
  "workspaceId": "ws_abc123",
  "siteId": "site_xyz456",
  "data": {
    "object": {
      "id": "site_xyz456",
      "name": "Acme Marketing",
      "slug": "acme-marketing",
      "workspaceId": "ws_abc123",
      "subdomain": "acme",
      "customDomain": "www.acme.com",
      "domainStatus": "active",
      "createdAt": "2026-06-06T10:00:00.000Z",
      "updatedAt": "2026-06-06T12:00:00.000Z"
    }
  }
}

This is a representative subset — the real site.created/site.updated payload carries many more fields (domains, theme, SEO settings, AI profile, and more). site.deleted uses a much smaller shape instead: just id, name, and workspaceId.


Blog

EventStatusFired when
blog.post.createdLiveA blog post draft is created.
blog.post.updatedLiveA post is modified.
blog.post.publishedLiveA post is published.
blog.post.deletedLiveA post is deleted.
{
  "id": "evt_c498e4f1-9872-4f38-a15d-0be167cdfa88",
  "event": "blog.post.published",
  "created": "2026-06-06T12:00:00.000Z",
  "apiVersion": "2026-05-01",
  "workspaceId": "ws_abc123",
  "siteId": "site_xyz456",
  "data": {
    "object": {
      "postId": "post_789",
      "siteId": "site_xyz456",
      "title": "Welcome to the New Era",
      "slug": "welcome-to-the-new-era",
      "publishedAt": "2026-06-06T12:00:00.000Z"
    }
  }
}

Field-naming inconsistency: blog.post.published keys the post as postId, while blog.post.created, blog.post.updated, and blog.post.deleted all key it as id instead. Handle both if you're consuming all four events.


CMS Collections

EventStatusFired when
collection.item.createdLiveA collection item is created.
collection.item.updatedLiveA collection item is updated.
collection.item.deletedLiveA collection item is deleted.
{
  "id": "evt_b398e4f1-1272-4f38-a15d-1be167cdfa99",
  "event": "collection.item.created",
  "created": "2026-06-06T12:00:00.000Z",
  "apiVersion": "2026-05-01",
  "workspaceId": "ws_abc123",
  "siteId": "site_xyz456",
  "data": {
    "object": {
      "id": "item_foo",
      "collectionId": "col_bar",
      "siteId": "site_xyz456",
      "data": {
        "name": "Jane Doe",
        "role": "Software Engineer"
      },
      "collectionName": "Team Members",
      "collectionSlug": "team-members",
      "createdAt": "2026-06-06T12:00:00.000Z",
      "updatedAt": "2026-06-06T12:00:00.000Z"
    }
  }
}

collection.item.deleted omits data, createdAt, and updatedAt — it only carries id, collectionId, siteId, collectionName, and collectionSlug.


Domains

The webhook-creation checklist groups these under Domains.

EventStatusFired when
domain.verifiedReservedWould fire when a custom domain passes DNS verification — not dispatched by any code path today.
domain.failedReservedWould fire when a custom domain fails verification — likewise not dispatched today.

No example payload — since neither event is ever dispatched, there's no real payload shape to show. Subscribing to either is a no-op today.


Billing

EventStatusFired when
subscription.updatedReservedWould fire when a workspace subscription changes plan or limits — not dispatched today.
subscription.cancelledReservedWould fire when a subscription is cancelled — not dispatched today.

Both billing events are Reserved — neither is dispatched by any code path today. If you need to track subscription state externally, poll GET /workspaces/:workspaceId instead. See Subscription Management for the lifecycle these would have reflected.


Members

The webhook-creation checklist groups these under Members.

EventStatusFired when
member.invitedReservedWould fire when a new workspace member is invited — not dispatched today.
member.joinedReservedWould fire when a pending member accepts their invitation — not dispatched today.

No example payload — since neither event is ever dispatched, there's no real payload shape to show. Subscribing to either is a no-op today.


  • Webhooks — Set up endpoints, verify signatures, and handle retries.
  • API Reference — Create and manage webhook subscriptions via REST.
  • API Overview — Base URL, formats, errors, and rate limits.