Skip to main content

Post Analytics

GET /developers/v1/analytics/{id}

Returns performance metrics for a published post, broken down by platform and aggregated into totals. Only posts with a status of posted have analytics available.

Request

Path parameters

ParameterTypeRequiredDescription
idintegerYesThe post ID to retrieve analytics for, as returned by Create Post or List Posts.

Headers

HeaderRequiredDescription
X-API-KEYYes*Your personal API key.
AuthorizationYes*Bearer token: Bearer sp_tok_xxxxxxx.

*Provide one of the two authentication headers.

No request body or query parameters are required.

Example request

curl https://api.schedpilot.com/developers/v1/analytics/8790 \
-H "X-API-KEY: smm_4a9f3c1e8b205d7a6e0f2c49b8d3a15f"

Response

Status: 200 OK

Top-level fields

FieldTypeDescription
post_idintegerThe post ID these analytics belong to.
breakdownarrayPer-platform metric snapshots (see below).
totalsobjectAggregated metrics across all platforms (see below).
engagement_ratenumber(likes + comments + shares) / impressions × 100, rounded to 2 decimal places. Returns 0 if impressions are zero.

Breakdown item fields

Each entry in breakdown corresponds to one platform account the post was published to.

FieldTypeDescription
platformstringPlatform type, e.g. "twitter", "linkedin".
account_idintegerThe connected account ID.
impressionsintegerNumber of times the post was displayed to users.
reachintegerNumber of unique users who saw the post.
clicksintegerNumber of link or post clicks.
likesintegerNumber of likes (or reactions on LinkedIn/Facebook).
commentsintegerNumber of comments or replies.
sharesintegerNumber of shares, retweets, or reposts.
snapshot_datestringThe date and time this metric snapshot was last synced, in YYYY-MM-DD HH:MM:SS format.

Totals fields

FieldTypeDescription
impressionsintegerSum of impressions across all platforms.
reachintegerSum of reach across all platforms.
clicksintegerSum of clicks across all platforms.
likesintegerSum of likes across all platforms.
commentsintegerSum of comments across all platforms.
sharesintegerSum of shares across all platforms.

Example response

{
"post_id": 8790,
"breakdown": [
{
"platform": "twitter",
"account_id": 12,
"impressions": 4820,
"reach": 3910,
"clicks": 217,
"likes": 143,
"comments": 28,
"shares": 61,
"snapshot_date": "2026-06-09 08:00:00"
},
{
"platform": "linkedin",
"account_id": 17,
"impressions": 2340,
"reach": 2105,
"clicks": 98,
"likes": 87,
"comments": 14,
"shares": 22,
"snapshot_date": "2026-06-09 06:15:00"
}
],
"totals": {
"impressions": 7160,
"reach": 6015,
"clicks": 315,
"likes": 230,
"comments": 42,
"shares": 83
},
"engagement_rate": 4.96
}

Error responses

StatusDescription
404 Not FoundNo post with the given ID exists, or the post belongs to a different user account.
422 Unprocessable EntityThe post exists but does not have a status of posted. Analytics are only available for published posts.
401 UnauthorizedMissing or invalid authentication credentials.
429 Too Many RequestsRead rate limit exceeded (60 requests/hour).

Notes

  • Published posts only. Call List Posts and check the status field before requesting analytics. Requesting analytics for a post with status scheduled, draft, or failed returns a 422 error.
  • LinkedIn analytics sync delay. LinkedIn's API delivers analytics data on a delayed schedule. SchedPilot syncs LinkedIn metrics more frequently for posts published within the last 7 days (approximately every 2–3 hours) and less frequently for older posts (once daily). You may see a delay of up to a few hours before LinkedIn numbers appear or update after a post goes live.
  • Metric availability varies by platform. Not all platforms expose every metric. For example, Twitter/X does not return a separate reach value distinct from impressions, and some platforms do not report clicks for organic posts. Fields for unavailable metrics are returned as 0.
  • Engagement rate formula. engagement_rate is calculated as (likes + comments + shares) / impressions × 100 across the post totals. If impressions is 0 (data not yet available), engagement_rate is 0.