Authentication and scopes
All API endpoints require OAuth 2.0 authentication. The webhooks journal API uses a client credentials token to authorize actions on behalf of your app. Instructions for setting up this token can be found in the authentication overview. Based on the webhook management and journal endpoints you plan on using, include the correspondingscopes when generating your client credentials token:
developer.webhooks_journal.read: access journal data.developer.webhooks_journal.subscriptions.read: retrieve subscription information.developer.webhooks_journal.subscriptions.write: create, update, and delete subscriptions.developer.webhooks_journal.snapshots.read: retrieve snapshot information.developer.webhooks_journal.snapshots.write: create and manage object snapshots.
crm.objects.contacts.read scope.
For example, to generate a client credentials token with all available webhook journal and management permissions, you’d make the following API call:
https://api.hubapi.com/oauth/v1/token endpoint will then return an access token you can include in the Authorization header of your requests:
How to use the management and journal APIs
The management, journal, and snapshot APIs are designed to be used together:- Use the management API endpoints to subscribe to specific events, or filter event data.
- After you’ve subscribed to specific events, you can use the journal API endpoints to access historical event data in chronological order. This allows you to query for subscription-related changes for the past three days. These endpoints are optimized for a performant response when checking object changes, especially compared to the alternative of using the CRM search API.
- Use the snapshots API endpoints to create snapshots of CRM objects at specific points in time.
Event data format
After you’ve created your webhook subscriptions, you can retrieve journal entries using the journal API endpoints. For example, when making aGET request to /webhooks-journal/journal/2026-03/earliest, the response will resemble the following:
url property in the response from these journal retrieval endpoints, the associated file contain JSON events in the following format:
Contact creation 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
Error response format
Error responses include details in the following format:Rate limits
The following rate limits apply to the webhooks journal and subscription management APIs:- Journal API: 100 requests per second per app
- Subscriptions API: 50 requests per second per app
- Snapshots API: 10 requests per second per app
429 Too Many Requests response with a Retry-After header indicating when you can retry.
Best practices
Keep the following best practices in mind 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
currentOffsetfrom 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.
- 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.
- Timing considerations: snapshots reflect object state at request time.