Outbound webhooks | Glue Developers | Glue Guide
Webhooks Overview
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 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.
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. 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:
Content-Type: application/json
X-Glue-Event-Signature: {HMAC Signature}
Example JavaScript to verify the signature
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. |
| 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.
Example Message Content
{
"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
| Field | Type | Description |
|---|---|---|
| id | string | Unique Message UUID (e.g., 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 (e.g., 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 this is the underlying thread for a 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 (e.g., 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 (e.g., 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.