Instagram Profile Scraper | Followers, Following & Post Count
Pricing
from $1.20 / 1,000 results
Instagram Profile Scraper | Followers, Following & Post Count
Get public Instagram profile stats without logging in: full name, followers, following, post count, profile picture and URL for a bulk list of usernames. Counts are Instagram's rounded public figures (like 269M). Missing usernames are flagged, never charged. MCP-ready for AI agents.
Pricing
from $1.20 / 1,000 results
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
68
Total users
15
Monthly active users
3 days ago
Last modified
Categories
Share
From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with nearly 139,000 runs across our actors.
Why choose this actor?
- 48 profiles in 57 seconds, with no Instagram login. A recorded run of 50 usernames delivered 48 profiles in 57 seconds at 512 MB. The other 2 no longer exist on Instagram, so they were logged and not charged. No account, cookies or Graph API app of yours is involved, so there is nothing of yours to get banned.
- Exact counts plus how the reels perform. NASA came back with 104,334,628 followers, not "104M". Each row also carries the median views of the profile's recent reels (up to 12) and its 3 latest reels with views, likes and comments, inside the same row at no extra charge.
- One charge per profile delivered. $1.20 to $2.00 per 1,000 profiles depending on your plan. Usernames that do not exist, or that Instagram refuses, are not charged. The one extra cost is an optional $0.008 browser retry for hard usernames, capped at 20 per run, which you can switch off.
Part of The Mine Works Social media and video family: Threads Scraper, Reddit Scraper, Threads Search Scraper, Instagram Followers & Following, Reddit Search Scraper, Twitter / X Scraper.
Try it in one minute
Paste this into the input's JSON tab and start the run. It returns 10 public profiles, each with its reel snapshot, usually in under a minute (recorded runs of 11 and 12 usernames took 50 and 42 seconds).
{"usernames": ["nasa", "natgeo", "netflix", "nba", "nfl", "espn", "cnn", "time", "voguemagazine", "nike"]}
usernames accepts plain handles (nasa), handles with the @ (@nasa), and full profile links (https://www.instagram.com/nasa/); the actor strips the link down to the handle and removes duplicates. For a single profile you can use the username field instead. Up to 1,000 usernames per run.
Apify's free plan includes $5 of credit every month, which covers about 2,499 profiles at this actor's price (the Free plan rate of $0.002 per profile, plus $0.00005 per run to start at the default 512 MB). Any browser retries, at $0.008 each, come out of the same credit.
Copy to your AI assistant
themineworks/instagram-profile-scraper on Apify. Returns public Instagram profile data for a list of usernames with no login: full name, bio, exact follower, following and post counts, verified and private flags, link in bio, profile picture, user ID, plus the median views of up to 12 recent reels and the 3 latest reels with views, likes and comments. Call ApifyClient("TOKEN").actor("themineworks/instagram-profile-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: usernames (list of handles or profile URLs, up to 1000) or username (one handle). Optional: includePostDetails (default false; adds caption, coauthors, video URL, duration and exact time to the 3 preview reels), maxDays (only reels from the last N days count toward the median and preview), allowBrowserFallback (default true; set false to never pay the $0.008 browser retry). The dataset holds one row per profile delivered and every row is charged; usernames that were not found or were skipped are not in it. Full spec: GET https://api.apify.com/v2/acts/themineworks~instagram-profile-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations
Key features
- 14 profile fields.
username,full_name,biography,followers,following,posts_count,is_verified,is_private,external_url(link in bio),profile_pic_url,user_id,profile_url,sourceandscraped_at. A field Instagram leaves empty (for example no bio) is left out of the row. - A reel snapshot in every row.
median_play_countis the median views over up to 12 recent reels (pinned reels left out of the median).latestReelsholds the 3 latest reels with 15 fields each: link, date, views, likes, comments, pinned and collab flags, andreach_ratio, the reel's views divided by the profile's median. - Reel details on request.
includePostDetailsadds the caption, coauthor usernames, video link, duration in seconds and exact publish time to each of the 3 preview reels, still one charge per profile. - Up to 1,000 usernames per run. Three profiles are read at a time. Duplicates are removed before the run starts, so a repeated handle is never charged twice.
- A status log for everything not delivered. Usernames that do not exist, were blocked or were skipped are recorded, with the reason, in a separate dataset named
status-logand in the run'sOUTPUTsummary, never in your results. - Cost caps built in. At most 20 usernames per run go to the paid browser retry. If Instagram blocks 12 profiles in a row, the run stops and marks the rest as skipped instead of spending on a blocked run.
How to use it
Basic: a list of handles
{"usernames": ["cartier", "tiffanyandco", "messika", "boucheron"]}
Paste profile links straight from a spreadsheet
{"usernames": ["https://www.instagram.com/nasa/","https://www.instagram.com/natgeo/?hl=en","@nba"]}
All three forms end up as plain handles. Query strings and trailing paths are removed.
Creator vetting: real reach against follower count
{"usernames": ["creator_one", "creator_two", "creator_three"],"maxDays": 60}
With maxDays set, only reels from the last 60 days (among the 12 most recent) count toward median_play_count and the preview. Divide median_play_count by followers for a quick reach rate, and look at reach_ratio on each preview reel to spot a one off hit against a steady account. A profile whose reels are hidden or missing says why in reels_status.
Weekly competitor tracking
{"usernames": ["brand_a", "brand_b", "brand_c", "brand_d"]}
Save it as a task and add a weekly schedule in Apify Console. Each run adds one dated row per profile (scraped_at), so a sheet or dashboard can chart followers, posts_count and median_play_count week by week. Each scheduled run is billed per profile like a manual one.
Captions and video links for the latest reels
{"usernames": ["cartier", "boucheron"],"includePostDetails": true}
Each preview reel gains caption, coauthors, owner_username, video_url and video_duration, and taken_at switches from a time worked out from the reel's ID to the exact publish time (taken_at_source: "exact"). One extra lookup per reel, so the run takes a little longer; the price per profile is the same.
The cheapest possible run
{"usernames": ["nasa", "natgeo"],"allowBrowserFallback": false}
With the browser retry off, a username the fast routes cannot read is marked skipped in the status log and nothing extra is ever charged. In 11 recorded runs on the current route (166 usernames between them), the browser retry was never needed.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
usernames | array | none | Handles, @handles or profile links. Up to 1,000 per run; duplicates are removed. |
username | string | none | One handle, added to usernames. Handy for a single lookup. |
includePosts | boolean | false | Kept so older inputs still run. It has no effect: every row already carries the 3 reel preview. |
maxDays | integer | none | 1 to 3650. When set, only reels from the last N days (among the 12 read) count toward median_play_count and the preview. |
maxPosts | integer | 500 | Kept so older inputs still run. Values under 12 lower how many reels feed the median; the preview is always at most 3 reels. |
includePostDetails | boolean | false | Adds caption, coauthors, owner, video link, duration and exact publish time to the 3 preview reels. Same price per profile. |
proxyConfiguration | object | Apify residential | Used only for the profile page read and the browser retry. The main route runs on Apify's datacenter proxy by itself. Leave as is. |
allowBrowserFallback | boolean | true | Lets a username the fast routes cannot read try once more in a real browser, for $0.008. Set false to skip such usernames and never pay that fee. |
What data do you get?
One row per profile delivered. Every row in the results is a profile, and every row is charged.
Identity: username, full_name, biography, external_url (the first link in bio), profile_pic_url, user_id (Instagram's numeric ID), profile_url.
Counts and flags: followers, following, posts_count, is_verified, is_private. source says where the counts came from: graphql for exact counts, or html-og when only the page preview could be read, in which case counts are rounded the way Instagram shows them there (for example 269M) and the verified and private flags and the user ID are missing.
Reel snapshot: median_play_count, reels_sampled (how many reels the median used), latestReels (up to 3), reels_preview_note (a pointer to the full reels actor when the profile has more than 3), reels_status and, when reels are missing, reels_note with the reason. Each reel has shortcode, url, taken_at, taken_at_source, play_count, like_count, comment_count, share_count (always null: Instagram does not show shares to logged out visitors), product_type, is_reel, is_pinned, is_collab, counts_hidden, display_url and reach_ratio.
reels_status values: ok, none (the profile has no reels), private, unavailable (restricted or age gated), blocked (Instagram refused the reels request; profile fields are complete), route_broken (Instagram changed its internal reels query during the run; profile fields are complete), time_limit (the run was seconds from its time limit, so reels were skipped; profile fields are complete).
With includePostDetails: each preview reel adds caption, coauthors, owner_username, video_url, video_duration, and the row adds post_details_status.
Housekeeping: scraped_at, and posts_included, which is always 0 and kept only for older integrations.
Not in your results: usernames that do not exist, were blocked on every route, were skipped by a cost cap, or were not reached before the run's time limit. Each is written with its reason to the dataset named status-log in your Apify storage, and the run's OUTPUT record holds a summary with the counts (requested, scraped, not_found, blocked, skipped, skipped_time_limit, ended_on_deadline, browser_fallbacks).
Stable fields for automations
These fields were present in every row of the recorded 48 profile run and of our other recorded runs on the current route. Their names will not change, so a sheet, Zapier zap or n8n flow can map them once.
| Field | What it is |
|---|---|
username | The handle, the key to store and join on |
user_id | Instagram's numeric account ID, which survives a handle change |
followers | Follower count |
following | Following count |
posts_count | Number of posts |
is_verified | Blue check |
is_private | Private account |
profile_pic_url | Profile picture link (Instagram image links expire after some days) |
profile_url | Public profile link |
source | graphql (exact counts) or html-og (rounded) |
latestReels | Up to 3 latest reels; an empty list when there are none |
reels_status | Why the reel list looks the way it does |
scraped_at | When the row was written |
None of our recorded rows came from html-og; on such a row user_id, is_verified and is_private would be missing. full_name was missing on 1 of 53 rows in another run, and biography, external_url and median_play_count are left out when the profile has none, so treat those as optional.
Output examples
A profile row as delivered today (recorded run of 27 September 2026 for NASA; the reel list is trimmed to one reel and image links are shortened):
{"username": "nasa","full_name": "NASA","biography": "Making the seemingly impossible, possible. ✨","followers": 104334628,"following": 89,"posts_count": 4934,"is_verified": true,"is_private": false,"profile_pic_url": "https://scontent-mia5-1.cdninstagram.com/v/t51.2885-19/29090066_159271188110124_1152068159029641216_n.jpg?...","external_url": "https://www.nasa.gov","user_id": "528817151","profile_url": "https://www.instagram.com/nasa/","source": "graphql","scraped_at": "2026-09-27T12:14:16.596Z","latestReels": [{"shortcode": "DdhFkS7KGkZ","url": "https://www.instagram.com/reel/DdhFkS7KGkZ/","taken_at": "2026-09-20T17:08:42.959Z","taken_at_source": "media_id","play_count": 6968080,"like_count": 45232,"comment_count": 592,"share_count": null,"product_type": "clips","is_reel": true,"is_pinned": false,"is_collab": true,"counts_hidden": false,"display_url": "https://scontent-lga3-1.cdninstagram.com/v/t51.82787-15/818140576_18629026666008515_1855276003783924212_n.jpg?...","reach_ratio": 1.29}],"reels_sampled": 12,"median_play_count": 5420857,"reels_preview_note": "Showing the 3 most recent reels; median_play_count uses up to 12. For every reel with date and view filters, use themineworks/instagram-reels-views-scraper.","reels_status": "ok","posts_included": 0}
A smaller business account (same run; reel list trimmed to one reel):
{"username": "jewelbox.co.in","full_name": "Jewelbox","biography": "Lab Grown Diamond Jewellery\nAs seen on Shark Tank India \n📍• Mumbai • Bangalore • New Delhi • Gurgaon • Noida • Kolkata • Chennai • Guwahati •Ludhiana","followers": 86181,"following": 12,"posts_count": 724,"is_verified": false,"is_private": false,"external_url": "https://jewelbox.co.in/","user_id": "49521494812","profile_url": "https://www.instagram.com/jewelbox.co.in/","source": "graphql","latestReels": [{"shortcode": "DdwNSbWBd6Q","url": "https://www.instagram.com/reel/DdwNSbWBd6Q/","taken_at": "2026-09-26T14:04:47.365Z","play_count": 1551,"like_count": 35,"comment_count": 2,"is_pinned": false,"is_collab": false,"reach_ratio": 0.14}],"reels_status": "ok"}
This excerpt drops a few fields for length; the full row has the same fields as the NASA row. A reach_ratio of 0.14 means the newest reel had 14% of the account's median views when the run read it.
One preview reel with includePostDetails on (recorded run for Cartier; caption and links shortened):
{"shortcode": "DdsS904Euey","url": "https://www.instagram.com/reel/DdsS904Euey/","taken_at": "2026-09-25T15:55:04.000Z","taken_at_source": "exact","play_count": 148288,"like_count": 3874,"comment_count": 40,"share_count": null,"product_type": "clips","is_reel": true,"is_pinned": false,"is_collab": false,"counts_hidden": false,"display_url": "https://scontent-lga3-3.cdninstagram.com/v/t51.82787-15/818463171_18653859166049800_7582339680455902085_n.jpg?...","reach_ratio": 0.58,"caption": "A true style companion, the new Clash de Cartier bag can be carried just as easily in the hand, on the arm, or over the shoulder ...","coauthors": [],"owner_username": "cartier","video_url": "https://scontent-ord5-2.cdninstagram.com/o1/v/t2/f2/m86/AQNVbouNwsGMxWsSW2qJczuaqPTzc_4V391Dsb-dL4hDLZSN3iK5jyLrnhPskhkzX8UhkskpLcMQwl080p-qBUJqwdRAAGxAdc95ffQ.mp4?...","video_duration": 58.69}
A status log record for a username that does not exist (in the status-log dataset, not charged):
{"username": "bottegaveneta","status": "not_found","reason": "no public profile at this username","scraped_at": "2026-09-26T12:48:49.001Z"}
Pricing
Pay per event. Three events exist on this actor, and in a normal run only the profile rows and the run start appear on your bill.
| Event | Free | Bronze | Silver | Gold and above |
|---|---|---|---|---|
Profile row (apify-default-dataset-item), per profile | $0.002 | $0.00175 | $0.0015 | $0.0012 |
| Per 1,000 profiles | $2.00 | $1.75 | $1.50 | $1.20 |
Browser retry (proxy_fallback), per attempt | $0.008 | $0.008 | $0.008 | $0.008 |
Run start (apify-actor-start), per GB of memory | $0.00005 | $0.00005 | $0.00005 | $0.00005 |
When each one is charged:
apify-default-dataset-item: Apify charges it automatically for every row written to the run's default dataset. This actor writes only delivered profiles there, one row per profile, so it is exactly one charge per profile. The reel snapshot and the reel details ride inside that row at no extra cost. Not found, blocked and skipped usernames, and the run summary, go to the separatestatus-logdataset and theOUTPUTrecord, which are not charged.proxy_fallback: $0.008, charged once for each username sent to the browser retry, and charged whether or not the browser then finds the profile, because the residential proxy cost is spent by trying. A username goes there only when Instagram's profile query returned nothing for it and its profile page failed three times with an error (a page that says the profile does not exist does not count). At most 20 usernames per run, so at most $0.16 per run. The browser needs about a minute per username, so it is not started when the run is too close to its time limit; a username it never tried is skipped and not charged. WithallowBrowserFallback: false, it is never charged. In 11 recorded runs on the current route (166 usernames), it was charged 0 times.apify-actor-start: Apify charges it once when the run starts, one event per GB of memory with a minimum of one. At the default 512 MB that is one event, $0.00005 per run.
Never charged: usernames that do not exist, usernames blocked on every route (other than a browser retry fee already described), usernames skipped by a cost cap or by the time limit, duplicate usernames in your list, and the summary.
What real jobs cost on Gold: 1,000 profiles cost $1.20 plus $0.00005. The recorded 48 profile run cost $0.0576 plus $0.00005.
There is no price change scheduled for this actor. The Pricing tab on this page always shows the rate for your own plan.
FAQ
What does this actor read from Instagram? The public profile data Instagram's own website loads for a visitor who is not logged in: the profile, its counts and its reels tab. It does not log in, so it cannot see anything a logged out visitor cannot.
How many profiles can I scrape in one run?
Up to 1,000 usernames; any beyond the first 1,000 are ignored, so split a longer list across runs. Three are read at a time; a recorded run of 50 took 57 seconds and one of 131 took 158 seconds, so a long list needs a timeout above the 300 second default. When the time limit comes first, the actor stops starting new usernames about 20 seconds before it, ends as Succeeded with the profiles it has, sets ended_on_deadline: true in the summary, and lists every username it did not reach as skipped in the status log, so you can run those again.
How fresh is the data?
Live. Every run reads Instagram at the moment it runs, and scraped_at stamps each row.
Do I need an Instagram account, cookies or an API key? No. Nothing of yours is used, so nothing of yours can be blocked or banned.
Do I need to set up a proxy? No. The main route runs on Apify's datacenter proxy by itself, and the residential proxy in the input is used only for the profile page read and the browser retry. Leave the proxy setting as it is.
Are the follower counts exact?
Yes when source is graphql, which was every row in our recorded runs. If Instagram only serves the page preview for a profile, source is html-og and the counts are rounded the way the preview shows them, such as 269M.
What happens with private accounts?
The row is delivered and charged with the public fields Instagram shows for a private account (name, counts, picture) and is_private: true. Their reels are visible only to approved followers, so latestReels is empty and reels_status is private.
What happens with usernames that do not exist?
They are checked twice, recorded as not_found in the status-log dataset with the reason, and not charged. They do not appear in your results.
Does it return every reel, shares, saves, stories or comments?
No. It returns a 3 reel preview and a median over up to 12 reels. Shares and saves are not shown to logged out visitors, so share_count is always null. Stories and comment text are not included. For every reel of a profile with date and view filters, use the Instagram Reels Views Scraper.
Why is reels_status "route_broken"?
Instagram sometimes renames the internal query its website uses for reels. The actor looks up the new name once per run; if it still cannot read reels, the profile fields are delivered complete and each affected row says route_broken instead of silently showing no reels.
How do I track a profile over time? Save the input as a task and add a daily or weekly schedule in Apify Console. Each run adds a new dated row per profile, which you can chart in a sheet or dashboard. There is no monitor mode here, because every run is a fresh snapshot you usually want.
How do I export the data?
From the run's Storage tab as JSON, CSV, Excel, XML or HTML, or through the Apify API. JSON keeps latestReels nested; CSV and Excel flatten it into columns.
Can I use it from Claude, ChatGPT or another AI assistant?
- Connector URL:
https://mcp.apify.com/?tools=themineworks/instagram-profile-scraper. - Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http instagram-profile-scraper "https://mcp.apify.com/?tools=themineworks/instagram-profile-scraper".
Is it legal to scrape Instagram profiles? The actor reads only public profile data that anyone can see without logging in. Profiles of people contain personal data, such as names, bios and pictures, so you are responsible for having a lawful reason to process them and for following Instagram's terms and data protection law such as GDPR and CCPA. This actor is independent and not affiliated with, endorsed by or sponsored by Meta Platforms, Inc.; Instagram is a trademark of Meta Platforms, Inc. This is general information, not legal advice.
Integrations
- Google Sheets: send each run's profiles to a sheet with Apify's Google Sheets integration, one row per profile per run.
- Make, Zapier and n8n: start runs and read datasets with the official Apify apps and nodes.
- Webhooks: get a call to your own URL when a run succeeds, then fetch its dataset.
- API and SDKs: the Apify API and the Python and JavaScript clients.
- MCP clients: Claude, ChatGPT, Cursor and others through
https://mcp.apify.com/?tools=themineworks/instagram-profile-scraper.
More from The Mine Works
Social media and video
- Threads Scraper
- Reddit Scraper
- Threads Search Scraper
- Instagram Followers & Following
- Reddit Search Scraper
- Twitter / X Scraper
- Xiaohongshu (RED) Scraper
- YouTube Transcript
- Telegram Channel Scraper
- Telegram Channel Finder
- Pinterest Profile Scraper
- TikTok Scraper
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
E-commerce and marketplaces
Company and business data
Food and local services
Developer and AI tools
More tools
- Tennis Match & Player Data Scraper
- Google Hotels Prices Scraper
- LandWatch Scraper
- Taobao Products Scraper 淘宝 天猫
Support
Found a bug or need a field? Open an issue on the Issues tab of this actor. To ask for a new source, email dmineworks@gmail.com.
Instagram Profile Scraper returns exact follower, following and post counts, bio and links, plus median reel views and the 3 latest reels, for up to 1,000 public profiles per run with no login, from $1.20 per 1,000 profiles.

