Skip to main content
Analytics is a paid add-on. Two endpoints are dedicated to it, and several other responses carry analytics fields when access is enabled.

Audience breakdown

GET /accounts/{username}/audience returns the account’s audience by country, age bucket, and gender.
Pass as_of with an ISO timestamp to read the breakdown as it stood then. Snapshots are append-only, so an older reading stays available after a newer one arrives.

Shares are basis points, and they do not sum to 10000

share_bps is hundredths of a percent. 4120 is 41.20%. Instagram reports only an account’s top countries, so the shares routinely sum to less than 10000. The remainder is real: it is audience whose country was never reported.
Do not rescale the shares to sum to 100%. That invents reach that was never measured. Show the remainder as unattributed instead.
Bucket labels are passed through exactly as Instagram reports them, such as 18-24, F, and U.

availability is its own answer

“No data” is not an empty breakdown. Keep the two apart in your own storage, or an account Instagram cannot describe becomes indistinguishable from one with no audience.

Daily account insights

GET /accounts/{username}/insights returns one point per day, with views, reach, profile_views, and followers_count. Narrow it with since and until. Any of the metrics can be null for a day. As everywhere in this API, null means Instagram did not report it, and 0 is a real reading.

Media demographics

GET /submissions can include a demographics block per tracked media. This is the connected account’s audience over the media’s first days, not the audience of the media itself. Instagram reports demographics per account, not per post. The block carries window_start, window_end, and snapshot_count, so you can see the real span that was averaged and the divisor used.

Access and history

Analytics has two separate gates, and both apply. Current access. When analytics is disabled, the dedicated endpoints answer 403 with the code analytics_not_enabled, and analytics fields are omitted from other responses entirely. Basic account identity stays visible. Entitled intervals. When analytics is enabled, you see observations from every interval you were entitled to, including a trial and any payment grace. Observations collected while analytics was off stay hidden, even after a later purchase.
Collection is separate from access. Background collection continues without analytics purchased, so enabling it later starts showing data from the moment entitlement began, not from every reading ever taken.