Instagram Profile Scraper avatar

Instagram Profile Scraper

Pricing

from $1.75 / 1,000 profiles

Go to Apify Store
Instagram Profile Scraper

Instagram Profile Scraper

Scrape Instagram profiles by handle: followers, post count, category and engagement averages, latest posts nested. $1.75 per 1,000 profiles: 32% below the Free plan price of apify/instagram-profile-scraper, one flat rate for every buyer.

Pricing

from $1.75 / 1,000 profiles

Rating

0.0

(0)

Developer

itnlab

itnlab

Maintained by Community

Actor stats

0

Bookmarked

16

Total users

8

Monthly active users

5 days ago

Last modified

Categories

Share

Give it Instagram handles and get one row per account — followers, follows, post count, verification, business category, engagement averages — with the account's latest posts nested inside the same row, at a flat $1.75 per 1,000 profiles for every buyer.

This is the narrow Actor of the three. If you want post rows, reel rows or comment rows, use Instagram Scraper or Instagram Comment Scraper with Sentiment, which are the same collector wearing a different form. What this one sells is the account: paste handles, get a table you can sort by followers.

What you get

  • The account's own figures — followersCount, followsCount, postsCount, verified, private, isBusinessAccount, businessCategoryName, fullName, id, url. When Instagram answers the profile request with its login page, the row is read from the public profile page instead: that page carries no business flag or category, so isBusinessAccount and businessCategoryName are absent on those rows, and postsCount often is.
  • Engagement, computed rather than claimed — avgLikes, avgComments and engagementRatePct, worked out over the posts actually collected (avgVideoViews too, when the posts carry view counts - logged out a profile's own posts normally do not). postsInSnapshot says how many posts the snapshot holds, so you can tell an average over 12 posts from one over 200; the averages use only those of them that carry their counts. engagementRatePct is the average of likes + comments per post, over the posts carrying both, divided by followers, as a percentage to 4 decimals.
  • latestPosts — the recent posts nested in the row: caption, hashtags, mentions, timestamp, likesCount, commentsCount, taggedUsers, dimensions, and the media URLs when you ask for them. A nested post whose comments a comment run has already read also carries firstComment and latestComments, the same as a post row does.
  • The account as it presents itself — biography, profilePicUrl, externalUrl, externalUrls (the full link list, each with its title) and highlightReelCount. Collected since 14 September 2026, under a data-controller decision described below.
  • relatedProfiles — the accounts Instagram suggests beside the profile: handle, name, id, verified and private flags, avatar. Off by default (includeRelatedProfiles), because it costs an extra request per account and the accounts in it are third parties nobody named.
  • collectedAt — when the snapshot behind the row was taken. Rows are served from a stored snapshot rather than fetched at read time, so this is the honest age of the data.
  • A row for every handle, including the ones that failed — a handle that could not be collected writes a row carrying inputUrl, error and errorDescription rather than disappearing from the dataset, and error rows are never charged. A private account is not a failure here: it gets its profile row, with private: true and latestPosts: []. Fifty different handles in means fifty rows out; the same handle twice is collected once.

Input

{
"usernames": ["nasa", "natgeo"],
"resultsLimit": 12
}

apify/instagram-profile-scraper's published form is two fields — usernames and includeAboutSection — and its own example input runs here unchanged. Both are on this form; tests/test_actor_variants.py keeps a copy of that object so the day either side moves, the suite says so.

usernames takes handles or profile URLs; both spellings work. resultsLimit is how many posts to nest per account. onlyPostsNewerThan drops nested posts older than a date or a span like "3 days", and the profile row still comes back either way — an account with nothing recent is still an account. includeMediaUrls adds the signed image and video URLs, which expire within days and are withheld unless asked for. includeRelatedProfiles adds the suggested-accounts list, at one extra request per account. enrichPosts is on by default and is what gives each nested post its timestamp, likesCount, commentsCount, dimensions and taggedUsers: Instagram's logged-out grid carries none of them, so they are read from each post's own page at one request per post. Turn it off for a faster, thinner listing.

Through the API this Actor also takes Instagram Scraper's fields — directUrls, resultsType, search — and a run that sets them writes that Actor's post or comment rows, at the same $1.75 per 1,000. The form offers only the profile fields, because that is what this listing is for.

Output

One row per account:

{
"dataType": "profile",
"id": "528817151",
"username": "nasa",
"fullName": "NASA",
"url": "https://www.instagram.com/nasa/",
"verified": true,
"private": false,
"isBusinessAccount": true,
"businessCategoryName": "Government Organization",
"followersCount": 97400000,
"followsCount": 78,
"postsCount": 4210,
"postsInSnapshot": 12,
"avgLikes": 412903,
"avgComments": 1363,
"engagementRatePct": 0.4253,
"biography": "Exploring the universe and our home planet.",
"profilePicUrl": "https://scontent.cdninstagram.com/v/t51.2885-19/a1_n.jpg",
"externalUrl": "http://nasa.gov",
"externalUrls": [{"url": "http://nasa.gov", "title": "NASA", "lynx_url": "https://l.instagram.com/?u=http%3A%2F%2Fnasa.gov", "link_type": "external"}],
"highlightReelCount": 14,
"latestPosts": [
{
"shortCode": "DCMUrLltVlM",
"type": "Image",
"caption": "A new view of the Carina Nebula. #webb",
"hashtags": ["webb"],
"timestamp": "2026-08-30T18:02:11.000Z",
"likesCount": 412903,
"commentsCount": 1363
}
],
"collectedAt": "2026-08-30T21:14:05.000Z",
"inputUrl": "nasa"
}

What it does not return, and why that is written down

A figure the collected surface did not carry is an absent column — never 0, never a stand-in. postsCount missing means nobody measured it, not that the account has no posts. latestPosts is [] when the snapshot holds no posts to nest — a private account, one that has never posted, or an onlyPostsNewerThan that kept none — so read it beside private and postsInSnapshot.

What a nested post carries depends on where it was read. Instagram's logged-out profile grid does not send per-post like counts, comment counts or timestamps. With enrichPosts on — the default — each post is read again from its own page, which does carry them. Turn it off and those columns are left out of the nested entries rather than written as 0 — and with no likes to average, avgLikes, avgComments and engagementRatePct come back absent too. They are absent because nobody measured them, not because the account has no engagement. A post fetched by its own URL carries the full set, which is what Instagram Scraper does when you give it post URLs.

biography, profilePicUrl, externalUrl, externalUrls and highlightReelCount were on this list until 14 September 2026 and are now collected. The data controller's decision was to match what apify/instagram-profile-scraper publishes and not one field further, so that a buyer switching does not lose the bio — and so that the line where collection stops is a stated purpose rather than the shape of a payload. The compliance file carries the dated row, the amended legitimate-interest assessment and the field list.

What the reference publishes and this Actor still does not:

  • public_email and public_phone_number — measured on 14 September 2026, the logged-out profile does not offer them. The reference Actor does not publish them either, and the collection ceiling written down in this project's compliance file would not admit them if a surface did.
  • profilePicUrlHD, businessAddress, fbid — not on the logged-out surfaces this Actor reads (measured 14 September 2026), so there is nothing to collect.
  • includeAboutSection — the paid About-this-account panel: date joined, country of registration, broadcast channel. None of it is on the surfaces this Actor reads, so sending the flag is refused with that sentence rather than accepted and billed for an empty panel. It is the one paid add-on the reference sells on top of its per-profile rate.
  • Stories, place pages and /tagged/ URLs — outside the perimeter. They are refused with an explanation rather than answered with an empty result set, because [] reads as "there is nothing there", which is a different and false claim.
  • Hashtags — reachable since 19 September 2026, but not here. This listing returns one row per account, with followers, engagement averages and the rest; a hashtag names content, not an account, so it is refused with that sentence rather than answered with a row of blanks. Use Instagram Scraper for a hashtag's posts — and for the comments on them too, with resultsType: comments, since it is the only listing with a Search limit to bound how many of the tag's posts get walked.

How it collects

Public, logged-out surfaces only: no login, no cookies, no session. That is what makes the perimeter above real, and it is also why the figures that are here can be trusted — they are what any visitor to the page would see.

How many posts get nested

resultsLimit is how many posts to nest per account, and a run returns that many or every post the account has, whichever is smaller. The profile row comes back either way — an account with nothing to nest is still an account.

Pricing

$1.75 per 1,000 profiles ($0.00175 each), pay-per-event.

One flat rate, for everybody. $1.75 per 1,000 — no plans, no tiers, no volume brackets, and no Apify platform usage charged on top. That is 32% below the $2.60 that apify/instagram-profile-scraper charges its Free-plan buyers (read from Apify's public API, 17 September 2026); their rate moves with the subscription a buyer is on, and ours does not move at all.

One thing a price comparison leaves out and an invoice does not: theirs charges the About-this-account panel as a separate add-on, at $7.00 per 1,000 on their Free plan. Here there is no add-on, because this Actor does not collect that panel at all.

A result is a row: one account is one result, however many posts are nested in latestPosts. The nested posts are part of the row, not rows of their own, and are not charged separately.