Instagram Profile Scraper avatar

Instagram Profile Scraper

Pricing

from $10.00 / 1,000 profile scrapeds

Go to Apify Store
Instagram Profile Scraper

Instagram Profile Scraper

Scrape public Instagram profiles - followers, bio, posts - without logging in.

Pricing

from $10.00 / 1,000 profile scrapeds

Rating

0.0

(0)

Developer

John Wu

John Wu

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Turn a list of Instagram handles into a clean spreadsheet of followers, bios, categories and recent posts. No login, no Instagram account, no cookies — just paste usernames and press Start.

Export to JSON, CSV, Excel, XML or HTML, or pull results straight from the API.


What you can do with it

Track competitor follower growth

Run this on a schedule with your competitors' handles and you get a dated row per profile per run. Point Google Sheets or Looker Studio at the dataset and you have a growth chart nobody had to maintain. The Follower tracking dataset view is already trimmed to exactly these columns.

Audit an influencer list before you pay anyone

Paste the handles from a media kit or an agency spreadsheet. In one run you can see who is actually verified, who quietly went private, who has 400k followers but posts twice a year, and whose "brand account" is a personal profile. followersCount next to postsCount and latestPosts[].likesCount tells you more in thirty seconds than a media kit does.

Qualify leads from a list of brand accounts

isBusinessAccount, businessCategoryName and externalUrl turn a list of handles into a segmented prospect list with a website to enrich against.

Find similar accounts

Every scraped profile carries relatedProfiles — the accounts Instagram itself suggests alongside it. Feed those back in as input and you can map a niche outward from a single seed account.

Archive your own brand presence

Snapshot bios, links and recent post performance across all your regional accounts on a weekly schedule, so you have a record of what changed and when.


Input

Paste usernames or profile URLs. All of these work and mean the same thing:

nasa
@nasa
https://www.instagram.com/nasa/
{
"usernames": ["humansofny", "nasa", "https://www.instagram.com/natgeo/"],
"resultsLimit": 12
}
FieldTypeDefaultWhat it does
usernamesarrayUsernames or profile URLs to scrape.
resultsLimitinteger12Recent posts per profile. Instagram gives logged-out visitors at most 12. Set to 0 for metadata only — the fastest and cheapest option if you only need follower counts.
proxyConfigurationobjectresidentialLeave as-is. See Proxies.
maxConcurrencyinteger5Profiles fetched in parallel.
maxRequestRetriesinteger5Retries per profile, each from a fresh IP.
directUrlsarrayAlias for usernames, so input written for other Instagram Actors runs unchanged.

Output

One dataset item per input profile, always. Field names match the common Instagram profile-scraper format, so existing pipelines keep working.

{
"inputUrl": "https://www.instagram.com/nasa/",
"id": "528817151",
"username": "nasa",
"url": "https://www.instagram.com/nasa/",
"fullName": "NASA",
"biography": "Making the seemingly impossible, possible. ✨",
"externalUrl": "https://www.nasa.gov/",
"externalUrlShimmed": "https://l.instagram.com/?u=...",
"followersCount": 104422532,
"followsCount": 92,
"postsCount": 4888,
"isBusinessAccount": true,
"businessCategoryName": "Government Agencies",
"verified": true,
"private": false,
"joinedRecently": false,
"hasChannel": false,
"highlightReelCount": 5,
"igtvVideoCount": 0,
"profilePicUrl": "https://scontent.cdninstagram.com/...",
"profilePicUrlHD": "https://scontent.cdninstagram.com/...",
"facebookPage": null,
"fbid": "17841401474538262",
"relatedProfiles": [
{
"id": "...",
"username": "nasaearth",
"full_name": "NASA Earth",
"is_verified": true,
"is_private": false,
"profile_pic_url": "https://..."
}
],
"latestPosts": [
{
"id": "...",
"type": "Image",
"shortCode": "C...",
"url": "https://www.instagram.com/p/C.../",
"caption": "...",
"hashtags": ["nasa"],
"mentions": ["@nasaearth"],
"likesCount": 481203,
"commentsCount": 2210,
"timestamp": "2026-08-19T14:02:11.000Z",
"displayUrl": "https://...",
"dimensionsWidth": 1080,
"dimensionsHeight": 1350,
"alt": "Photo by NASA on August 19, 2026.",
"childPosts": []
}
],
"latestIgtvVideos": [],
"dataSource": "api",
"scrapedAt": "2026-08-23T10:41:07.912Z"
}

Profiles that don't work out still get a row

A run never dies on one bad handle, and you never have to diff your input against your output to find out what's missing. Failures come back as records:

{
"inputUrl": "https://www.instagram.com/thisdoesnotexist/",
"username": "thisdoesnotexist",
"error": "not_found",
"errorDescription": "Profile does not exist",
"scrapedAt": "2026-08-23T10:41:09.004Z"
}

error is one of not_found, blocked, unavailable or invalid_input. Filter the dataset on error to see just the problems.

Private profiles are not errors. Instagram publishes their metadata, so you get a normal record with private: true, real follower and post counts, and an empty latestPosts.

Two fields worth knowing about

  • dataSource"api" or "html". Instagram has a long-standing server-side bug that makes its JSON endpoint fail for a large share of business accounts with a category. Rather than return nothing, this Actor falls back to reading the public profile page.
  • partial — present and true only on "html" records. Those carry username, name, bio, exact follower and following counts, profile picture, verified and private flags, and the bio link. They cannot carry latestPosts, relatedProfiles or businessCategoryName, and postsCount is Instagram's own rounded figure. If you need a strict dataset, filter on partial != true.

Proxies

Instagram blocks datacenter IPs almost immediately and rate-limits any single IP after roughly nine requests, then keeps that IP cold for over an hour. Residential proxies are not optional for runs of any size, and are configured by default. The Actor rotates to a fresh IP well before it reaches Instagram's ceiling, and retries blocked profiles on new IPs rather than dropping them.

If you scrape only a handful of profiles occasionally you can try datacenter proxies to save a little, but expect blocked records.

No login, ever

This Actor only reads data that Instagram serves to logged-out visitors. It never signs in, never sends a cookie or session, and never asks you for Instagram credentials. Anyone asking for your Instagram password to run a scraper is asking for your account.

It also does not keep your results. Everything lands in your run's dataset, which belongs to your account — there is no cache, no shared database, no aggregation across runs.

Notes and limits

  • Instagram shows logged-out visitors at most 12 recent posts per profile; resultsLimit above 12 is capped.
  • Numeric profile IDs are not accepted as input — only usernames and profile URLs. Resolving an ID to a username requires an endpoint Instagram does not serve to logged-out visitors, and this Actor never logs in. An all-digit entry is treated as a username, because Instagram does allow all-digit usernames.
  • latestComments is always [] — comments are not available logged-out.
  • Follower counts move constantly. Two runs minutes apart will differ by thousands on large accounts; that is Instagram, not the scraper.
  • A very small number of accounts report followersCount: 0 from Instagram itself. That value is passed through as returned.

Integrations

Results are available through the Apify API and the JavaScript and Python clients, and connect to Make, Zapier, n8n, Airbyte, Google Sheets, Slack and others through Apify integrations. Schedule runs from the Apify Console to build a time series without writing any glue.