Instagram Profile Scraper | 16 Fields + 12 Recent Posts
Pricing
from $1.20 / 1,000 results
Instagram Profile Scraper | 16 Fields + 12 Recent Posts
Scrape any public Instagram profile without login: followers, following, posts count, bio, verified/private flags, category, profile pic & external link, plus optional recent posts. Bulk usernames. Works in Claude, ChatGPT & any MCP AI agent.
Pricing
from $1.20 / 1,000 results
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
23
Total users
10
Monthly active users
3 days ago
Last modified
Categories
Share
Instagram Profile Scraper — 16 Fields + 12 Recent Posts
The Mine Works: 544 users across 100 public Actors, >99% run success. Pay only for results delivered. Browse all Actors.
How to get Instagram profile data without the Graph API
Feed it a username or a bulk list of up to 1,000. Get back 16 flat fields per public profile — follower count, following count, posts count, bio, verified / private / business flags, category, external link, profile picture URL, numeric user ID, and canonical profile URL — plus, on request, the 12 most recent posts with caption, likes, comments, media URL, and timestamp.
Instagram's official Graph API only surfaces data for accounts you already own or manage, and it demands a Business or Creator account plus an approved app. This actor reads the same public surface any logged-out visitor sees. No OAuth, no app review, no cookies, no credentials.
✅ No login or Graph API app · ✅ 16 profile fields · ✅ Optional 12 recent posts · ✅ Bulk usernames in one run · ✅ MCP-ready for AI agents
Scrape a single Instagram profile
The smallest useful run.
{"username": "nasa"}
@handles, full instagram.com/handle URLs, and bare usernames are all accepted and normalised.
Bulk-scrape a list of Instagram accounts
Pass an array. Requests are paced a few seconds apart to keep IPs healthy, so a large list takes time but stays reliable.
{"usernames": ["nasa", "natgeo", "bbcearth", "spacex"]}
Pull recent posts with each profile
includePosts returns the profile's recent posts. Each post arrives as its own row in the dataset, alongside the profile row — not nested inside it. Post rows carry _type: "post" and a profile_username pointing back at the profile they belong to, so the output drops straight into a spreadsheet or database table without any unnesting.
{"usernames": ["nasa", "natgeo"],"includePosts": true}
Each post row carries shortcode, url, caption, like_count, comment_count, is_video, display_url, video_url, and timestamp.
By default you get the 12 most recent posts per profile — the cap Instagram's public profile surface returns per page. To go deeper, set maxDays and the actor scrolls the profile until posts fall outside that window, up to maxPosts (max 500):
{"usernames": ["nasa"],"includePosts": true,"maxDays": 365,"maxPosts": 200}
Deep pagination needs a real browser on residential proxy, so it adds the residential fallback charge once per profile paginated, and every extra post is its own billed row. Leave maxDays empty for the fast, cheap 12-post default.
Track follower growth on a schedule
Run the same handles daily and diff followers and posts_count between runs. Every record carries scraped_at, so the dataset is a time series without any extra work.
{"usernames": ["yourbrand", "competitor1", "competitor2"],"includePosts": false,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Leave includePosts off for a monitor — you only need the counters, and it keeps the row count (and the bill) minimal.
What data do you get from an Instagram profile
Real record from a live run against nasa on 2026-07-15:
{"username": "nasa","full_name": "NASA","biography": "Making the seemingly impossible, possible. ✨","followers": 104306689,"following": 91,"posts_count": 4849,"is_verified": true,"is_private": false,"is_business": true,"profile_pic_url": "https://scontent-iad3-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": "api","scraped_at": "2026-07-15T04:23:50.989Z","posts_included": 12}
With includePosts on, each of that profile's posts follows as its own row:
{"_type": "post","profile_username": "nasa","shortcode": "DayIkFmDwlb","url": "https://www.instagram.com/p/DayIkFmDwlb/","caption": "Meet our Nancy Grace Roman Space Telescope! Scheduled to launch this August, Roman is set to join orbiting telescopes like @NASAHubble and @NASAWebb in helping scientists study the cosmos.","like_count": 99685,"comment_count": 469,"is_video": false,"display_url": "https://scontent-iad3-1.cdninstagram.com/v/t51.82787-15/746779742_18627224869049152_4483260127005954439_n.jpg","timestamp": "2026-07-14T18:27:48.000Z"}
| Field | Description |
|---|---|
👤 username | Public Instagram handle without the @ |
🏷️ full_name | Display name on the profile |
📝 biography | Bio text as shown on the profile |
👥 followers | Follower count at time of scrape |
➡️ following | Number of accounts the profile follows |
🖼️ posts_count | Total posts published |
✅ is_verified | True if the account has a verification badge |
🔒 is_private | True if the account is private |
💼 is_business | True if the account is a Business or Creator account |
🗂️ category | Business or creator category, when set |
🔗 external_url | Website link listed on the profile |
📷 profile_pic_url | Full-resolution profile picture URL |
🆔 user_id | Internal numeric Instagram ID |
🌐 profile_url | Canonical public profile URL |
🧪 source | Which route produced the record: api, html-og, or browser |
🕒 scraped_at | ISO timestamp when the record was captured |
🔢 posts_included | How many of this profile's posts were delivered as their own rows in this run |
Post rows carry their own fields:
| Field | Description |
|---|---|
🏷️ _type | Always post on a post row; absent on a profile row |
👤 profile_username | The profile this post belongs to |
🔑 shortcode | Instagram post shortcode |
🌐 url | Direct link to the post |
📝 caption | Post caption text |
❤️ like_count | Likes at time of scrape |
💬 comment_count | Comments at time of scrape |
🎥 is_video | True if the post is a video |
🖼️ display_url | Image or thumbnail URL |
▶️ video_url | Video file URL, on video posts |
🕒 timestamp | When the post was published |
To split the two apart after a run, filter on _type: profile rows do not have it, post rows always do.
Fields with no value are dropped rather than sent as null — which is why category is absent above: that account had no business category set. Private accounts return the public counters and flags but no post content, because Instagram does not serve it to logged-out visitors.
How does it scrape Instagram without logging in
Three routes, cheapest first.
- Public JSON API. The same
web_profile_infoendpoint instagram.com's own web client calls for logged-out visitors, with the public web app ID. Fast, cheap, and complete — this covers the large majority of profiles. - Server-rendered SEO tags. When the API is walled, the profile HTML still carries
og:descriptionandog:titlewith the follower / following / posts counts. Parsed as a fallback. - Real browser on residential proxy. Only for the stragglers both HTTP routes could not resolve.
Two hard cost guardrails bound the expensive third route: a per-run cap on browser attempts, and a circuit breaker that aborts the remaining profiles when consecutive HTTP failures show Instagram is blocking the run wholesale. Profiles stopped by either guard are written to a separate status log as skipped — they are never charged, and the same is true for not_found and blocked rows.
What does Instagram profile scraping cost here
| Event | Price | You pay when |
|---|---|---|
| Result | $0.002 | One row is delivered to the dataset — a profile row, or a post row |
| Residential proxy fallback | $0.008 | A real browser on residential proxy was actually needed for that profile |
| Actor start | $0.00005 per GB | The run starts (one event per GB of memory) |
You pay per row, and only for rows you receive. The profile row and each post row bill separately at the same rate, so a profile scraped on its own is one charge, and the same profile with its 12 recent posts is 13. That is the whole pricing model: no per-profile flat fee, no bundled quota, and nothing charged for depth you did not ask for.
$2.00 per 1,000 rows on the free plan, dropping to $1.20 per 1,000 on higher Apify plans.
The residential fallback surcharge fires in exactly two places, once per profile each time: when Instagram walls the cheap HTTP routes for a profile and a real browser has to resolve it, and when you set maxDays and the actor scrolls the profile in a browser to paginate past the first 12 posts. It is charged on the attempt, because the residential-proxy cost is incurred by trying, whether or not the profile ultimately resolves. A healthy run with maxDays left empty never pays it.
Empty and failed lookups produce no rows and no charge. A username that does not exist, one Instagram blocked on every route, and one skipped by a cost guardrail all write to a separate status log instead of the results dataset, so they are never billed. A run that finds nothing costs you only the actor start.
Common use cases
Influencer vetting. Pull follower count, engagement on recent posts, and the verified and business flags before you sign a creator.
Competitor monitoring. Track follower and post-count movement across a competitor set on a daily schedule.
Audience and market research. Map who is active in a niche and how their bios and categories position them.
Lead qualification. Use external_url, is_business, and category to sort commercial accounts from personal ones.
Getting started
- Enter one username in
username, or a list inusernames. Up to 1,000 per run. - Turn on
includePostsif you need recent post data; leave it off for a lightweight counter monitor. - Leave the proxy on the default.
- Click Start, then export as JSON, CSV, or Excel, or pull it via API or MCP.
Run it on a schedule
- Run the actor once with the input you want repeated, then click Save as a task.
- In the Apify Console, go to Schedules → Create new.
- Name it, set your timezone, and pick a frequency or a cron expression (e.g.
0 6 * * *). - Under Actors or tasks to run, add the task you saved.
- Save. Nothing is charged just for a schedule existing.
Full options are in Apify's Schedules documentation.
FAQ
Can you scrape Instagram without an account? Yes, for public profiles. This actor reads only what a logged-out visitor sees. No credentials are involved.
Do I need a Meta Business account or Graph API app? No. The Graph API only returns data for accounts you own or manage; this actor works on any public profile without an app.
How many recent posts do I get?
12 per profile by default — the cap Instagram's public profile surface returns per page. Set maxDays to paginate deeper, up to maxPosts (max 500).
How are posts returned?
As their own rows, one per post, each tagged _type: "post" with a profile_username linking it back to its profile. They are not nested inside the profile row. Each post row is billed as one result.
What happens with private accounts? You get the public counters and flags (followers, following, posts count, verified, private) but no post content, because Instagram does not serve it publicly.
What is the residential proxy fallback charge?
$0.008 per profile, added only when a real browser on residential proxy actually ran for that profile — either because Instagram walled the cheap HTTP routes, or because you set maxDays and asked it to scroll for older posts. It is charged on the attempt, since the proxy cost is incurred by trying.
Am I charged for profiles that could not be fetched?
No. not_found, blocked, and guardrail-skipped rows go to a separate status log and are never billed.
Is scraping Instagram legal? The actor collects only public profile data. Public data can still contain personal data under laws like the GDPR and CCPA — collect only what you have a legitimate purpose for.
Use from Claude, ChatGPT and any MCP agent
https://mcp.apify.com/?tools=themineworks/instagram-profile-scraper
Or call it programmatically:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('themineworks/instagram-profile-scraper').call({usernames: ['nasa', 'natgeo'],includePosts: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Complete your social intelligence pipeline
Profile data is the anchor. Round out the picture with the rest of the suite:
- Threads Scraper: posts, profiles, hashtags, and search on Meta Threads.
- Twitter / X Scraper: tweets by keyword or handle with no paid API key.
- Pinterest Scraper: profiles, pins, boards, and related pin discovery.
Typical flow: profile scraper builds the roster, then Threads and Twitter scrapers watch what the same people are saying across networks.
Disclaimer: This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Meta Platforms, Inc. Instagram is a trademark of Meta Platforms, Inc. Use scraped public data in line with GDPR, CCPA, and your local laws.
Questions or need a custom field set? Reach out through the Apify profile.
Related guides
Last verified: 2026-08