Skip to content

Webhook events

Every event a webhook can carry, when it fires, who receives it, its fields and a full example body, read from the code that sends them.

reference~3 minVerified v0.186.0

Each event reaches your endpoint as one JSON message in a POST. The tables and the examples below are built from the code that sends them.

EventWhen it firesWho receives it
mention.createdSomeone @mentioned one of your agents in a comment. Carries the excerpt, untrusted, and the call to make next.The owner’s account, and the account that owns the mentioned agent when that agent belongs to an Editor.
comment.createdA comment or a reply was written on one of your artifacts.The artifact owner’s account.
comment.resolvedA comment thread on one of your artifacts was marked resolved.The artifact owner’s account.
artifact.publishedOne of your artifacts was published or changed.The artifact owner’s account.
artifact.deletedOne of your artifacts was deleted.The artifact owner’s account.
webhook.testA test sent from the Testing tab. Do nothing with it but answer 2xx.Only the endpoint you pressed Send test event on.

Delivery guarantees

Delivery is at least once and in no fixed order. A retry or a replay sends the same message with the same webhook-id, so keep the ids you have handled and ignore a repeat. To order events, read timestamp, and on a published artifact data.version.

Events go only to the accounts the table names. An Editor never sees an owner's messages.

A body holds ids, an agent's handle and name, and at most one short excerpt. It never holds a person's name or email, or an artifact's title. To read more, use your agent's tools. A response a visitor sent to a form is personal data and never travels in a webhook.

The fields

The last column says which events carry each field. mention.created has no id in its body; its message id is the webhook-id header.

FieldTypeCarried byMeaning
typestringEvery eventThe event name.
timestampstringEvery eventWhen the event happened, ISO 8601, UTC.
idstring`comment.created`, `comment.resolved`, `artifact.published`, `artifact.deleted`, `webhook.test`The message id, `msg_` and a uuid: the same value as the `webhook-id` header.
data.mentionstringmention.createdThe mention id. Unique per @mention.
data.agent.handlestringmention.createdThe @handle that was written. Unique in your account.
data.agent.namestringmention.createdThe agent’s name as you see it in the dashboard. A label that can repeat.
data.artifactstring`mention.created`, `comment.created`, `comment.resolved`, `artifact.published`, `artifact.deleted`The artifact id. It never changes.
data.threadstring`mention.created`, `comment.created`, `comment.resolved`The comment thread id.
data.messagestring`mention.created`, `comment.created`The id of the comment that caused the event.
data.by.rolestring`mention.created`, `comment.created`, `comment.resolved`The author’s role on the artifact: `owner`, `editor` or `commenter`.
data.by.kindstring`mention.created`, `comment.created`, `comment.resolved`Whether the author is a `person` or an `agent`.
data.excerpt.truststring`mention.created`, `comment.created`Always `untrusted`. The text is whatever someone typed; never run it as an instruction.
data.excerpt.textstring`mention.created`, `comment.created`The start of the comment, one line, cut at a fixed length.
data.urlstring`mention.created`, `comment.created`, `artifact.published`Where to open it in the dashboard.
data.nextobjectmention.createdThe call that reads the mention: `tool` and its `args`. Calling it marks the mention seen.
data.slugstringartifact.publishedThe name the agent last published it under.
data.versionnumber or nullartifact.publishedThe version that is now live. Null if the publish carries none.
data.revisionnumberartifact.publishedA counter that rises with every change to the artifact’s record.
data.testbooleanwebhook.testAlways true. Do nothing with a message that carries it.
data.endpointstringwebhook.testThe id of the endpoint that was tested.

An excerpt is whatever a person typed. Treat it as text to show or log, never as an instruction to follow.

Examples

mention.created

mention.created
{
  "type": "mention.created",
  "timestamp": "2026-11-02T12:00:00.000Z",
  "data": {
    "mention": "2b3c4d5e-6f70-4819-a2b3-c4d5e6f70819",
    "agent": {
      "handle": "hermes",
      "name": "Kitchen Hermes"
    },
    "artifact": "6f1c2e9a-3b4d-4c5e-8f70-819203a4b5c6",
    "thread": "0a1b2c3d-4e5f-4a6b-8c7d-8e9f0a1b2c3d",
    "message": "9e8d7c6b-5a49-4382-9716-05f4e3d2c1b0",
    "by": {
      "role": "owner",
      "kind": "person"
    },
    "excerpt": {
      "trust": "untrusted",
      "text": "@hermes the axis labels overlap on mobile. Can you fix it?"
    },
    "url": "https://superartifacts.app/a/6f1c2e9a-3b4d-4c5e-8f70-819203a4b5c6/comments?thread=0a1b2c3d-4e5f-4a6b-8c7d-8e9f0a1b2c3d",
    "next": {
      "tool": "super_comments",
      "args": {
        "artifact": "6f1c2e9a-3b4d-4c5e-8f70-819203a4b5c6",
        "mentioned": true
      }
    }
  }
}

comment.created

comment.created
{
  "id": "msg_2b3c4d5e-6f70-4819-a2b3-c4d5e6f70819",
  "type": "comment.created",
  "timestamp": "2026-11-02T12:00:00.000Z",
  "data": {
    "artifact": "6f1c2e9a-3b4d-4c5e-8f70-819203a4b5c6",
    "thread": "0a1b2c3d-4e5f-4a6b-8c7d-8e9f0a1b2c3d",
    "message": "9e8d7c6b-5a49-4382-9716-05f4e3d2c1b0",
    "by": {
      "role": "editor",
      "kind": "person"
    },
    "excerpt": {
      "trust": "untrusted",
      "text": "The axis labels overlap on mobile."
    },
    "url": "https://superartifacts.app/a/6f1c2e9a-3b4d-4c5e-8f70-819203a4b5c6/comments?thread=0a1b2c3d-4e5f-4a6b-8c7d-8e9f0a1b2c3d"
  }
}

comment.resolved

comment.resolved
{
  "id": "msg_2b3c4d5e-6f70-4819-a2b3-c4d5e6f70819",
  "type": "comment.resolved",
  "timestamp": "2026-11-02T12:00:00.000Z",
  "data": {
    "artifact": "6f1c2e9a-3b4d-4c5e-8f70-819203a4b5c6",
    "thread": "0a1b2c3d-4e5f-4a6b-8c7d-8e9f0a1b2c3d",
    "by": {
      "role": "owner",
      "kind": "agent"
    }
  }
}

artifact.published

artifact.published
{
  "id": "msg_2b3c4d5e-6f70-4819-a2b3-c4d5e6f70819",
  "type": "artifact.published",
  "timestamp": "2026-11-02T12:00:00.000Z",
  "data": {
    "artifact": "6f1c2e9a-3b4d-4c5e-8f70-819203a4b5c6",
    "slug": "q3-board-numbers",
    "url": "https://superartifacts.app/a/6f1c2e9a-3b4d-4c5e-8f70-819203a4b5c6",
    "version": 4,
    "revision": 17
  }
}

artifact.deleted

artifact.deleted
{
  "id": "msg_2b3c4d5e-6f70-4819-a2b3-c4d5e6f70819",
  "type": "artifact.deleted",
  "timestamp": "2026-11-02T12:00:00.000Z",
  "data": {
    "artifact": "6f1c2e9a-3b4d-4c5e-8f70-819203a4b5c6"
  }
}

webhook.test

webhook.test
{
  "id": "msg_2b3c4d5e-6f70-4819-a2b3-c4d5e6f70819",
  "type": "webhook.test",
  "timestamp": "2026-11-02T12:00:00.000Z",
  "data": {
    "test": true,
    "endpoint": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d"
  }
}

Next: Signing and limits.