Skip to main content
PlugKit collects metrics in the background and serves them from its own store. That means one request answers for every connected account at once, over any window, sorted however you like — instead of one call per account per platform, each with a different shape. It also means the numbers have an age. Every response carries lastSyncAt and nextSyncAt so you can show it; see How collection works for the cadence.
Analytics are included on every plan and every account, from the trial onwards. Nothing here is gated.

Summary

The headline numbers over a window, each with its change against the previous period of the same length:
Response (trimmed)
null is not zero. A null metric means the platform doesn’t expose it for that account — TikTok has no reach, YouTube has no impressions. Rendering it as 0 skews every average you compute downstream.
Changes follow the unit of what they measure: a volume changes in percent, a rate changes in points. engagementRate.change: 0.5 means half a point (6.3% → 6.8%), not half a percent.

Posts

Every post with its metrics, sorted by whichever one matters:

Posts you didn’t publish through PlugKit

The collector mirrors what each platform lists, so a post published straight from the Instagram app shows up here too, marked source: "external". That’s what makes the numbers match the platform’s own dashboard on day one, instead of only counting what has gone through the API since you connected. Use source=plugkit when you specifically want to measure your own automation.

Over time

One metric, bucketed by day, week or month, optionally split by platform — the shape a stacked chart wants:
Response (trimmed)
Posts are grouped by publication date, and their current metrics summed: “likes for the week of the 3rd” means “likes earned by the posts published that week”. That’s the reading that tells you what to publish next.

Platform breakdown

One row per network over the window — posts, every metric, and the engagement rate:

Best time to post

Average engagement per weekday and hour, read in the timezone you ask for:
Response (trimmed)
weekday is 0 for Sunday, following Postgres. Always pass a timezone — an hour-of-day grid read in UTC is off by your users’ whole offset, and it fails silently, because every cell still has a plausible number in it. Check posts before acting on a cell. The second row above has the best average of the set and is worth nothing: one post is a coincidence, not a slot.

Engagement accumulation

How fast a post earns its final engagement, by age bucket — the answer to “is it still worth watching, or is it done?”:
Response (trimmed)
share is the percentage of final engagement already earned at that age, averaged over the posts in the window. It fills in as your posts age — a brand new account only has the early buckets.

Followers

Follower count over time, per account, with growth:
The series starts the day the account was connected. No platform hands back the follower history it didn’t record — it can only be measured forward, one day at a time. Connect early.

Refresh on demand

Someone just published from the platform’s own app and wants to see it now:
With an accountId, the platform is queried within the request. Without one, every account of the caller is moved to the front of the queue and picked up on the next cycle. Calls within 15 seconds of each other on the same account are ignored — a dashboard that refreshes on focus can’t turn into a burst of platform calls.

Live reads

The endpoints above never touch a platform. When you want the value right now for one object — and are willing to pay for it on metered platforms — two pass-through reads remain:
They return one object, no history and no comparison, and each one is billed on X. Prefer /v1/analytics/* for anything you’d put in a dashboard.

How collection works

Cadences, freshness, history depth, and what each platform actually exposes.

Try it live

Every analytics endpoint in the playground.