The Cheapest Instagram API for Developers

Bio, followers, engagement and recent posts as JSON. No Facebook developer account, no app, no App Review.

Try for Free View Documentation
Profile + posts from $0.28/1K No App Review 10 Free Calls Public Profile Data

The recent-post grid comes back in the same call, at the same price as the profile alone — the one place a bundle normally costs extra.

Run a live Instagram lookup

One real call, no signup and no key. Give it any public handle and read the JSON it returns.

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 + Posts

Profile with Recent Posts

from $0.28
/1K calls — the same rate as the profile alone
  • 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
Default$0.40/1K calls
Growth$0.36/1K calls
Scale$0.28/1K calls
Read the docs →
Engagement

Profile with Post Details

from $2.80
/1K calls (Scale tier)
  • GET /api/social/instagram/profile?include_post_details=true
  • Per-post like counts, comment counts and captions
  • engagementRate, averaged over posts that carry counts
  • avgLikesPerPost and avgCommentsPerPost
  • postsSampled separates absence from a real zero
  • Up to 12 posts opened per request
Default$4.00/1K calls
Growth$3.60/1K calls
Scale$2.80/1K calls
Read the docs →

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.

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.

cURL — the three bands
# 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"
Python — screen an influencer list on engagement
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",
    )
Node.js — a daily follower-growth log
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"));
JSON Response (partial)
{
  "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.

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%)

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.

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.

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.

Bash — nightly follower log
# 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

Instagram API Questions

No. You send a public username or profile URL and structured JSON comes back. There is no Instagram login, no OAuth token, no registered app and no review process. Meta's own route is the opposite: the Instagram Graph API needs a Meta developer account, a registered app and an Instagram professional account, and reading any professional account you do not own requires Advanced Access, which requires App Review and Business Verification. Its Business Discovery lookup also returns nothing at all for age-gated accounts and nothing for personal accounts. Checked against Meta's documentation on 8 September 2026.
Profile data: username, full name, biography, profile picture URL, follower count, following count, post count, verification status, private and account-type flags, and the external link in the bio. Add 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.
No, and that is the unusual part. A profile with its recent-post grid is billed at exactly the same rate as the profile on its own: $0.40 per 1,000 on Default, $0.36 on Growth, $0.28 on Scale. We do not cap the grid; you get what the profile page renders, which is normally about 12 posts. Most vendors bill this the other way. Apify's official 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.
Per 1,000 requests: a profile is $0.40 on Default, $0.36 on Growth and $0.28 on Scale, and a profile with its recent posts is the same. Post-details enrichment, which opens each recent post for its likes, comments and caption, is $4.00, $3.60 and $2.80. Four optional field groups — contact info, business details, reels info and full profile detail — each add 20 percent to the request. Growth unlocks with a one-time $100 deposit and Scale with a one-time $500 deposit; both are permanent and neither is a monthly plan. A username that does not exist answers 404 and is charged; a failure on our side is refunded, and a post-details request is billed at the tier actually delivered. Free to start on eligible endpoints, with the allowance shared across them.
No published rate in our comparison table goes below ours. HasData's Growth plan at $0.69 per 1,000 is the closest, and it is a genuine like-for-like because one HasData request also returns a profile with its latest 12 posts. It costs $208 every month, which is $624 for three months and $2,496 for a year; 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. HasData's Basic plan is $0.99 and costs $99 every month. HikerAPI's volume rate of $0.60 is a per-request price rather than a bundle price, and they do not publish the balance threshold that unlocks it, and they bill per request, so a profile with its posts is at least two of them. The gap is widest on the bundle: Apify's official scraper works out at $35.10 per 1,000 bundles, or $19.50 on its $999-a-month Business plan.
Set 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.
Whatever the public profile grid renders, which is normally about 12. We do not impose a cap of our own on 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.
No. These endpoints read publicly available profile data only. A private account returns what any logged-out visitor would see — username, profile picture and account status — and nothing more. We do not access private content, do not ask for or use anyone's credentials, and do not bypass Instagram's privacy settings. You remain responsible for making sure your own use of the data complies with applicable law and with Instagram's terms.
A username that genuinely does not exist answers 404 and is charged, because that is a real answer and we did the work to establish it. A request we could not complete on our side is refunded automatically and costs you nothing. Partial answers ship rather than being discarded: if the profile came back but a field did not, you get the profile, and a post-details request that could not open every post is billed at the tier actually delivered rather than the tier requested.

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

Related guides

More on working with social profile data in code.

Graph API vs Public DataWhat App Review actually gates. Instagram Profile TrackerFollower and cadence deltas over time. Scrape Instagram for FreeHow to pull Instagram data in 2026. LinkedIn APIProfiles, jobs and company firmographics. Social Media APIOne API for social and video platform data. YouTube APISearch videos, channels, and playlists. All SERP APIsWeb, news, images, and video across five engines.