Give it an Instagram handle, get the account's follower count, following count, post count, bio, verification badge and avatar URL back as JSON. It reads the public profile page — the same thing you see logged out — so there is no Graph API app review and no Business account requirement. 1 credit per profile.
| parameter | type | description |
|---|---|---|
| handle | string, required | The Instagram username, without the @. |
| fresh | boolean | Skip the stored copy and read live, at the same price. |
| fields | string | Comma-separated field paths to keep. |
| format | json | JSON envelope. |
1 credit per profile. Failed calls are never charged, and empty results are free up to 25 a day. Stored copies are refreshed every 12 hours.
One object per handle. The three counters (followers, following, posts) are the numbers Instagram prints at the top of a profile, plus the profile text: display name, bio, verified flag, avatar image URL, canonical profile link, and whether the account is set to private.
This is account-level data only. There is nothing here about individual posts — no likes, no captions, no reach. If you want the grid, that is a separate call to the Instagram Channel Posts API, and this endpoint is usually the cheap first step that tells you whether the grid is worth pulling at all.
Private accounts still return a profile. Instagram publishes the header of a private account to logged-out visitors, so you get handle, name, bio, avatar and the counters, with `is_private` set to true. What you do not get is anything behind the wall, and no other endpoint on this API will get it either.
curl "https://api.instadata.dev/v1/instagram/channel-stats?handle=nasa" \ -H "Authorization: Bearer ik_live_..."
{
"data": {
"platform": "instagram",
"handle": "instagram",
"name": "Example Creator",
"bio": "Tutorials and behind-the-scenes. New video every Tuesday.",
"verified": true,
"metrics": {
"followers": 2450318,
"following": 132,
"posts": 842
}
},
"request_id": "req_01JZX4M8Q2TE9W"
} | field | type | note |
|---|---|---|
| handle | string | The username without the @. Always present — the call fails rather than returning a profile with no handle. |
| name | string|null | The display name from the profile header. Null when the account never set one. |
| followers | number|null | Public follower count. Instagram rounds this in its own UI above roughly 10,000. |
| following | number|null | How many accounts this account follows. A useful ratio input when screening for follow-for-follow inflation. |
| posts | number|null | Total posts on the grid. Counts carousels as one, and does not include stories or archived posts. |
| bio | string|null | The biography text as written, newlines and emoji included. Null when the bio is empty. |
| verified | boolean | True when the account carries the blue badge, false otherwise. Never null — if the page data does not carry the flag we return false, so absence and a genuine unverified account look the same. |
| avatar | string|null | URL of the profile picture, highest resolution available. The link is a CDN URL that expires — download the image if you need to keep it. |
| url | string | Canonical https://www.instagram.com/handle/ profile link. Constructed from the handle when the page does not supply one. |
| is_private | boolean | True for private accounts, false otherwise. Never null — branch on `is_private === true`, not on a null check, which will never fire. Check it before spending credits on the posts or reels endpoints for the same handle. |
Instagram displays follower counts to logged-out visitors with rounding once an account gets large, and the figure it publishes is not updated the instant someone follows. Treat the number as the platform's public figure at call time, accurate enough for trends and segmentation, not accurate enough for a contractual payout calculation.
That rounding also means small day-to-day changes on a big account can vanish entirely. If you are charting growth for an account with hundreds of thousands of followers, weekly sampling produces a cleaner series than daily.
Profile data sits in the slow cache class because the underlying numbers barely move within a day. Repeat calls for the same handle inside the window return in milliseconds and set x-cache: hit. A cache hit is billed at the same 1 credit.
Pass fresh=true when you specifically need to bypass the cache — a follower-count monitor that runs once a day, for instance, should use it, otherwise the second run of the day may hand you back the first run's answer.
Instagram serves profile pictures from a CDN with signed, expiring links. The URL is valid when we return it and will break some time later, often within days. If the image matters to your product, fetch it during the same job and store your own copy rather than hotlinking the value.
Instagram lets people rename accounts, and the old handle becomes free for someone else to claim. This response is keyed on the handle, so a stored handle can silently start resolving to a different person. If you keep a long-lived database of creators, re-verify handles periodically instead of assuming they are permanent identifiers.
People put email addresses, phone numbers and other contact details in their Instagram bio. That text arrives verbatim in the `bio` field. It is public, but public is not the same as fair game under GDPR or CCPA — if you store or process it, that is your processing, and your obligations. Strip what you do not need.
Send a GET to /v1/instagram/channel-stats with the handle and your API key. You get followers, following and post count as JSON. Instagram's Graph API only reports on accounts you own or manage, needs a linked Business or Creator account, and requires app review before it returns anything in production. This endpoint reads the public profile page instead, so any public handle works immediately.
Yes, as long as it is public. The endpoint reads the same profile page a logged-out browser sees, so any public account is reachable regardless of who owns it. That is the whole reason it exists — competitor tracking and influencer vetting are impossible through Instagram's own API, which is scoped to accounts you already control.
A normal response with is_private set to true. Instagram shows the header of a private profile publicly, so the handle, display name, bio, avatar and the three counters all come back. Nothing behind the privacy wall is available — no posts, no reels, no comments — and no other endpoint on this API can reach them either.
1 credit per handle. Credits are $0.005 each on the monthly plan and $0.0045 on annual, so a lookup is about half a cent and $5 covers roughly 1,000 profiles. Cached responses cost the same as fresh ones. Calls that fail are not charged, so a handle that does not exist costs you nothing.
One handle per call. Fire the requests concurrently — each is independent and the service is built for parallel traffic. For a screening job over a few thousand handles, run a worker pool of ten or twenty and let the slow cache absorb any duplicates in your list.
You cannot from this endpoint alone; it has no post data. The usual method is two calls: take the follower count from here, then pull the last twelve posts from the Instagram Channel Posts API, average their likes and comments, and divide that average by followers. Quote the window you used — a rate over twelve posts and a rate over ninety days are different numbers.
It is what Instagram publishes to logged-out visitors, which is rounded on larger accounts and updated on Instagram's own schedule rather than in real time. Good enough to segment creators by size or chart growth over weeks. Not good enough to settle a payment that depends on an exact threshold — use the account owner's own analytics for that.