Social Analytics Overview
Cross-account analytics for your social posts. Totals, per-post metrics and follower counts
Published ·Updated
/v1/social/analyticscurl -X GET "https://api.orshot.com/v1/social/analytics?platform=<PLATFORM>&account_id=10&source=<SOURCE>" \
-H "Authorization: Bearer <ORSHOT_API_KEY>"const res = await fetch("https://api.orshot.com/v1/social/analytics?platform=<PLATFORM>&account_id=10&source=<SOURCE>", {
method: "GET",
headers: {
Authorization: "Bearer <ORSHOT_API_KEY>",
},
});
const data = await res.json();import requests
response = requests.get(
"https://api.orshot.com/v1/social/analytics?platform=<PLATFORM>&account_id=10&source=<SOURCE>",
headers={"Authorization": "Bearer <ORSHOT_API_KEY>"},
)
data = response.json()$ch = curl_init("https://api.orshot.com/v1/social/analytics?platform=<PLATFORM>&account_id=10&source=<SOURCE>");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer <ORSHOT_API_KEY>",
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);require "net/http"
require "json"
uri = URI("https://api.orshot.com/v1/social/analytics?platform=<PLATFORM>&account_id=10&source=<SOURCE>")
req = Net::HTTP::Get.new(uri)
req["Authorization"] = "Bearer <ORSHOT_API_KEY>"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
data = JSON.parse(res.body)Overview#
Returns analytics for every post across your connected social accounts. This is the same data behind the Analytics page in your dashboard. Each post carries its metrics (impressions, reach, likes, comments, shares, saves, clicks, views, engagement rate), and the response includes follower counts per account.
Covers posts published through Orshot and posts synced from your connected platforms, so there is data from day one.
https://api.orshot.com/v1/social/analyticsRequest#
await fetch(
"https://api.orshot.com/v1/social/analytics?from=2026-08-01&to=2026-08-13&sort=engagement",
{
method: "GET",
headers: {
Authorization: "Bearer <ORSHOT_API_KEY>",
},
},
);{
"data": {
"analytics_available": true,
"overview": {
"total_posts": 42,
"published_posts": 38,
"scheduled_posts": 4,
"last_sync": "2026-08-13T11:25:38.000Z",
"stale_accounts": 0,
"refresh_triggered": false
},
"posts": [
{
"analytics_post_id": "665f1c0f8a2b3c0012ab34cd",
"post_id": 512,
"is_external": false,
"content": "Our new pricing is live.",
"status": "published",
"published_at": "2026-08-12T09:00:00.000Z",
"platform": "linkedin",
"post_url": "https://www.linkedin.com/feed/update/...",
"thumbnail_url": "https://storage.orshot.com/.../launch.png",
"media_type": "image",
"media_urls": ["https://storage.orshot.com/.../launch.png"],
"metrics": {
"impressions": 790,
"reach": 561,
"likes": 66,
"comments": 2,
"shares": 0,
"saves": 1,
"clicks": 2,
"engagement_rate": 8.7,
"last_updated": "2026-08-13T10:12:00.000Z"
},
"platforms": [
{
"platform": "linkedin",
"metrics": { "impressions": 790, "likes": 66 },
"sync_status": "synced",
"post_url": "https://www.linkedin.com/feed/update/..."
}
]
}
],
"accounts": [
{
"account_id": 15,
"platform": "linkedin",
"username": "acme-inc",
"follower_count": 930,
"followers_last_updated": "2026-08-13T10:12:00.000Z"
}
],
"pagination": { "page": 1, "limit": 50, "total": 1, "has_more": false }
}
}Query Parameters#
| Parameter | Type | Required | Description |
|---|---|---|---|
platform | String | No | Only posts on this platform, e.g. linkedin |
account_id | Integer | No | Only posts from this connected account |
source | String | No | all (default), orshot (published through Orshot) or external (synced from platform) |
from | String | No | Start date, YYYY-MM-DD |
to | String | No | End date, YYYY-MM-DD |
sort | String | No | Sort order: date, engagement, impressions, reach, likes, comments, shares, saves, clicks or views |
page | Integer | No | Page number |
refresh | String | No | Pass 1 to bypass the cache and pull fresh numbers from the platforms |
pagination has page, limit (the page size), total (posts across all pages) and has_more. Responses are cached briefly and refreshed in the background, so repeated calls are fast. post_id is set when a post was published through Orshot, so use it with the per-post analytics endpoint. External posts use analytics_post_id there instead. media_urls lists every image or video of a post published through Orshot, so a carousel has one URL per slide; it is empty for external posts, which only have thumbnail_url.
Error Responses#
Account not found (404)#
Returned when account_id is not a connected account in this workspace.
{
"error": "Social account not found"
}With no social accounts connected, you get 200 with empty data and "message": "No social accounts connected".
Analytics not enabled (403)#
Analytics is not available for this workspace yet. Contact hi@orshot.com if you need it.
{
"error": "Analytics is not enabled for this account.",
"code": "analytics_not_enabled"
}Rate limited (429)#
API analytics reads are limited to 10 requests per minute per workspace (responses are cached server-side, so polling faster buys nothing). The response includes a Retry-After header.
Ready to automate?
Start rendering images, PDFs and videos from your templates in under 2 minutes. Free plan, no credit card.
Get your API key- Image, PDF and video generation via API
- Visual editor with AI and smart layouts
- Zapier, Make, MCP and 40+ integrations
- White-label embed for your own app
- 100 free credits a month, no credit card required