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.