View subscriptions timeline for a portal
curl --request GET \
--url https://api.hubapi.com/email/public/v1/subscriptions/timelineimport requests
url = "https://api.hubapi.com/email/public/v1/subscriptions/timeline"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.hubapi.com/email/public/v1/subscriptions/timeline', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hubapi.com/email/public/v1/subscriptions/timeline",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.hubapi.com/email/public/v1/subscriptions/timeline"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.hubapi.com/email/public/v1/subscriptions/timeline")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hubapi.com/email/public/v1/subscriptions/timeline")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"hasMore": true,
"offset": "CK_PuKu3KBXr8LqG",
"timeline": [
{
"timestamp": 1401975207000,
"portalId": 62515,
"recipient": "6d4b537e-c5ac-11e3-a673-00262df65d03@some.email.com",
"changes": [
{
"change": "BOUNCED",
"source": "SOURCE_NON_DELIVERY_REPORT",
"portalId": 62515,
"changeType": "PORTAL_BOUNCE",
"causedByEvent": {
"id": "6d72d39c-87da-3ced-bfdf-5f0213363827",
"created": 1401975207000
}
}
]
},
{
"timestamp": 1400255007763,
"portalId": 62515,
"recipient": "tim@opas.com",
"changes": [
{
"change": "SUBSCRIBED",
"source": "SOURCE_RECIPIENT",
"portalId": 62515,
"subscriptionId": 2849,
"changeType": "SUBSCRIPTION_STATUS",
"causedByEvent": {
"id": "0d813e2c-ce7f-4510-9250-839cd08c967a",
"created": 1400255007763
}
},
{
"change": "SUBSCRIBED",
"source": "SOURCE_RECIPIENT",
"portalId": 62515,
"subscriptionId": 230318,
"changeType": "SUBSCRIPTION_STATUS",
"causedByEvent": {
"id": "0d813e2c-ce7f-4510-9250-839cd08c967a",
"created": 1400255007763
}
},
{
"change": "SUBSCRIBED",
"source": "SOURCE_RECIPIENT",
"portalId": 62515,
"changeType": "PORTAL_STATUS",
"causedByEvent": {
"id": "0d813e2c-ce7f-4510-9250-839cd08c967a",
"created": 1400255007763
}
}
]
},
{
"timestamp": 1399053958000,
"portalId": 62515,
"recipient": "testemail+535fe913a51ff@emailtest.com",
"changes": [
{
"change": "BOUNCED",
"source": "SOURCE_NON_DELIVERY_REPORT",
"portalId": 62515,
"changeType": "PORTAL_BOUNCE",
"causedByEvent": {
"id": "cf568063-f12f-3a94-9c02-faccdc5f9bad",
"created": 1399053958000
}
}
]
}
]
}{
"status": "<string>",
"message": "<string>",
"correlationId": "<string>"
}v1
View subscriptions timeline for a portal
For a given portal, return a time-ordered list of subscription changes. Timeline items will be returned in reverse-chronological order.
GET
/
email
/
public
/
v1
/
subscriptions
/
timeline
View subscriptions timeline for a portal
curl --request GET \
--url https://api.hubapi.com/email/public/v1/subscriptions/timelineimport requests
url = "https://api.hubapi.com/email/public/v1/subscriptions/timeline"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.hubapi.com/email/public/v1/subscriptions/timeline', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.hubapi.com/email/public/v1/subscriptions/timeline",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.hubapi.com/email/public/v1/subscriptions/timeline"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.hubapi.com/email/public/v1/subscriptions/timeline")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.hubapi.com/email/public/v1/subscriptions/timeline")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"hasMore": true,
"offset": "CK_PuKu3KBXr8LqG",
"timeline": [
{
"timestamp": 1401975207000,
"portalId": 62515,
"recipient": "6d4b537e-c5ac-11e3-a673-00262df65d03@some.email.com",
"changes": [
{
"change": "BOUNCED",
"source": "SOURCE_NON_DELIVERY_REPORT",
"portalId": 62515,
"changeType": "PORTAL_BOUNCE",
"causedByEvent": {
"id": "6d72d39c-87da-3ced-bfdf-5f0213363827",
"created": 1401975207000
}
}
]
},
{
"timestamp": 1400255007763,
"portalId": 62515,
"recipient": "tim@opas.com",
"changes": [
{
"change": "SUBSCRIBED",
"source": "SOURCE_RECIPIENT",
"portalId": 62515,
"subscriptionId": 2849,
"changeType": "SUBSCRIPTION_STATUS",
"causedByEvent": {
"id": "0d813e2c-ce7f-4510-9250-839cd08c967a",
"created": 1400255007763
}
},
{
"change": "SUBSCRIBED",
"source": "SOURCE_RECIPIENT",
"portalId": 62515,
"subscriptionId": 230318,
"changeType": "SUBSCRIPTION_STATUS",
"causedByEvent": {
"id": "0d813e2c-ce7f-4510-9250-839cd08c967a",
"created": 1400255007763
}
},
{
"change": "SUBSCRIBED",
"source": "SOURCE_RECIPIENT",
"portalId": 62515,
"changeType": "PORTAL_STATUS",
"causedByEvent": {
"id": "0d813e2c-ce7f-4510-9250-839cd08c967a",
"created": 1400255007763
}
}
]
},
{
"timestamp": 1399053958000,
"portalId": 62515,
"recipient": "testemail+535fe913a51ff@emailtest.com",
"changes": [
{
"change": "BOUNCED",
"source": "SOURCE_NON_DELIVERY_REPORT",
"portalId": 62515,
"changeType": "PORTAL_BOUNCE",
"causedByEvent": {
"id": "cf568063-f12f-3a94-9c02-faccdc5f9bad",
"created": 1399053958000
}
}
]
}
]
}{
"status": "<string>",
"message": "<string>",
"correlationId": "<string>"
}Scope requirements
Scope requirements
Query Parameters
Only return timeline changes of the specified type (case-sensitive).
Only return timeline items which occurred at or after the given timestamp (in milliseconds since epoch).
Only return timeline items which occurred at or before the given timestamp (in milliseconds since epoch).
Include the user's full subscription snapshot with each timeline item.
An offset token returned by a previous call to this endpoint.
The maximum number of timeline items to return. If omitted, the default value of 10 is used. The maximum allowed value is 1000.
Required range:
1 <= x <= 1000Last modified on March 25, 2026
Was this page helpful?
⌘I