Try it
Run a live Instagram lookup
One real call, no signup and no key. Give it any public handle and read the JSON it returns.
Endpoints & Pricing
One Endpoint, Three Priced Bands
Everything runs through a single profile request. Two query flags decide how deep it goes, and only the deepest one changes the rate.
Profile
GET /api/social/instagram/profileby handle or URL- Username, full name, biography and the link in bio
- Follower count, following count and total posts
- Verified, private and account-type flags
- Profile picture URL and follower-to-following ratio
- Four opt-in field groups, each +20% on the call
Profile with Recent Posts
GET /api/social/instagram/profile?include_posts=true- The recent-post grid — normally about 12 posts
- Thumbnail, permalink, shortcode and timestamp
- Media type: IMAGE, VIDEO or CAROUSEL
- Newest post date and days since the last one
- We add no cap of our own, and charge no surcharge
Profile with Post Details
GET /api/social/instagram/profile?include_post_details=true- Per-post like counts, comment counts and captions
engagementRate, averaged over posts that carry countsavgLikesPerPostandavgCommentsPerPostpostsSampledseparates absence from a real zero- Up to 12 posts opened per request
Growth unlocks with a one-time $100 deposit and Scale with a one-time $500. Both are permanent and neither expires. Free to start on eligible endpoints, with the allowance shared across them.
Quick Start
A Handle In, Structured JSON Out
No token to mint, no app to register and no review to wait on. One header, one query parameter, and the same response shape on every call.
# Profile only curl "https://apiserpent.com/api/social/instagram/profile?username=natgeo" \ -H "X-API-Key: YOUR_API_KEY" # Profile + the recent-post grid — SAME rate as the line above curl "https://apiserpent.com/api/social/instagram/profile?username=natgeo&include_posts=true" \ -H "X-API-Key: YOUR_API_KEY" # Adds per-post likes, comments and the engagement averages — $4.00/1K band curl "https://apiserpent.com/api/social/instagram/profile?username=natgeo&include_post_details=true" \ -H "X-API-Key: YOUR_API_KEY"
import requests KEY = "YOUR_API_KEY" handles = ["natgeo", "nasa", "bbcnews"] for h in handles: p = requests.get( "https://apiserpent.com/api/social/instagram/profile", headers={"X-API-Key": KEY}, params={"username": h, "include_post_details": "true"}, ).json() # null means NOT MEASURED, never zero. postsSampled tells you which. if p["postsSampled"] == 0: print(h, "- no posts carried counts, skipping") continue print( h, f"{p['followersCount']:,} followers", f"ER {p['engagementRate']:.2f}%", f"over {p['postsSampled']} posts", f"last post {p['daysSinceLastPost']}d ago", )
const KEY = process.env.SERPENT_KEY; // include_posts costs nothing extra, so take the grid every time — // posting cadence is the context that makes a follower delta readable. async function snapshot(handle) { const res = await fetch( `https://apiserpent.com/api/social/instagram/profile` + `?username=${handle}&include_posts=true`, { headers: { "X-API-Key": KEY } } ); if (res.status === 404) return null; // no such public profile const p = await res.json(); return { day: new Date().toISOString().slice(0, 10), handle: p.username, followers: p.followersCount, posts: p.postsCount, verified: p.isVerified, grid: p.recentPosts.length, // always an array, never absent lastPost: p.daysSinceLastPost, }; } console.log(await snapshot("natgeo"));
{
"username": "natgeo",
"fullName": "National Geographic",
"biography": "Experience the world through the eyes of National Geographic photographers.",
"profilePicUrl": "https://scontent.cdninstagram.com/.../natgeo.jpg",
"followersCount": 283000000,
"followingCount": 156,
"postsCount": 32500,
"isVerified": true,
"isPrivate": false,
"accountType": "business",
"externalUrl": "http://visitstore.bio/natgeo",
"engagementRate": null,
"avgLikesPerPost": null,
"avgCommentsPerPost": null,
"postsSampled": 0,
"followerFollowingRatio": 1814102.56,
"lastPostDate": null,
"daysSinceLastPost": null,
"isActive": null,
"recentPosts": [
{
"position": 1,
"shortcode": "Dbqme5HGFMd",
"mediaType": "IMAGE",
"caption": null,
"thumbnailUrl": "https://scontent.cdninstagram.com/...",
"permalink": "https://www.instagram.com/p/Dbqme5HGFMd/",
"timestamp": "2026-08-19T09:20:00.000Z",
"likeCount": null,
"commentCount": null
}
],
"accessLevel": "full"
}
This is an include_posts response, which is why likeCount, engagementRate and the averages are null and postsSampled reads 0. They are null rather than 0 on purpose: a missing measurement and a genuine zero are different facts, and a chart that treats them the same is wrong. Add include_post_details=true to fill them.
Data Fields
Every Field an Instagram Call Returns
Named, typed JSON. Every key is always present, so an empty grid arrives as [] and an unmeasured metric as null.
Profile Fields
- username
- fullName
- biography
- profilePicUrl
- followersCount
- followingCount
- postsCount
- isVerified
- isPrivate
- accountType
- externalUrl
Engagement Fields
- engagementRate
- avgLikesPerPost
- avgCommentsPerPost
- postsSampled
- followerFollowingRatio
- lastPostDate
- daysSinceLastPost
- isActive
Post Fields
- recentPosts[].position
- recentPosts[].shortcode
- recentPosts[].permalink
- recentPosts[].thumbnailUrl
- recentPosts[].mediaType
- recentPosts[].timestamp
- recentPosts[].likeCount
- recentPosts[].commentCount
- recentPosts[].caption
Request Parameters
- username (handle, @handle or URL)
- url / handle (aliases)
- include_posts
- include_post_details
- include_contact (+20%)
- include_business (+20%)
- include_reels_info (+20%)
- include_profile_detail (+20%)
Why Instagram profile data
The official route is gated. This one is a URL.
Meta's own API can read accounts you do not own only after App Review and Business Verification. Most teams need the data long before they can pass that.
What Meta's own API asks for first
The Instagram Graph API needs a Meta developer account, a registered app and an Instagram professional account. To read any professional account you do not own it needs Advanced Access, and Advanced Access requires App Review and Business Verification. Checked against Meta's documentation on 8 September 2026.
Its Business Discovery lookup also returns nothing at all for age-gated accounts, and nothing for personal accounts. For an influencer-vetting tool or a competitor tracker, that is a gate before the first row of data and a coverage hole after it.
The bundle is where the money is
A profile is rarely useful on its own; you want the grid beside it. Here that is one call at one rate. Elsewhere it is the expensive part: Apify's official instagram-scraper counts every result as one billable item, so a profile plus 12 posts is 13 items.
At its $2.70 per 1,000 items that is $35.10 per 1,000 bundles, and $19.50 even on the $999-a-month Business plan. Our $0.40, or $0.28 at Scale, buys the same bundle.
Null is not zero, and the response says which
Instagram's profile grid does not carry per-post like and comment counts, so engagement has to be measured by opening the posts. When it has not been measured, engagementRate, avgLikesPerPost and avgCommentsPerPost are null rather than 0, and postsSampled reads 0.
That distinction is the difference between “this account gets no engagement” and “we did not measure it”. Any tool that scores creators has to be able to tell them apart.
Public only, and honest about it
These endpoints read publicly available profile data. A private account returns what a logged-out visitor sees — username, picture, account status — and nothing more. There is no credential to supply and no privacy setting to work around.
A handle that does not exist answers 404 and is charged, because establishing that is a real answer. A request we could not complete is refunded automatically.
Price Comparison
Every Vendor's Lowest Rate, Normalised to One Bundle
Normalised to one unit: a public profile with its recent posts. Vendors bill this very differently, so the unit column is the one to read first.
| Provider | One billable unit is | Cost per 1,000 | What the lowest rate requires | Free tier |
|---|---|---|---|---|
| Serpent (ours) | 1 call = a profile and its recent posts | $0.40 → $0.28 | A one-time $500 deposit. No monthly plan. | Free to start |
| HasData Growth | 1 request = a profile and its latest 12 posts (their words) | $2.46 → $0.69 | $208 every month. Entry is the $49-a-month Startup plan. | 100 lookups a month |
| HasData Basic | the same unit | $0.99 | $99 every month | — |
| HikerAPI | 1 request = 1 API call; pagination is billed separately, so a profile with posts is at least two | about $2.00 → about $1.20 per bundle (their per-request rate is $1.00 → $0.60) | A prepaid balance of $100, $299 or $599 — the three published thresholds. Permanent once reached. | 100 free requests |
Apify apify/instagram-scraper |
1 result = ONE ITEM — a post, reel, comment or profile. A profile plus 12 posts is 13 items. | $35.10 → $19.50 per bundle (their per-item rate is $2.70 → $1.50) | Apify Business, at $999 every month | $5 credit |
Apify apidojo/instagram-scraper |
1 result = one POST. 12 posts is 12 items, and it returns no profile. | $6.00 → $5.64 per 12 posts (their per-post rate is $0.50 → $0.47) | A higher Apify plan | 5 runs a month, 10 items a run |
Apify apify/instagram-profile-scraper |
1 result = 1 profile, no posts | Not published | This actor's per-plan rates are not published on a page we could read. | $5 credit |
| Bright Data | 1 record — “record” is not defined on their pricing page | $1.50 → $1.30 | Scale plan at $499 every month | 5,000 records a month |
| ScrapingDog | Not published — Instagram is absent from their own credits table, and their Instagram documentation states no credit cost | Not published | The $30,000-a-month plan | 200 credits |
| Instagram Graph API (Meta) | the official route | No published rate | A Meta developer account, a registered app, an Instagram professional account, and Advanced Access — which requires App Review and Business Verification — to read accounts you do not own. | — |
The closest published rates, and what they cost
HasData Growth at $0.69 is the closest published rate, and it is a true like-for-like: one HasData request also returns a profile with its latest 12 posts. It costs $208 every month — $624 for three months and $2,496 for a year — while our Default $0.40 is below it with no plan at all, and our Scale $0.28 comes from a one-time $500 deposit that never expires. Their Basic plan is $0.99, for $99 a month.
HikerAPI's volume rate of $0.60 is a per-request price, not a bundle price, and it is not an entry price: it needs a prepaid balance of $599. The rate a new account meets is $1.00 per 1,000 after a $100 top-up, with $0.69 at $299 — all three thresholds published on their own pricing page, re-read 16 September 2026. They also bill per request with pagination charged separately, so a profile with its posts is at least two requests.
How to read the table
Every figure is the vendor's own published rate, checked 8 September 2026, and our column shows our lowest rate against theirs rather than against their entry price. Where a vendor bills per item rather than per bundle we show both, and the arithmetic is stated in the cell.
Some rows are marked because the vendor's own pages leave a gap. Bright Data does not define what a “record” is. ScrapingDog documents an Instagram endpoint but publishes no credit cost for it anywhere we could read — Instagram is missing from their credits table, and their Instagram documentation states no price — so that row reads Not published rather than carrying a number we cannot source. Two Apify actors are in the same position. An empty cell is the honest cell; we do not fill one with a figure the vendor has not printed.
Use cases
What Teams Actually Pull Instagram Data For
Four jobs that account for most Instagram API traffic, and the band each one needs.
Influencer vetting at list scale
Follower count on its own is the easiest number to buy. What separates a real creator from an inflated one is engagement per post and posting cadence, and both need include_post_details=true.
At $4.00 per 1,000 a 5,000-creator screen costs $20, or $14 at Scale. Screen on the cheap band first and only open posts for the shortlist.
Competitor and brand monitoring
Snapshot a set of handles daily on the profile band and store the deltas: followers, post count, days since last post. Because the grid costs nothing extra, take it every time — posting cadence is the context that makes a follower delta readable.
200 handles daily is 200 calls, about $6 a month at Default and about $4 at Scale.
Lead enrichment from a bio
The link in bio, the external URL and the business flags are often the only public connection between a creator and the company behind them. Contact and business field groups add 20 percent each when you need them.
Because there is no app to register and no review to pass, a one-off enrichment run does not need a Meta project to exist first.
Social audits and reporting
daysSinceLastPost, isActive and followerFollowingRatio come back on every profile call, which is enough for a dormancy and authenticity pass without opening a single post.
Add post details only for the accounts that pass the cheap filter, and the audit costs a fraction of a flat per-item run.
# One line per handle: date, handle, followers, posts, days since last post. # include_posts is the SAME rate as the profile alone, so always take the grid. while IFS= read -r h; do curl -s -G "https://apiserpent.com/api/social/instagram/profile" \ --data-urlencode "username=$h" \ -d "include_posts=true" \ -H "X-API-Key: $SERPENT_KEY" \ | jq -r '[.username, (.followersCount|tostring), (.postsCount|tostring), (.daysSinceLastPost // "n/a"|tostring)] | @csv' \ | sed "s|^|$(date -u +%F),|" >> instagram-log.csv done < handles.txt
FAQ
Instagram API Questions
include_posts and the recent-post grid comes back too, with a thumbnail, permalink, shortcode, timestamp and media type of IMAGE, VIDEO or CAROUSEL for each post, plus the newest post date and days since it. Per-post like counts, comment counts and captions, and the engagement metrics averaged from them, come from include_post_details.
instagram-scraper counts every result as one item, so a profile plus 12 posts is 13 billable items, and that turns a $2.70 per 1,000 rate into $35.10 per 1,000 bundles. HikerAPI bills per request and paginates separately, so a profile with its posts is at least two requests.
include_post_details=true. Instagram's profile grid does not carry per-post like and comment counts, so each recent post has to be opened for them, and that is the $4.00 band. With it you get likeCount, commentCount and caption on each post, plus engagementRate, avgLikesPerPost and avgCommentsPerPost averaged over the posts that carried counts. Without it those three fields are null rather than 0, and postsSampled reads 0, so you can always tell a missing measurement from a real zero. Up to 12 posts are opened per request.
include_posts, and the count is not part of the price, so a profile that shows fewer posts costs the same as one that shows more. Post-details enrichment opens up to 12 of them. The recentPosts array is always present, so a profile with no visible posts arrives as an empty list rather than a missing key.
Try the Instagram API Free
Free to start on eligible endpoints. No card and no subscription. A profile with its recent posts from $0.40/1K on Default, $0.28 at Scale.
Try for Free

