From 25173f90876ae1771a94a59929b9fac9a75f12f3 Mon Sep 17 00:00:00 2001 From: danciaclara Date: Fri, 29 May 2026 00:58:54 +0530 Subject: [PATCH 1/4] Webhooks V2 --- docs/dev-tools/intro-webhooks.md | 415 ++++++++++++++++++++++++------- 1 file changed, 319 insertions(+), 96 deletions(-) diff --git a/docs/dev-tools/intro-webhooks.md b/docs/dev-tools/intro-webhooks.md index e4364815..d8d015f6 100644 --- a/docs/dev-tools/intro-webhooks.md +++ b/docs/dev-tools/intro-webhooks.md @@ -6,135 +6,358 @@ keywords: plane, developer tools, integrations, extensions, webhooks, automation # Webhooks -A webhook triggers a HTTP POST request on the specified url, whenever there is a change in an event. Like a new project is created, updated or deleted then a webhook can be triggered to receive the required payload. +Webhooks give you a way to push Plane events into other systems the moment they happen. Instead of polling the Plane API periodically to check for changes, your service registers a URL and Plane calls it, with a structured payload, whenever something occurs. + +The value of webhooks over polling is immediacy and simplicity. Your endpoint receives exactly what happened without having to query anything. A work item created at 14:00:01 triggers a request at 14:00:01. + +Webhooks in Plane work at the workspace level. A single webhook can subscribe to events from every project in the workspace. There is no per-project webhook configuration. Only Workspace Owners and Admins can create or manage them. + +The current webhook system is v2. V2 payloads use dot-notation event names (e.g., `workitem.created`) and include structured fields for deduplication, diffing, and filtering that were not available in the original version. If you have webhooks created before v2, they appear in the list with a **(deprecated)** tag. They still deliver but do not receive any v2 fields. Recreate them as new webhooks to get the full v2 feature set. ## Creating a webhook -`url` You are required to provide a url in which you want the payloads to be triggered. +### What you're configuring -Then select the events for which you want the webhook to be triggered. +When you create a webhook, you're telling Plane two things: where to send events, and which events to send. -After you create the webhook, a secret key will be created automatically and will be downloaded in csv format. +**Webhook title** is a label for your own reference - it appears in the webhook list and helps you tell multiple webhooks apart. -```ini -"Content-Type": "application/json", -"User-Agent": "Autopilot", -"X-Plane-Delivery": "f819eff4-cd50-4987-bc97-e5be1e04c94f", -"X-Plane-Event": "project", -"X-Plane-Signature": "7896ae9addb1f73931132b4f3e052bf12c410b837b24898e75dcd660c7" -``` +**Payload URL** is the endpoint that Plane will POST to. It must be a publicly reachable `http://` or `https://` address. Local addresses (localhost, private IPs) are not accepted. -| Header | Description | -| ----------------- | -------------------------------------------------------------------- | -| X-Plane-Delivery | It is a randomly generated UUID for uniquely identifying the payload | -| X-Plane-Event | It describes the event for which the webhook triggered | -| X-Plane-Signature | A signature is generated based on the secret and the payload | +**Events** control what triggers this webhook. The form groups events by type - Projects, Cycles, Modules, Work items, and so on. Check the specific actions you care about. You can subscribe to as many or as few as you need. -### Webhook Payload Example for the project `update` +**Advanced configurations** lets you add a filter so the webhook only fires for work items that match specific conditions - for example, high-priority bugs in a particular project. See [Filtering work item events](#filtering-work-item-events) below. -```json -"event": "project", -"action": "update", -"webhook_id": "3c2c32ac-82df-48b3-be2a-a3e21dbe8692", -"workspace_id": "d2d97c94-a6ad-4012-b526-5577c0d7c769", -"data": { - "id":"22b6fc9c-1849-45da-b103-52a3e3a6b4c1", - "workspace_detail": { - "name":"Testing Project", - "slug":"testing-project", - "id":"bob1b192-f988-4bf9-b569-825de8cb0678" - }, - "created_at":"2023-10-25T04:38:59.566962Z", - "updated_at":"2023-10-25T06:44:48.543685Z", - "name":"vfecddcwerj", - "description":"", - "description_text":null, - "description_html":null, - "network":2, - "identifier":"TRACE", - "emoji":null, - "icon_prop":null, - "module_view":true, - "cycle_view":true, - "issue_views_view":true, - "page_view":true, - "inbox_view":true, - "cover_image":null, - "archive_in":0, - "close_in":0, - "created_by":"6bb20d1c-4960-41ca-af4f-cee01de160c4", - "updated_by":"6bb20d1c-4960-41ca-af4f-cee01de160c4", - "workspace":"bob1b192-f988-4bf9-b569-825de8cb0678", - "default_assignee":null, - "project_lead":null, - "estimate":null, - "default_state":null -}, -``` +**Secret key** is generated automatically when you save the webhook. Plane downloads it as a CSV file the moment you click **Create webhook** and then returns you to the webhook list. It is not displayed on screen - the download is the only time you receive it automatically. Save the file. You need the key to verify incoming requests. + +### How to create a webhook + +1. Go to **Workspace Settings → Webhooks**. +2. Click **Add webhook**. +3. Enter a **Webhook title** and **Payload URL**. +4. Check the events you want this webhook to fire for. +5. Optionally, expand **Advanced configurations** to add a work item filter. +6. Click **Create webhook**. + +Plane downloads the secret key as a CSV file to your computer and returns you to the webhook list. The webhook is active immediately. + +If you lose the CSV, you can re-generate the secret key from the edit form - but the old key stops working the moment you do. + +## Filtering work item events + +### How filtering works + +By default, a webhook fires for every work item event you subscribe to, across all projects in the workspace. Filters let you narrow that, for example, to fire only when a high-priority work item is created in a specific project. + +Filters apply only to work item events. Events for projects, cycles, pages, milestones, and other types are always delivered without filtering. + +Plane evaluates filters at delivery time. If the filter fails to evaluate for any reason, the delivery is skipped rather than defaulting to "deliver everything." If you're not receiving expected deliveries, check that your filter expression is valid. + +### Basic mode versus PQL mode -User can choose the things for which they want the webhook to be triggered. +The filter builder in **Advanced configurations** offers two modes you can switch between freely: -Currently Plane supports the following events for which webhook can be trigged: +- **Basic** - a visual picker. Select values from dropdowns and Plane converts your selections into a filter expression behind the scenes. +- **PQL** - direct text input. Type a PQL (Plane Query Language) expression. The expression shown is exactly what is stored and evaluated at delivery time. - - Project - - Issue - - Cycle - - Module - - Issue Comment +Switching between modes is lossless - your filter is not lost when you switch. -## Verifying Signature +### How to add a work item filter + +1. Create or edit a webhook. +2. Check at least one **Work items** event. +3. Expand **Advanced configurations**. +4. Use the filter builder to define your conditions in Basic mode, or switch to PQL mode to type an expression directly. +5. Save the webhook. + +### PQL syntax and supported fields + +| Filter field | PQL field name | Accepted values | +|---|---|---| +| Work item type | `type_id` | Work item type UUID | +| State group | `state_group` | `backlog` · `unstarted` · `started` · `completed` · `cancelled` | +| Assignees | `assignee_id` | User UUID | +| Labels | `label_id` | Label UUID | +| Projects | `project_id` | Project UUID | +| Priority | `priority` | `none` · `low` · `medium` · `high` · `urgent` | +| Start date | `start_date` | ISO date | +| Due date | `target_date` | ISO date | + +**Expression syntax** ``` +priority = "urgent" Single value +priority in ["urgent", "high"] Multiple values +state_group = "started" State group match +assignee_id = "" Specific assignee +project_id = "" Specific project +``` + +## Securing requests + +### Why Plane signs every request + +Any server on the internet can send a POST request to your endpoint. Without a way to verify the source, someone could send fake webhook payloads to your system and trigger whatever logic you've built around them. + +Plane solves this by signing every request with HMAC-SHA256 using your secret key. The signature is attached as an `X-Plane-Signature` header. Because only Plane and you know the secret, a valid signature proves the request came from Plane and was not modified in transit. + +Skipping verification means your endpoint will process any request that arrives - forged or not. + +### How to verify a webhook payload + +On your server, compute the expected signature from the **raw request body bytes** and compare it to the value in `X-Plane-Signature`. Use a constant-time comparison to prevent timing attacks. + +```python import hashlib import hmac -secret_token = os.environ.get("WEBHOOK_SECRET") +def verify_webhook(request_body_bytes: bytes, secret: str, signature_header: str) -> bool: + expected = hmac.new( + secret.encode("utf-8"), + request_body_bytes, + hashlib.sha256, + ).hexdigest() + return hmac.compare_digest(expected, signature_header) +``` -received_signature = request.headers.get('X-Plane-Signature') -received_payload = json.dumps(request.json).encode('utf-8') +Use the raw bytes from the incoming request - not a parsed or re-serialized version. JSON re-serialization can change key ordering, spacing, or escaping, which will produce a different signature and cause verification to fail. Reject any request where the signature does not match before running any other logic. -expected_signature = hmac.new(secret_token.encode('utf-8'), msg=received_payload, digestmod=hashlib.sha256).hexdigest() +### Signature header reference -if not hmac.compare_digest(expected_signature, received_signature): - raise HTTPException(status_code=403, detail="Invalid Signature provided") +| Header | Value | +|---|---| +| `X-Plane-Signature` | HMAC-SHA256 hex digest of the raw request body, keyed with your webhook secret | -``` +The secret key is formatted as `plane_wh_` followed by a random string. Plane masks it in the UI. To view the full key, open the edit form for the webhook and use the show/hide toggle in the **Secret key** section. -## How webhook works +## Managing webhooks -Your webhook consumer is a simple HTTP endpoint. It must satisfy the following conditions: +### Disabling versus deleting -- It's available in a publicly accessible non-localhost URL. -- It will respond to the Plane Webhook push (HTTP POST request) with a `HTTP 200` ("OK") response. +Disabling a webhook pauses delivery without removing any configuration. The webhook stays in the list, its event subscriptions are preserved, and you can re-enable it at any time. Events are not queued while the webhook is disabled - any event that fires during the disabled period is not delivered. Use this when your endpoint is temporarily down or you need to make changes to your receiving system. -If a delivery fails (i.e. server unavailable or responded with a non-200 HTTP status code), the push will be retried a couple of times. Here an exponential backoff delay is used: the attempt will be retried after approximately 10 minutes, then 30 minutes, and so on. +Deleting a webhook removes it permanently - configuration and delivery history are gone. There is no undo. -The webhooks are triggered for POST, PATCH, and DELETE requests. +### Edit a webhook -- For DELETE requests, the response only includes the ID of the deleted entity. +1. Go to **Workspace Settings → Webhooks**. +2. Click **···** on the webhook row and select **Edit**. +3. Update the title, URL, event subscriptions, or filter. +4. Click **Update webhook**. -```json -"action":"delete", -"data":{ - "id":"9a28bd00-ed9c-4f5d-8be9-fc05cbb1fc57" -}, -"event":"issue", -"webhook_id":"f1a2fe64-c8d4-4eed-b3ef-498690052c1d", -"workspace_id":"c467e125-59e3-44ec-b5ee-f9c1e138c611" +### Disable or enable a webhook -``` +1. Go to **Workspace Settings → Webhooks**. +2. Click **···** on the webhook row. +3. Select **Disable webhook** to stop delivery, or **Enable webhook** to resume it. + +### Delete a webhook + +1. Go to **Workspace Settings → Webhooks**. +2. Click **···** on the webhook row and select **Delete webhook**. + +### View and copy the secret key + +The secret key is not displayed during creation - Plane downloads it as a CSV instead. To access it later: + +1. Go to **Workspace Settings → Webhooks**. +2. Click **···** on the webhook row and select **Edit**. +3. In the **Secret key** section, click the eye icon to reveal the key. +4. Click the copy icon to copy it. + +### Re-generate the secret key + +Re-generate if your secret key is compromised. The old key is invalidated the moment you re-generate - update your server before completing this step or your signature verification will break. + +1. Go to **Workspace Settings → Webhooks**. +2. Click **···** on the webhook row and select **Edit**. +3. In the **Secret key** section, click **Re-generate key**. + +Plane downloads the new key as a CSV. + +## Delivery and monitoring + +### How Plane delivers events + +Plane sends webhook requests asynchronously. When an event occurs, Plane queues the delivery and sends a POST request to your endpoint. Any 2xx response is treated as a success. + +If your endpoint is unavailable or returns a server error, Plane retries using exponential backoff with a ~10-minute base and jitter. After **5 failed attempts**, Plane automatically disables the webhook and emails the webhook creator. Re-enable it from the webhook list once your endpoint is fixed. + +4xx responses are not retried. Plane treats them as a deliberate rejection from your server. + +Retry behavior is automatic. There is no way to trigger a manual retry for a failed delivery. -- However, for both POST and PATCH requests, the complete payload is sent in the response. +### How to read delivery logs + +1. Go to **Workspace Settings → Webhooks**. +2. Click on a webhook to open its detail view. + +The top of the view shows four summary stats: + +| Stat | What it shows | +|---|---| +| Total deliveries | Total number of delivery attempts | +| Successful | Deliveries that received a 2xx response | +| Failed | Deliveries that returned an error or exhausted retries | +| Success rate | Successful deliveries as a percentage of total | + +Below the summary, the delivery log lists individual attempts: + +| Column | What it shows | +|---|---| +| Events | The event type that triggered the delivery | +| Status | Successful or Failed | +| Response time | How long your endpoint took to respond, in milliseconds | +| Event time | When the delivery was sent | + +## Events and payload + +### Event reference + +| Group | Event key | Fires when | +|---|---|---| +| **Projects** | `project.created` | A project is created | +| | `project.updated` | A project is updated | +| | `project.archived` | A project is archived | +| | `project.deleted` | A project is deleted | +| **Cycles** | `cycle.created` | A cycle is created | +| | `cycle.updated` | A cycle is updated | +| | `cycle.archived` | A cycle is archived | +| | `cycle.deleted` | A cycle is deleted | +| **Modules** | `module.created` | A module is created | +| | `module.updated` | A module is updated | +| | `module.archived` | A module is archived | +| | `module.deleted` | A module is deleted | +| **Milestones** | `milestone.created` | A milestone is created | +| | `milestone.updated` | A milestone is updated | +| | `milestone.deleted` | A milestone is deleted | +| **Pages** | `page.created` | A page is created | +| | `page.updated` | A page is updated | +| | `page.archived` | A page is archived | +| | `page.deleted` | A page is deleted | +| **Page comments** | `page.comment.created` | A comment is added to a page | +| | `page.comment.updated` | A page comment is edited | +| | `page.comment.deleted` | A page comment is deleted | +| **Work items** | `workitem.created` | A work item is created | +| | `workitem.updated` | A work item is updated | +| | `workitem.archived` | A work item is archived | +| | `workitem.deleted` | A work item is deleted | +| **Work item comments** | `workitem.comment.created` | A comment is added to a work item | +| | `workitem.comment.updated` | A work item comment is edited | +| | `workitem.comment.deleted` | A work item comment is deleted | +| **Work item links** | `workitem.link.created` | A link is added to a work item | +| | `workitem.link.updated` | A work item link is updated | +| | `workitem.link.deleted` | A work item link is removed | +| **Work item votes** | `workitem.vote.created` | A vote is cast on a work item | +| | `workitem.vote.deleted` | A vote is removed | +| **Work item attachments** | `workitem.attachment.created` | A file is attached to a work item | +| | `workitem.attachment.updated` | A work item attachment is updated | +| | `workitem.attachment.deleted` | A work item attachment is removed | +| **Work item relations** | `workitem.relation.created` | A relation is added between work items | +| | `workitem.relation.deleted` | A relation is removed | +| **Work item dependencies** | `workitem.dependency.created` | A dependency is added | +| | `workitem.dependency.deleted` | A dependency is removed | +| **Work item page links** | `workitem.page_link.created` | A page link is added to a work item | +| | `workitem.page_link.deleted` | A page link is removed | + +### Request headers + +Every webhook request includes these headers: + +| Header | Value | +|---|---| +| `Content-Type` | `application/json` | +| `User-Agent` | `Autopilot` | +| `X-Plane-Delivery` | Unique UUID per delivery attempt. Matches `delivery_id` in the payload body. | +| `X-Plane-Event` | The event type, e.g. `workitem.created`. Matches `event` in the payload body. | +| `X-Plane-Signature` | HMAC-SHA256 signature of the request body | + +These headers are reserved and cannot be overridden with custom values: `host`, `content-length`, `content-type`, `user-agent`, `x-plane-delivery`, `x-plane-event`, `x-plane-signature`. + +### Payload structure + +All v2 payloads share this top-level structure: ```json -"event":"issue", -"action":"update", -"webhook_id":"f1a2fe64-c8d4-4eed-b3ef-498690052c1d", -"workspace_id":"c467e125-59e3-44ec-b5ee-f9c1e138c611", -"data":{ ... } +{ + "version": "v2", + "delivery_id": "", + "event_id": "", + "entity_id": "", + "entity_type": "", + "event": "", + "webhook_id": "", + "workspace_id": "", + "data": { }, + "previous_attributes": { } +} +``` + +| Field | Description | +|---|---| +| `version` | Always `"v2"` | +| `delivery_id` | Unique ID for this delivery attempt. Matches the `X-Plane-Delivery` header. A new UUID is generated for each retry. | +| `event_id` | Unique ID for the triggering event. Stable across retries - use this for deduplication. | +| `entity_id` | UUID of the primary entity affected by the event. | +| `entity_type` | Type of the entity, e.g. `issue`, `cycle`, `issue_comment`, `issue_link`. | +| `event` | Full dot-notation event name, e.g. `workitem.comment.updated`. | +| `webhook_id` | ID of the webhook configuration that triggered this delivery. | +| `workspace_id` | UUID of the workspace in which the event occurred. | +| `data` | Full entity object for create and update events. Empty object `{}` for delete events. | +| `previous_attributes` | Present on all events. For `updated` events, contains the previous values of changed fields. For `deleted` events, contains the full record before deletion. Empty object `{}` for all other events. | + +### Payload examples + +**workitem.comment.created** +```json +{ + "version": "v2", + "delivery_id": "01ab9316-f978-4449-bad6-dce958be8454", + "event_id": "0afa042d-92a9-4326-bdca-5ff5490dbf09", + "entity_id": "088a83b9-a53f-4dda-b2bc-c860cf455997", + "entity_type": "issue", + "event": "workitem.comment.created", + "webhook_id": "285f087b-e1e0-4f90-b9f4-0b720acfac04", + "workspace_id": "d250cd44-fa71-42c2-b2b5-3c73227288fc", + "data": { + "id": "088a83b9-a53f-4dda-b2bc-c860cf455997", + "name": "Webhook Test Work Item 2", + "comment": { + "id": "4797f841-c731-4e55-971f-d9cfe1938dfb", + "access": "INTERNAL", + "actor_id": "88fc36c8-73b0-4547-81c7-96b70f61835e", + "issue_id": "088a83b9-a53f-4dda-b2bc-c860cf455997", + "edited_at": null, + "comment_stripped": "Webhook Test Comment" + } + }, + "previous_attributes": {} +} ``` -::: info -Whenever an issue is added to the module, the corresponding issue webhook will be triggered. Similarly, any updates made to the cycle issue will also activate the issue webhook. -::: +**workitem.link.created** + +```json +{ + "version": "v2", + "delivery_id": "616d98fe-35a7-4431-a233-db40936c8339", + "event_id": "7b3c1e2a-8f94-4b12-a781-2c5e9d4f6a03", + "entity_id": "8661bdfa-098f-434d-8e44-b1f32de62406", + "entity_type": "issue_link", + "event": "workitem.link.created", + "webhook_id": "285f087b-e1e0-4f90-b9f4-0b720acfac04", + "workspace_id": "d250cd44-fa71-42c2-b2b5-3c73227288fc", + "data": { + "id": "a6f8e562-49d2-4c19-bc4b-2bcb9d917da1", + "url": "http://google.com", + "title": "", + "issue_id": "8661bdfa-098f-434d-8e44-b1f32de62406", + "created_at": "2026-05-20T09:51:27.373582+00:00", + "project_id": "45b87d89-0ce0-4d6f-8903-4070f1c67f1b", + "workspace_id": "d250cd44-fa71-42c2-b2b5-3c73227288fc", + "created_by_id": "88fc36c8-73b0-4547-81c7-96b70f61835e" + }, + "previous_attributes": {} +} +``` From cdaabbcea166ffa7e4434af909c3533f37a41995 Mon Sep 17 00:00:00 2001 From: danciaclara Date: Fri, 29 May 2026 01:00:18 +0530 Subject: [PATCH 2/4] formatting fixes --- docs/dev-tools/intro-webhooks.md | 246 +++++++++++++++---------------- 1 file changed, 123 insertions(+), 123 deletions(-) diff --git a/docs/dev-tools/intro-webhooks.md b/docs/dev-tools/intro-webhooks.md index d8d015f6..93235517 100644 --- a/docs/dev-tools/intro-webhooks.md +++ b/docs/dev-tools/intro-webhooks.md @@ -72,16 +72,16 @@ Switching between modes is lossless - your filter is not lost when you switch. ### PQL syntax and supported fields -| Filter field | PQL field name | Accepted values | -|---|---|---| -| Work item type | `type_id` | Work item type UUID | -| State group | `state_group` | `backlog` · `unstarted` · `started` · `completed` · `cancelled` | -| Assignees | `assignee_id` | User UUID | -| Labels | `label_id` | Label UUID | -| Projects | `project_id` | Project UUID | -| Priority | `priority` | `none` · `low` · `medium` · `high` · `urgent` | -| Start date | `start_date` | ISO date | -| Due date | `target_date` | ISO date | +| Filter field | PQL field name | Accepted values | +| -------------- | -------------- | --------------------------------------------------------------- | +| Work item type | `type_id` | Work item type UUID | +| State group | `state_group` | `backlog` · `unstarted` · `started` · `completed` · `cancelled` | +| Assignees | `assignee_id` | User UUID | +| Labels | `label_id` | Label UUID | +| Projects | `project_id` | Project UUID | +| Priority | `priority` | `none` · `low` · `medium` · `high` · `urgent` | +| Start date | `start_date` | ISO date | +| Due date | `target_date` | ISO date | **Expression syntax** @@ -124,8 +124,8 @@ Use the raw bytes from the incoming request - not a parsed or re-serialized vers ### Signature header reference -| Header | Value | -|---|---| +| Header | Value | +| ------------------- | ------------------------------------------------------------------------------ | | `X-Plane-Signature` | HMAC-SHA256 hex digest of the raw request body, keyed with your webhook secret | The secret key is formatted as `plane_wh_` followed by a random string. Plane masks it in the UI. To view the full key, open the edit form for the webhook and use the show/hide toggle in the **Secret key** section. @@ -194,83 +194,83 @@ Retry behavior is automatic. There is no way to trigger a manual retry for a fai The top of the view shows four summary stats: -| Stat | What it shows | -|---|---| -| Total deliveries | Total number of delivery attempts | -| Successful | Deliveries that received a 2xx response | -| Failed | Deliveries that returned an error or exhausted retries | -| Success rate | Successful deliveries as a percentage of total | +| Stat | What it shows | +| ---------------- | ------------------------------------------------------ | +| Total deliveries | Total number of delivery attempts | +| Successful | Deliveries that received a 2xx response | +| Failed | Deliveries that returned an error or exhausted retries | +| Success rate | Successful deliveries as a percentage of total | Below the summary, the delivery log lists individual attempts: -| Column | What it shows | -|---|---| -| Events | The event type that triggered the delivery | -| Status | Successful or Failed | +| Column | What it shows | +| ------------- | ------------------------------------------------------- | +| Events | The event type that triggered the delivery | +| Status | Successful or Failed | | Response time | How long your endpoint took to respond, in milliseconds | -| Event time | When the delivery was sent | +| Event time | When the delivery was sent | ## Events and payload ### Event reference -| Group | Event key | Fires when | -|---|---|---| -| **Projects** | `project.created` | A project is created | -| | `project.updated` | A project is updated | -| | `project.archived` | A project is archived | -| | `project.deleted` | A project is deleted | -| **Cycles** | `cycle.created` | A cycle is created | -| | `cycle.updated` | A cycle is updated | -| | `cycle.archived` | A cycle is archived | -| | `cycle.deleted` | A cycle is deleted | -| **Modules** | `module.created` | A module is created | -| | `module.updated` | A module is updated | -| | `module.archived` | A module is archived | -| | `module.deleted` | A module is deleted | -| **Milestones** | `milestone.created` | A milestone is created | -| | `milestone.updated` | A milestone is updated | -| | `milestone.deleted` | A milestone is deleted | -| **Pages** | `page.created` | A page is created | -| | `page.updated` | A page is updated | -| | `page.archived` | A page is archived | -| | `page.deleted` | A page is deleted | -| **Page comments** | `page.comment.created` | A comment is added to a page | -| | `page.comment.updated` | A page comment is edited | -| | `page.comment.deleted` | A page comment is deleted | -| **Work items** | `workitem.created` | A work item is created | -| | `workitem.updated` | A work item is updated | -| | `workitem.archived` | A work item is archived | -| | `workitem.deleted` | A work item is deleted | -| **Work item comments** | `workitem.comment.created` | A comment is added to a work item | -| | `workitem.comment.updated` | A work item comment is edited | -| | `workitem.comment.deleted` | A work item comment is deleted | -| **Work item links** | `workitem.link.created` | A link is added to a work item | -| | `workitem.link.updated` | A work item link is updated | -| | `workitem.link.deleted` | A work item link is removed | -| **Work item votes** | `workitem.vote.created` | A vote is cast on a work item | -| | `workitem.vote.deleted` | A vote is removed | -| **Work item attachments** | `workitem.attachment.created` | A file is attached to a work item | -| | `workitem.attachment.updated` | A work item attachment is updated | -| | `workitem.attachment.deleted` | A work item attachment is removed | -| **Work item relations** | `workitem.relation.created` | A relation is added between work items | -| | `workitem.relation.deleted` | A relation is removed | -| **Work item dependencies** | `workitem.dependency.created` | A dependency is added | -| | `workitem.dependency.deleted` | A dependency is removed | -| **Work item page links** | `workitem.page_link.created` | A page link is added to a work item | -| | `workitem.page_link.deleted` | A page link is removed | +| Group | Event key | Fires when | +| -------------------------- | ----------------------------- | -------------------------------------- | +| **Projects** | `project.created` | A project is created | +| | `project.updated` | A project is updated | +| | `project.archived` | A project is archived | +| | `project.deleted` | A project is deleted | +| **Cycles** | `cycle.created` | A cycle is created | +| | `cycle.updated` | A cycle is updated | +| | `cycle.archived` | A cycle is archived | +| | `cycle.deleted` | A cycle is deleted | +| **Modules** | `module.created` | A module is created | +| | `module.updated` | A module is updated | +| | `module.archived` | A module is archived | +| | `module.deleted` | A module is deleted | +| **Milestones** | `milestone.created` | A milestone is created | +| | `milestone.updated` | A milestone is updated | +| | `milestone.deleted` | A milestone is deleted | +| **Pages** | `page.created` | A page is created | +| | `page.updated` | A page is updated | +| | `page.archived` | A page is archived | +| | `page.deleted` | A page is deleted | +| **Page comments** | `page.comment.created` | A comment is added to a page | +| | `page.comment.updated` | A page comment is edited | +| | `page.comment.deleted` | A page comment is deleted | +| **Work items** | `workitem.created` | A work item is created | +| | `workitem.updated` | A work item is updated | +| | `workitem.archived` | A work item is archived | +| | `workitem.deleted` | A work item is deleted | +| **Work item comments** | `workitem.comment.created` | A comment is added to a work item | +| | `workitem.comment.updated` | A work item comment is edited | +| | `workitem.comment.deleted` | A work item comment is deleted | +| **Work item links** | `workitem.link.created` | A link is added to a work item | +| | `workitem.link.updated` | A work item link is updated | +| | `workitem.link.deleted` | A work item link is removed | +| **Work item votes** | `workitem.vote.created` | A vote is cast on a work item | +| | `workitem.vote.deleted` | A vote is removed | +| **Work item attachments** | `workitem.attachment.created` | A file is attached to a work item | +| | `workitem.attachment.updated` | A work item attachment is updated | +| | `workitem.attachment.deleted` | A work item attachment is removed | +| **Work item relations** | `workitem.relation.created` | A relation is added between work items | +| | `workitem.relation.deleted` | A relation is removed | +| **Work item dependencies** | `workitem.dependency.created` | A dependency is added | +| | `workitem.dependency.deleted` | A dependency is removed | +| **Work item page links** | `workitem.page_link.created` | A page link is added to a work item | +| | `workitem.page_link.deleted` | A page link is removed | ### Request headers Every webhook request includes these headers: -| Header | Value | -|---|---| -| `Content-Type` | `application/json` | -| `User-Agent` | `Autopilot` | -| `X-Plane-Delivery` | Unique UUID per delivery attempt. Matches `delivery_id` in the payload body. | -| `X-Plane-Event` | The event type, e.g. `workitem.created`. Matches `event` in the payload body. | -| `X-Plane-Signature` | HMAC-SHA256 signature of the request body | +| Header | Value | +| ------------------- | ----------------------------------------------------------------------------- | +| `Content-Type` | `application/json` | +| `User-Agent` | `Autopilot` | +| `X-Plane-Delivery` | Unique UUID per delivery attempt. Matches `delivery_id` in the payload body. | +| `X-Plane-Event` | The event type, e.g. `workitem.created`. Matches `event` in the payload body. | +| `X-Plane-Signature` | HMAC-SHA256 signature of the request body | These headers are reserved and cannot be overridden with custom values: `host`, `content-length`, `content-type`, `user-agent`, `x-plane-delivery`, `x-plane-event`, `x-plane-signature`. @@ -280,30 +280,30 @@ All v2 payloads share this top-level structure: ```json { - "version": "v2", - "delivery_id": "", - "event_id": "", - "entity_id": "", - "entity_type": "", - "event": "", - "webhook_id": "", - "workspace_id": "", - "data": { }, - "previous_attributes": { } + "version": "v2", + "delivery_id": "", + "event_id": "", + "entity_id": "", + "entity_type": "", + "event": "", + "webhook_id": "", + "workspace_id": "", + "data": {}, + "previous_attributes": {} } ``` -| Field | Description | -|---|---| -| `version` | Always `"v2"` | -| `delivery_id` | Unique ID for this delivery attempt. Matches the `X-Plane-Delivery` header. A new UUID is generated for each retry. | -| `event_id` | Unique ID for the triggering event. Stable across retries - use this for deduplication. | -| `entity_id` | UUID of the primary entity affected by the event. | -| `entity_type` | Type of the entity, e.g. `issue`, `cycle`, `issue_comment`, `issue_link`. | -| `event` | Full dot-notation event name, e.g. `workitem.comment.updated`. | -| `webhook_id` | ID of the webhook configuration that triggered this delivery. | -| `workspace_id` | UUID of the workspace in which the event occurred. | -| `data` | Full entity object for create and update events. Empty object `{}` for delete events. | +| Field | Description | +| --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `version` | Always `"v2"` | +| `delivery_id` | Unique ID for this delivery attempt. Matches the `X-Plane-Delivery` header. A new UUID is generated for each retry. | +| `event_id` | Unique ID for the triggering event. Stable across retries - use this for deduplication. | +| `entity_id` | UUID of the primary entity affected by the event. | +| `entity_type` | Type of the entity, e.g. `issue`, `cycle`, `issue_comment`, `issue_link`. | +| `event` | Full dot-notation event name, e.g. `workitem.comment.updated`. | +| `webhook_id` | ID of the webhook configuration that triggered this delivery. | +| `workspace_id` | UUID of the workspace in which the event occurred. | +| `data` | Full entity object for create and update events. Empty object `{}` for delete events. | | `previous_attributes` | Present on all events. For `updated` events, contains the previous values of changed fields. For `deleted` events, contains the full record before deletion. Empty object `{}` for all other events. | ### Payload examples @@ -312,23 +312,23 @@ All v2 payloads share this top-level structure: ```json { - "version": "v2", - "delivery_id": "01ab9316-f978-4449-bad6-dce958be8454", - "event_id": "0afa042d-92a9-4326-bdca-5ff5490dbf09", - "entity_id": "088a83b9-a53f-4dda-b2bc-c860cf455997", - "entity_type": "issue", - "event": "workitem.comment.created", - "webhook_id": "285f087b-e1e0-4f90-b9f4-0b720acfac04", + "version": "v2", + "delivery_id": "01ab9316-f978-4449-bad6-dce958be8454", + "event_id": "0afa042d-92a9-4326-bdca-5ff5490dbf09", + "entity_id": "088a83b9-a53f-4dda-b2bc-c860cf455997", + "entity_type": "issue", + "event": "workitem.comment.created", + "webhook_id": "285f087b-e1e0-4f90-b9f4-0b720acfac04", "workspace_id": "d250cd44-fa71-42c2-b2b5-3c73227288fc", "data": { - "id": "088a83b9-a53f-4dda-b2bc-c860cf455997", + "id": "088a83b9-a53f-4dda-b2bc-c860cf455997", "name": "Webhook Test Work Item 2", "comment": { - "id": "4797f841-c731-4e55-971f-d9cfe1938dfb", - "access": "INTERNAL", - "actor_id": "88fc36c8-73b0-4547-81c7-96b70f61835e", - "issue_id": "088a83b9-a53f-4dda-b2bc-c860cf455997", - "edited_at": null, + "id": "4797f841-c731-4e55-971f-d9cfe1938dfb", + "access": "INTERNAL", + "actor_id": "88fc36c8-73b0-4547-81c7-96b70f61835e", + "issue_id": "088a83b9-a53f-4dda-b2bc-c860cf455997", + "edited_at": null, "comment_stripped": "Webhook Test Comment" } }, @@ -340,22 +340,22 @@ All v2 payloads share this top-level structure: ```json { - "version": "v2", - "delivery_id": "616d98fe-35a7-4431-a233-db40936c8339", - "event_id": "7b3c1e2a-8f94-4b12-a781-2c5e9d4f6a03", - "entity_id": "8661bdfa-098f-434d-8e44-b1f32de62406", - "entity_type": "issue_link", - "event": "workitem.link.created", - "webhook_id": "285f087b-e1e0-4f90-b9f4-0b720acfac04", + "version": "v2", + "delivery_id": "616d98fe-35a7-4431-a233-db40936c8339", + "event_id": "7b3c1e2a-8f94-4b12-a781-2c5e9d4f6a03", + "entity_id": "8661bdfa-098f-434d-8e44-b1f32de62406", + "entity_type": "issue_link", + "event": "workitem.link.created", + "webhook_id": "285f087b-e1e0-4f90-b9f4-0b720acfac04", "workspace_id": "d250cd44-fa71-42c2-b2b5-3c73227288fc", "data": { - "id": "a6f8e562-49d2-4c19-bc4b-2bcb9d917da1", - "url": "http://google.com", - "title": "", - "issue_id": "8661bdfa-098f-434d-8e44-b1f32de62406", - "created_at": "2026-05-20T09:51:27.373582+00:00", - "project_id": "45b87d89-0ce0-4d6f-8903-4070f1c67f1b", - "workspace_id": "d250cd44-fa71-42c2-b2b5-3c73227288fc", + "id": "a6f8e562-49d2-4c19-bc4b-2bcb9d917da1", + "url": "http://google.com", + "title": "", + "issue_id": "8661bdfa-098f-434d-8e44-b1f32de62406", + "created_at": "2026-05-20T09:51:27.373582+00:00", + "project_id": "45b87d89-0ce0-4d6f-8903-4070f1c67f1b", + "workspace_id": "d250cd44-fa71-42c2-b2b5-3c73227288fc", "created_by_id": "88fc36c8-73b0-4547-81c7-96b70f61835e" }, "previous_attributes": {} From e01aaa08bb17832045a7deba84ce1db105dd595d Mon Sep 17 00:00:00 2001 From: danciaclara Date: Thu, 4 Jun 2026 15:23:47 +0530 Subject: [PATCH 3/4] review fixes --- docs/dev-tools/intro-webhooks.md | 161 ++++++++++++------ .../images/webhooks/create-webhook.webp | Bin 0 -> 65122 bytes 2 files changed, 112 insertions(+), 49 deletions(-) create mode 100644 docs/public/images/webhooks/create-webhook.webp diff --git a/docs/dev-tools/intro-webhooks.md b/docs/dev-tools/intro-webhooks.md index 93235517..c2a518d1 100644 --- a/docs/dev-tools/intro-webhooks.md +++ b/docs/dev-tools/intro-webhooks.md @@ -14,21 +14,22 @@ Webhooks in Plane work at the workspace level. A single webhook can subscribe to The current webhook system is v2. V2 payloads use dot-notation event names (e.g., `workitem.created`) and include structured fields for deduplication, diffing, and filtering that were not available in the original version. If you have webhooks created before v2, they appear in the list with a **(deprecated)** tag. They still deliver but do not receive any v2 fields. Recreate them as new webhooks to get the full v2 feature set. -## Creating a webhook - -### What you're configuring - -When you create a webhook, you're telling Plane two things: where to send events, and which events to send. - -**Webhook title** is a label for your own reference - it appears in the webhook list and helps you tell multiple webhooks apart. +:::warning Migrate your v1 webhooks to v2 +V1 webhooks are deprecated. They continue to deliver but will not receive v2 payload features — including `delivery_id` and `event_id` for deduplication, `previous_attributes` for diffs on updated events, and dot-notation event names. There is no in-place upgrade. To move to v2, recreate each v1 webhook as a new webhook and update your server to handle the v2 payload structure. -**Payload URL** is the endpoint that Plane will POST to. It must be a publicly reachable `http://` or `https://` address. Local addresses (localhost, private IPs) are not accepted. +**To migrate a v1 webhook:** -**Events** control what triggers this webhook. The form groups events by type - Projects, Cycles, Modules, Work items, and so on. Check the specific actions you care about. You can subscribe to as many or as few as you need. +1. Open the v1 webhook (marked **deprecated**) and note its URL and event subscriptions. +2. Create a new webhook with the same URL and event subscriptions. See [How to create a webhook](#how-to-create-a-webhook). +3. Save the new secret key from the CSV download — your server will need it to verify v2 requests. +4. Update your server to expect the v2 payload structure. See [Payload structure](#payload-structure) for the full field reference. +5. Test that deliveries are arriving and your server is handling them correctly. +6. Delete the original v1 webhook once you're confident the new one is working. +::: -**Advanced configurations** lets you add a filter so the webhook only fires for work items that match specific conditions - for example, high-priority bugs in a particular project. See [Filtering work item events](#filtering-work-item-events) below. +## Creating a webhook -**Secret key** is generated automatically when you save the webhook. Plane downloads it as a CSV file the moment you click **Create webhook** and then returns you to the webhook list. It is not displayed on screen - the download is the only time you receive it automatically. Save the file. You need the key to verify incoming requests. +![Plane architecture](/images/webhooks/create-webhook.webp#hero) ### How to create a webhook @@ -43,6 +44,20 @@ Plane downloads the secret key as a CSV file to your computer and returns you to If you lose the CSV, you can re-generate the secret key from the edit form - but the old key stops working the moment you do. +### What you're configuring + +When you create a webhook, you're telling Plane two things: where to send events, and which events to send. + +- **Webhook title** is a label for your own reference - it appears in the webhook list and helps you tell multiple webhooks apart. + +- **Payload URL** is the endpoint that Plane will POST to. It must be a publicly reachable `http://` or `https://` address. Local addresses (localhost, private IPs) are not accepted. + +- **Events** control what triggers this webhook. The form groups events by type - Projects, Cycles, Modules, Work items, and so on. Check the specific actions you care about. You can subscribe to as many or as few as you need. + +- **Advanced configurations** lets you add a filter so the webhook only fires for work items that match specific conditions - for example, high-priority bugs in a particular project. See [Filtering work item events](#filtering-work-item-events) below. + +- **Secret key** is generated automatically when you save the webhook. Plane downloads it as a CSV file the moment you click **Create webhook** and then returns you to the webhook list. It is not displayed on screen - the download is the only time you receive it automatically. Save the file. You need the key to verify incoming requests. + ## Filtering work item events ### How filtering works @@ -66,7 +81,7 @@ Switching between modes is lossless - your filter is not lost when you switch. 1. Create or edit a webhook. 2. Check at least one **Work items** event. -3. Expand **Advanced configurations**. +3. Scroll down to the **Work item v2 filters** section. 4. Use the filter builder to define your conditions in Basic mode, or switch to PQL mode to type an expression directly. 5. Save the webhook. @@ -93,43 +108,6 @@ assignee_id = "" Specific assignee project_id = "" Specific project ``` -## Securing requests - -### Why Plane signs every request - -Any server on the internet can send a POST request to your endpoint. Without a way to verify the source, someone could send fake webhook payloads to your system and trigger whatever logic you've built around them. - -Plane solves this by signing every request with HMAC-SHA256 using your secret key. The signature is attached as an `X-Plane-Signature` header. Because only Plane and you know the secret, a valid signature proves the request came from Plane and was not modified in transit. - -Skipping verification means your endpoint will process any request that arrives - forged or not. - -### How to verify a webhook payload - -On your server, compute the expected signature from the **raw request body bytes** and compare it to the value in `X-Plane-Signature`. Use a constant-time comparison to prevent timing attacks. - -```python -import hashlib -import hmac - -def verify_webhook(request_body_bytes: bytes, secret: str, signature_header: str) -> bool: - expected = hmac.new( - secret.encode("utf-8"), - request_body_bytes, - hashlib.sha256, - ).hexdigest() - return hmac.compare_digest(expected, signature_header) -``` - -Use the raw bytes from the incoming request - not a parsed or re-serialized version. JSON re-serialization can change key ordering, spacing, or escaping, which will produce a different signature and cause verification to fail. Reject any request where the signature does not match before running any other logic. - -### Signature header reference - -| Header | Value | -| ------------------- | ------------------------------------------------------------------------------ | -| `X-Plane-Signature` | HMAC-SHA256 hex digest of the raw request body, keyed with your webhook secret | - -The secret key is formatted as `plane_wh_` followed by a random string. Plane masks it in the UI. To view the full key, open the edit form for the webhook and use the show/hide toggle in the **Secret key** section. - ## Managing webhooks ### Disabling versus deleting @@ -175,6 +153,43 @@ Re-generate if your secret key is compromised. The old key is invalidated the mo Plane downloads the new key as a CSV. +## Securing requests + +### Why Plane signs every request + +Any server on the internet can send a POST request to your endpoint. Without a way to verify the source, someone could send fake webhook payloads to your system and trigger whatever logic you've built around them. + +Plane solves this by signing every request with HMAC-SHA256 using your secret key. The signature is attached as an `X-Plane-Signature` header. Because only Plane and you know the secret, a valid signature proves the request came from Plane and was not modified in transit. + +Skipping verification means your endpoint will process any request that arrives - forged or not. + +### How to verify a webhook payload + +On your server, compute the expected signature from the **raw request body bytes** and compare it to the value in `X-Plane-Signature`. Use a constant-time comparison to prevent timing attacks. + +```python +import hashlib +import hmac + +def verify_webhook(request_body_bytes: bytes, secret: str, signature_header: str) -> bool: + expected = hmac.new( + secret.encode("utf-8"), + request_body_bytes, + hashlib.sha256, + ).hexdigest() + return hmac.compare_digest(expected, signature_header) +``` + +Use the raw bytes from the incoming request - not a parsed or re-serialized version. JSON re-serialization can change key ordering, spacing, or escaping, which will produce a different signature and cause verification to fail. Reject any request where the signature does not match before running any other logic. + +### Signature header reference + +| Header | Value | +| ------------------- | ------------------------------------------------------------------------------ | +| `X-Plane-Signature` | HMAC-SHA256 hex digest of the raw request body, keyed with your webhook secret | + +The secret key is formatted as `plane_wh_` followed by a random string. Plane masks it in the UI. To view the full key, open the edit form for the webhook and use the show/hide toggle in the **Secret key** section. + ## Delivery and monitoring ### How Plane delivers events @@ -361,3 +376,51 @@ All v2 payloads share this top-level structure: "previous_attributes": {} } ``` + +**workitem.link.updated** + +```json +{ + "version":"v2", + "delivery_id":"2a0d0510-9052-446e-a1c7-a704bbd68cba", + "event_id":"9d508cd9-36c2-44a5-928d-7ee2f2a3b8a8", + "entity_id":"775c5716-5302-4617-bb9f-2cd843911268", + "entity_type":"issue", + "event":"WebhookScope.ScopeChoices.WORK_ITEM_UPDATED", + "webhook_id":"8944ed18-1331-4eae-b9bb-7c40864b8abd", + "workspace_id":"b54ecb0d-e3eb-4986-b238-f83fd8665e65", + "data":{ + "id":"775c5716-5302-4617-bb9f-2cd843911268", + "name":"webhook test 3", + "point":"None", + "type_id":"None", + "is_draft":false, + "priority":"none", + "state_id":"067b88e5-304b-4221-ba09-94340dcc36e5", + "label_ids":[], + "parent_id":"None", + "created_at":"2026-03-31T11:44:41.249292+00:00", + "deleted_at":"None", + "project_id":"59e3be42-87ec-4950-99a3-ae639cf2b089", + "sort_order":75535, + "start_date":"None", + "updated_at":"2026-03-31T11:44:41.249304+00:00", + "archived_at":"None", + "external_id":"None", + "sequence_id":3, + "target_date":"None", + "assignee_ids":[ ], + "completed_at":"None", + "workspace_id":"b54ecb0d-e3eb-4986-b238-f83fd8665e65", + "created_by_id":"754009ab-3fb5-424e-909a-b46e9c9d0c4f", + "updated_by_id":"None", + "external_source":"None", + "description_json":{}, + "last_activity_at":"2026-03-31T11:44:41.346305+00:00", + "estimate_point_id":"None" + }, + "previous_attributes":{ + "last_activity_at":"2026-03-31 11:44:41.242868+00" + } +} +``` \ No newline at end of file diff --git a/docs/public/images/webhooks/create-webhook.webp b/docs/public/images/webhooks/create-webhook.webp new file mode 100644 index 0000000000000000000000000000000000000000..d6e07c13ac52430434af70c5c72eb1d93baf3367 GIT binary patch literal 65122 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 bqq5foSND?#eAX3` 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 literal 0 HcmV?d00001 From 81d9d8cd46224486b4255b6bb86b9fa59e74e147 Mon Sep 17 00:00:00 2001 From: danciaclara Date: Thu, 4 Jun 2026 15:25:29 +0530 Subject: [PATCH 4/4] formatting fixes --- docs/dev-tools/intro-webhooks.md | 86 ++++++++++++++++---------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/docs/dev-tools/intro-webhooks.md b/docs/dev-tools/intro-webhooks.md index c2a518d1..0947f97b 100644 --- a/docs/dev-tools/intro-webhooks.md +++ b/docs/dev-tools/intro-webhooks.md @@ -25,7 +25,7 @@ V1 webhooks are deprecated. They continue to deliver but will not receive v2 pay 4. Update your server to expect the v2 payload structure. See [Payload structure](#payload-structure) for the full field reference. 5. Test that deliveries are arriving and your server is handling them correctly. 6. Delete the original v1 webhook once you're confident the new one is working. -::: + ::: ## Creating a webhook @@ -381,46 +381,46 @@ All v2 payloads share this top-level structure: ```json { - "version":"v2", - "delivery_id":"2a0d0510-9052-446e-a1c7-a704bbd68cba", - "event_id":"9d508cd9-36c2-44a5-928d-7ee2f2a3b8a8", - "entity_id":"775c5716-5302-4617-bb9f-2cd843911268", - "entity_type":"issue", - "event":"WebhookScope.ScopeChoices.WORK_ITEM_UPDATED", - "webhook_id":"8944ed18-1331-4eae-b9bb-7c40864b8abd", - "workspace_id":"b54ecb0d-e3eb-4986-b238-f83fd8665e65", - "data":{ - "id":"775c5716-5302-4617-bb9f-2cd843911268", - "name":"webhook test 3", - "point":"None", - "type_id":"None", - "is_draft":false, - "priority":"none", - "state_id":"067b88e5-304b-4221-ba09-94340dcc36e5", - "label_ids":[], - "parent_id":"None", - "created_at":"2026-03-31T11:44:41.249292+00:00", - "deleted_at":"None", - "project_id":"59e3be42-87ec-4950-99a3-ae639cf2b089", - "sort_order":75535, - "start_date":"None", - "updated_at":"2026-03-31T11:44:41.249304+00:00", - "archived_at":"None", - "external_id":"None", - "sequence_id":3, - "target_date":"None", - "assignee_ids":[ ], - "completed_at":"None", - "workspace_id":"b54ecb0d-e3eb-4986-b238-f83fd8665e65", - "created_by_id":"754009ab-3fb5-424e-909a-b46e9c9d0c4f", - "updated_by_id":"None", - "external_source":"None", - "description_json":{}, - "last_activity_at":"2026-03-31T11:44:41.346305+00:00", - "estimate_point_id":"None" - }, - "previous_attributes":{ - "last_activity_at":"2026-03-31 11:44:41.242868+00" - } + "version": "v2", + "delivery_id": "2a0d0510-9052-446e-a1c7-a704bbd68cba", + "event_id": "9d508cd9-36c2-44a5-928d-7ee2f2a3b8a8", + "entity_id": "775c5716-5302-4617-bb9f-2cd843911268", + "entity_type": "issue", + "event": "WebhookScope.ScopeChoices.WORK_ITEM_UPDATED", + "webhook_id": "8944ed18-1331-4eae-b9bb-7c40864b8abd", + "workspace_id": "b54ecb0d-e3eb-4986-b238-f83fd8665e65", + "data": { + "id": "775c5716-5302-4617-bb9f-2cd843911268", + "name": "webhook test 3", + "point": "None", + "type_id": "None", + "is_draft": false, + "priority": "none", + "state_id": "067b88e5-304b-4221-ba09-94340dcc36e5", + "label_ids": [], + "parent_id": "None", + "created_at": "2026-03-31T11:44:41.249292+00:00", + "deleted_at": "None", + "project_id": "59e3be42-87ec-4950-99a3-ae639cf2b089", + "sort_order": 75535, + "start_date": "None", + "updated_at": "2026-03-31T11:44:41.249304+00:00", + "archived_at": "None", + "external_id": "None", + "sequence_id": 3, + "target_date": "None", + "assignee_ids": [], + "completed_at": "None", + "workspace_id": "b54ecb0d-e3eb-4986-b238-f83fd8665e65", + "created_by_id": "754009ab-3fb5-424e-909a-b46e9c9d0c4f", + "updated_by_id": "None", + "external_source": "None", + "description_json": {}, + "last_activity_at": "2026-03-31T11:44:41.346305+00:00", + "estimate_point_id": "None" + }, + "previous_attributes": { + "last_activity_at": "2026-03-31 11:44:41.242868+00" + } } -``` \ No newline at end of file +```