Instagram Engagement Rate: Calculate It From Raw Post Data
Pull an Instagram profile and its recent posts in one call, then compute an engagement rate you can defend. Mean, median and window change the answer.
Get an Instagram profile and its recent posts, with likes and comments per post, in one prompt. Paste this into your agent:
Set up https://monid.ai/SKILL.md, and then use Monid to pull the Instagram profile and the latest posts for nasa, and give me followers, then likes and comments per post sorted by date, with the median engagement rate.
One prompt reads a profile and its posts. 1 min setup · 12-30 hrs saved.
You want an engagement rate for an Instagram account, or for a whole list of creators, and every calculator and tracker gives you a different number. The reason is that Instagram publishes counts, not a rate: the rate is arithmetic somebody else chose. This guide shows how to pull the raw counts with one call per account, what comes back (we ran it live on 2026-10-16), and how the same 12 posts gave us 0.184% or 0.574% depending on three choices. It runs through Monid, the OpenRouter for agent tools: one key, one balance, every tool priced per call.
What is the easiest way to get Instagram engagement data for an account?
Monid. Install it once, add a key, and your agent calls a profile endpoint with a username and gets the follower count plus the latest posts with likes and comments back as typed JSON, with no scraper to build and no vendor account to set up.
- Pay per call. Each profile read is billed on its own, at $0.0016 per username (Verified 2026-10-16 on the Instagram tools page). Buy calls as you need them: no monthly plan and no minimum top-up. Discovery and inspection are free; only a run bills.
- One install, every API. The same key and the same balance call the Instagram endpoint and every other tool on Monid. When you want search results or a different platform for the same creator, it is another call on the same balance, and the best social media scraping APIs compared shows what else sits behind one key.
- Lives inside your agent. Install the CLI, add your key, run the prompt above, and the tool is there whenever your agent needs it, with nothing to keep running. Your agent reads
SKILL.mdand learns the rest, so setup is about a minute.
At that price, reading 100 accounts costs about $0.16 (Verified 2026-10-16).
How do you get engagement data for many Instagram accounts at once?
Pass the usernames in one call. The endpoint is /apify/instagram-profile-scraper from the provider apify. It takes a list of usernames and returns one result per username, so a list of 20 creators is 20 results from one run.
| Route | What you get | Cost shape | Fits |
|---|---|---|---|
| Free online calculator | One account, a number with no stated method | Free | Checking your own account once |
| Influencer database | Pre-computed scores for a catalogue of creators | Subscription | Browsing creators you have not picked yet |
| Build your own scraper | Whatever you code | Your hours | A fixed list you will maintain |
| Monid profile endpoint | Profile plus 12 latest posts with likes and comments per account | Pay per result, buy flexibly | Lists of creators, reports, agents |
Monid fits a list because the work is the same call repeated and you pay for the accounts you read and nothing between runs.
For agents
Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:
set up https://monid.ai/SKILL.md
It learns the whole discover, inspect, run workflow itself. More in the agent quickstart.
For humans
npm install -g @monid-ai/cli
monid keys add -k <your-api-key> -l main
Pull one profile with its recent posts
monid run -p apify -e /apify/instagram-profile-scraper -w -i '{"usernames": ["nasa"]}'
Pull a list in one call
Put several usernames in the same array. Each username is one billed result:
monid run -p apify -e /apify/instagram-profile-scraper -w -i '{"usernames": ["nasa", "natgeo", "spacex"]}'
The result is an array, so read the total with length and loop over it. Turning a profile into structured data in one call walks through the record you get per username.
Or hand the whole job to an agent
Give this to your agent![]()
Set up https://monid.ai/SKILL.md, and then use Monid to pull the last 12 posts for these 20 creators, compute median engagement per follower over the last 14 days, and show me the sample size next to each.Can you calculate Instagram engagement rate yourself with Python?
Yes, and the formula is a single line once you have the counts: likes plus comments, divided by followers. Getting the counts is the hard part. Instagram's own app shows them to you one post at a time, and a script that reads them for a list of accounts has to deal with logins, rate limits and a page that changes shape.
The calculation is where you should spend your time, and it fits in a function, and what the Apify Instagram scraper returns shows the same likesCount and commentsCount fields it reads. This one fixes a time window instead of a post count, drops pinned posts, defaults to the median and refuses to answer on a sample of fewer than five:
from datetime import datetime, timedelta, timezone
from statistics import mean, median
def engagement(profile, *, days=14, stat=median, min_posts=5):
followers = profile["followersCount"]
cutoff = datetime.now(timezone.utc) - timedelta(days=days)
sample = [
p for p in profile["latestPosts"]
if not p.get("isPinned")
and datetime.fromisoformat(p["timestamp"].replace("Z", "+00:00")) >= cutoff
]
if len(sample) < min_posts:
return None, len(sample)
per_post = [p["likesCount"] + p["commentsCount"] for p in sample]
return stat(per_post) / followers, len(sample)
The function returns the rate and the sample size it came from. Store both. A rate without its sample size is a number you cannot defend later.
The Monid route is the choice for anything you will run more than once. The collection is maintained for you, the output is typed JSON with likesCount and commentsCount on each post instead of a page you parse, and a profile read is $0.0016 (Verified 2026-10-16). Free online calculators are quicker for one account, but they are made for a person looking at a page, not for a list or an agent, and most do not tell you which posts they used.
What does Instagram profile data look like, and what can you build with it?
A profile read returns one record with the account's counts and a short list of its latest posts. We ran the endpoint on 2026-10-16 with usernames: ["nasa"], so the fields below are what came back.
The response
The profile layer held username, fullName, biography, externalUrl, followersCount (104,375,718), followsCount (90), postsCount (4,967), igtvVideoCount (171), highlightReelCount (6), verified (true), isBusinessAccount (true) and businessCategoryName ("Government Agencies"). It also held relatedProfiles and latestIgtvVideos.
The post layer was latestPosts, an array of 12. Each post carried type (Image, Video or Sidecar), timestamp, likesCount, commentsCount, isPinned, caption, hashtags, mentions, taggedUsers and a url. Videos also carried productType ("clips") and videoViewCount. The run billed one result, $0.0016 (Verified 2026-10-16).
Two details matter for any calculation. The posts are not in date order: the three pinned posts came first. And there is no parameter for how many posts you get; the endpoint's schema takes usernames and an includeAboutSection switch and nothing else.
What you can build with it
- A creator shortlist. Pull a list of accounts, compute one rate per account with the same function, and rank them. A ranking from one definition is comparable; the absolute number is not.
- A vetting check. Compare typical likes to follower count and read the biography and
businessCategoryNamenext to it. The follower and engagement API guide goes through the fields you would use for that. - A weekly report. Run the same list on a schedule, store
likesCount,commentsCount,timestampandtypeper post, and chart the median over time. Keep the raw posts, not only the rate, so you can change the definition later. - A format breakdown. Split the sample by
typeand see which format carries an account. In our run that split was the largest effect of all.
Why do Instagram engagement trackers give different numbers?
Because the rate is not published by Instagram. Every tool picks a method and shows the result as a fact. We computed the rate five ways on the same pull of @nasa and got numbers from 0.184% to 0.574%. All figures below use the 12 posts from the 2026-10-16 run and 104,375,718 followers.
Does mean or median change the answer?
Yes, by a factor of 1.7 on likes. The mean of likes per post was 511,691 and the median was 300,002, which is 0.490% and 0.287% of followers. The spread explains it: the best post had 1,870,519 likes and the worst 54,297, a gap of 34 to one. A few big posts pull the mean up while the median describes the typical post. The two answer different questions, and a tracker that does not say which one it uses is not comparable with one that does.
Do pinned posts change it?
Yes. Three of the 12 posts were pinned, dated 2026-10-02, 2026-10-10 and 2026-10-12. Dropping them left nine posts, and the mean fell from 0.490% to 0.437% and the median from 0.287% to 0.248%. A pinned post stays at the top of the profile and collects likes for as long as it is there, so counting it in a "recent posts" window mixes old and new posts. The isPinned field lets you filter it.
Does the time window change it?
Yes, the most. Taking only the seven posts since 2026-10-10 and counting likes plus comments, the mean was 0.506% and the median 0.184%. Taking only the four since 2026-10-13, the mean was 0.574% and the median 0.175%. The mean rose while the median fell, because a smaller window is dominated by whichever big post it contains. A window by dates is repeatable. A window of "the last 12 posts" covers a different period on every account, depending on how often it posts.
Does the post format change it?
Yes. Median likes per follower was 0.215% for the six images, 0.868% for the four carousels (Sidecar) and 0.357% for the two videos. The sample is small, so the point is the size of the difference: an account that posts mostly carousels and one that posts mostly images are not measured on equal terms by an average over all posts. Store type and compare like with like.
Is the follower count the problem?
No. The count is a number Instagram displays, and a read returns it as followersCount. It moves while you collect, because a large account gains and loses followers all the time, so record the time you took it. For a rate the denominator that matters is reach, and reach is private analytics visible only to the account owner, so a public tool that quotes reach is estimating it.
Which endpoint should I use for which job?
| Endpoint | What it does | Input | Billing | Price (Verified 2026-10-16) |
|---|---|---|---|---|
apify/apify/instagram-profile-scraper | Profile counts plus the 12 latest posts with likes and comments | usernames (array, required) | Per result, one per username | $0.0016 (Verified 2026-10-16) |
Prices Verified 2026-10-16 with monid inspect. This is the row to loop over a list. The endpoint returns the posts of the profile and nothing about their reach, saves or shares. For follower lists and other Instagram lookups, the Instagram tools page lists the other endpoints on the same key and balance, each with its own price. To put the profile read into a pipeline, shipping an Instagram profile enricher shows the wiring.
When is another route a better fit?
You need reach, saves, shares or impressions. Those are visible only to the account owner. If a creator shares their own analytics for a paid deal, use those instead of any public estimate.
You need more than the latest 12 posts. The endpoint returns 12 and has no parameter to change that. A longer history needs a source that keeps its own archive of past posts, or your own stored pulls over time.
You need a number to compare with other tools' numbers. A rate from one tool and a rate from another are two definitions, not two measurements. Compute everything yourself with one function.
You need one account, once, for free. An online calculator does that with no key.
And the disclosure: we resell this endpoint. The most useful thing in this post is the function above and the habit of storing the raw posts, which costs nothing and is right whoever you buy the data from.
Conclusion
The quickest way to get Instagram engagement data for a list of accounts is one profile call per account through Monid: $0.0016 a result (Verified 2026-10-16), one key for this and every other tool, about a minute to set up and ready inside your agent whenever you need it. Building a scraper yourself works for a handful of accounts and costs hours of upkeep; Monid keeps the collection maintained.
Two things matter more than the endpoint. Fix the definition: a date window, the median, pinned posts out, and the sample size stored next to every rate. And keep the raw posts, because the same 12 posts gave us 0.184% to 0.574% depending on those choices.
How we estimated the time saved: building and running your own profile and post scraper is roughly 8 to 20 hours, and the metric code plus settling on a definition is 4 to 10 hours more. That is 12 to 30 hours. The 1 minute is the install, key and first call once you already have a Monid key.
Free next step: run monid inspect -p apify -e /apify/instagram-profile-scraper, then read one account you know well and compute both the mean and the median. If they are close, the account posts consistently. If they are far apart, you have learned what a single tracker number was hiding. Start at monid.ai.
FAQ
Are Instagram engagement trackers accurate?
The counts are, the rate is not comparable between tools. Likes, comments and followers are numbers Instagram displays. The rate is computed by each tool with its own choice of mean or median, post window and post types, and on one account those choices moved our result from 0.184% to 0.574%.
How do you calculate Instagram engagement rate?
Add likes and comments for each post in a window, take the median across posts, and divide by followers. Use a date window such as 14 days, leave out pinned posts, and keep the number of posts you used next to the result.
Can you get Instagram follower and engagement data through an API?
Yes. A profile endpoint on Monid takes a list of usernames and returns each account's follower count and its 12 latest posts with likes and comments, at $0.0016 per username (Verified 2026-10-16).
Should engagement be divided by followers or by reach?
Reach is the better denominator in principle, but it is private analytics only the account owner sees. Public tools divide by followers, which measures engagement relative to audience size. If a creator shares their reach, use it.
Why do my post-level numbers differ from another tracker's?
Because the trackers may use a different set of posts. Pinned posts, the date window and the post format all changed our result, so ask which posts a tool used before comparing two numbers.
Published September 2026.


