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 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. 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.

For example:

{
  "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": "[email protected]",
          "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 (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

Last updated

Was this helpful?