Webhooks API

Complete API reference for managing webhooks in Blue - create, configure, and manage webhook integrations


Overview

Webhooks allow you to receive real-time HTTP notifications when events occur in your Blue workspaces. When an event is triggered (such as a record being created or updated), Blue sends a POST request to your configured URL with details about the event.

Each webhook has a secret that is used to sign payloads with an HMAC SHA-256 signature, sent via the X-Signature header. The secret is only returned once at creation time and cannot be retrieved afterward.

Available Operations

OperationDescriptionLink
Create WebhookRegister a new webhook endpointThis page
List WebhooksQuery and paginate your webhooksView Details
Update WebhookUpdate webhook URL, events, or statusView Details
Delete WebhookPermanently remove a webhookView Details

Create a Webhook

The createWebhook mutation registers a new webhook endpoint that will receive event notifications.

Basic Example

mutation {
  createWebhook(input: {
    url: "https://example.com/webhooks/blue"
  }) {
    id
    uid
    url
    secret
    status
    enabled
    createdAt
  }
}

Advanced Example

mutation CreateWebhook($input: CreateWebhookInput!) {
  createWebhook(input: $input) {
    id
    uid
    name
    url
    secret
    status
    events
    projectIds
    enabled
    metadata
    createdAt
    updatedAt
  }
}

Variables:

{
  "input": {
    "name": "Slack Notifications",
    "url": "https://example.com/webhooks/blue",
    "events": [
      "TODO_CREATED",
      "TODO_DONE_STATUS_UPDATED",
      "COMMENT_CREATED"
    ],
    "projectIds": ["project-abc-123", "project-def-456"]
  }
}
Secret is only returned once

The secret field is only included in the response when the webhook is first created. Subsequent queries for the webhook will return null for this field. Store the secret securely for verifying webhook signatures.

Input Parameters

CreateWebhookInput

ParameterTypeRequiredDescription
urlString!YesThe endpoint URL that will receive webhook POST requests. Must be a valid, publicly accessible URL. Private/internal network URLs are rejected.
nameStringNoA human-readable name for the webhook
events[WebhookEvent!]NoArray of event types to subscribe to. If omitted, no events will be delivered until events are configured via update.
projectIds[String!]NoArray of workspace IDs to scope the webhook to. You must be a member of each workspace. If omitted, the webhook applies to all your workspaces.

Response Fields

FieldTypeDescription
idID!Unique identifier for the webhook
uidString!User-friendly unique identifier
nameStringHuman-readable name for the webhook
urlString!The endpoint URL receiving webhook events
secretStringHMAC signing secret (only returned on creation)
statusWebhookStatusType!Health status: HEALTHY or UNHEALTHY
events[WebhookEvent!]Array of subscribed event types
projectIds[String!]Array of workspace IDs this webhook is scoped to
enabledBooleanWhether the webhook is currently active
metadataJSONAdditional metadata associated with the webhook
createdAtDateTime!Timestamp when the webhook was created
updatedAtDateTime!Timestamp when the webhook was last updated

Available Webhook Events

Record Events

EventDescription
TODO_CREATEDA record was created
TODO_DELETEDA record was deleted
TODO_MOVEDA record was moved to a different list
TODO_NAME_CHANGEDA record’s title was changed
TODO_DONE_STATUS_UPDATEDA record was marked done or undone
TODO_DUE_DATE_ADDEDA due date was added to a record
TODO_DUE_DATE_UPDATEDA record’s due date was changed
TODO_DUE_DATE_REMOVEDA due date was removed from a record
TODO_ASSIGNEE_ADDEDAn assignee was added to a record
TODO_ASSIGNEE_REMOVEDAn assignee was removed from a record
TODO_TAG_ADDEDA tag was added to a record
TODO_TAG_REMOVEDA tag was removed from a record
TODO_CUSTOM_FIELD_UPDATEDA custom field value was changed on a record

Checklist Events

EventDescription
TODO_CHECKLIST_CREATEDA checklist was created on a record
TODO_CHECKLIST_NAME_CHANGEDA checklist was renamed
TODO_CHECKLIST_DELETEDA checklist was deleted
TODO_CHECKLIST_ITEM_CREATEDA checklist item was created
TODO_CHECKLIST_ITEM_NAME_CHANGEDA checklist item was renamed
TODO_CHECKLIST_ITEM_DELETEDA checklist item was deleted
TODO_CHECKLIST_ITEM_DUE_DATE_ADDEDA due date was added to a checklist item
TODO_CHECKLIST_ITEM_DUE_DATE_UPDATEDA checklist item’s due date was changed
TODO_CHECKLIST_ITEM_DUE_DATE_REMOVEDA due date was removed from a checklist item
TODO_CHECKLIST_ITEM_ASSIGNEE_ADDEDAn assignee was added to a checklist item
TODO_CHECKLIST_ITEM_ASSIGNEE_REMOVEDAn assignee was removed from a checklist item
TODO_CHECKLIST_ITEM_DONE_STATUS_UPDATEDA checklist item was marked done or undone

List Events

EventDescription
TODO_LIST_CREATEDA list was created in a workspace
TODO_LIST_DELETEDA list was deleted
TODO_LIST_NAME_CHANGEDA list was renamed

Custom Field Events

EventDescription
CUSTOM_FIELD_CREATEDA custom field was created
CUSTOM_FIELD_DELETEDA custom field was deleted
CUSTOM_FIELD_UPDATEDA custom field definition was updated

Tag Events

EventDescription
TAG_CREATEDA tag was created
TAG_DELETEDA tag was deleted
TAG_UPDATEDA tag was updated

Comment Events

EventDescription
COMMENT_CREATEDA comment was created
COMMENT_DELETEDA comment was deleted
COMMENT_UPDATEDA comment was updated

Required Permissions

Webhooks are user-scoped. You can only create webhooks for workspaces you are a member of.

RequirementDescription
Authenticated userYou must be logged in
Workspace membershipYou must be a member of every workspace specified in projectIds

Error Responses

Invalid URL

{
  "errors": [{
    "message": "url is not valid",
    "extensions": {
      "code": "BAD_USER_INPUT"
    }
  }]
}

When: The provided url is not a valid URL format.

Private URL Rejected

{
  "errors": [{
    "message": "URL points to a private network",
    "extensions": {
      "code": "BAD_USER_INPUT"
    }
  }]
}

When: The provided url resolves to a private or internal network address.

Unauthorized Workspace Access

{
  "errors": [{
    "message": "Unauthorized",
    "extensions": {
      "code": "UNAUTHORIZED"
    }
  }]
}

When: One or more of the provided projectIds refer to workspaces you are not a member of.

Verifying Webhook Signatures

When Blue sends a webhook event, it includes an X-Signature header containing an HMAC SHA-256 hash of the request body, signed with your webhook’s secret. To verify:

const crypto = require('crypto');

function verifySignature(body, signature, secret) {
  const hash = crypto
    .createHmac('sha256', secret)
    .update(JSON.stringify(body))
    .digest('hex');
  return hash === signature;
}

Important Notes

  • Webhooks are user-scoped – each user manages their own webhooks independently.
  • The secret is generated automatically and only returned once at creation time. Store it securely.
  • If no events are specified, the webhook will not receive any notifications until events are configured via the updateWebhook mutation.
  • If no projectIds are specified, the webhook applies across all workspaces you are a member of.
  • URLs must be publicly accessible; private network addresses (localhost, 10.x.x.x, 192.168.x.x, etc.) are rejected.
  • New webhooks are created in a HEALTHY status. The status changes to UNHEALTHY if delivery failures occur.