Skip to Content
API ReferenceAnalytics

Analytics

Access engagement metrics for posts and accounts. Metrics are fetched from each platform and cached by VoxBurst.

Base URL

https://api.voxburst.io/v1/analytics

Date Range & Plan Limits

All analytics endpoints accept startDate and endDate as ISO 8601 datetime strings. Dates are clamped based on your plan:

PlanMax History
Free / Starter30 days
Pro / Agency365 days

Requests for data older than the plan limit are silently clamped to the earliest allowed date.


Get Post Metrics

GET /v1/analytics/posts/:postId

Retrieve engagement metrics for a specific post across all platforms it was published to.

Query Parameters

ParameterTypeDefaultDescription
startDatestring (ISO 8601)30 days agoStart of date range
endDatestring (ISO 8601)NowEnd of date range
granularitystringDAILYBucket size: HOURLY, DAILY, WEEKLY, MONTHLY
metricsstringAllComma-separated metric names to include
curl "https://api.voxburst.io/v1/analytics/posts/post_abc123" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "data": [ { "postId": "post_abc123", "platform": "TWITTER", "impressions": 1240, "engagements": 87, "likes": 52, "comments": 14, "shares": 21, "clicks": 0, "saves": 0, "collectedAt": "2026-04-09T12:00:00Z" } ] }

Get Account Metrics

GET /v1/analytics/accounts/:accountId

Retrieve metrics for a connected account over a time period.

Query Parameters

ParameterTypeDefaultDescription
startDatestring (ISO 8601)30 days agoStart of date range
endDatestring (ISO 8601)NowEnd of date range
granularitystringDAILYBucket size: HOURLY, DAILY, WEEKLY, MONTHLY
curl "https://api.voxburst.io/v1/analytics/accounts/acc_123?startDate=2026-03-01&endDate=2026-03-31" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "followerHistory": [...], "timeseries": [...], "totalFollowers": 12400, "followerGrowth": 210, "accountStatus": "active" }

For disconnected accounts, the response also includes disconnectedAt:

{ "followerHistory": [...], "timeseries": [...], "totalFollowers": 8300, "followerGrowth": null, "accountStatus": "disconnected", "disconnectedAt": "2026-05-14T09:22:11.000Z" }

Response Fields

FieldTypeDescription
accountStatusstringAlways present. Lowercase account status (e.g. "active", "disconnected")
disconnectedAtstring | undefinedISO 8601 timestamp of when the account was disconnected. Only present when accountStatus is "disconnected".

Disconnected accounts return cached data only. When accountStatus is "disconnected", no live fetch is attempted against the platform — only historical data stored in VoxBurst is returned. Use GET /v1/accounts?includeArchived=true to list disconnected accounts.

Error Codes

CodeHTTPDescription
404The accountId does not exist or does not belong to this workspace. Previously, unknown account IDs returned an empty 200 response; as of 2026-06-15 they return 404 Not Found.

Get Aggregate Metrics

GET /v1/analytics/aggregate

Aggregate metrics across all posts for a time period.

Query Parameters

ParameterTypeDefaultDescription
startDatestring (ISO 8601)30 days agoStart of date range
endDatestring (ISO 8601)NowEnd of date range
accountIdsstringAllComma-separated account IDs to filter by
platformsstringAllComma-separated platforms (e.g. TWITTER,LINKEDIN)
limitinteger10Number of top-performing posts to return (1–100)
curl "https://api.voxburst.io/v1/analytics/aggregate?startDate=2026-03-01&endDate=2026-03-31" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Get Analytics Overview

GET /v1/analytics/overview

High-level performance overview across all connected accounts and posts, with period-over-period comparisons.

Query Parameters

ParameterTypeDefaultDescription
startDatestring (ISO 8601)30 days agoStart of date range
endDatestring (ISO 8601)NowEnd of date range
curl "https://api.voxburst.io/v1/analytics/overview?startDate=2026-03-01&endDate=2026-03-31" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "summary": { "totalPosts": 42, "totalImpressions": 95400, "totalEngagements": 3812, "averageEngagementRate": 3.99, "weightedEngagementRate": 4.12, "totalReach": 78200, "videoViews": 12400 }, "comparison": { "previousPeriod": { "start": "2026-02-01T00:00:00.000Z", "end": "2026-02-28T23:59:59.999Z" }, "deltas": { "impressions": { "previous": 82100, "change": 16.2 }, "engagements": { "previous": 3100, "change": 23.0 }, "engagementRate": { "previous": 3.77, "change": 5.8 }, "weightedEngagementRate": { "previous": 3.91, "change": 5.4 }, "posts": { "previous": 35, "change": 20.0 }, "totalReach": { "previous": 68000, "change": 15.0 } } }, "bestPostingSlot": { "dayOfWeek": 2, "hour": 10, "avgEngagementRate": 5.8 }, "topPosts": [ "..." ], "byPlatform": { "..." : "..." }, "period": { "start": "2026-03-01T00:00:00.000Z", "end": "2026-03-31T23:59:59.999Z" } }

Each deltas entry has shape { previous: number, change: number | null } where change is a percentage. A null change means the previous value was 0. The previous period is automatically computed as the same duration immediately before the requested range.


Get Analytics Time Series

GET /v1/analytics/timeseries

Impression and engagement time series grouped by date bucket. Results are cached in Redis for 30 minutes.

Query Parameters

ParameterTypeDefaultDescription
startDatestring (ISO 8601)30 days agoStart of date range
endDatestring (ISO 8601)NowEnd of date range
granularitystringDAILYBucket size: DAILY, WEEKLY, or MONTHLY (HOURLY is not supported for timeseries)
accountIdsstringAllComma-separated account IDs to filter by
platformsstringAllComma-separated platforms to filter by
curl "https://api.voxburst.io/v1/analytics/timeseries?granularity=WEEKLY" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "granularity": "DAILY", "series": [ { "date": "2026-03-01", "impressions": 4200, "engagements": 163, "engagementRate": 3.88, "posts": 3 } ], "totals": { "impressions": 95400, "engagements": 3812, "engagementRate": 3.99, "posts": 42 }, "period": { "start": "2026-03-01T00:00:00.000Z", "end": "2026-03-31T00:00:00.000Z" } }

Refresh Post Metrics

POST /v1/analytics/posts/:postId/refresh

Force a fresh fetch of metrics from the platform. Use sparingly — metrics are automatically refreshed on a schedule.

curl -X POST https://api.voxburst.io/v1/analytics/posts/post_abc123/refresh \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "data": [ "..." ], "refreshedAt": "2026-04-09T12:00:00.000Z" }

Refresh Account Metrics

POST /v1/analytics/accounts/:accountId/refresh

Force a refresh of account-level metrics from the platform.

curl -X POST https://api.voxburst.io/v1/analytics/accounts/acc_123/refresh \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Get Account Time Series

GET /v1/analytics/account-timeseries

Impression and engagement time series scoped to specific accounts or platforms. Useful for per-account trend charts.

Query Parameters

ParameterTypeDefaultDescription
startDatestring (ISO 8601)30 days agoStart of date range
endDatestring (ISO 8601)NowEnd of date range
granularitystringDAILYBucket size: DAILY, WEEKLY, or MONTHLY (HOURLY is not supported)
accountIdsstringAllComma-separated account IDs to filter by
platformsstringAllComma-separated platforms to filter by
curl "https://api.voxburst.io/v1/analytics/account-timeseries?granularity=WEEKLY" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

Each series entry contains the standard date/impressions/engagements fields plus a dynamic key for each platform’s follower count:

{ "series": [ { "date": "2026-03-01", "impressions": 4200, "engagements": 163, "TWITTER": 12400, "INSTAGRAM": 8300 } ] }

The platform keys (e.g. TWITTER, INSTAGRAM) represent follower count for that platform on that date. Only platforms with data appear.


Get Posting Heatmap

GET /v1/analytics/posting-heatmap

Returns average engagement rate by day-of-week and hour-of-day for the trailing 90-day window. Use this to identify the best times to post. Results are cached in Redis for 30 minutes.

curl "https://api.voxburst.io/v1/analytics/posting-heatmap" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "slots": [ { "dayOfWeek": 1, "hour": 9, "avgEngagementRate": 4.8, "postCount": 12 } ], "minPostsForReliability": 3 }

minPostsForReliability is always 3. Slots with fewer than 3 posts should be treated as low-confidence.


Get Audience Growth

GET /v1/analytics/audience-growth

Follower growth and timeseries per platform. Returns current follower counts, net growth over the requested period, and a bucketed timeseries of follower counts.

Query Parameters

ParameterTypeDefaultDescription
startDatestring (ISO 8601)30 days agoStart of date range
endDatestring (ISO 8601)NowEnd of date range
granularitystringDAILYBucket size: DAILY, WEEKLY, or MONTHLY
curl "https://api.voxburst.io/v1/analytics/audience-growth?startDate=2026-03-01&endDate=2026-03-31" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "totalFollowers": 24800, "totalGrowth": 420, "byPlatform": [ { "platform": "TWITTER", "followers": 12400, "growth": 210, "growthPct": 1.72 }, { "platform": "INSTAGRAM", "followers": 12400, "growth": 210, "growthPct": 1.72 } ], "timeseries": [ "..." ], "platforms": ["TWITTER", "INSTAGRAM"], "period": { "start": "2026-03-01T00:00:00.000Z", "end": "2026-03-31T23:59:59.999Z" } }

Get Content Decay

GET /v1/analytics/content-decay

Returns average engagement rate grouped by days-since-publish buckets. Use this to understand how quickly engagement drops off for your content.

curl "https://api.voxburst.io/v1/analytics/content-decay?startDate=2026-01-01&endDate=2026-03-31" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "buckets": [ { "label": "Day 0", "from": 0, "to": 0, "avgEngagementRate": 6.2, "avgEngagements": 48, "avgImpressions": 774, "sampleSize": 12 }, { "label": "1–2d", "from": 1, "to": 2, "avgEngagementRate": 3.8, "avgEngagements": 29, "avgImpressions": 763, "sampleSize": 12 }, { "label": "3–6d", "from": 3, "to": 6, "avgEngagementRate": 1.9, "avgEngagements": 14, "avgImpressions": 737, "sampleSize": 12 }, { "label": "7–13d", "from": 7, "to": 13, "avgEngagementRate": 0.8, "avgEngagements": 6, "avgImpressions": 750, "sampleSize": 12 }, { "label": "14–29d", "from": 14, "to": 29, "avgEngagementRate": 0.3, "avgEngagements": 2, "avgImpressions": 667, "sampleSize": 10 }, { "label": "30+d", "from": 30, "to": null, "avgEngagementRate": 0.1, "avgEngagements": 1, "avgImpressions": 1000,"sampleSize": 4 } ], "halfLifeDays": 2.4, "hasData": true, "period": { "start": "2026-01-01T00:00:00.000Z", "end": "2026-03-31T23:59:59.999Z" } }

The buckets are always the same 6 windows: Day 0, 1–2d, 3–6d, 7–13d, 14–29d, and 30+d. halfLifeDays is the estimated number of days until engagement falls to half its Day 0 value. When hasData is false, the buckets array is empty.


Get Hashtag Performance

GET /v1/analytics/hashtag-performance

Returns the top hashtags from published posts ranked by average engagement rate. Hashtags are parsed from post content; only posts with engagement metric data are ranked by ER — posts without metrics are counted but sorted lower.

Query Parameters

ParameterTypeDefaultDescription
startDatestring (ISO 8601)30 days agoStart of date range
endDatestring (ISO 8601)NowEnd of date range
accountIdsstringAllComma-separated account IDs to filter by
limitinteger20Number of hashtags to return (1–50)
curl "https://api.voxburst.io/v1/analytics/hashtag-performance?limit=10" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "hashtags": [ { "tag": "productlaunch", "postCount": 8, "avgEngagementRate": 5.4, "totalImpressions": 42000, "totalEngagements": 2268, "topPlatforms": ["INSTAGRAM", "LINKEDIN", "TWITTER"] }, { "tag": "socialmedia", "postCount": 14, "avgEngagementRate": 3.1, "totalImpressions": 61000, "totalEngagements": 1891, "topPlatforms": ["TWITTER", "INSTAGRAM"] } ], "hasMetricsData": true, "period": { "start": "2026-05-08T00:00:00.000Z", "end": "2026-06-07T00:00:00.000Z" } }

avgEngagementRate, totalImpressions, and totalEngagements are null when no metric data is available for posts using that hashtag. When hasMetricsData is false, results are sorted by postCount instead of engagement rate.


Get Content Type Performance

GET /v1/analytics/content-types

Returns performance broken down by content type (TEXT, IMAGE, VIDEO, REEL, etc.). Helps identify which formats drive the most engagement in your workspace.

Query Parameters

ParameterTypeDefaultDescription
startDatestring (ISO 8601)30 days agoStart of date range
endDatestring (ISO 8601)NowEnd of date range
accountIdsstringAllComma-separated account IDs to filter by
curl "https://api.voxburst.io/v1/analytics/content-types?startDate=2026-05-01&endDate=2026-06-01" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "types": [ { "type": "IMAGE", "postCount": 24, "avgEngagementRate": 4.8, "avgImpressions": 3200, "avgEngagements": 154, "totalImpressions": 76800, "totalEngagements": 3696 }, { "type": "TEXT", "postCount": 18, "avgEngagementRate": 2.1, "avgImpressions": 1800, "avgEngagements": 38, "totalImpressions": 32400, "totalEngagements": 684 } ], "period": { "start": "2026-05-01T00:00:00.000Z", "end": "2026-06-01T00:00:00.000Z" } }

avgEngagementRate is 0 when no metric data is available for that content type. Only content types with at least one published post in the date range appear.


Get AI Insights

GET /v1/analytics/insights

Returns three AI-generated insights based on workspace analytics. Insights are structured and categorized — suitable for display in dashboards or programmatic action.

Paid plan required. This endpoint returns { unavailable: true, reason: "upgrade_required" } for free plan workspaces. A system-level AI provider must also be configured by a VoxBurst admin — if not configured, it returns reason: "provider_not_configured" or reason: "key_not_configured".

Query Parameters

ParameterTypeDefaultDescription
startDatestring (ISO 8601)30 days agoStart of date range
endDatestring (ISO 8601)NowEnd of date range
accountIdsstringAllComma-separated account IDs to filter by
buststringAny non-empty value bypasses the 2-hour Redis cache and forces a fresh AI call
curl "https://api.voxburst.io/v1/analytics/insights?startDate=2026-05-08&endDate=2026-06-07" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response — success

{ "insights": [ { "type": "warning", "category": "zero_impressions", "priority": 1, "text": "Facebook posted 12 times with 0 impressions recorded.", "detail": "Zero impressions typically means the Facebook API connection has stopped returning data or the account has been disconnected. Go to Settings → Accounts, find Facebook, and reconnect it.", "action": "Review Accounts", "actionRoute": "/settings/accounts" } ], "generatedAt": "2026-06-07T10:00:00.000Z" }

Response — unavailable

{ "insights": [], "generatedAt": "2026-06-07T10:00:00.000Z", "unavailable": true, "reason": "upgrade_required" }

Possible reason values: upgrade_required (free plan), feature_disabled (admin toggle), provider_not_configured (no AI provider set up), key_not_configured (API key missing).

Insight shape

FieldTypeDescription
typestringpositive, warning, or recommendation
categorystringdata_anomaly, zero_impressions, engagement_gap, format_performance, cadence_drop, audience_growth, insufficient_data, or onboarding
priorityinteger1 (highest) to 3 (lowest) — insights are sorted priority 1 → 3
textstringHeadline — max 12 words, includes at least one concrete number
detailstring1–3 sentences with a specific actionable workflow
actionstring | nullCTA label, or null
actionRoutestring | nullIn-app route or #anchor, or null

Results are cached for 2 hours. Pass bust=1 to force fresh generation.


Get Publishing Calendar

GET /v1/analytics/publishing-calendar

Returns post count per calendar day for a trailing window. Used to render the publishing activity heatmap calendar.

Query Parameters

ParameterTypeDefaultDescription
weeksinteger52Trailing weeks to include (1–52)
curl "https://api.voxburst.io/v1/analytics/publishing-calendar?weeks=12" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "days": [ { "date": "2026-03-15", "count": 3 }, { "date": "2026-03-16", "count": 1 }, { "date": "2026-03-18", "count": 5 } ] }

Only days with at least one published post appear. Days with zero posts are omitted. Results are cached for 30 minutes.


Get Content Themes

GET /v1/analytics/content-themes

Extracts word frequency from published post content (filtered against a stop-word list) and joins with engagement metrics. Returns the most common meaningful words alongside their average engagement rate.

Query Parameters

ParameterTypeDefaultDescription
startDatestring (ISO 8601)30 days agoStart of date range
endDatestring (ISO 8601)NowEnd of date range
accountIdsstringAllComma-separated account IDs to filter by
limitinteger25Number of words to return (5–50)
curl "https://api.voxburst.io/v1/analytics/content-themes?limit=20" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"

Response

{ "words": [ { "word": "launch", "count": 12, "avgEngagementRate": 5.2 }, { "word": "product", "count": 18, "avgEngagementRate": 4.1 }, { "word": "team", "count": 9, "avgEngagementRate": 3.8 } ], "period": { "start": "2026-05-08T00:00:00.000Z", "end": "2026-06-07T00:00:00.000Z" } }

Words shorter than 4 characters and common English stop words are excluded. Only words appearing in 2 or more posts are returned. avgEngagementRate is 0 when no metric data is available.


Analytics Goals

Get Goals

GET /v1/analytics/goals

Returns the workspace’s analytics goals.

curl "https://api.voxburst.io/v1/analytics/goals" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"
{ "goals": { "followers": 50000, "impressions": 500000, "engagements": 20000, "posts": 60 } }

Any goal field is null if not set.

Set Goals

POST /v1/analytics/goals

Sets analytics goals for the workspace. All fields are optional — omitted fields are set to null.

curl -X POST "https://api.voxburst.io/v1/analytics/goals" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "followers": 50000, "impressions": 500000, "engagements": 20000, "posts": 60 }'

Request Body

FieldTypeDescription
followersnumber | nullTarget total follower count
impressionsnumber | nullTarget total impressions
engagementsnumber | nullTarget total engagements
postsnumber | nullTarget posts published

Returns { goals } with the saved values.


Analytics Report Schedule

Get Report Schedule

GET /v1/analytics/report-schedule

Returns the workspace’s current email report schedule.

curl "https://api.voxburst.io/v1/analytics/report-schedule" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"
{ "schedule": { "enabled": true, "frequency": "weekly", "recipients": ["alice@example.com", "bob@example.com"] } }

Defaults to { enabled: false, frequency: "weekly", recipients: [] } when not configured.

Set Report Schedule

POST /v1/analytics/report-schedule

Configures the workspace’s automated analytics email report. Up to 10 recipients.

curl -X POST "https://api.voxburst.io/v1/analytics/report-schedule" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "enabled": true, "frequency": "weekly", "recipients": ["alice@example.com"] }'

Request Body

FieldTypeDescription
enabledbooleanWhether automated reports are active
frequencystring"weekly" or "monthly"
recipientsstring[]Email addresses to send to (max 10)

Returns { schedule } with the saved configuration.


Send Analytics Report

POST /v1/analytics/send-report

Sends an analytics email report immediately. If recipients is omitted, uses the addresses configured in the report schedule. Returns 400 if no recipients are found.

curl -X POST "https://api.voxburst.io/v1/analytics/send-report" \ -H "Authorization: Bearer vb_live_xxxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "recipients": ["alice@example.com"] }'

Request Body

FieldTypeDescription
recipientsstring[]Optional. Override recipient list for this send. Falls back to scheduled recipients if omitted.

Response — success

{ "sent": true, "recipients": ["alice@example.com"] }

Response — no recipients

{ "error": "No recipients configured" }

HTTP 400. Configure recipients via POST /v1/analytics/report-schedule or pass them in the request body.

Last updated on