Payload
Every call is a POST with Content-Type: application/json:
{
"schemaVersion": 1,
"deliveryId": "5b0c8d4e-…",
"webhookId": "9f1e2c3a-…",
"projectId": "3f1c2d4e-…",
"createdAt": "2026-09-23T10:15:00+00:00",
"customData": { "board": 42 },
"changes": [
{
"type": "item.created", "eventId": "…", "timestamp": "2026-09-23T10:14:58Z", "actorId": "u-1",
"itemId": "…", "itemType": "Chart", "parentId": "…"
},
{ "type": "item.updated", "eventId": "…", "timestamp": "…", "actorId": "u-1", "itemId": "…" },
{ "type": "item.deleted", "eventId": "…", "timestamp": "…", "actorId": "u-1", "itemId": "…" },
{ "type": "user.added", "eventId": "…", "timestamp": "…", "actorId": "u-2", "userId": "u-7", "role": "Contributor" },
{
"type": "user.roleChanged", "eventId": "…", "timestamp": "…", "actorId": "u-2",
"userId": "u-7", "role": "Manager", "previousRole": "Contributor"
},
{
"type": "user.removed", "eventId": "…", "timestamp": "…", "actorId": "u-2",
"userId": "u-7", "previousRole": "Manager"
}
]
}
| Field | Description |
|---|---|
schemaVersion | Increases only on breaking changes. New fields can appear at any time; ignore unknown fields. |
deliveryId | Identifies the delivered changes: unchanged when the call is retried or the same changes are delivered again. Also sent as the Webhook-Id header. |
webhookId, projectId | Check that both match the webhook you registered. |
createdAt | When the delivery was created. |
customData | Your customData, unchanged. Omitted if you did not set any. |
changes | Up to 500 changes, in the order they happened. |
changes[].type | One of the event types. |
changes[].eventId | The change's event. Together with type and itemId or userId it identifies a change. |
changes[].timestamp | When the change happened (UTC). |
changes[].actorId | The user who made the change. |
itemId | The changed item (item.*). |
itemType | Chart, Presentation, PresentationStep, PresentationSubStep, CommentThread, CommentPost, Resource, Voting, … (only on item.created). |
parentId | The item the new item was created in (only on item.created). |
userId | The member the change is about (user.*). |
role, previousRole | Viewer, Contributor, Manager or Admin. |
Users are identified by id only. Look up names through the API if you need them.
The test endpoint sends a single change { "type": "ping" }.