Use cases / Instagram API
Instagram engagement rate
Last updated October 29, 2026. Response excerpts are recorded from the live API.
Who runs this, and what for
| Team | What they decide with it |
|---|---|
| Brands and agencies | Which creators to shortlist for a campaign, and which ones have an audience that no longer responds. |
| Influencer platforms | What engagement figure to show on each creator's card, refreshed on a schedule. |
| Creators and managers | How their own engagement compares with accounts of a similar size, for rate cards and pitches. |
The calls, step by step
1. Read the profile
Call the profile endpoint with the username. It returns followers_count exactly, whether the account is private, and latest_posts: the first twelve posts on the grid, pinned posts first, each with its shortcode. A private account has no public posts to measure.
GET /v1/instagram/profile?username=nasa · profile.latest_posts.0
{ "shortcode": "DeTUk4sDSp-", "url": "https://www.instagram.com/reel/DeTUk4sDSp-/", "type": "reel", "caption": "POV: you're watching the Earth set\n\nWe just released hundreds of new images and hours of new audio from our Artemis II mission around the Moon this spring. Check out our link in bio for the Artemis II Preliminary Lunar Science Report.\n\n#NASA #ArtemisII #Artemis", "alt_text": "Video by NASA on October 10, 2026. May be an image of planet, eclipse and text.", "cover": "https://scontent-lax3-2.cdninstagram.com/v/t51.82787-15/842191580_18656578867049152_4200499629839780998_n.jpg?stp=dst-jpg_e35_s640x640_tt6&_nc_cat=111&ccb=7-5&_nc_sid=18de74&efg=eyJlZmdfdGFnIjoiQ0xJUFMuYmVzdF9pbWFnZV91cmxnZW4uQzMifQ%3D%3D&_nc_ohc=-pFHKreB7_EQ7kNvwEBhhxz&_nc_oc=AdoMNKzX90mmLh8V1cxCSlWnt2NDKhNvOb_SGTeTGkS6R9BqE1NUpx4EiRNW7QqMQ1Y&_nc_zt=23&_nc_ht=scontent-lax3-2.cdninstagram.com&_nc_gid=MIDOetHntRxGG_YsMvXc7A&_nc_ss=79689&oh=00_AQSQIi58_mrV856_SJI_UrZd_uOpOj2tBmaRbSxwsbWOtw&oe=6AE81757", "author_username": "nasa" }Recorded response. Live values differ. 2. Read each recent post
The profile page does not show likes or dates, so call the post endpoint for each shortcode. It returns likes_count, comments_count, published_at, and type (photo, video, reel, or carousel). Sort by published_at and keep the newest: pinned posts lead the grid and can be months old. likes_count is null when the author hides likes; leave those posts out of the average rather than counting them as zero.
GET /v1/instagram/post?shortcode=DeTUk4sDSp- · post.likes_count
752840Recorded response. Live values differ. 3. Compute the rate
Engagement rate by followers is (average likes + average comments) ÷ followers. Compare creators of similar size only: the rate falls as an account grows, so a figure that is high for a million followers can be ordinary for ten thousand. Store each run, since a sudden jump in followers without a jump in likes is the pattern bought followers leave.
GET /v1/instagram/post?shortcode=DeTUk4sDSp- · post.comments_count
7577Recorded response. Live values differ.
A script to start from
engagement_rate.py
# Engagement rate for a list of Instagram creators: average likes plus
# comments on their newest posts, divided by followers.
import csv, os, requests, statistics
API = "https://api.clair.im"
HEADERS = {"Authorization": f"Bearer {os.environ['CLAIR_API_KEY']}"}
CREATORS = ["nasa", "natgeo", "zachking"]
RECENT = 9 # posts to average; the profile lists up to 12, pinned first
def get(path, **params):
r = requests.get(f"{API}{path}", headers=HEADERS, params=params, timeout=90)
r.raise_for_status()
return r.json()
with open("engagement.csv", "w", newline="") as f:
out = csv.writer(f)
out.writerow(["username", "followers", "posts", "likes_hidden",
"avg_likes", "avg_comments", "engagement_rate"])
for username in CREATORS:
profile = get("/v1/instagram/profile", username=username)["profile"]
if profile["private"] or not profile["followers_count"]:
continue
posts = []
for card in profile["latest_posts"]:
if card["author_username"] != profile["username"]:
continue # a collaborator's post shown on this grid
try:
posts.append(get("/v1/instagram/post", shortcode=card["shortcode"])["post"])
except requests.HTTPError:
continue # removed since the profile was read
# Pinned posts lead the grid and can be months old: keep the newest.
posts.sort(key=lambda p: p["published_at"], reverse=True)
posts = posts[:RECENT]
counted = [p for p in posts if p["likes_count"] is not None]
if not counted:
continue
likes = statistics.mean(p["likes_count"] for p in counted)
comments = statistics.mean(p["comments_count"] for p in counted)
rate = (likes + comments) / profile["followers_count"]
out.writerow([username, profile["followers_count"], len(counted),
len(posts) - len(counted), round(likes), round(comments),
f"{rate:.2%}"])
Set CLAIR_API_KEY to your Clair key; one plan covers the Instagram API. Each call spends that API's rate from the plan's monthly balance.
What it costs per month
| Schedule | Requests | Plan | Per month | Per 1,000 |
|---|---|---|---|---|
| 100 creators, once1 profile + 12 posts per creator = 13 requests, × 100. | 1,300 | Starter | $30 | $23.08 |
| 500 creators, monthly500 × 13 requests, refreshed once a month. | 6,500 | Starter | $30 | $4.62 |
| 2,000 creators, monthly2,000 × 13 requests. | 26,000 | Standard | $100 | $3.85 |
| 200 creators, weekly200 × 13 requests × 4 weekly runs. | 10,400 | Standard | $100 | $9.62 |
What to plan for
- This is engagement by followers. Reach and impressions, which give the rate by reach, are shown only to the account's owner, so no public source has them.
- Clair's Instagram post response has no play count, so views on reels are not part of the rate.
- The profile lists twelve posts. Older posts need their shortcodes from elsewhere, such as the creator's own links.
- When an author hides likes, likes_count is null. A creator who hides likes on every post cannot be measured this way.
- Private accounts show only their counts. Their posts, and so their engagement, are not public.
- posts_count is rounded above 10,000, as Instagram shows it; followers_count and following_count are exact.
Common questions
What is a good Instagram engagement rate?
It depends on account size and niche, and published benchmarks disagree. Compare a creator with accounts of similar size in the same niche, measured the same way, rather than with one industry figure.
Can it detect fake followers?
Not directly: follower lists are not public. A low rate for the account's size, or followers that grow without likes growing with them, is the signal the data gives you.
Does it need the creator's permission or login?
No. It reads the public profile and posts that anyone can see signed out. Meta's own API looks up business and creator accounts only from a professional account of your own.
Why read twelve posts if I only average nine?
Pinned posts come first on the grid and are often old. Reading all twelve and keeping the newest by date leaves pinned posts out.
Run it on your own products
$1 of usage a month free across every API, no card. Enough to run the pipeline on a short list before choosing a plan.

Glassdoor API
Crunchbase API
Instagram API
Bloomberg API
Associated Press API