The subscriptions API allows you to manage event subscriptions for your app. Additional endpoints also allow you to create snapshots of CRM objects at specific points in time, or filter the events that you’re subscribed to.Documentation Index
Fetch the complete documentation index at: https://developers.hubspot.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
Before you get started
You’ll need to generate a client credentials token to use the webhook management API. More information on how to generate this token is available in the authentication section of overview article.Create and manage subscriptions
The sections below provide details on how to create and manage webhook subscriptions.Create or update a subscription
To create a new subscription, first ensure your client credentials token was generated with thedeveloper.webhooks_journal.subscriptions.write scope specified. Then make a POST request to /webhooks-journal/subscriptions/2026-03. In the body of your request, include the properties for the subscription you want to create, detailed in the table below.
| Field | Type | Description |
|---|---|---|
objectTypeId | String | The object type identifier (e.g., "0-1" for contacts). Required for OBJECT and ASSOCIATION subscriptions, but not applicable for LIST_MEMBERSHIP subscriptions. |
subscriptionType | String | Type of subscription. Available types are: OBJECT, ASSOCIATION, APP_LIFECYCLE_EVENT, or LIST_MEMBERSHIP. |
portalId | Number | The ID of the HubSpot account to subscribe to events for. |
actions | Array | A list of actions to subscribe to. The following actions are available for OBJECT subscriptions:
The following actions are available for LIST_MEMBERSHIP subscriptions:
|
properties | Array | Specific properties to include in events. Applies to OBJECT subscription events only. |
objectIds | Array | Specific object IDs to subscribe to. Applies to both OBJECT and LIST_MEMBERSHIP subscriptions. |
associatedObjectTypeIds | Array | Associated object types to include. Applies to ASSOCIATION subscriptions only. |
listIds | Array | Specific list IDs to monitor for membership changes. If empty or omitted, the subscription will apply to all lists. Applies to LIST_MEMBERSHIP subscriptions only. |
subscriptionType of OBJECT to subscribe to creation and deletion events for a set of specific contacts, as well as any updates to the email, first name, or last name properties of those contacts.
subscriptionType of ASSOCIATION, which will trigger any time a set of specific contacts (provided via the objectIds field) are associated with a company, or if any existing associations are removed:
LIST_MEMBERSHIP subscription, which will trigger whenever records are added to or removed from specific lists. If you provide an empty array for the listIds property or omit it entirely, the subscription will apply to all lists:
Create an app install or uninstall event subscription
To subscribe to app install or app uninstall events, use your client credentials token to make aPOST request to /webhooks-journal/subscriptions/2026-03 with the following request body:
eventTypeId) are available based on the event you want to subscribe to:
4-1909196: App install event4-1916193: App uninstall event
Get all subscriptions
To retrieve all subscriptions, authorize thedeveloper.webhooks_journal.subscriptions.read scope for your app, then make a GET request to /webhooks-journal/subscriptions/2026-03.
The response will resemble the following:
Delete a subscription
To delete a specific subscription by its ID, authorize thedeveloper.webhooks_journal.subscriptions.write scope for your app, then make a DELETE request to /webhooks-journal/subscriptions/2026-03/{subscriptionId}.
For example, if the ID of the subscription you want to delete is 789, you’d make a DELETE request to https://api.hubapi.com/webhooks-journal/subscriptions/2026-03/789.
A successful request will result in a response of 204 No Content.
Delete all subscriptions for an account
To delete all subscriptions for a specific HubSpot account, authorize thedeveloper.webhooks_journal.subscriptions.write scope for your app, then make a DELETE request to /webhooks-journal/subscriptions/2026-03/portals/{portalId}, using the ID of the HubSpot account as the portalId path parameter.
A successful deletion request will return a response of 204 No Content.
Subscription filters
Subscription filters allow you to attach additional filtering criteria to an existing subscription, further narrowing which events are written to the journal. If you omit filters, then all events matching the subscription criteria will be delivered. Multiple filters can be specified for a subscription. An event is delivered when it satisfies any attached filter (OR logic across filters). Within a single filter, all conditions must be satisfied for the filter to match (AND logic within a filter).
Create a filter
To create a webhook subscription filter, first ensure your client credentials token was generated with thedeveloper.webhooks_journal.subscriptions.write scope specified. Then, make a POST request to /webhooks-journal/subscriptions/2026-03/filters. In the request body, include the subscriptionId that the filter will apply to, along with the filter definition, detailed in the table below.
| Property | Type | Description |
|---|---|---|
subscriptionId | Number | The ID of the subscription to attach this filter to. |
filter.conditions | Array | Array of conditions (minimum 1). All conditions must match for the filter to pass. |
conditions[].filterType | String | Must be set to "CRM_OBJECT_PROPERTY". |
conditions[].property | String | The CRM property name to evaluate (e.g., "lifecycle_stage"). |
conditions[].operator | String | Comparison operator. See the filter operators table below. |
conditions[].value | String | Single value for scalar operators (EQ, N_EQ, LT, GT, LTE, GTE, CONTAINS, STARTS_WITH, ENDS_WITH). |
conditions[].values | Array | List of values for set operators (IN, NOT_IN). Must be non-empty. |
If you provide an
operator of IS_EMPTY or IS_NOT_EMPTY, you should omit value and values from the associated entry in the conditions array.cURL request to create a filter an existing CRM property change subscription to events where the record’s lifecycle change updated to customer.
Filter operators
| Operator | Description | Usesvalue | Uses values |
| --- | --- | --- | --- | --- |
| EQ | Property equals value (case-insensitive) | yes | no |
| N_EQ | Property does not equal value (case-insensitive) | yes | no |
| LT | Property is numerically less than value | yes | no |
| GT | Property is numerically greater than value | yes | no |
| LTE | Property is numerically less than or equal to value | yes | no |
| GTE | Property is numerically greater than or equal to value | yes | no |
| IS_EMPTY | Property is absent or empty | no | no |
| IS_NOT_EMPTY | Property is present and non-empty | no | no |
Note the following caveats and validation rules as you build out your filters:
- Scalar operators (
EQ,N_EQ,LT,GT,LTE,GTE,CONTAINS,STARTS_WITH,ENDS_WITH) require exact value. - When using null-check operators (
IS_EMPTYandIS_NOT_EMPTY), omit thevalueandvaluesin the associated entry of yourconditionsarray. - Sending both
valueandvalues, or omitting both when one is required, will return a validation error.
Retrieve a filter
To get an existing filter by its ID, ensure your client credentials token was generated with thedeveloper.webhooks_journal.subscriptions.read scope specified. Then make a GET request to /webhooks-journal/subscriptions/2026-03/filters/{filterId}.
The response will resemble the following:
Get filters by subscription
To retrieve all filters attached to a specific webhook subscription, first ensure your client credentials token was generated with thedeveloper.webhooks_journal.subscriptions.read scope specified. Then, make a GET request to /webhooks-journal/subscriptions/2026-03/filters/subscription/{subscriptionId}.
The response will include an array of filter objects, or an empty array if no filters are attached to the provided subscription ID.
Update a filter
Updating a filter is not currently supported. You’ll need to retrieve an existing filter, make any manual modifications to the JSON definition, then create a new filter with the updated definition. You can then delete the previous filter if it’s unused.Delete a filter
To delete a filter by its ID, first ensure your client credentials token was generated with thedeveloper.webhooks_journal.subscriptions.write scope specified. Then, make a GET request to /webhooks-journal/subscriptions/2026-03/filters/{filterId}.
A successful request will result in a response of 204 No Content, and events will no longer be evaluated against the deleted filter.
Common errors
Consult the table below for errors you might encounter when creating webhook subscription errors:| Error | Description |
|---|---|
SUBSCRIPTION_NOT_FOUND | The subscriptionId does not exist or belongs to a different app. |
FILTER_NOT_FOUND | The filterId does not exist or belongs to a different app. |
FILTER_INVALID_OPERATOR | Unsupported operator used |
FILTER_PROPERTY_BLANK | Property is null/empty/whitespace |
FILTER_PROPERTY_TOO_LONG | Condition Property Name > 256 characters |
FILTER_UNSUPPORTED_TYPE | Type isn’t supported |
FILTER_CONDITIONS_LIMIT_EXCEEDED | Too many conditions on a filter |
FILTER_LIMIT_EXCEEDED | Too many filters on a subscription |
FILTER_PROPERTY_VALUE_TOO_LONG | Condition value exceeded 256 characters |
FILTER_UNSUPPORTED_SUBSCRIPTION_ACTION | Filters on a non-CREATE/UPDATE subscription |
Rate limits
The following limits apply to the management and snapshot APIs:- Subscription management APIs: subject to a limit of 50 requests per second per app.
- Snapshot APIs: subject to a limit of 10 requests per second per app.