# Outbound webhooks

Glue provides webhooks that let you receive HTTP push notifications whenever threads or messages are created or sent in your workspace. This allows you to build integrations that respond to changes in real time—for example, syncing data to external systems, triggering workflows, or sending notifications based on activity in Glue.

You can use the Glue GraphQL schema explorer to look up the object types that are included in webhook payloads.

Webhooks are configured at the **Workspace** level. You can choose to receive updates from all groups and threads within a workspace, or scope webhooks to a specific group, depending on your integration needs.

To set up webhooks, go to your application’s settings in Glue, and create an [OAuth Application](/developers/authentication/oauth-2-0-authentication.md) to get started. Once configured, whenever a new workspace authorizes your application, Glue automatically creates a webhook for that workspace that posts to the URL you provide.&#x20;

## Handling Webhook Requests

### Authentication and Security

All webhook requests must be sent through HTTPS. Each request is also signed, so you know the request came from Glue.

### Retry Policy

If the response to the webhook request is anything other than a 200, we will retry the request with the delays listed below.

| Retry # | Delay |
| ------- | ----- |
| 1       | 10s   |
| 2       | 1m    |
| 3       | 10m   |

## Webhook Payload

The webhook HTTP payload will include information both in its HTTP headers and its request body.

The format of the payload body reflects that of the corresponding GraphQL entity. You can explore the payload structure in our [GraphQL schema explorer](https://studio.apollographql.com/public/Linear-Webhooks/variant/current/schema/reference/objects). For a closer look at specific fields, you can also query them directly using the Linear API.

The payload will be sent with the following HTTP headers:

```http
Content-Type: application/json
X-Glue-Event-Signature: {HMAC Signature}
```

**Example JavaScript to verify the signature**

```jsx
const crypto = require("crypto");

function verifySignature(request, secret = "") {
  const hmac = crypto.createHmac("sha256", secret);
  hmac.update(request.body);
  const digest = hmac.digest("hex");
  return digest === request.headers["X-Glue-Event-Signature"];
}
```

### Event Body

| Field         | Type   | Description                            |
| ------------- | ------ | -------------------------------------- |
| `type`        | string | The Event Type being sent              |
| `workspaceID` | string | The Workspace ID the event belongs to. |
| `event`       | Event  | The Event payload                      |

### Event Type

| Name            | Description                                                                                                            |
| --------------- | ---------------------------------------------------------------------------------------------------------------------- |
| message.created | Occurs when a new message is sent in an existing thread. Contains the Message, and the Thread the Message was sent in. |
| thread.created  | Occurs when a new thread is created. Contains the Thread Created, and the first Message sent.                          |

## New Message or Thread Event

For each message created in Glue, the corresponding event will have `message` content and `thread` content. The contents of each one are outlined below.&#x20;

For example:&#x20;

```json
{
  "event": {
    "message": {
      "id": "msg_2u0hEEQUZuDraFWJdoqLV2nF1gm",
      "quotedMessageID": "msg_2u0hEEQUZuDraFWJdoqLV2nF1gm",
      "text": "I don't know what happened, it worked on my local",
      "createdAt": "2025-03-07T23:48:06.079072Z",
      "updatedAt": "2025-03-07T23:54:33.050815Z",
      "url": "https://app.gluegroups.com/thr_2rKIaEdbiSuc869jTAGfMpSfaaa/usr_2vTvWPDt27hffx7BUNgIHQVLbbb-bd784d43-f620-46e7-bded-393522c68ccc",
      "user": {
        "avatarURL": null,
        "bio": "Software Developer",
        "id": "usr_2rdDJjsN0n5HONuOusUoNcdu26X",
        "name": "Donald Johnson",
        "workspaceIDs": ["wks_2rdAeYdtPPUOMQx5MgeeUkw9Yar"]
      }
    },
    "thread": {
      "id": "thr_2rdAeT8weQGRzVVjJ0HDzYhI57q",
      "subject": "Prod is down",
      "createdAt": "2025-01-14T18:17:53.703017Z",
      "updatedAt": "2025-03-07T23:48:06.077649Z",
      "url": "https://app.gluegroups.com/thr_2rKIaEdbiSuc869jTAGfMpSfaaa",
      "isPersistentChat": false,
      "recipients": [
        {
          "id": "grp_2tuREOmMXCuwA9GDHhJf9CaHaaa",
          "name": "🥸 Dev Team"
        },
        {
          "address": "imadev@gluegroups.com",
          "id": "usr_2tuREOmMXCuwA9GDHhJf9CaHaaa",
          "name": "Ima Goodev"
        }
      ],
      "user": {
        "avatarURL": null,
        "bio": "Project Manager",
        "id": "usr_2rdAe3Iuh2i92zy9Rq2xsWBQ59u",
        "name": "Jane Smith",
        "workspaceIDs": ["wks_2rdAeYdtPPUOMQx5MgeeUkw9Yar"]
      }
    }
  },
  "type": "message.created",
  "workspaceID": "wks_2rdAeYdtPPUOMQx5MgeeUkw9Yar"
}
```

### `message` content&#x20;

| Field           | Type   | Description                                                |
| --------------- | ------ | ---------------------------------------------------------- |
| id              | string | Unique Message UUID (ie `msg_2u0XJ6Urwwhd50uzfT1EVgJTwl1`) |
| user            | User   | The User that sent the Message                             |
| text            | string | The Markdown text representing the Message sent.           |
| quotedMessageID | string | The Message UUID quoted by this Message                    |
| url             | string | Link to the message in the Glue App                        |
| createdAt       | string | The time the Message was created                           |
| updatedAt       | string | The time the Message was last updated                      |

### `thread` content

| Field            | Type         | Description                                                                                                                                                         |
| ---------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| id               | string       | Unique Thread UUID (ie `thr_2rdAeT8weQGRzVVjJ0HDzYhI57q`)                                                                                                           |
| user             | User         | The User that created the Thread                                                                                                                                    |
| subject          | string       | The subject of the Thread                                                                                                                                           |
| url              | string       | Link to the Thread in the Glue App                                                                                                                                  |
| recipients       | \[]Recipient | Array of recipients of the Thread                                                                                                                                   |
| isPersistentChat | boolean      | Indicates that this is the underlying thread for a group chat. In this case `recipients` will contain just one entry which is the group containing this group chat. |
| createdAt        | string       | The time the Thread was created                                                                                                                                     |
| updatedAt        | string       | The time the Thread was last updated                                                                                                                                |

### `user` content

| Field        | Type      | Description                                             |
| ------------ | --------- | ------------------------------------------------------- |
| id           | string    | Unique User UUID (ie `usr_2mHVPy5LlHYPs2zHcwm56M85J3h`) |
| name         | string    | The full name of the user                               |
| avatarURL    | string    | A link to the User’s avatar image (optional)            |
| bio          | string    | User’s bio (optional)                                   |
| workspaceIDs | \[]string | Workspace IDs the User belongs to                       |

### `recipient` content

| Field   | Type   | Description                                                                                                              |
| ------- | ------ | ------------------------------------------------------------------------------------------------------------------------ |
| id      | string | Unique User or Group UUID (ie `usr_2mHVPy5LlHYPs2zHcwm56M85J3h` for User or `grp_2rdAeYdtPPUOMQx5MgeeUkw9Yar` for Group) |
| name    | string | The full name of the User or the Group                                                                                   |
| address | string | The User’s email address. (This will not be set for Groups)                                                              |

All time fields are formatted as ISO8601 in UTC `1989-10-28T17:30:00.000Z`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.glue.ai/developers/graphql-api/outbound_webhooks.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
