Every client dashboard ends up needing the same handful of numbers: how many people saw a post, how many engaged, and how the account grew. The arithmetic is easy. The hard part is that Instagram calls it reach, Facebook renamed its impressions to media views in June 2026, TikTok only gives you a snapshot, and every network has its own OAuth flow, permission review and rate limit.
This guide is a reference for developers building reporting into a product. It covers what a social media analytics API actually is, which metrics each network exposes in 2026, the permissions you need to read them, what changed this year, and how to get all of it from one endpoint instead of seven integrations.
What is a social media analytics API?
A social media analytics API is an interface that returns performance data for social content and accounts: impressions, reach, views, likes, comments, shares, clicks, follower counts and engagement rate. You call it from your own code, so the numbers can feed a dashboard, a client report, a data warehouse or an AI agent.
The term covers two different products, and mixing them up is the most common reason teams pick the wrong tool:
- Owned-account analytics. Metrics for accounts that have authorized your app, and for the posts those accounts published. This is what the native network APIs (Graph API insights, LinkedIn Community Management, TikTok Display API) give you, and it is what you need for client reporting, scheduling tools and creator dashboards.
- Social listening and data collection. Public posts across the web, competitor accounts, keyword and hashtag tracking. This is a different category with different vendors, data licensing rules and prices.
This guide is about the first kind. If you need competitor benchmarks or brand monitoring, a listening provider is the right tool, and no publishing API (including Outstand) will replace it.
Post analytics vs account analytics
Analytics splits into two grains, and they come from different platform endpoints, refresh on different schedules and belong in different tables:
- Post-level analytics answer "how did this piece of content do?": impressions, reach, views, likes, comments, shares, saves, clicks and, for video, watch time.
- Account-level analytics answer "how is this account doing?": followers, follower growth, and engagement totals over a date range.
Some networks support a date range on account metrics. Others only give you the value as of right now. If a network is snapshot-only, the only way to get a trend line is to store snapshots yourself on a schedule. Start collecting on day one, because nobody can backfill that history for you later.
Metrics by network in 2026
The table below summarizes what you can read for an authorized account on each major network, as exposed through Outstand's account metrics endpoint. The native APIs underneath differ in naming and shape, but the coverage is the same: if a network does not expose a metric, no wrapper can invent it.
Network | Account metrics | Date range | Notes |
|---|---|---|---|
Followers, following, media count, views, likes, comments, shares, saves, reach, accounts engaged, total interactions, follower growth | Yes | Business or Creator accounts only. Follower growth is omitted for accounts under 100 followers. | |
Facebook Pages | Followers and fans, impressions, reach, post engagements | Yes | Impressions and reach are based on media views since 15 June 2026. Needs read_insights. |
Followers for members and organizations; likes, comments, shares, clicks, impressions and engagement rate for organizations | Yes | The connecting user must be an organization ADMINISTRATOR. | |
Threads | Followers, views, likes, replies, reposts, quotes | Yes | Needs threads_manage_insights. |
X (Twitter) | Followers, following, post count, plus views, likes, replies, shares and quotes from up to 500 recent posts | Yes | Reading posts is billed by X at about $0.005 per post read. |
TikTok | Followers, following, total likes, video count | No, snapshot | Post metrics come from video.list. |
YouTube | Subscribers, total views, video count | No, lifetime | Time-series channel data lives in the separate YouTube Analytics API. |
Followers, following, pin count, impressions, saves, pin clicks, outbound clicks | Yes | Daily breakdowns are available. | |
Bluesky | Followers, following, post count | No, snapshot | Bluesky exposes no engagement time series. |
Insights only work for Business and Creator accounts, and your app needs the instagram_business_manage_insights permission approved in App Review. The format of the post changes the metric set:
- Feed posts return likes, comments, shares, saves, reach and views.
- Reels add average and total watch time, a skip rate (the share of views skipped in the first three seconds, estimated by Meta), reposts and total interactions.
- Stories do not return likes, comments or saves. They return replies, profile visits, follows, link clicks and a navigation breakdown (tap forward, tap back, tap exit, swipe forward), and Story insights can only be read for about 24 hours after publishing.
Instagram data can lag by up to 48 hours, so do not treat a low number on day one as final. For the publishing side of Instagram, see Instagram API pricing and limits and how to get Instagram posts via the API.
Facebook Page and post insights need the pages_read_engagement and read_insights permissions. There is also a role requirement that catches many teams out: the person who connected the Page must hold the Analyze task on it. A user with only Editor access can publish but cannot read insights.
Video posts and Reels return their own insights: views, average and total watch time, plays and replays for Reels, and an approximate completion rate for regular videos.
Organization analytics require the connecting user to have the ADMINISTRATOR role on the company page. Content creators and other roles are not enough. Member (personal profile) post analytics come from LinkedIn's Member Creator Post Analytics API and need the r_member_postAnalytics scope. LinkedIn enforces rate limits per application, and you can see them in the Developer Portal under your app's Usage & Limits tab.
X (Twitter)
X gives you a follower and post-count snapshot cheaply. Engagement is a different matter: to aggregate views, likes and replies for an account, something has to read the account's posts, and on X's pay-per-use pricing each post read costs about $0.005. Reading 500 posts for one account can cost about $2.50 per call. Put X on a slower refresh schedule than your other networks. The full pricing picture is in our X API pricing guide.
TikTok, YouTube and Bluesky
These three are where trend lines break if you are not storing data yourself:
- TikTok returns a current snapshot of followers, following, total likes and video count. Post metrics come from the video.list scope. Videos uploaded as drafts for the creator to finish in the TikTok app have no public URL and no analytics until the creator publishes them.
- YouTube returns lifetime subscriber, view and video counts through the Data API. Daily channel analytics live in the separate YouTube Analytics API, which has its own OAuth scopes. Quota is its own topic, covered in our YouTube API quota guide.
- Bluesky returns followers, following and post count, with no engagement time series at the account level.
What changed in 2026: Meta's insights deprecation
On 15 June 2026 Meta retired its impression and unique-reach metrics across Facebook Page, post and video insights, and replaced them with "media view" metrics. The metrics removed include post_impressions, post_impressions_unique, page_impressions, page_impressions_unique, page_engaged_users and page_consumptions.
Three details matter more than the rename itself:
- It applied to every Graph API version at once. Pinning an older API version did not protect you.
- The numbers read lower. A media view counts content that was actually rendered on screen, while an impression counted content that was delivered. The same post now shows a smaller number, and Meta did not backfill history. A drop across 15 June in your reports reflects a change of definition, not a change in audience. Do not mix the old and new values in one time series.
- One retired metric fails the whole request. The Graph API rejects an entire insights call when it contains a single metric name it no longer recognizes. A dashboard that requested ten metrics in one batch got zero back.
If you maintain a direct Graph API integration, audit every metric name in your insights requests and add a fallback that retries metrics one at a time when a batch is rejected. Our Facebook insights deprecation notes list what changed and how Outstand handles it.
Permissions and roles you will need
Most "my metrics are empty" bugs are permission or role problems, not code problems. Before you write any analytics code, check:
Network | Permission or scope | Role requirement |
|---|---|---|
instagram_business_manage_insights | Business or Creator account | |
pages_read_engagement, read_insights | Connecting user has the Analyze task on the Page | |
r_member_postAnalytics for members; organization admin scopes for pages | ADMINISTRATOR on the organization | |
Threads | threads_manage_insights | Account owner |
TikTok | user.info.stats, video.list | Account owner |
Each of these permissions goes through its platform's app review, which can take days to weeks. Our social media API approval guide covers the review process network by network.
Building it yourself: the hidden costs
Pulling analytics from one network is a weekend project. Pulling it from seven, and keeping it working, is a product. The costs that do not show up in the first estimate:
- Seven auth flows and token lifecycles. Meta long-lived tokens, LinkedIn's 60-day tokens with refresh, TikTok and YouTube OAuth, X app credentials. Each one expires differently. (We wrote up the Facebook and Instagram token lifecycle separately.)
- Seven metric vocabularies. Reach, impressions, views, media views, plays: you need one internal schema and a mapping for every network.
- Renames like Meta's. Each network changes metric names on its own schedule, and some, like Meta in June 2026, do it without a version bump.
- Zero versus not measured. A post with 0 impressions and a post whose impressions could not be read are different facts. If your pipeline turns both into 0, your reports are quietly wrong.
- Rate limits and cost. Per-app limits on LinkedIn, per-user and per-app limits on Meta, per-read pricing on X.
Pulling analytics with one API
Outstand is a unified social media API: one integration publishes, schedules and reads analytics across 12 networks. Analytics cover the accounts you connect and the posts published through Outstand. It is owned-account analytics, not social listening. There are two endpoints, one per grain.
Post analytics
GET /v1/posts/{id}/analytics returns metrics for one published post across every account it went out to, in a single request:
1curl "https://api.outstand.so/v1/posts/$POST_ID/analytics" \
2 -H "Authorization: Bearer $OUTSTAND_API_KEY"The response has three parts:
- post: the post's id, publishedAt and createdAt.
- metrics_by_account: one entry per account the post was published to. Each entry carries the social account (id, nickname, network, username), the platform post id and URL, published_at, a metrics object, a platform_specific object and a metrics_error.
- aggregated_metrics: cross-network totals: total_likes, total_comments, total_shares, total_views, total_impressions, total_reach and average_engagement_rate.
The metrics object uses the same field names on every network: likes, comments, shares, views, impressions, reach, engagement_rate and, where the network supports them, replies, profile visits, follows, link clicks, reposts and total interactions. Anything that only exists on one platform, such as retweets on X or saves on Instagram, goes into platform_specific instead of being forced into a shared field it does not quite match.
Three behaviors are worth designing around:
- Errors are per account, not per request. If one network is down or a permission is missing, metrics_error is set on that account's entry and the other accounts still return data. Render the rows you have and flag the one you do not.
- Honest nulls. When a network does not report a metric, the value is null rather than 0, and the missing field names are listed in platform_specific.unavailable_fields. A measured zero stays 0.
- Published posts only. Drafts and scheduled posts return a 400. Only request analytics after the post has gone out.
Account metrics
GET /v1/social-accounts/{id}/metrics returns follower counts and engagement over a period:
1curl -G "https://api.outstand.so/v1/social-accounts/$ACCOUNT_ID/metrics" \
2 -H "Authorization: Bearer $OUTSTAND_API_KEY" \
3 -d "since=1759276800" \
4 -d "until=1761868800"since and until are Unix timestamps. Leave them out and you get the last 30 days. Snapshot-only networks (TikTok, YouTube and Bluesky) ignore the range and return current values. The response includes followers_count, following_count, posts_count, an engagement object, platform_specific data, the period actually used and a fetched_at timestamp. Store fetched_at next to the numbers so you always know how fresh a report is.
Turning it into a report
There is no CSV endpoint. The API returns JSON, and you flatten it once against one schema. Here is a TypeScript example that turns post analytics into CSV rows:
1const COLUMNS = ["likes", "comments", "shares", "views", "impressions", "reach", "engagement_rate"] as const;
2
3type AccountMetrics = {
4 social_account: { network: string; username: string };
5 platform_post_url: string | null;
6 published_at: string;
7 metrics: Record<string, number | null> | null;
8 metrics_error?: { message: string } | null;
9};
10
11export function analyticsToCsv(postId: string, rows: AccountMetrics[]): string {
12 const header = ["post_id", "network", "username", "url", "published_at", ...COLUMNS, "error"];
13 const body = rows.map((row) => [
14 postId,
15 row.social_account.network,
16 row.social_account.username,
17 row.platform_post_url ?? "",
18 row.published_at,
19 ...COLUMNS.map((c) => row.metrics?.[c] ?? ""),
20 row.metrics_error?.message ?? "",
21 ]);
22 return [header, ...body]
23 .map((cells) => cells.map((c) => `"${String(c).replaceAll('"', '""')}"`).join(","))
24 .join("\n");
25}The same mapping works for a warehouse table, and it does not change when a client connects a network you had not planned for. If you want a finished, client-ready report rather than a pipeline, see exportable social media reports.
Rate limits and refresh cadence
Outstand's rate limits are dynamic: they scale with your post volume and number of connected accounts. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers, so back off based on those headers instead of hard-coding an interval.
A cadence that works in practice:
- Account metrics: once a night, and less often for X because of per-read costs.
- Post analytics: on a decay curve. Hourly for the first day, daily for the first week, then weekly. Most engagement settles long before your dashboard stops asking.
- Instagram Stories: read within 24 hours of publishing, because the insights expire after that.
How to choose a social media analytics API
Whichever provider you evaluate, ask the same questions:
- Owned or listening? Do you need metrics for your own or your clients' accounts, or for public content across the web? These are different products.
- Which networks, at which grain? Check post-level and account-level coverage per network, and whether each supports a date range or only a snapshot.
- How are gaps reported? Does a missing metric come back as null with a reason, or as a silent 0?
- What happens on a platform change? Ask how the provider handled Meta's June 2026 deprecation. The answer tells you how they will handle the next one.
- Who pays for upstream costs? On X, analytics reads have a real per-post price.
- Is publishing in the same API? If you also publish or schedule content, one integration for both removes a whole set of auth flows. Our comparison of unified social media APIs goes through the main options.
FAQ
Which social media API is free?
The native network APIs are free to call within their rate limits, except X, which charges per read on its pay-per-use plan. "Free" still costs app review time, token maintenance and engineering hours. Outstand plans start at $19 a month with unlimited connected accounts.
Can I get analytics for posts I did not publish?
Not through an owned-account analytics API. You can read metrics for accounts that authorized your app, and Outstand's post analytics cover posts published through Outstand. Analytics for other people's public content is social listening, which is a separate product category.
Why did my Facebook impressions drop in June 2026?
On 15 June 2026 Meta replaced impressions and reach with media-view metrics, which count content actually rendered on screen. The new numbers are lower for the same content, and history was not backfilled. The drop is a change of definition, not a change in your audience.
How often is social media analytics data refreshed?
It depends on the network. Instagram data can lag by up to 48 hours, Story insights expire after about 24 hours, and TikTok, YouTube and Bluesky only return current snapshots. Store your own snapshots if you need trends for those networks.
Do I need a Business account for Instagram analytics?
Yes. Instagram insights are only available for Business and Creator accounts. Personal accounts cannot access them.
Get started
You can read post and account analytics from every connected network, in one schema, with the two endpoints above. The reference docs are at Get post analytics and Get account metrics, and webhooks can push publish events to you instead of you polling.
Create an Outstand account to connect your first account and make your first analytics call. Plans start at $19 a month.