Instagram Profile Scraper | 16 Fields + 12 Recent Posts avatar

Instagram Profile Scraper | 16 Fields + 12 Recent Posts

Pricing

from $1.20 / 1,000 results

Go to Apify Store
Instagram Profile Scraper | 16 Fields + 12 Recent Posts

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

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

23

Total users

10

Monthly active users

3 days ago

Last modified

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"
}
FieldDescription
👤 usernamePublic Instagram handle without the @
🏷️ full_nameDisplay name on the profile
📝 biographyBio text as shown on the profile
👥 followersFollower count at time of scrape
➡️ followingNumber of accounts the profile follows
🖼️ posts_countTotal posts published
is_verifiedTrue if the account has a verification badge
🔒 is_privateTrue if the account is private
💼 is_businessTrue if the account is a Business or Creator account
🗂️ categoryBusiness or creator category, when set
🔗 external_urlWebsite link listed on the profile
📷 profile_pic_urlFull-resolution profile picture URL
🆔 user_idInternal numeric Instagram ID
🌐 profile_urlCanonical public profile URL
🧪 sourceWhich route produced the record: api, html-og, or browser
🕒 scraped_atISO timestamp when the record was captured
🔢 posts_includedHow many of this profile's posts were delivered as their own rows in this run

Post rows carry their own fields:

FieldDescription
🏷️ _typeAlways post on a post row; absent on a profile row
👤 profile_usernameThe profile this post belongs to
🔑 shortcodeInstagram post shortcode
🌐 urlDirect link to the post
📝 captionPost caption text
❤️ like_countLikes at time of scrape
💬 comment_countComments at time of scrape
🎥 is_videoTrue if the post is a video
🖼️ display_urlImage or thumbnail URL
▶️ video_urlVideo file URL, on video posts
🕒 timestampWhen 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.

  1. Public JSON API. The same web_profile_info endpoint 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.
  2. Server-rendered SEO tags. When the API is walled, the profile HTML still carries og:description and og:title with the follower / following / posts counts. Parsed as a fallback.
  3. 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 skippedthey are never charged, and the same is true for not_found and blocked rows.

What does Instagram profile scraping cost here

EventPriceYou pay when
Result$0.002One row is delivered to the dataset — a profile row, or a post row
Residential proxy fallback$0.008A real browser on residential proxy was actually needed for that profile
Actor start$0.00005 per GBThe 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

  1. Enter one username in username, or a list in usernames. Up to 1,000 per run.
  2. Turn on includePosts if you need recent post data; leave it off for a lightweight counter monitor.
  3. Leave the proxy on the default.
  4. Click Start, then export as JSON, CSV, or Excel, or pull it via API or MCP.

Run it on a schedule

  1. Run the actor once with the input you want repeated, then click Save as a task.
  2. In the Apify Console, go to SchedulesCreate new.
  3. Name it, set your timezone, and pick a frequency or a cron expression (e.g. 0 6 * * *).
  4. Under Actors or tasks to run, add the task you saved.
  5. 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:

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.

Last verified: 2026-08