Instagram Profile Scraper - Followers, Posts & Emails
Eimantas V · @amethyst
Scrape Instagram profiles by username, URL or ID: exact followers, following and post counts, bio, links, emails and phones from the bio, category, verified and business flags, engagement rate, 12 latest posts and related profiles. No login. From $1.60 / 1,000.
About
Instagram Profile Scraper extracts public profile data from Instagram: exact follower, following and post counts, bio, website and bio links, emails and phone numbers found in the bio, category, verified, private and business flags, engagement rate, the 12 latest posts and up to 50 related profiles. Paste usernames, @handles, profile URLs or numeric user IDs and get one row per profile. No login, no cookies, no browser, from $1.60 per 1,000 profiles.
{
"username": "nasa",
"fullName": "NASA",
"followersCount": 104266795,
"followsCount": 90,
"postsCount": 4955,
"isVerified": true,
"accountType": "business",
"category": "Government organization",
"externalUrl": "https://www.nasa.gov/",
"engagementRate": 0.074,
"avgLikes": 76644,
"postsPerWeek": 20.91,
"latestPostAt": "2026-10-07T18:19:38.000Z"
}
Measured on Apify (2026-10-08): 113 creator profiles in 37 seconds, 134 brand profiles in 70 seconds, every one returned.
What does Instagram Profile Scraper do?
It reads the same public profile data Instagram shows a visitor who is not logged in, for as many profiles as you list, and returns it as clean rows you can download as JSON, CSV or Excel. It adds what Instagram does not show directly: engagement rate, average likes, comments and video views, posting frequency, and the email addresses and phone numbers written in the bio.
- Every input form. Usernames (
natgeo), @handles, profile URLs with any tracking parameters (instagram.com/natgeo?igsh=...),/reels/and story links, and numeric user IDs. Duplicates are scraped and charged once. - Exact counts. Followers, following and posts as exact numbers, not "104M".
- Leads and contacts. Emails and international phone numbers from the bio and link titles, WhatsApp numbers from wa.me links, the website and all bio links (the real URLs, not Instagram's redirects), and the category.
- Influencer metrics. Engagement rate, average likes, comments and video views over the latest posts, posts per week and the date of the latest post, so inactive or inflated accounts stand out.
- Latest posts and similar accounts. The 12 latest posts with caption, likes, comments, views, date, hashtags, mentions and media URLs, plus up to 50 accounts Instagram suggests next to the profile.
- Only pay for results. Usernames that do not exist and profiles that cannot be read return an error row and are never charged.
- Built for automation. Run it on a schedule, call it from the API, or connect it to Make, Zapier, n8n, Google Sheets or an AI agent through Apify's MCP server.
Why it is fast and cheap
There is no browser and no login. The Actor asks Instagram's own app endpoints for each profile in one request of about 35 KB, the same data the Instagram app loads. Requests start from free addresses, and the Actor switches to fresh residential IPs on its own when Instagram rate-limits them, so you never set up a proxy and a large list does not stall. Ten profiles are scraped at a time.
What data can you extract from Instagram?
| Field | Example | What it is |
|---|---|---|
username, fullName, id | nasa, NASA, 528817151 | Handle, display name and the permanent user ID |
followersCount, followsCount, postsCount | 104266795, 90, 4955 | Exact counts |
biography | Making the seemingly impossible, possible. | The bio text |
externalUrl, externalUrls | https://www.nasa.gov/ | Main link and all bio links with their titles |
emails, phones | ["[email protected]"] | Found in the bio, link titles and WhatsApp links |
isVerified, isPrivate | true, false | Blue badge, private account |
accountType, category | business, Government organization | Business, creator or personal, and the category shown on the profile |
engagementRate | 0.074 | (Average likes + comments) / followers x 100 |
avgLikes, avgComments, avgVideoViews | 76644, 342, 380036 | Averages over the latest posts |
postsPerWeek, latestPostAt | 20.91, 2026-10-07T18:19:38Z | Posting frequency and activity |
highlightReelCount, igtvVideoCount, hasClips | 6, 171, true | Story highlights, long videos, Reels |
latestPosts | 12 posts | Caption, likes, comments, views, date, type, media URLs, hashtags, mentions, collaborators |
relatedProfiles | 50 accounts | Similar accounts: username, name, verified, private, picture |
profilePicUrl, profilePicUrlHD | URL | Profile picture |
dataLevel | full | partial for the accounts described under Tips and limits |
The dataset has four views: Overview, Contacts and leads, Engagement, and Latest posts (one row per post).
How to scrape Instagram profiles
- Click Try for free and paste your usernames, @handles, profile URLs or user IDs into Instagram profiles, one per line.
- Keep Include the 12 latest posts and Include related profiles on for the full picture, or turn them off for smaller rows.
- Click Start. A typical list of a few hundred profiles finishes in two to three minutes.
- Open the Output tab, or download the results as JSON, CSV, Excel or HTML.
How much does it cost to scrape Instagram?
You pay per profile returned, and the price drops on higher Apify plans:
| Apify plan | Per 1,000 profiles |
|---|---|
| Free | $2.50 |
| Starter | $2.00 |
| Scale | $1.80 |
| Business | $1.60 |
- 500 influencer profiles on the Starter plan cost $1.00.
- 10,000 brand profiles on the Scale plan cost $18.00.
- A run also costs $0.00005 to start. Profiles that fail or do not exist cost nothing.
- The Free plan's $5 monthly credit covers about 2,000 profiles.
Input
{
"targets": ["nasa", "@humansofny", "https://www.instagram.com/natgeo/", "787132"],
"includeLatestPosts": true,
"includeRelatedProfiles": true
}
| Field | Default | Notes |
|---|---|---|
| Instagram profiles | nasa, humansofny (example) | Usernames, @handles, profile URLs or numeric user IDs, one per line |
| Profile URLs (for chaining Actors) | empty | The same in the URL-list shape other Actors output |
| Max profiles | 10,000 | Total for the run: your cost cap |
| Include the 12 latest posts | on | Free; off makes rows smaller |
| Include related profiles | on | Free; off makes rows smaller |
| Concurrency, timeout, retries | 10, 30 s, 2 | Tuned already; IP addresses are managed for you |
Output
Each profile is one row in the dataset (shortened here; the full row has every field in the table above):
{
"recordType": "profile",
"input": "nasa",
"id": "528817151",
"username": "nasa",
"url": "https://www.instagram.com/nasa/",
"fullName": "NASA",
"biography": "Making the seemingly impossible, possible. ✨",
"followersCount": 104266795,
"followsCount": 90,
"postsCount": 4955,
"isVerified": true,
"isPrivate": false,
"accountType": "business",
"category": "Government organization",
"businessCategoryName": "Government Agencies",
"emails": [],
"phones": [],
"externalUrl": "https://www.nasa.gov/",
"externalUrls": [
{ "title": "NASA.gov Homepage", "url": "https://www.nasa.gov", "linkType": "external" }
],
"latestPostAt": "2026-10-07T18:19:38.000Z",
"avgLikes": 76644,
"avgComments": 342,
"avgVideoViews": 380036,
"engagementRate": 0.074,
"postsPerWeek": 20.91,
"highlightReelCount": 6,
"igtvVideoCount": 171,
"hasThreadsProfile": true,
"fbid": "17841401474538262",
"latestPosts": [
{
"shortCode": "DeMIwYYPAMt",
"url": "https://www.instagram.com/p/DeMIwYYPAMt/",
"type": "Video",
"productType": "clips",
"caption": "They say when one door closes, another one opens…",
"likesCount": 50914,
"commentsCount": 395,
"videoViewCount": 442792,
"timestamp": "2026-10-07T10:26:36.000Z",
"ownerUsername": "astro_anil",
"coauthors": ["iss", "soph_astro", "nasa", "astro_jessica"]
}
],
"relatedProfiles": [
{ "id": "36407544", "username": "sciencechannel", "fullName": "Science Channel", "isVerified": true, "isPrivate": false }
],
"dataLevel": "full",
"scrapedAt": "2026-10-08T08:04:20.843Z"
}
A profile that cannot be read becomes a row with "recordType": "error" and an errorCode instead of failing the whole run:
errorCode | Meaning |
|---|---|
NOT_FOUND | No such username or ID, or the account is deactivated, banned or restricted |
BLOCKED / RATE_LIMITED | Instagram refused every address for this profile; run it again later |
PARSE_FAILED | Instagram answered in an unexpected shape; please report it |
Error rows are never charged.
Tips and limits
- Business accounts are sometimes partial. Instagram's profile API currently refuses about two in three brand accounts (an Instagram-side bug in its business-category lookup). The Actor then rebuilds the profile from Instagram's public pages and marks it
"dataLevel": "partial": counts, bio, links, the latest posts and engagement are there, while the category, story highlights, long-video count and related profiles are empty. Creator and personal accounts are almost always complete. - Contact buttons stay hidden. Instagram does not show the address behind a business's Email, Call or Directions button to logged-out visitors, so
emailsandphonescome from the bio, link titles and WhatsApp links only. - Private accounts return their public header (name, bio, counts, links) but no posts, because Instagram hides them.
- "About this account" (join date, country, former usernames) needs a logged-in session, so it is not included.
- Media URLs expire after a few days; download pictures and videos you want to keep.
- For more than 12 posts per profile, use a dedicated posts scraper.
- Hit your spending limit? The run stops cleanly at your maximum cost per run and keeps everything it collected. Raise the limit in the run options to get more.
- Very long lists of brand accounts may stop early. If Instagram refuses most requests, or most profiles need the slower rebuild, the run stops with everything it collected (saved and charged). Run the rest again later, or split the list across smaller runs.
- Memory is fixed at 512 MB, all the Actor needs. If you saved another memory setting for it, clear it, or the run will not start.
FAQ
Is it legal to scrape Instagram?
This Actor collects only data that Instagram shows publicly, without logging in. Results can still contain personal data, which laws such as the GDPR protect. Scrape personal data only for a legitimate purpose, and ask a lawyer if you are unsure. Instagram is a trademark of its owner; this Actor is not affiliated with or endorsed by Instagram or Meta.
Can I use it through the API or with Make, Zapier and n8n?
Yes. Every run can be started through the Apify API and returns the dataset as JSON, CSV or Excel. Schedules, webhooks and integrations for Make, Zapier, n8n and Google Sheets are on the Integrations tab.
Can AI agents use it?
Yes. Agents connected to Apify's MCP server can find and run this Actor as a tool, with the same per-profile pricing. Give it a list of usernames and read back follower counts, bios and engagement.
How is the engagement rate calculated?
Average likes plus average comments over the latest posts, divided by followers, times 100. Pinned posts are left out when at least three other posts remain, because they are old favourites that stay on top. Around 1-3 % is typical; well under 0.5 % on a large account often means inactive or bought followers.
Why did I get fewer results than I asked for?
Some usernames do not exist or are restricted (they return error rows), the run reached your maximum cost per run or its timeout, or Instagram refused so many requests that the run stopped early. The log says which, and nothing collected before that is lost.
Related scrapers
- TikTok Creator & Profile Scraper: the same creator vetting for TikTok, with exact follower and like counts.
- Threads Scraper - Posts, Likes & Replies by Profile: the posts of the same accounts on Threads.
- YouTube Channel & Video Scraper: subscriber counts and uploads for creators who are also on YouTube.
- Website Tech Stack & Lead Enrichment Scraper: emails, phones and socials from the websites in the bios.
Support
Missing a field, or found a profile that does not work? Open an issue on the Issues tab with the input you used, and it will be looked at quickly.
Input
Preview of the input form. Rent the Actor to fill it in and start runs from the console.
targetsOne profile per line, in any form: username (natgeo), @handle, profile URL (https://www.instagram.com/natgeo/) or numeric user ID (787132). Duplicates are scraped and charged once.
startUrlsThe same profiles in the URL-list shape other Actors output (for example the authors found by a post or hashtag scraper), so their results can be fed straight in. Use this or the field above.
maxItemsStop after this many profiles in total. You pay per profile, so this is also your cost cap for the run.
includeLatestPostsAdds each profile's 12 latest posts (caption, likes, comments, video views, date, media URLs, hashtags, mentions). Free and costs no time; turn it off for smaller rows. Engagement rate and posts per week are computed either way.
includeRelatedProfilesAdds up to 50 accounts Instagram suggests next to each profile ("Similar accounts"): handy for finding more creators or competitors in a niche. Free; turn it off for smaller rows.
The defaults are tuned for speed and cost. IP addresses are managed automatically: there is no proxy to set up.
maxConcurrencyHow many profiles are scraped at the same time. The default is tuned for speed without tripping Instagram's rate limits.
requestTimeoutSecsHow long to wait for one response from Instagram before giving up on it.
maxRetriesRetries for failed connections and server errors. Rate limits are handled separately, by switching IP address.
API
Bytewells speaks the Apify API. Existing integrations keep working: point apify-client at https://bytewells.com/api and use your Bytewells API token (Console → Settings → API access). The Actor ID is amethyst/instagram-profile-scraper (or amethyst~instagram-profile-scraper in URLs).
JavaScript · apify-client
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({
token: process.env.BYTEWELLS_TOKEN,
baseUrl: 'https://bytewells.com/api',
});
const input = {
"targets": [
"nasa",
"humansofny"
],
"maxItems": 10000,
"includeLatestPosts": true,
"includeRelatedProfiles": true,
"maxConcurrency": 10,
"requestTimeoutSecs": 30,
"maxRetries": 2
};
const run = await client.actor('amethyst/instagram-profile-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);Python · apify-client
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["BYTEWELLS_TOKEN"], api_url="https://bytewells.com/api")
run_input = {
"targets": [
"nasa",
"humansofny"
],
"maxItems": 10000,
"includeLatestPosts": True,
"includeRelatedProfiles": True,
"maxConcurrency": 10,
"requestTimeoutSecs": 30,
"maxRetries": 2
}
run = client.actor("amethyst/instagram-profile-scraper").call(run_input=run_input)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)HTTP · curl
curl -X POST "https://bytewells.com/api/v2/acts/amethyst~instagram-profile-scraper/runs" \
-H "Authorization: Bearer $BYTEWELLS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"targets":["nasa","humansofny"],"maxItems":10000,"includeLatestPosts":true,"includeRelatedProfiles":true,"maxConcurrency":10,"requestTimeoutSecs":30,"maxRetries":2}'Runs are billed as compute from your credit balance. Paid Actors need an active rental or trial; otherwise the API answers 402 rental-required.
Related
More Actors from the same publisher.

Facebook Ads Library Scraper - Meta Ads, All Countries
Eimantas V · @amethyst
Scrape the Facebook Ads Library by keyword, Page or Ad Library link, in any country: ad copy, images and videos, landing pages, CTAs, run dates, platforms and the advertiser Page with its likes. Political ad spend included. No login, no token.
MarketingSocial mediaBusiness$29/mo7-day free trial
Google Search Results Scraper - SERP API
Eimantas V · @amethyst
Scrape Google search results by keyword or URL: organic results with real URLs and ranks, places, top stories, knowledge panel, related searches, News and Videos tabs. Optional AI Overview, People also ask and ads. Any country, language or city. From $0.40 per 1,000 pages.
SEO toolsMarketingLead generation$19/mo7-day free trial
Twitter / X Scraper - Tweets, Profiles & Engagement
Eimantas V · @amethyst
Scrape tweets from any public Twitter / X account by handle or URL. Full text, likes, retweets, replies, quotes, bookmarks and view counts, plus hashtags, mentions, expanded links, images and playable video URLs. Retweets carry the original post's engagement. No API key, no browser.
Social mediaLead generationAutomation$19/mo7-day free trial
YouTube Channel & Video Scraper
Eimantas V · @amethyst
Scrape YouTube channels and videos without a browser: subscriber counts, full video lists, exact view counts, durations, publish dates, keywords, and optional likes and comment counts.
Social mediaBusinessMarketing$19/mo7-day free trial