curl --request GET \
--url https://api.tryfuse.ai/api/v1/business/analytics/campaigns \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.tryfuse.ai/api/v1/business/analytics/campaigns"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.tryfuse.ai/api/v1/business/analytics/campaigns', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"range": "30d",
"email": {
"trend": {
"totals": {
"sent": 66,
"contacted": 40,
"sentWithOpenTracking": 66,
"contactedWithOpenTracking": 40,
"ai": 20,
"manual": 46,
"opened": 41,
"emailsOpened": 33,
"uniqueOpened": 28,
"clicked": 9,
"uniqueClicked": 7,
"replied": 6,
"positiveReplies": 2,
"bounced": 1,
"invalidated": 3
},
"series": [
{
"date": "Jul 27",
"isoDate": "2026-07-27",
"sent": 32,
"contacted": 21,
"sentWithOpenTracking": 32,
"contactedWithOpenTracking": 21,
"ai": 20,
"manual": 12,
"opened": 22,
"emailsOpened": 18,
"uniqueOpened": 15,
"clicked": 5,
"uniqueClicked": 4,
"replied": 4,
"positiveReplies": 1,
"bounced": 1,
"invalidated": 2
},
{
"date": "Aug 3",
"isoDate": "2026-08-03",
"sent": 34,
"contacted": 19,
"sentWithOpenTracking": 34,
"contactedWithOpenTracking": 19,
"ai": 0,
"manual": 34,
"opened": 19,
"emailsOpened": 15,
"uniqueOpened": 13,
"clicked": 4,
"uniqueClicked": 3,
"replied": 2,
"positiveReplies": 1,
"bounced": 0,
"invalidated": 1
}
]
}
},
"linkedin": {
"trend": {
"totals": {
"sent": 183,
"inmailsSent": 6,
"profileVisits": 46,
"postsLiked": 14,
"ai": 33,
"manual": 154,
"contacted": 168,
"invitesSent": 156,
"invitesAccepted": 52,
"replied": 29,
"positiveReplies": 4,
"bounced": 9
},
"series": [
{
"date": "Jul 27",
"isoDate": "2026-07-27",
"sent": 95,
"inmailsSent": 4,
"profileVisits": 30,
"postsLiked": 8,
"ai": 15,
"manual": 80,
"contacted": 132,
"invitesSent": 130,
"invitesAccepted": 38,
"replied": 20,
"positiveReplies": 3,
"bounced": 5
}
]
},
"topCampaigns": [
{
"campaignId": "69c50c3da19bd0c24ab4b503",
"campaignName": "Qa linkedin campaign",
"connectionRequestsSent": 132,
"connectionsAccepted": 130,
"repliesReceived": 29,
"positiveRepliesReceived": 0,
"acceptanceRate": 98.48,
"connectionReplyRate": 22.31,
"positiveReplyRate": 0
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Campaigns analytics roll-up
The campaigns insights tab in one response for the whole account (every campaign the token owner can see): the email trend and the LinkedIn trend — each as , where totals is the exact whole-window figure per metric and series one zero-filled point per bucket carrying the same fields — plus the top 10 LinkedIn campaigns by acceptance rate. Derive rates from totals; contacted is the distinct-contact count the per-contact metrics divide by (email and LinkedIn reply rate = replied / contacted, LinkedIn acceptance rate = invitesAccepted / invitesSent). Email open counts cover only emails sent while the campaign’s open tracking was on, so open rates divide by the tracked sends: uniqueOpened / contactedWithOpenTracking per contact, emailsOpened / sentWithOpenTracking per email. Every count is event-date attributed — each row lands in the bucket its event happened in — so the series describe volume over time and sum exactly to totals; do not divide one point’s engagement by the same point’s sends as a per-bucket rate, because opens, acceptances and replies lag their send and the two counts describe different people. Buckets are daily for 7d and ISO-weekly for 30d and 90d; each point’s date is its bucket’s start date as a display label (‘Jan 1’) with the same date as YYYY-MM-DD in isoDate. Each panel is computed independently and is null when its aggregation fails, so always null-check them. Per-campaign detail stays on GET /business/campaigns//stats. Rate limit: 20 requests per minute, 1000 per day.
Errors:
422VALIDATION_FAILED—rangewas sent and is not one of 7d, 30d or 90d.429RATE_LIMITED— Per-user quota for this endpoint family exceeded (20 per minute, 1000 per day); retry after the Retry-After / RateLimit-Reset seconds.
Requires one of the following token scopes: analytics.
curl --request GET \
--url https://api.tryfuse.ai/api/v1/business/analytics/campaigns \
--header 'Authorization: Basic <encoded-value>'import requests
url = "https://api.tryfuse.ai/api/v1/business/analytics/campaigns"
headers = {"Authorization": "Basic <encoded-value>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Basic <encoded-value>'}};
fetch('https://api.tryfuse.ai/api/v1/business/analytics/campaigns', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"range": "30d",
"email": {
"trend": {
"totals": {
"sent": 66,
"contacted": 40,
"sentWithOpenTracking": 66,
"contactedWithOpenTracking": 40,
"ai": 20,
"manual": 46,
"opened": 41,
"emailsOpened": 33,
"uniqueOpened": 28,
"clicked": 9,
"uniqueClicked": 7,
"replied": 6,
"positiveReplies": 2,
"bounced": 1,
"invalidated": 3
},
"series": [
{
"date": "Jul 27",
"isoDate": "2026-07-27",
"sent": 32,
"contacted": 21,
"sentWithOpenTracking": 32,
"contactedWithOpenTracking": 21,
"ai": 20,
"manual": 12,
"opened": 22,
"emailsOpened": 18,
"uniqueOpened": 15,
"clicked": 5,
"uniqueClicked": 4,
"replied": 4,
"positiveReplies": 1,
"bounced": 1,
"invalidated": 2
},
{
"date": "Aug 3",
"isoDate": "2026-08-03",
"sent": 34,
"contacted": 19,
"sentWithOpenTracking": 34,
"contactedWithOpenTracking": 19,
"ai": 0,
"manual": 34,
"opened": 19,
"emailsOpened": 15,
"uniqueOpened": 13,
"clicked": 4,
"uniqueClicked": 3,
"replied": 2,
"positiveReplies": 1,
"bounced": 0,
"invalidated": 1
}
]
}
},
"linkedin": {
"trend": {
"totals": {
"sent": 183,
"inmailsSent": 6,
"profileVisits": 46,
"postsLiked": 14,
"ai": 33,
"manual": 154,
"contacted": 168,
"invitesSent": 156,
"invitesAccepted": 52,
"replied": 29,
"positiveReplies": 4,
"bounced": 9
},
"series": [
{
"date": "Jul 27",
"isoDate": "2026-07-27",
"sent": 95,
"inmailsSent": 4,
"profileVisits": 30,
"postsLiked": 8,
"ai": 15,
"manual": 80,
"contacted": 132,
"invitesSent": 130,
"invitesAccepted": 38,
"replied": 20,
"positiveReplies": 3,
"bounced": 5
}
]
},
"topCampaigns": [
{
"campaignId": "69c50c3da19bd0c24ab4b503",
"campaignName": "Qa linkedin campaign",
"connectionRequestsSent": 132,
"connectionsAccepted": 130,
"repliesReceived": 29,
"positiveRepliesReceived": 0,
"acceptanceRate": 98.48,
"connectionReplyRate": 22.31,
"positiveReplyRate": 0
}
]
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"param": "<string>",
"doc_url": "<string>",
"request_id": "<string>"
}
}Authorizations
Your API token (af_…) as the Basic-auth username, with an empty password.
Query Parameters
Rolling window ending now: 7d, 30d (default) or 90d, i.e. the roll-up covers the last 7, 30 or 90 days; time-series bucket sizes (daily, weekly, monthly) are chosen from the window length.
7d, 30d, 90d IANA timezone name (e.g. Europe/Kyiv, America/New_York) whose calendar days the time series is bucketed by: each bucket's isoDate / date is a local day, week, month or quarter in this zone. Offsets such as +03:00 are rejected. Default: UTC.
64