Instagram Scraper avatar

Instagram Scraper

Pricing

from $1.10 / 1,000 profile / contacts / searches

Go to Apify Store
Instagram Scraper

Instagram Scraper

One Instagram scraper for everything — profiles, contacts (emails & phones), posts, reels, comments, likers, followers, following, tagged, stories, highlights, hashtags, locations & search. No code: paste usernames or URLs, export to Excel, CSV, JSON or API. Public data needs no login.

Pricing

from $1.10 / 1,000 profile / contacts / searches

Rating

5.0

(2)

Developer

VortexData

VortexData

Maintained by Community

Actor stats

3

Bookmarked

248

Total users

56

Monthly active users

12 hours ago

Last modified

Share

What is Instagram Scraper?

Instagram Scraper extracts data from Instagram: profiles, contacts, posts, reels, comments, followers, likers, stories, highlights, hashtags and locations. Use it to monitor competitors, research influencers, find leads and track trends. Paste usernames or links, choose what to scrape, and download the results as Excel, CSV or JSON. Profiles, contacts, posts, reels, comments and location posts work without an Instagram login.

Try it for free: press Start with the example input to get 20 recent posts each from @humansofny and @natgeo. The free plan's $5 monthly credit covers about 4,000 posts or 2,200 profiles.

What can Instagram Scraper do?

  • 🧩 All Instagram data in one Actor: 15 modes, from profile details to hashtag posts.
  • 🔓 No login for public data: you need an Instagram cookie only for the modes marked 🔑.
  • 📅 Date filters: keep only posts, reels or stories from the last days or from a date range.
  • 📇 Lead generation: get emails, phones and links from profile bios.
  • ⏰ Scheduling: run it daily or weekly on the Apify platform to keep your data fresh.
  • 📈 Monitoring: get alerted when a run fails or returns less data than usual.
  • 🔌 API and integrations: get the data in Python or JavaScript, Google Sheets, Make, Zapier or a webhook.

What data can you extract from Instagram?

ModeWhat you getWhat to pasteLogin cookie
👤 Profile detailsBio, links, follower and following counts, verified and business flags, highlightsusernamenot needed
📇 ContactsEmails, phones and links from the biousernamenot needed
🖼️ Profile postsCaption, likes, comments count, date, images, video, music, tagged usersusernamenot needed
🎬 Profile reelsThe same as posts, plus play countsusernamenot needed
📄 Post / Reel detailOne post or reelpost URLnot needed
💬 CommentsComment text, author, date, likespost URL or usernamenot needed
❤️ LikersAccounts that liked a postpost URL or username🔑 needed
👥 Followers / FollowingA profile's followers or the accounts it followsusername🔑 needed
🏷️ Tagged postsPosts a profile is tagged inusername🔑 needed
📸 Stories / ⭐ HighlightsActive stories or highlight itemsusername🔑 needed
#️⃣ Hashtag postsPosts under a hashtag#tag or hashtag URL🔑 needed
📍 Location postsPosts from a placelocation URL or IDnot needed for about 70 recent and top posts; add a cookie for more
🔎 SearchProfiles, hashtags or places matching a phrasea search phrase🔑 needed

If you paste a username into Comments or Likers, you get the comments or likers of that account's recent posts.

What can you do with Instagram data?

  • 🔍 Competitor monitoring: see what your competitors post, how often, and which posts and reels get the most likes and views.
  • 🤝 Influencer research: compare follower counts, engagement and recent posts before you contact a creator.
  • 📇 Lead generation: collect emails, phones and websites of businesses in your niche.
  • 💬 Audience research: read comments to learn what people like, ask for or complain about.
  • #️⃣ Trend tracking: follow hashtags and places to spot popular topics and content.
  • 📊 Reporting: schedule a run and send fresh numbers to Google Sheets or your dashboard every week.

How to scrape Instagram

  1. Create a free Apify account and open Instagram Scraper.
  2. Choose a mode in What do you want to scrape?
  3. Paste usernames or URLs, one per line. nike, @nike and https://www.instagram.com/nike/ all work.
  4. Set Results per input: how many results you want from each line.
  5. For a 🔑 mode, add your Instagram cookie (see How to get your Instagram cookie).
  6. Press Start. When the run finishes, open Output, pick the view for your data (for example Posts & reels, Profiles or Contacts) and export it.
  1. Log in to instagram.com in your browser.
  2. Export your cookies with the Cookie-Editor or EditThisCookie browser extension.
  3. Paste the export into Instagram login cookie.
  4. In Country you use Instagram from, choose the country where you usually use Instagram. If your account is suddenly used from another country, Instagram may ask you to verify it.

⚠️ Use only your own cookie and don't share it with anyone: it gives access to your Instagram account.

Ready-to-run Instagram scraping tasks

Open a task, press Try for free, and change the usernames or dates to your own:

Pricing

How much does it cost to scrape Instagram?

You pay for the results you get. The price per result depends on the type of data and on your Apify plan:

Price per 1,000 resultsFree planStarterScaleBusiness
🖼️ Posts, reels, hashtag and location posts$1.20$0.60$0.55$0.50
👤 Profiles, contacts, search results$2.20$1.30$1.20$1.10
📸 Stories and highlight items$0.80$0.40$0.35$0.30
💬 Comments$0.60$0.30$0.25$0.20
👥 Followers, following, likers$0.50$0.25$0.20$0.15

For example, 1,000 posts from 10 accounts cost $1.20 on the Free plan and $0.60 on the Starter plan. Results per input sets how many you get, and a maximum cost per run in the run options caps your spending.

If a line of your input leads nowhere for a reason about the input itself, such as an account that doesn't exist, a private account or a login cookie Instagram refused, you get one error row for that line instead of data. It says what happened and is charged as one result of the mode you chose. Lines that fail on our side are never charged.

Is scraping Instagram free?

You can scrape Instagram for free within Apify's free plan. It includes $5 of platform credit every month, which is enough for about 4,000 posts, 2,200 profiles or 8,000 comments.

On a paid plan, every result costs less and your monthly credit goes further. At Starter prices, $10 of credit buys about 16,600 posts or 7,700 profiles.

Input and output examples

Input

The input is simple: choose a mode and paste usernames or links. Every other field is optional. Fill the form in the Input tab, or send the same fields as JSON through the API:

  • What do you want to scrape? (resultsType): the mode, for example posts, reels, details, contacts, comments or followers.
  • Instagram URLs or usernames (directUrls): one username, profile, post, hashtag or location per line.
  • Results per input (resultsLimit): how many results to get from each line.
  • 🔎 Search phrase, Search for and Search matches (search, searchType, searchLimit): find profiles, hashtags or places by a phrase instead of pasting them.
  • 🔑 Instagram login cookie (sessionCookies) and Country you use Instagram from (proxyCountry): needed only for the 🔑 modes.
  • 📅 Only newer than and Only older than (onlyPostsNewerThan, onlyPostsOlderThan): a date like 2026-01-15 or a period like 3 months.
  • Add source info (addParentData): add columns that say where each row came from.

This input gets 20 recent reels from @apple:

{
"resultsType": "reels",
"directUrls": ["apple"],
"resultsLimit": 20
}

Output

Each result is one row of your dataset. You can download it as JSON, CSV, Excel, XML or HTML, or read it through the API. The examples below are real rows, shortened.

🎬 Posts and reels

{
"url": "https://www.instagram.com/p/Ddt0zGgsis6/",
"type": "Video",
"caption": "A one-of-a-kind look at the world's most iconic structure. #ShotoniPhone18Pro ...",
"hashtags": ["ShotoniPhone18Pro"],
"likesCount": 47723,
"commentsCount": 646,
"videoPlayCount": 1928639,
"videoDuration": 50.567,
"timestamp": "2026-09-25T16:00:16.000Z",
"displayUrl": "https://scontent.cdninstagram.com/...",
"videoUrl": "https://scontent.cdninstagram.com/...mp4",
"ownerUsername": "apple",
"inputUrl": "https://www.instagram.com/apple/"
}

👤 Profile details

{
"username": "apple",
"fullName": "apple",
"biography": "Everyone has a story to tell.\n#ShotoniPhone",
"followersCount": 37993640,
"followsCount": 9,
"verified": true,
"isBusinessAccount": true,
"externalUrl": "http://apple.co/Apple-Support"
}

📇 Contacts

{
"username": "cafe16",
"biography": "• Food • Cake • Tea • Coffee • Wine •\r\n\r\nNakhon Rachasima - Thailand\r\ncontact : 044 353 116\r\ne-mail : cafe.sixteen@gmail.com ...",
"followersCount": 123,
"emails": ["cafe.sixteen@gmail.com"],
"phones": ["044353116"],
"inputUrl": "https://www.instagram.com/cafe16/"
}

💬 Comments

{
"postUrl": "https://www.instagram.com/p/Ddt0zGgsis6/",
"commentUrl": "https://www.instagram.com/p/Ddt0zGgsis6/c/18108919220179128/",
"text": "❤️❤️❤️❤️",
"timestamp": "2026-09-28T15:26:18.000Z",
"likesCount": 0,
"ownerUsername": "jamu.n792",
"ownerIsVerified": false
}

👥 Followers, following and likers

{
"username": "mr.pjane_",
"fullName": "PJ",
"isPrivate": true,
"isVerified": false,
"profilePicUrl": "https://scontent.cdninstagram.com/...",
"inputUrl": "https://www.instagram.com/natgeo/"
}

⚠️ Error rows

{
"inputUrl": "https://www.instagram.com/zq1_nosuchuser_7919/",
"error": "not_found",
"errorMessage": "Instagram has no such account, post or place: it was deleted, renamed or mistyped."
}

📸 Stories and highlights

{
"url": "https://www.instagram.com/stories/natgeo/3995540021612466512/",
"type": "Video",
"timestamp": "2026-09-27T16:12:04.000Z",
"dimensionsHeight": 1280,
"dimensionsWidth": 720,
"displayUrl": "https://scontent.cdninstagram.com/..."
}

How to scrape Instagram posts from the last 7 days

Track what your competitors published this week:

{
"resultsType": "posts",
"directUrls": ["nike", "adidas", "puma"],
"resultsLimit": 100,
"onlyPostsNewerThan": "7 days"
}

You get each brand's posts from the last 7 days, up to 100 per brand. Relative dates like 2 weeks or 3 months work too.

How to scrape Instagram posts from a date range

{
"resultsType": "posts",
"directUrls": ["natgeo"],
"resultsLimit": 500,
"onlyPostsNewerThan": "2026-01-01",
"onlyPostsOlderThan": "2026-03-31"
}

You get up to 500 of @natgeo's posts published in the first quarter of 2026.

How to compare Instagram reel views

{
"resultsType": "reels",
"directUrls": ["apple", "samsung"],
"resultsLimit": 30
}

Each reel comes with videoPlayCount, likesCount and commentsCount, so you can compare which reels performed best.

How to scrape Instagram comments from a post

{
"resultsType": "comments",
"directUrls": ["https://www.instagram.com/p/Ddt0zGgsis6/"],
"resultsLimit": 500
}

You get up to 500 comments with their text, author and date. No cookie needed.

How to scrape comments from an account's recent posts

{
"resultsType": "comments",
"directUrls": ["apple"],
"resultsLimit": 300
}

Paste the account instead of post URLs. The 300 results are spread over the account's recent posts, not 300 per post.

How to extract emails and phone numbers from Instagram

{
"resultsType": "contacts",
"directUrls": ["starbucks", "https://www.instagram.com/p/Ddt0zGgsis6/"]
}

You get one row per profile with the emails, phones and links from its bio. A post URL works too: you get the contacts of the account that posted it.

How to find Instagram profiles by name and get their contacts

{
"resultsType": "contacts",
"search": "bakery",
"searchType": "profile",
"searchLimit": 50,
"sessionCookies": "<your Instagram cookie>"
}

The search finds up to 50 profiles and returns their contacts. Instagram matches the phrase against account names and usernames, not against the bio, so use words people put in their names.

How to scrape Instagram followers

{
"resultsType": "followers",
"directUrls": ["natgeo"],
"resultsLimit": 1000,
"sessionCookies": "<your Instagram cookie>"
}

You get up to 1,000 followers with username, full name, profile picture and private and verified flags. Use "following" to get the accounts a profile follows.

How to scrape Instagram posts by hashtag or location

{
"resultsType": "hashtag",
"directUrls": ["#streetphotography"],
"resultsLimit": 200,
"sessionCookies": "<your Instagram cookie>"
}

For a place, use "resultsType": "location" and paste the place's URL from Instagram, which looks like https://www.instagram.com/explore/locations/{id}/, or just the ID. A place works without a cookie too: you get its recent and top posts, about 70 of them. Add a cookie to go further.

How to scrape many Instagram accounts into one dataset

{
"resultsType": "posts",
"directUrls": ["nike", "adidas", "puma", "reebok", "newbalance"],
"resultsLimit": 50
}

Every row has inputUrl, the line it came from, so you can filter or group one dataset by account.

Other scrapers

ActorWhat it does
🗺️ Google Maps ScraperExtracts businesses from Google Maps for lead generation and market research.
📊 Similarweb ScraperGets any website's traffic, rankings, top keywords, competitors and WHOIS from Similarweb.

FAQ

The Actor collects only data that Instagram shows publicly, or that your own account can see. This data can include personal information protected by GDPR and similar laws, so use it only for legitimate purposes. If you are unsure, consult a lawyer. Read more in Is web scraping legal?

Yes for the 🔑 modes: likers, followers, following, tagged, stories, highlights, hashtag and search. Instagram shows this data only to logged-in users, so these modes need your login cookie. The other modes work without it. Location posts are shown to everyone only up to about 70 posts per place; with a cookie you can get more.

Instagram Scraper or the official Instagram API?

Instagram ScraperOfficial Instagram API
Whose dataAny public profile, post, hashtag or placeMainly your own business or creator account
What you needAn Apify account; a cookie only for 🔑 modesA business account, a Meta app and app review
Comments, followers, likers of other accounts✅❌
Export to Excel, CSV, JSON✅ built in❌ you write the code

How to use the Instagram API in Python?

Start runs and download results with the Apify API. The API tab has ready-to-use code for Python, JavaScript and other languages. A Python example:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("vortex_data/instagram-scraper").call(run_input={
"resultsType": "details",
"directUrls": ["apple", "nike"],
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["username"], item["followersCount"])

Can I connect Instagram Scraper to other apps?

Yes. With Apify integrations you can send results to Google Sheets, Slack, Make, Zapier, Airbyte or your own webhook after every run. Combine it with a schedule to get fresh Instagram data every day.

How do I get the most out of it?

  • Set Results per input to what you need: you pay per result.
  • Use Only newer than to get recent posts only. The run stops reading an account once its posts get older than the date.
  • Put many accounts into one run instead of starting one run per account.
  • Turn on Add source info if you mix profiles, hashtags and posts in one run and want to group the rows later.

Why are some fields empty?

Instagram doesn't show some data to visitors who aren't logged in. Without a cookie, a profile's number of posts, business email and business phone stay empty. To collect emails and phones, use Contacts mode: it finds them in the bio.

Why did I get fewer results than I asked for?

The account has fewer posts than you asked for, or Instagram limits the list. For example, Instagram shows only about 100 likers per post. To get more likers, paste a username instead of a post URL: the results come from several of the account's recent posts.

Can I scrape private accounts?

You can get their public profile information. Their posts are visible only to approved followers.

Can I download photos and videos?

Each post, reel and story contains links to its images and videos. The links expire after a few days, so download the files you want to keep.

Does it collect replies to comments?

No. Comments mode collects top-level comments.

A run returned no results. What should I do?

Look for error rows in the dataset: the error and errorMessage columns say why a line gave nothing, for example that the account doesn't exist or is private. The end of the run's log says the same. If it looks like a bug, let us know on the Issues tab.

Need help or a custom solution?

Open an issue on the Issues tab and include the link to your run. You can also ask there if you need a custom version of this Actor.