Social Analytics for a Post
One post's full metrics plus its day-by-day timeline
Published
/v1/social/analytics/posts/{postId}curl -X GET "https://api.orshot.com/v1/social/analytics/posts/<POST_ID>?from=<FROM>&to=<TO>&refresh=<REFRESH>" \
-H "Authorization: Bearer <ORSHOT_API_KEY>"const res = await fetch("https://api.orshot.com/v1/social/analytics/posts/<POST_ID>?from=<FROM>&to=<TO>&refresh=<REFRESH>", {
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/posts/<POST_ID>?from=<FROM>&to=<TO>&refresh=<REFRESH>",
headers={"Authorization": "Bearer <ORSHOT_API_KEY>"},
)
data = response.json()$ch = curl_init("https://api.orshot.com/v1/social/analytics/posts/<POST_ID>?from=<FROM>&to=<TO>&refresh=<REFRESH>");
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/posts/<POST_ID>?from=<FROM>&to=<TO>&refresh=<REFRESH>")
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 everything analytics knows about a single post: total metrics, per-platform results, sync status, and a daily timeline of impressions and engagement since it published.
For posts published through Orshot, :postId is the post id from the posts endpoints. For posts synced from your platforms, use the analytics_post_id from the analytics overview.
https://api.orshot.com/v1/social/analytics/posts/:postIdRequest#
await fetch("https://api.orshot.com/v1/social/analytics/posts/512", {
method: "GET",
headers: {
Authorization: "Bearer <ORSHOT_API_KEY>",
},
});{
"data": {
"post": {
"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",
"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/..."
}
],
"sync_status": "synced",
"sync_message": null
},
"timeline": [
{
"date": "2026-08-12",
"platform": "linkedin",
"impressions": 610,
"likes": 51,
"comments": 2
},
{
"date": "2026-08-13",
"platform": "linkedin",
"impressions": 180,
"likes": 15
}
]
}
}Right after publishing, sync_status is pending while the platform reports its first numbers. Poll with refresh=1 sparingly, or just wait a few minutes.
Query Parameters#
| Parameter | Type | Required | Description |
|---|---|---|---|
from | String | No | Timeline start date, YYYY-MM-DD |
to | String | No | Timeline end date, YYYY-MM-DD |
refresh | String | No | Pass 1 to bypass the cache and pull fresh numbers from the platforms |
Error Responses#
Not found (404)#
The post does not exist in this workspace, has no analytics yet, or an external analytics_post_id does not belong to this workspace's accounts.
Other errors match the analytics overview endpoint: 403 with code analytics_not_enabled, and 429 with 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 50+ integrations
- White-label embed for your own app
- 30 free credits — no credit card required