API · Endpoints

Webhooks

Subscribe to events at the org level. Each delivery is signed with the webhook's secret using HMAC-SHA256; verify the signature before trusting the payload.

Generated from src/lib/api-paths/webhooks.ts. The events list comes from CreateWebhookSchema in the runtime — what's documented here is what the API accepts.

get/api/orgs/{slug}/webhooks

List org webhooks

Every webhook configured for the org. Secrets are returned as a preview only.

Auth: Bearer token (API key or OAuth access token).

Path parameters

NameTypeRequiredDescription
slugstringyes

Responses

StatusBodyDescription
200objectWebhook list.

post/api/orgs/{slug}/webhooks

Create a webhook

Register a webhook subscription. The full signing secret is returned exactly once in the response — store it before the response is closed.

Auth: Bearer token (API key or OAuth access token).

Path parameters

NameTypeRequiredDescription
slugstringyes

Request body

FieldTypeRequiredDescription
urlstring (uri)yes
events"row.created" | "row.updated" | "row.deleted" | "row.sealed" | "comment.added" | "comment.deleted" | "member.invited" | "member.joined" | "member.removed" | "member.role_changed" | "workspace.created" | "workspace.renamed" | "workspace.columns_updated" | "workspace.visibility_changed" | "workspace.archived" | "doc.created" | "doc.updated" | "doc.heading_added" | "doc.mention_added"[]no

Responses

StatusBodyDescription
200objectCreated.
400ErrorURL failed SSRF guard (loopback, private range, cloud metadata).

patch/api/orgs/{slug}/webhooks/{id}

Toggle webhook active state

Enable or disable a webhook without deleting it. Body: `{ active: boolean }`.

Auth: Bearer token (API key or OAuth access token).

Path parameters

NameTypeRequiredDescription
slugstringyes
idstringyes

Request body

FieldTypeRequiredDescription
activebooleanyes

Responses

StatusBodyDescription
200objectUpdated.
404ErrorNot found.

delete/api/orgs/{slug}/webhooks/{id}

Delete a webhook

Removes the subscription. In-flight deliveries are cancelled.

Auth: Bearer token (API key or OAuth access token).

Path parameters

NameTypeRequiredDescription
slugstringyes
idstringyes

Responses

StatusBodyDescription
200objectDeleted.
404ErrorNot found.

get/api/orgs/{slug}/webhooks/{id}/deliveries

List recent webhook deliveries

Up to 50 most recent delivery attempts for one webhook, newest first. Use to debug failed integrations or watch retry status.

Auth: Bearer token (API key or OAuth access token).

Path parameters

NameTypeRequiredDescription
slugstringyes
idstringyes

Responses

StatusBodyDescription
200objectDelivery list.
404ErrorWebhook not found.

post/api/orgs/{slug}/webhooks/{id}/rotate-secret

Rotate webhook signing secret

Generate a fresh signing secret. Returned exactly once. Subsequent deliveries are signed with the new secret only — update your receiver before the next event lands.

Auth: Bearer token (API key or OAuth access token).

Path parameters

NameTypeRequiredDescription
slugstringyes
idstringyes

Responses

StatusBodyDescription
200objectRotated.
404ErrorNot found.

Events

Pass any subset on events at create time. Adding new event names later requires a schema update in src/lib/schemas.ts + Settings UI; the runtime rejects unknown names.

EventWhen it fires
row.createdA new row is appended.
row.updatedAny cell on a row is changed. Includes the diff.
row.deletedA row is deleted.
row.sealedA row is sealed (writes locked).
comment.addedA comment is created on any anchor type.
comment.deletedA comment is deleted.
member.invitedAn invite is created (workspace or org).
member.joinedAn invitee accepts and a membership row is created.
member.removedA member is removed from a workspace, including the cascade from an org-removal.
member.role_changedA member's role changes (workspace or org).
workspace.createdA workspace is created.
workspace.renamedA workspace's name (or slug) changes.
workspace.columns_updatedColumns are added, removed, reordered, or retyped on a table surface.
workspace.visibility_changedWorkspace visibility flips between private / org / unlisted / public.
workspace.archivedA workspace is archived (soft-delete).
doc.createdA workspace is created in doc mode.
doc.updatedA doc body is replaced or appended-to.
doc.heading_addedA new heading is written in a doc body. Useful for outline-aware downstream pipelines.
doc.mention_addedA new @mention or [[cross-ref]] appears in a doc body.

Signing

Every delivery includes a Dock-Signature header of the form t=<ts>,v1=<hex>. Compute HMAC_SHA256(secret, ts + "." + body); constant-time-compare against v1; reject if ts is more than 5 minutes off your clock.