> ## Documentation Index
> Fetch the complete documentation index at: https://developers.wrike.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks

Webhooks allow you to subscribe to notifications about changes in Wrike instead of having to rely on periodic polling. When webhooks are in place, a small package of information ("payload") is sent to your HTTP endpoint when specific changes occur.

We support the following scopes for webhooks:

1. **Folder webhooks** - Fire notifications about changes to tasks, folders, projects within a single folder or project. You can subscribe to folder/project individually, or use "recursive" webhooks to subscribe to folder/project and its subfolders/subprojects.
2. **Account webhooks** - Fire notifications about task, folder, and project-related events in the Account. Includes changes to all tasks that are shared with you in the account.
3. **Space webhooks** - Fire notifications about changes to tasks, folders, and projects within a single space.

***

<span class="wrike-section-label">Reference</span>

## API Methods

REST-style API methods allow you to create webhooks, get lists of your webhooks and their states, update webhook states, and delete webhooks.

### Create Webhooks

* **\[POST]** `/folders/{folderId}/webhooks` — Creates a webhook for a target folder/project.

  Parameters:

  * `hookUrl` - URL of the server that will receive the payload.
  * `secret` (optional) - Client secret to check authenticity of the events later. See Secure Webhooks [section below.](#secure-webhooks)
  * `events` (optional) - Comma-separated list of events that client wants to subscribe to, in square brackets. Example: `[AttachmentAdded,AttachmentDeleted]`. If not specified, all events will be received. See supported events [here](#event-types).
  * `recursive` (optional) - Specifies whether hook should listen to events for subfolders and subprojects anywhere in the hierarchy. Default value is `false`, set to `true` for tracking all nested elements.
  * `parameterisedEvents` (optional) - Array of JSON objects for filtering and additional fields. See the [Event Filtering and Customizable Payload](#event-filtering) sections below.
  * `customItemTypes` (optional) - JSON array of Custom Item Type IDs. Use when you want to receive webhook events only when the changes occur on specified Custom Item Types (CITs).

* **\[POST]** `/spaces/{spaceId}/webhooks` — Creates a webhook for a target space.

  Parameters:

  * `hookUrl` - URL of the server that will receive the payload.
  * `secret` (optional) - Client secret to check authenticity of the events later. See Secure Webhooks section below.
  * `events` (optional) - Comma-separated list of events that client wants to subscribe to, in square brackets. Example: `[AttachmentAdded,AttachmentDeleted]`. If not specified, all events will be received. See supported events [here](#event-types).
  * `recursive` (optional) - Specifies whether hook should listen to events for subfolders and subprojects anywhere in the hierarchy. Default value is `false`, set to `true` for tracking all nested elements.
  * `parameterisedEvents` (optional) - Array of JSON objects for filtering and additional fields. See the [Event Filtering and Customizable Payload](#event-filtering) sections below.
  * `customItemTypes` (optional) - JSON array of Custom Item Type IDs. Use when you want to receive webhook events only when the changes occur on specified Custom Item Types (CITs).

* **\[POST]** `/webhooks` — Creates a webhook for a current account.

  Parameters:

  * `hookUrl` - URL of the server that will receive the payload.
  * `secret` (optional) - Client secret to check authenticity of the events later. See Secure Webhooks section below.
  * `events` (optional) - Comma-separated list of events that client wants to subscribe to, in square brackets. Example: `[AttachmentAdded,AttachmentDeleted]`. If not specified, all events will be received. See supported events [here](#event-types).
  * `parameterisedEvents` (optional) - Array of JSON objects for filtering and additional fields. See the [Event Filtering and Customizable Payload](#event-filtering) sections below.
  * `customItemTypes` (optional) - JSON array of Custom Item Type IDs. Use when you want to receive webhook events only when the changes occur on specified Custom Item Types (CITs).

<Callout icon="❗" theme="error">
  **Important Note on Event Exclusivity:** The event types specified in `events` and `parameterisedEvents` must be a **unique set**. For example, if `TaskCreated` is mentioned in the `events` parameter, it cannot also be used in `parameterisedEvents` or vice-versa.
</Callout>

### Get Webhook(s) State

* **\[GET]** `/webhooks` — Returns a list of webhooks created under the API app associated with the token used for request authorization.
* **\[GET]** `/webhooks/{webhookId},{webhookId},...` \[up to 100 IDs] — Returns information for the specified webhooks.
* The response model for these methods includes the following data for each hook:
  webhook ID, account ID, Folder ID (optional), your server's URL and status (`Active` | `Suspended`).

### Update Webhook State

* **\[PUT]** `/webhooks/{webhookId}` — Modifies the webhooks state to suspend or resume. Suspended webhooks do not send notifications.

  Parameters:

  * `status` = `Active` | `Suspended`

### Delete Webhooks

* **\[DELETE]** `/webhooks/{webhookId}` — Deletes webhook by ID.

<Callout icon="📘" theme="info">
  Note: If the user who created the webhook is removed from the account, all webhooks created by that user are permanently deleted.
</Callout>

***

<span class="wrike-section-label">New Feature</span>

## \[New] Event Filtering and Customizable Payload

Wrike webhooks now support advanced filtering via `parameterisedEvents` and `customItemTypes` parameters and customizable payloads via the `fields` parameter in `parameterisedEvents`, allowing you to be more selective about the events you receive and include additional context directly in the payload.

### Event Filtering

Use event filtering to receive a webhook only when certain conditions are met, such as when a specific custom field is updated or when a task is recurrent.

**Rules (read first)**

* **Scope**: `customItemTypes` (CIT) restricts delivery to items of the listed CITs. It applies to tasks and projects that have a CIT. Plain folders and spaces have no CIT.
* **Boolean logic**: CIT *AND* (`events` *OR* `parameterisedEvents`). Inside `parameterisedEvents`, multiple entries are combined with *OR*.
* **Exclusivity**: an event must appear in either `events` or in `parameterisedEvents`, not both.

### Supported Parameterized Events

Events below must be included in the `parameterisedEvents` array and support one or more filtering parameters:

| Event                      | Filter Parameter | Supported Value(s)                                              | Description                                                                                                  |
| -------------------------- | ---------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ |
| `TaskCreated`              | `recurrent`      | `true` (only recurrent task), `false` (only non-recurrent task) | Filter to receive notifications only when a recurrent or non-recurrent task is created.                      |
| `TaskCustomFieldChanged`   | `customFields`   | IDs of custom fields (array)                                    | Filter to receive notifications only when one of the specified custom fields is updated on a task.           |
| `FolderCustomFieldChanged` | `customFields`   | IDs of custom fields (array)                                    | Filter to receive notifications only when one of the specified custom fields is updated on a folder/project. |

### Filter by Custom Item Type (CIT)

Use the `customItemTypes` parameter when creating the webhook to receive notifications for *all* supported events, but only for tasks or projects that belong to the specified CITs.

### Sample curl request with filtering

**CURL example:**

```bash
curl -X POST "https://www.wrike.com/api/v4/webhooks" \
    -H "Authorization: Bearer <access_token>" \
    -H "Content-Type: application/json" \
    -d '{
      "hookUrl": "https://yoursite.com/db1c28f6-d600-4282-b039-fce77f080dac",
      "events": ["FolderTitleChanged"],
      "parameterisedEvents": [
        {
          "event": "TaskCreated",
          "recurrent": true
        },
        {
          "event": "TaskCustomFieldChanged",
          "customFields": [
            "IEAAAAADJUAAAABB",
            "IEAAAAADJUAAAABC"
          ]
        }
      ],
      "customItemTypes": [
        "IEAAAAADPIAAAAAO",
        "IEAAAAADPIAAAAAP"
      ]
    }'
```

**This delivers when** any of the following happen *on items with the listed CITs*:

* Project title changes (project has one of the listed CITs).
* A recurrent task is created.
* One of the specified task custom fields changes.

Folder or space title changes (no CIT) are excluded by the CIT filter.

### Customizable Payload

Request extra fields inline when a `parameterisedEvents` entry fires by adding a `fields` array to that entry. Returned fields appear under top-level `fields` in the webhook payload. This avoids extra API calls to fetch contextual data.

### Supported Custom Payload Fields

| Field                       | Applicable Events    | Type       | Description                                            | Sample                                       |
| --------------------------- | -------------------- | ---------- | ------------------------------------------------------ | -------------------------------------------- |
| `title`                     | Task, Folder/Project | string     | Item title.                                            | `"Q4 Marketing Plan"`                        |
| `responsibleIds`            | Task                 | `string[]` | Assigned user IDs.                                     | `["KUAAABK2"]`                               |
| `responsiblePlaceholderIds` | Task                 | `string[]` | Assigned placeholder IDs.                              | `["PLAAAA1"]`                                |
| `status`                    | Task                 | string     | Current workflow status.                               | `"Active"`                                   |
| `dates`                     | Task                 | object     | Start/due/duration.                                    | `{"startDate":"...","dueDate":"..."}`        |
| `customFields`              | Task, Folder/Project | `object[]` | All custom fields                                      | `[ { "id": "IEA..", "value": "testValue" }]` |
| `customStatusId`            | Task                 | string     | Workflow custom status ID.                             | `"IEAADQ..."`                                |
| `recurrence`                | Task                 | object     | Recurrence metadata.                                   | `{"originalTaskId":"..."}`                   |
| `dependencyIds`             | Task                 | `string[]` | Linked dependencies.                                   | `["IEAQLC..."]`                              |
| `customItemTypeId`          | Task, Folder/Project | string     | CIT ID.                                                | `"IEAAAAADPIAAAAAO"`                         |
| `project`                   | Folder/Project       | object     | Project metadata (ownerIds, customStatusId, dates...). | `{"ownerIds":["KU..."]}`                     |

### Sample curl request with customizable payload

**CURL example:**

```bash
curl -X POST "https://www.wrike.com/api/v4/webhooks" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "hookUrl": "https://yoursite.com/db1c28f6-d600-4282-b039-fce77f080dac",
    "events": ["FolderTitleChanged"],
    "parameterisedEvents": [
      {
        "event": "TaskCustomFieldChanged",
        "customFields": [
          "IEAAAAADJUAAAABB",
          "IEAAAAADJUAAAABC"
        ],
        "fields": [
          "title",
          "status",
          "dependencyIds",
          "customItemTypeId"
        ]
      }
    ],
    "customItemTypes": [
      "IEAAAAADPIAAAAAO",
      "IEAAAAADPIAAAAAP"
    ]
  }'
```

### Sample webhook payload (with additional fields)

**Example response:**

```json
{
  "taskId": "IEAAAAADJUAAAABB",
  "webhookId": "IEAAAAADJAAAAANO",
  "eventType": "TaskCustomFieldChanged",
  "lastUpdatedDate": "2025-09-20T10:05:30Z",
  "fields": {
    "title": "Q4 Marketing Plan",
    "status": "Active",
    "customItemTypeId": "IEAAAAADPIAAAAAO",
    "dependencyIds": ["IEAQLCJBIUAB5BFHKMAB5BFI"]
  }
}
```

***

<span class="wrike-section-label">Reference</span>

## Sample Payloads

Below is an example of the most basic payload which can be received. This payload is sent when a new task is created (note the "eventType"):

**Example response:**

```json
[{
    "webhookId": "IEAAABC6JAAAABAS",
    "eventAuthorId": "KUAAABKU",
    "eventType": "TaskCreated",
    "taskId": "IEAAABC6KQAB5FKW",
    "lastUpdatedDate": "2016-10-10T11:33:28Z"
}]
```

<Callout icon="📘" theme="info">
  Note, even single notifications are sent as JSON-array. For simplicity, we'll write payloads as single JSON-objects in the text below.
</Callout>

Some payloads can contain values that designate what the data was before the change. For example, for the `TaskTitleChanged` event you see the old and new task title:

**Example response:**

```json
{
    "oldValue": "Old task title",
    "title": "New task title",
    "taskId": "IEAAABC6KQAB5FKW",
    "webhookId": "IEAAABC6JAAAABAS",
    "eventAuthorId": "KUAAABKU",
    "eventType": "TaskTitleChanged",
    "lastUpdatedDate": "2016-11-22T10:25:50Z"
}
```

Another example with old/new values is `TaskStatusChanged`:

**Example response:**

```json
{
    "oldStatus": "New",
    "status": "In Progress",
    "oldCustomStatusId": "IEAADQQLJMAAAAAA",
    "customStatusId": "IEAADQQLJMA7IM7A",
    "taskId": "IEAAABC6KQAB5FKW",
    "webhookId": "IEAAABC6JAAAABAS",
    "eventAuthorId": "KUAALDRX",
    "eventType": "TaskStatusChanged",
    "lastUpdatedDate": "2016-11-22T11:09:58Z"
}
```

Note that custom field values are represented in the form of JSON string, so when custom field has text type, it will be wrapped in quotes:

**Example response:**

```json
{
    "customFieldId": "IEAAABDGJUAAAAA6",
    "oldValue": "\"old text\"",
    "value": "\"new value\"",
    "taskId": "IEAAABDGKQAB5FLY",
    "webhookId": "IEAAABDGJAAAABA2",
    "eventAuthorId": "KUAAABLA",
    "eventType": "TaskCustomFieldChanged",
    "lastUpdatedDate": "2024-09-05T07:33:24Z"
}
```

***

## Event Types

The following table lists supported webhooks events. Events on tasks, folders, projects, attachments, timelogs, and comments changes are supported. Folder events are also fired on projects.

<Table align={["left","left","left"]}>
  <thead>
    <tr>
      <th>
        Event
      </th>

      <th>
        Description
      </th>

      <th>
        Old Value
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        <code>TaskCreated</code>
      </td>

      <td>
        Fired when a user creates a new task. It's also fired for creating task-based work items and submitting request forms.<br /><em>Note:</em> This event can be filtered using the <em><strong>parameterisedEvents</strong></em> feature to fire only on recurrent tasks.

        ```json
        {
            "webhookId": "IEAAABC6JAAAABAS",
            "eventAuthorId": "KUAAABKU",
            "eventType": "TaskCreated",
            "taskId": "IEAAABC6KQAB5FKW",
            "lastUpdatedDate": "2016-10-10T11:33:28Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskDeleted</code>
      </td>

      <td>
        Fired when task is deleted.

        ```json
        {
            "webhookId": "IEAAABC6JAAAABAS",
            "eventAuthorId": "KUAAABKU",
            "eventType": "TaskDeleted",
            "taskId": "IEAAABC6KQAB5FKW",
            "lastUpdatedDate": "2016-10-10T11:33:28Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskTitleChanged</code>
      </td>

      <td>
        Fired when a task title changes.

        ```json
        {
            "oldValue": "Old task title",
            "title": "New task title",
            "taskId": "IEAAABC6KQAB5FKW",
            "webhookId": "IEAAABC6JAAAABAS",
            "eventAuthorId": "KUAAABKU",
            "eventType": "TaskTitleChanged",
            "lastUpdatedDate": "2016-11-22T10:25:50Z"
        }
        ```
      </td>

      <td>
        ✅
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskImportanceChanged</code>
      </td>

      <td>
        Fired when a task importance changes.

        ```json
        {
            "oldValue": "Normal",
            "importance": "High",
            "taskId": "IEAAABC6KQAB5FKW",
            "webhookId": "IEAAABC6JAAAABAS",
            "eventAuthorId": "KUAAABKU",
            "eventType": "TaskImportanceChanged",
            "lastUpdatedDate": "2016-11-22T10:25:50Z"
        }
        ```
      </td>

      <td>
        ✅
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskStatusChanged</code>
      </td>

      <td>
        Fired when a task status changes.

        ```json
        {
            "oldStatus": "New",
            "status": "In Progress",
            "oldCustomStatusId": "IEAADQQLJMAAAAAA",
            "customStatusId": "IEAADQQLJMA7IM7A",
            "taskId": "IEAAABC6KQAB5FKW",
            "webhookId": "IEAAABC6JAAAABAS",
            "eventAuthorId": "KUAALDRX",
            "eventType": "TaskStatusChanged",
            "lastUpdatedDate": "2016-11-22T11:09:58Z"
        }
        ```
      </td>

      <td>
        ✅
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskDatesChanged</code>
      </td>

      <td>
        Fired when start, finish dates, duration, or the "Work on weekends" flag is changed.

        ```json
        {
            "oldValue": {
                "type": "Backlog",
                "workOnWeekends": false
            },
            "dates": {
                "type": "Planned",
                "startDate": "2024-09-02T09:00:00",
                "duration": 960,
                "dueDate": "2024-09-03T17:00:00",
                "workOnWeekends": false
            },
            "taskId": "IEAAABDBKQAB5FK7",
            "webhookId": "IEAAABDBJAAAABAV",
            "eventAuthorId": "KUAAABKX",
            "eventType": "TaskDatesChanged",
            "lastUpdatedDate": "2024-09-05T07:19:37Z"
        }
        ```
      </td>

      <td>
        ✅
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskParentsAdded</code>
      </td>

      <td>
        Fired when a task is added to a folder, project or space.

        ```json
        {
            "addedParents": [
                "IEAAABDCI4AB5FLD",
                "IEAAABDCI4AB5FLE"
            ],
            "taskId": "IEAAABDCKQAB5FLC",
            "webhookId": "IEAAABDCJAAAABAW",
            "eventAuthorId": "KUAAABKY",
            "eventType": "TaskParentsAdded",
            "lastUpdatedDate": "2024-09-05T07:22:25Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskParentsRemoved</code>
      </td>

      <td>
        Fired when a task is removed from a folder, project or space.

        ```json
        {
            "removedParents": [
                "IEAAABDCI4AB5FLD",
                "IEAAABDCI4AB5FLE"
            ],
            "taskId": "IEAAABDCKQAB5FLC",
            "webhookId": "IEAAABDCJAAAABAW",
            "eventAuthorId": "KUAAABKY",
            "eventType": "TaskParentsRemoved",
            "lastUpdatedDate": "2024-09-05T07:22:25Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskResponsiblesAdded</code>
      </td>

      <td>
        Fired when any new assignee is added to a task, including all Wrike users (and collaborators) and users with pending invitations.

        ```json
        {
            "addedResponsibles": [
                "KUAAABK2",
                "KUAAABK3"
            ],
            "taskId": "IEAAABDDKQAB5FLH",
            "webhookId": "IEAAABDDJAAAABAX",
            "eventAuthorId": "KUAAABKZ",
            "eventType": "TaskResponsiblesAdded",
            "lastUpdatedDate": "2024-09-05T07:28:37Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskResponsiblesRemoved</code>
      </td>

      <td>
        Fired when someone is unassigned from a task.

        ```json
        {
            "removedResponsibles": [
                "KUAAABK2",
                "KUAAABK3"
            ],
            "taskId": "IEAAABDDKQAB5FLH",
            "webhookId": "IEAAABDDJAAAABAX",
            "eventAuthorId": "KUAAABKZ",
            "eventType": "TaskResponsiblesRemoved",
            "lastUpdatedDate": "2024-09-05T07:28:37Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskSharedsAdded</code>
      </td>

      <td>
        Fired when a task is shared.

        ```json
        {
            "addedShareds": [
                "KUAAABK5",
                "KUAAABK6"
            ],
            "taskId": "IEAAABDEKQAB5FLO",
            "webhookId": "IEAAABDEJAAAABAY",
            "eventAuthorId": "KUAAABK4",
            "eventType": "TaskSharedsAdded",
            "lastUpdatedDate": "2024-09-05T07:30:39Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskSharedsRemoved</code>
      </td>

      <td>
        Fired when a task is unshared.

        ```json
        {
            "removedShareds": [
                "KUAAABK5",
                "KUAAABK6"
            ],
            "taskId": "IEAAABDEKQAB5FLO",
            "webhookId": "IEAAABDEJAAAABAY",
            "eventAuthorId": "KUAAABK4",
            "eventType": "TaskSharedsRemoved",
            "lastUpdatedDate": "2024-09-05T07:30:39Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskDescriptionChanged</code>
      </td>

      <td>
        Fired when a task's description is changed. Notifications related to description field changes are fired with approximately a 5-minute delay.

        ```json
        {
            "taskId": "IEAAABDFKQAB5FLV",
            "webhookId": "IEAAABDFJAAAABAZ",
            "eventAuthorId": "KUAAABK7",
            "eventType": "TaskDescriptionChanged",
            "lastUpdatedDate": "2024-09-05T07:32:19Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskCustomFieldChanged</code>
      </td>

      <td>
        Fired when a custom field value on a custom field is changed.<br /><em>Note:</em> This event can be filtered using the <em><strong>parameterisedEvents</strong></em> feature to fire only on specified custom fields.

        ```json
        {
            "customFieldId": "IEAAABDGJUAAAAA6",
            "oldValue": "1",
            "value": "2",
            "taskId": "IEAAABDGKQAB5FLY",
            "webhookId": "IEAAABDGJAAAABA2",
            "eventAuthorId": "KUAAABLA",
            "eventType": "TaskCustomFieldChanged",
            "lastUpdatedDate": "2024-09-05T07:33:24Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>AttachmentAdded</code>
      </td>

      <td>
        Fired when a new attachment is added to a task or a comment with attachment is added.

        ```json
        {
            "webhookId": "IEAAABC6JAAAABAS",
            "eventAuthorId": "KUAALDRX",
            "eventType": "AttachmentAdded",
            "lastUpdatedDate": "2016-10-10T11:33:28Z",
            "taskId": "IEAAABC6KQAB5FKW",
            "attachmentId": "IEAADQQLKQAKAOPD"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>AttachmentDeleted</code>
      </td>

      <td>
        Fired when an attachment was deleted from task or a comment with attachment was deleted.

        ```json
        {
            "webhookId": "IEAAABC6JAAAABAS",
            "eventAuthorId": "KUAALDRX",
            "eventType": "AttachmentDeleted",
            "lastUpdatedDate": "2016-10-10T11:33:28Z",
            "taskId": "IEAAABC6KQAB5FKW",
            "attachmentId": "IEAADQQLKQAKAOPD"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>CommentAdded</code>
      </td>

      <td>
        Fired when a new comment is added. Not fired for comments without text (that is, comments with attachments only).

        ```json
        {
            "commentId": "IEAAABDIIMAAADSG",
            "comment": {
                "text": "comment",
                "html": "<b>comment</b>"
            },
            "taskId": "IEAAABDIKQAB5FL6",
            "webhookId": "IEAAABDIJAAAABA4",
            "eventAuthorId": "KUAAABLC",
            "eventType": "CommentAdded",
            "lastUpdatedDate": "2024-09-05T07:40:40Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>CommentDeleted</code>
      </td>

      <td>
        Fired when a comment is deleted.

        ```json
        {
            "commentId": "IEAAABDIIMAAADSG",
            "taskId": "IEAAABDIKQAB5FL6",
            "webhookId": "IEAAABDIJAAAABA4",
            "eventAuthorId": "KUAAABLC",
            "eventType": "CommentDeleted",
            "lastUpdatedDate": "2024-09-05T07:40:40Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>CreateFromBlueprintCompleted</code>
      </td>

      <td>
        Fired when a creation from blueprint of task/project/folder is completed.

        ```json
        {
            "blueprintId": "IEAAABDJKQAB5FMC",
            "createdTaskGroupId": "IEAAABDJKQAB5FMD",
            "webhookId": "IEAAABDJJAAAABA5",
            "eventAuthorId": "KUAAABLD",
            "eventType": "CreateFromBlueprintCompleted",
            "lastUpdatedDate": "2024-09-05T07:46:34Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TimelogChanged</code>
      </td>

      <td>
        Fired when a timelog record is added, updated, or removed.

        ```json
        {
            "timeTrackerId": "IEAAABDLJQAAAAAU",
            "type": "Added",
            "hours": "2.0",
            "taskId": "IEAAABDLKQAB5FMI",
            "webhookId": "IEAAABDLJAAAABA6",
            "eventAuthorId": "KUAAABLF",
            "eventType": "TimelogChanged",
            "lastUpdatedDate": "2024-09-05T07:48:01Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderCreated</code>
      </td>

      <td>
        Fired when a folder, project or space is created. It's also fired for creating folder or project-based work items.

        ```json
        {
            "folderId": "IEAAABDMI4AB5FML",
            "webhookId": "IEAAABDMJAAAABA7",
            "eventAuthorId": "KUAAABLG",
            "eventType": "FolderCreated",
            "lastUpdatedDate": "2024-09-05T07:49:34Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderDeleted</code>
      </td>

      <td>
        Fired when a folder, project or space is deleted.

        ```json
        {
            "folderId": "IEAAABDMI4AB5FML",
            "webhookId": "IEAAABDMJAAAABA7",
            "eventAuthorId": "KUAAABLG",
            "eventType": "FolderDeleted",
            "lastUpdatedDate": "2024-09-05T07:49:34Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderTitleChanged</code>
      </td>

      <td>
        Fired when a user changes the title of a folder, project or space.

        ```json
        {
            "oldValue": "old folder title",
            "title": "new folder title",
            "folderId": "IEAAABDNI4AB5FMO",
            "webhookId": "IEAAABDNJAAAABBA",
            "eventAuthorId": "KUAAABLH",
            "eventType": "FolderTitleChanged",
            "lastUpdatedDate": "2024-09-05T07:50:39Z"
        }
        ```
      </td>

      <td>
        ✅
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderParentsAdded</code>
      </td>

      <td>
        Fired when a folder or project is added to another folder, project or space.

        ```json
        {
            "addedParents": [
                "IEAAABDOI4AB5FMS"
            ],
            "folderId": "IEAAABDOI4AB5FMR",
            "webhookId": "IEAAABDOJAAAABBB",
            "eventAuthorId": "KUAAABLI",
            "eventType": "FolderParentsAdded",
            "lastUpdatedDate": "2024-09-05T07:52:49Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderParentsRemoved</code>
      </td>

      <td>
        Fired when a folder or project is removed from another folder.

        ```json
        {
            "removedParents": [
                "IEAAABDOI4AB5FMS"
            ],
            "folderId": "IEAAABDOI4AB5FMR",
            "webhookId": "IEAAABDOJAAAABBB",
            "eventAuthorId": "KUAAABLI",
            "eventType": "FolderParentsRemoved",
            "lastUpdatedDate": "2024-09-05T07:52:49Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderSharedsAdded</code>
      </td>

      <td>
        Fired when a folder, project or space is shared.

        ```json
        {
            "addedShareds": [
                "KUAAABLK",
                "KUAAABLL"
            ],
            "folderId": "IEAAABDPI4AB5FMW",
            "webhookId": "IEAAABDPJAAAABBC",
            "eventAuthorId": "KUAAABLJ",
            "eventType": "FolderSharedsAdded",
            "lastUpdatedDate": "2024-09-05T07:53:54Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderSharedsRemoved</code>
      </td>

      <td>
        Fired when a folder, project or space is unshared.

        ```json
        {
            "removedShareds": [
                "KUAAABLK",
                "KUAAABLL"
            ],
            "folderId": "IEAAABDPI4AB5FMW",
            "webhookId": "IEAAABDPJAAAABBC",
            "eventAuthorId": "KUAAABLJ",
            "eventType": "FolderSharedsRemoved",
            "lastUpdatedDate": "2024-09-05T07:53:54Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderDescriptionChanged</code>
      </td>

      <td>
        Fired when a user changes the description of a folder or project.

        ```json
        {
            "folderId": "IEAAABDQI4AB5FM5",
            "webhookId": "IEAAABDQJAAAABBD",
            "eventAuthorId": "KUAAABLM",
            "eventType": "FolderDescriptionChanged",
            "lastUpdatedDate": "2024-09-05T07:55:18Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderCommentAdded</code>
      </td>

      <td>
        Fired when a comment is added to a folder or project.

        ```json
        {
            "commentId": "IEAAABDRIMAAADSY",
            "comment": {
                "text": "comment",
                "html": "<i>comment</i>"
            },
            "folderId": "IEAAABDRI4AB5FNA",
            "webhookId": "IEAAABDRJAAAABBE",
            "eventAuthorId": "KUAAABLN",
            "eventType": "FolderCommentAdded",
            "lastUpdatedDate": "2024-09-05T07:58:46Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderCommentDeleted</code>
      </td>

      <td>
        Fired when a comment is removed from a folder or project.

        ```json
        {
            "commentId": "IEAAABDRIMAAADSY",
            "folderId": "IEAAABDRI4AB5FNA",
            "webhookId": "IEAAABDRJAAAABBE",
            "eventAuthorId": "KUAAABLN",
            "eventType": "FolderCommentDeleted",
            "lastUpdatedDate": "2024-09-05T07:58:46Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderAttachmentAdded</code>
      </td>

      <td>
        Fired when an attachment is added to a folder or project.

        ```json
        {
            "attachmentId": "IEAAABDSIYAB5BFY",
            "folderId": "IEAAABDSI4AB5FND",
            "webhookId": "IEAAABDSJAAAABBF",
            "eventAuthorId": "KUAAABLO",
            "eventType": "FolderAttachmentAdded",
            "lastUpdatedDate": "2024-09-05T07:59:59Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderAttachmentDeleted</code>
      </td>

      <td>
        Fired when an attachment is removed from a folder or project.

        ```json
        {
            "attachmentId": "IEAAABDSIYAB5BFY",
            "folderId": "IEAAABDSI4AB5FND",
            "webhookId": "IEAAABDSJAAAABBF",
            "eventAuthorId": "KUAAABLO",
            "eventType": "FolderAttachmentDeleted",
            "lastUpdatedDate": "2024-09-05T07:59:59Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderCustomFieldChanged</code>
      </td>

      <td>
        Fired when a custom field value is changed for folder or project.<br /><em>Note:</em> This event can be filtered using the <em><strong>parameterisedEvents</strong></em> feature to fire only on specified custom fields.

        ```json
        {
            "customFieldId": "IEAAABDUJUAAAABA",
            "oldValue": "1",
            "value": "2",
            "folderId": "IEAAABDUI4AB5FNJ",
            "webhookId": "IEAAABDUJAAAABBH",
            "eventAuthorId": "KUAAABLQ",
            "eventType": "FolderCustomFieldChanged",
            "lastUpdatedDate": "2024-09-05T08:01:24Z"
        }
        ```
      </td>

      <td>
        ✅
      </td>
    </tr>

    <tr>
      <td>
        <code>ProjectDatesChanged</code>
      </td>

      <td>
        Fired when the start or end dates of a project are changed.

        ```json
        {
            "oldValue": {
                "type": "Backlog",
                "workOnWeekends": false
            },
            "dates": {
                "type": "Planned",
                "startDate": "2024-09-02T00:00:00",
                "dueDate": "2024-09-03T00:00:00",
                "workOnWeekends": false
            },
            "folderId": "IEAAABDWI4AB5FNP",
            "webhookId": "IEAAABDWJAAAABBJ",
            "eventAuthorId": "KUAAABLS",
            "eventType": "ProjectDatesChanged",
            "lastUpdatedDate": "2024-09-05T08:03:04Z"
        }
        ```
      </td>

      <td>
        ✅
      </td>
    </tr>

    <tr>
      <td>
        <code>ProjectOwnersAdded</code>
      </td>

      <td>
        Fired when any new owner is assigned to a project, including all Wrike users (and Collaborators) and users with pending invitations.

        ```json
        {
            "addedOwners": [
                "KUAAABLU",
                "KUAAABLV"
            ],
            "folderId": "IEAAABDXI4AB5FNS",
            "webhookId": "IEAAABDXJAAAABBK",
            "eventAuthorId": "KUAAABLT",
            "eventType": "ProjectOwnersAdded",
            "lastUpdatedDate": "2024-09-05T08:11:42Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>ProjectOwnersRemoved</code>
      </td>

      <td>
        Fired when an owner is unassigned from a project.

        ```json
        {
            "removedOwners": [
                "KUAAABLU",
                "KUAAABLV"
            ],
            "folderId": "IEAAABDXI4AB5FNS",
            "webhookId": "IEAAABDXJAAAABBK",
            "eventAuthorId": "KUAAABLT",
            "eventType": "ProjectOwnersRemoved",
            "lastUpdatedDate": "2024-09-05T08:11:42Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>ProjectStatusChanged</code>
      </td>

      <td>
        Fired when a project status changes.

        ```json
        {
            "oldStatus": "In Progress",
            "status": "Completed",
            "oldCustomStatusId": "IEABPELHJMAMIUZO",
            "customStatusId": "IEABPELHJMAMIUZF",
            "taskId": "IEABPELHI4AQE2MM",
            "webhookId": "IEABPELHJAAABATM",
            "eventAuthorId": "KUGEUT27",
            "eventType": "ProjectStatusChanged",
            "lastUpdatedDate": "2019-06-17T11:42:28Z"
        }
        ```
      </td>

      <td>
        ✅
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskApprovalStatusChanged</code>
      </td>

      <td>
        Fired when a task's approval status is changed.

        ```json
        [
         {
          "approvalId": "IEADGRKWMEAD3QBO",
          "status": "Approved",
          "taskId": "IEAFAZ72KRD5STHF",
          "webhookId": "IEADGRKWJAAAY2DH",
          "eventAuthorId": "KUAG52VT",
          "eventType": "TaskApprovalStatusChanged",
          "lastUpdatedDate": "2021-03-03T14:21:04Z"
         }
        ]
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskApprovalDecisionChanged</code>
      </td>

      <td>
        Fired when a user gives his decision on approval for task.

        ```json
        [
         {
          "approvalId": "IEADGRKWMEAD3QBO",
          "decision": "Approved",
          "taskId": "IEAFAZ72KRDTW4GG",
          "webhookId": "IEADGRKWJAAAY2DH",
          "eventAuthorId": "KUAG52VT",
          "eventType": "TaskApprovalDecisionChanged",
          "lastUpdatedDate": "2021-03-03T14:21:04Z"
         }
        ]
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>TaskApprovalDecisionReset</code>
      </td>

      <td>
        Fired when a user's actions reset a previous decision for task. For example, if a task's files have been rejected and the approval rejected, when a user uploads a new version of a file the approval decision is reset, and this event is triggered.

        ```json
        {
            "approvalId" : "IEAAABDYMEAAAACK",
            "approverIds" : [ "KUAAABLW", "KUAAABLX" ],
            "taskId" : "IEAAABDYKQAB5FNZ",
            "webhookId" : "IEAAABDYJAAAABBL",
            "eventAuthorId" : "KUAAABLW",
            "eventType" : "TaskApprovalDecisionReset",
            "lastUpdatedDate" : "2024-09-05T08:15:33Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderApprovalStatusChanged</code>
      </td>

      <td>
        Fired when a folder's or project's approval status is changed.

        ```json
        {
            "approvalId": "IEAAABDZMEAAAACL",
            "status": "Cancelled",
            "folderId": "IEAAABDZI4AB5FOA",
            "webhookId": "IEAAABDZJAAAABBM",
            "eventAuthorId": "KUAAABL2",
            "eventType": "FolderApprovalStatusChanged",
            "lastUpdatedDate": "2024-09-05T08:16:55Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderApprovalDecisionChanged</code>
      </td>

      <td>
        Fired when a folder's or project's approval final decision is changed.

        ```json
        {
            "approvalId": "IEAAABD2MEAAAACM",
            "decision": "Rejected",
            "folderId": "IEAAABD2I4AB5FOD",
            "webhookId": "IEAAABD2JAAAABBN",
            "eventAuthorId": "KUAAABL4",
            "eventType": "FolderApprovalDecisionChanged",
            "lastUpdatedDate": "2024-09-05T08:18:51Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>FolderApprovalDecisionReset</code>
      </td>

      <td>
        Fired when a user's actions reset a previous decision for folder or project. For example, if a folder's files have been rejected and the approval rejected, when a user uploads a new version of an approval file the approval decision is reset, and this event is triggered.

        ```json
        {
            "approvalId": "IEAAABD3MEAAAACN",
            "approverIds": [
                "KUAAABL7",
                "KUAAABMA"
            ],
            "folderId": "IEAAABD3I4AB5FOI",
            "webhookId": "IEAAABD3JAAAABBO",
            "eventAuthorId": "KUAAABL7",
            "eventType": "FolderApprovalDecisionReset",
            "lastUpdatedDate": "2024-09-05T08:20:13Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>WorkItemTypeChanged</code>
      </td>

      <td>
        Fired when a user changes the type of a work item, e.g., when an ordinary Task is converted to a particular Custom Item Type.

        ```json
        {
            "workItemId": "IEAAABD4KQAB5FOR",
            "oldWorkItemTypeId": "IEAAABD4PIAAAABP",
            "newWorkItemTypeId": "IEAAABD4PIAAAABQ",
            "newWorkItemTypeTitle": "new template title",
            "webhookId": "IEAAABD4JAAAABBP",
            "eventAuthorId": "KUAAABMD",
            "eventType": "WorkItemTypeChanged",
            "lastUpdatedDate": "2024-09-05T08:23:48Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>

    <tr>
      <td>
        <code>ImportFromFileCompleted</code>
      </td>

      <td>
        Fired when import from Excel or Microsoft Project file is completed.

        ```json
        {
            "parentTaskGroupId": "IEAAABD5I4AB5FOU",
            "attachmentId": "IEAAABD5IYAB5BF3",
            "webhookId": "IEAAABD5JAAAABBQ",
            "eventAuthorId": "KUAAABME",
            "eventType": "ImportFromFileCompleted",
            "lastUpdatedDate": "2024-09-05T08:26:02Z"
        }
        ```
      </td>

      <td>
        ❌
      </td>
    </tr>
  </tbody>
</Table>

The following events are not yet supported (and do not trigger notifications):

* Changes made with mass actions, including importing tasks

***

## Webhook URL Requirements

Current requirements for `hookUrl` are following:

* Web protocol must be present in the URL and must be either `http` or `https`, other protocols are not supported (and will not be)
* Address must be global, not an intranet address ([https://en.wikipedia.org/wiki/Private\_network](https://en.wikipedia.org/wiki/Private_network))
* Port (if specified) must be either `80` or `443`

If an incorrect port is used, you will receive a generic error message as follows:

**Example response:**

```json
{
    "errorDescription":"Parameter 'hookUrl' value is invalid",
    "error":"invalid_parameter"
}
```

Examples of Valid hookUrls:

```text
hookUrl=https://[Global_IP_address]:80/receiver
hookUrl=https://[Global_IP_address]:433/receiver
```

### Verifying the Accessibility of the Hook URL

To validate the accessibility of a hook URL, send a POST request to the URL.

**Example request:**

```http
POST https://webhook.site/7fbe2965-3d60-4d11-ac6d-f5c792ac1723
```

Successful connectivity is indicated by one of the following HTTP status codes in the response:

* 200 OK
* 201 Created
* 202 Accepted
* 204 No Content

### Webhooks delivery

To ensure proper webhooks delivery from Wrike, whitelist following IP subnets:

* For US DC: `160.19.162.0/23`, `34.73.3.211/32`
* For US2 DC: `35.196.104.95/32`, `34.72.158.28/32`
* For EU DC: `185.157.64.0/22`, `146.148.2.222/32`

***

## Secure Webhooks

Wrike optionally supports signing event payloads with a secret, pre-shared between client and Wrike. This provides a mechanism to check authenticity of the request and make sure it is indeed coming from Wrike and goes to the client who registered it.

The general flow looks like follows:

1. In order to register a secure webhook, send `secret` parameter:
   `https://www.wrike.com/api/v4/webhooks?hookUrl=<url>&secret=<some_secret>`.
2. Wrike sends request to `hookUrl` with header
   1. `X-Hook-Secret`: contains a random alphanumeric string.
   2. `X-Hook-Signature`: contains `hmacSha256(key: secret, value: request body)`.
   3. Body: `{"requestType": "WebHook secret verification"}`.
3. Verification & Response:
   1. Calculate `hmacSha256(key: secret, value: request body)` and compare it with the received `X-Hook-Signature`. If the values do not match, you **must discard** the request immediately. This indicates the request is not originating from Wrike.
   2. If the signature matches, calculate `hmacSha256(key: secret, value: received X-Hook-Secret value)` and add this calculated value to the response `X-Hook-Secret` header.
4. All events from webhook will contain `X-Hook-Signature` header with value `hmacSha256(key: secret, value: request body)` so client can check authenticity of the events.

<Callout icon="📘" theme="info">
  Note: The `X-Hook-Secret` challenge is always a random alphanumeric string. We recommend rejecting the handshake if the received `X-Hook-Secret` contains JSON characters or exceeds 100 characters, as this may indicate an attempt to use your server as a signing oracle.
</Callout>

***

<span class="wrike-section-label">Guides</span>

## Example of Usage

### Use Case Example

Let's assume a task is related to the development process, and a "Completed" status means that all code was committed/pushed to the source repository. This change could trigger a CI build via some CI REST endpoint. Additionally, we want to filter for changes only on tasks with a specific Custom Item Type and receive the task's title directly in the payload.

### Step 1

Create an account-wide webhook.

Get your accountId using the following CURL command:

**CURL example:**

```bash
curl -g -X GET -H 'Authorization: bearer <access_token>' 'https://www.wrike.com/api/v4/account'
```

The response contains a list of your accounts:

**Example response:**

```json
{
    "kind": "accounts",
    "data": [
        {
        "id": "IEAADQQL",
        "name": "My Personal Account",
        "dateFormat": "MM/dd/yyyy",
        "firstDayOfWeek": "Mon",
        "workDays": [
            "Sun",
            "Mon",
            "Tue",
            "Wed",
            "Thu",
            "Fri",
            "Sat"
        ],
        "rootFolderId": "IEAAAOVII7777777",
        "recycleBinId": "IEAAAOVII7777776",
        "createdDate": "2013-12-30T12:17:24Z",
        "joinedDate": "2015-08-04T13:56:13Z"
        }
    ]
}
```

You will need "id" field for future requests ("IEAADQQL" in the example above).

### Step 2

Execute the following CURL command to create a new account-wide webhook. We will use the new `parameterisedEvents` to listen for `TaskStatusChanged` events, and use the `fields` key to request the task's `title` and `customItemTypeId` in the payload. We will also use `customItemTypes` to only receive events for tasks with a specific Custom Item Type ID ("IEAAAAADPIAAAAAO" in this example).

**CURL example:**

```bash
curl -g -X POST -H 'Authorization: bearer <access_token>' \
-d 'hookUrl=https://yourwebhookserver.com/event-handler&parameterisedEvents=[{"event":"TaskStatusChanged","fields":["title","customItemTypeId"]}]&customItemTypes=["IEAAAAADPIAAAAAO"]' \
'https://www.wrike.com/api/v4/webhooks'
```

You'll see the following response (your new webhook is active):

**Example response:**

```json
{
    "kind": "webhooks",
    "data": [
        {
        "id": "IEAADQQLJAAAAULN",
        "accountId": "IEAADQQL",
        "hookUrl": "https://yourwebhookserver.com/event-handler",
        "status": "Active"
        }
    ]
}
```

### Step 3

Next, change a task in the account (that has the Custom Item Type "IEAAAAADPIAAAAAO") from "Active" to "Completed". You'll receive the following payload on your endpoint, including the requested `title` and `customItemTypeId` in the `fields` object:

**Example response:**

```json
{
    "oldStatus": "Active",
    "status": "Completed",
    "webhookId": "IEAADQQLJAAAAULN",
    "eventAuthorId": "KUAALDRX",
    "eventType": "TaskStatusChanged",
    "lastUpdatedDate": "2016-11-22T11:09:58Z",
    "fields": {
        "title": "Task for CI Build",
        "customItemTypeId": "IEAAAAADPIAAAAAO"
    }
}
```

### Suspended Webhooks

If a webhook is suspended, Wrike sends an email notification to the webhook author. If your endpoint is shut down or not accessible via the internet, we automatically suspend the webhook based on the response status. In this case, the following request using the given webhook ID will return the "Suspended" state for the webhook:

**CURL example:**

```bash
curl -g -X GET -H 'Authorization: bearer <access_token>' 'https://www.wrike.com/api/v4/webhooks/IEAADQQLJAAAAULN'
```

Response reflecting "Suspended" state:

**Example response:**

```json
{
    "kind": "webhooks",
    "data": [
        {
        "id": "IEAADQQLJAAAAULN",
        "accountId": "IEAADQQL",
        "hookUrl": "https://yourwebhookserver.com/event-handler",
        "status": "Suspended"
        }
    ]
}
```

### Retries for Webhooks

For retryable HTTP statuses, we attempt delivering up to 3 times. If all attempts fail, the webhook is suspended. However, for non-retryable HTTP statuses - all 4xx status codes, except for 408 and 429 - the webhook gets suspended immediately with no retries.

Additionally, if endpoints continue to fail and retries prove ineffective, the system will temporarily suspend all retries to prevent unnecessary delays.

### Reactivate Webhooks

Reactivate the webhook using the following PUT request:

**CURL example:**

```bash
curl -g -X PUT -H 'Authorization: bearer <access_token>' 'https://www.wrike.com/api/v4/webhooks/IEAADQQLJAAAAULN'
```

Response:

**Example response:**

```json
{
    "kind": "webhooks",
    "data": [
        {
        "id": "IEAADQQLJAAAAULN",
        "accountId": "IEAADQQL",
        "hookUrl": "https://yourwebhookserver.com/event-handler",
        "status": "Active"
        }
    ]
}
```

You can get a list of your webhooks (and their states) at any time:

**CURL example:**

```bash
curl -g -X GET -H 'Authorization: bearer <access_token>' 'https://www.wrike.com/api/v4/webhooks'
```

Response will contain JSON with all of webhooks created by you. Similar to:

**Example response:**

```json
{
    "kind": "webhooks",
    "data": [
        {
        "id": "IEAADQQLJAAAAULN",
        "accountId": "IEAADQQL",
        "hookUrl": "https://yourwebhookserver.com/event-handler",
        "status": "Active"
        }
    ]
}
```

### Handling duplicate deliveries

We cannot guarantee exactly-once delivery of events via webhooks. It is possible that due to network issues, the same payload may be re-delivered to your handler. You can prevent the processing of such duplicate deliveries by using an **Idempotency-Key** header in the request. The **Idempotency-Key** contains a unique identifier for each event, allowing you to determine if the event has already been processed.