Please note: the IP ranges returned from the API may change over time. By regularly retrieving the latest IP ranges using this API, you’ll ensure that you’re not using a stale list of HubSpot-related IP addresses in your firewall or network configuration.
Retrieve IP range data in JSON format
To retrieve active HubSpot IP addresses, make aGET request to /meta/network-origins/2026-09-beta/ip-ranges.
The response will resemble the following:
results returned in the response will include the following properties:
| Property | Type | Description |
|---|---|---|
cidr | String | The range of IP addresses used for a specific purpose in HubSpot. |
direction | String | Denotes the direction of IP traffic. Available values are: "INGRESS", "EGRESS". |
service | String | Denotes the nature of the service for the IP addresses. Values include: "EMAIL", "API", "DNS", "WEB_SCRAPING". |
description | String | Details about the purpose of the set of IP addresses. |
Retrieve IP range data in plaintext format
If you just want to retrieve HubSpot’s IP address data in plaintext format, you can make aGET request to /meta/network-origins/2026-09-beta/ip-ranges/simple and include a header of Accept: text/plain in your request. This will filter the results to just the IP address ranges themselves with none of the other properties in the table above.
The response will resemble the following:
Webhook notifications
Subscribe to IP range changes via webhooks. When HubSpot adds, updates, or removes IP ranges, your endpoint receives a signedPOST request with the change details.
Requirements
Scope requirements
Scope requirements
Subscribe to IP range change notifications
To subscribe to IP range changes from HubSpot, make aPOST request to /meta/network-origins/2026-09-beta/ip-ranges/webhook-subscriptions/{appId}. In the body of your request, include the URL of your backend service as the webhookUrl property. The URL must be a valid HTTPS. If it isn’t, the endpoint will return a 400 Bad Request.
For example, the following request body would specify https://example.com/my-webhook-endpoint as the callback URL:
201 Created response will resemble the following:
id returned, is the subscription ID, which you will need when you test your subscription.
If you attempt to register a URL that’s already been registered, you’ll receive a 409 Conflict.
Test your webhook subscription
Once registered, you can test the subscription by making aPOST request to /meta/network-origins/2026-09-beta/ip-ranges/webhook-subscriptions/{appId}/{subscription-id}/test, supplying the subscription ID found in the response you received when you registered your subscription as the subscriptionId path parameter, along with the ID of your app.
A successful request returns 200 OK with no response body. Your backend service will receive a test webhook payload to your configured callback URL, shown in the code block below:
| Property | Type | Description |
|---|---|---|
timestamp | String | An ISO 8601 formatted timestamp denoting when the event was fired. |
event | Object | An object containing details about the webhook payload, which contains the following properties:
|
ipRange sub-property within the event field contains the following properties:
| Property | Type | Description |
|---|---|---|
cidr | String | The range of IP addresses used for a specific purpose in HubSpot. |
direction | String | Denotes the direction of IP traffic. Available values are: "INGRESS", "EGRESS". |
service | String | Denotes the nature of the service for the IP addresses. Values include: "EMAIL", "API", "DNS", "WEB_SCRAPING", and "TEST_SERVICE". |
description | String | Details about the purpose of the set of IP addresses. |
Validate the signature
Webhook requests are signed using the standard HubSpot webhook signature (v3). Learn more about how to validate incoming requests using your app’s client secret.Delivery behavior
- Webhooks are delivered as signed POST requests with a JSON body and a 30-second timeout per delivery.
- Each event is delivered once per subscription. If a delivery succeeds, the same event won’t be resent to that subscription.
- If your endpoint returns a non-2xx status or times out, the delivery is recorded as failed. There are no automatic retries. Failed deliveries are logged but not reattempted on a schedule.
- Events are processed in batches. Multiple IP range changes that occur close together may each trigger a separate webhook delivery to your endpoint.
Retrieve webhook subscriptions
Retrieve a collection of all webhooks for your app by making aGET request to /meta/network-origins/2026-09-beta/ip-ranges/webhook-subscriptions/{appId}, supplying the ID of your app as the appId path parameter.
A successful response will resemble the following:
Delete webhook subscriptions
Delete webhook subscriptions for your app by making aDELETE request to /meta/network-origins/2026-09-beta/ip-ranges/webhook-subscriptions/{appId}/{subscriptionId}, supplying the subscription ID found in the response you received when you registered your subscription as the subscriptionId path parameter, along with the ID of your app. No further notifications will be sent to the deleted subscription’s URL.
A successful request returns 204 No Content with no response body.