Instagram Scraper
Pricing
from $1.40 / 1,000 results
Instagram Scraper
Scrape public Instagram profiles, posts, reels, comments, hashtags and places with no login or cookies. Get followers, bio contacts, likes, plays, captions and media links. Bulk input, auto proxy fallback. Export JSON, CSV or Excel for lead generation and influencer research.
Pricing
from $1.40 / 1,000 results
Rating
0.0
(0)
Developer
Data Minds
Maintained by CommunityActor stats
0
Bookmarked
16
Total users
9
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
What is Instagram Scraper?
Instagram Scraper collects public Instagram data from profile links, @usernames, post and reel links, hashtags, topic keywords and places, for influencer research, hashtag monitoring and lead generation. Choose what to return, and it saves profile details, posts, reels, comments and related profiles in separate tables, with no login or cookies. Pay per result, from $0.002 on Free to $0.0014 on Gold.
Typical use cases:
- ๐ฅ Influencer research and vetting. Find Instagram influencers and compare followers, engagement rate, posting frequency and top hashtags across many accounts.
- ๐ Competitor content analysis. Pull the latest posts and reels of rival brands with likes, comments and play counts.
- ๐ Hashtag monitoring and brand monitoring. Monitor Instagram hashtags and topics, and use the monitoring key so each run returns only new posts.
- ๐ง Lead generation from Instagram bios. Collect public emails, phone numbers and links shown on business and creator profiles.
- ๐ฌ Comment and sentiment analysis. Export comment text, authors, likes and reply counts for social listening.
- ๐ Social media monitoring and market research. Read place details and posts tagged at a location for Instagram market research.
Because it runs on the Apify platform, you also get the Apify API, scheduling, webhooks, integrations and downloads in JSON, CSV, Excel, XML, HTML and RSS.
What can Instagram Scraper do?
- ๐ Accept many inputs in one run: profile links, @usernames, post and reel links, #hashtags, topic keywords, place links and numeric user ids.
- ๐งฉ Scrape public Instagram profiles and return details, posts, reels, comments and related profiles, each in its own table.
- ๐ Scrape Instagram reels with their play counts.
- ๐ Scrape Instagram posts by date, and filter by post type, minimum likes, comments or video plays, caption words, pinned posts and paid partnerships.
- ๐ Add profile statistics such as average likes, engagement rate and posting cadence.
- ๐ Remember what earlier runs returned when you set a monitoring key.
- ๐ Stop at a maximum number of rows per run and respect your spend limit.
What data can Instagram Scraper extract?
Each saved row has a recordType (profile, post, comment, location or keyword) and a scrapedAt time. Every input also gets one free overview row in the inputs table.
Profile fields
| Data | Fields |
|---|---|
| ๐ค Identity | id, username, fullName, url, isVerified, isPrivate, isBusiness, accountType, category, pronouns, isMemorialized |
| ๐ Bio and links | biography, bioHashtags, bioMentions, externalUrl, bioLinks |
| ๐ง Contacts | emails, phones, whatsapp, address |
| ๐ข Counts | followersCount, followsCount, postsCount, postsCountIsApprox |
| ๐ท Pictures and extras | profilePicUrl, profilePicUrlHD, hasActiveStory, threadsUsername, fbid |
| ๐ Statistics | stats with postsAnalyzed, avgLikes, medianLikes, avgComments, avgVideoPlays, engagementRate, postsPerWeek, reelShare, paidPartnershipShare, topHashtags, topMentions |
| ๐ฏ Related accounts | relatedProfiles |
| ๐งพ Run details | recordType, source, scrapedAt, inputUrl |
| ๐ Same value, common names | verified, private, isBusinessAccount, businessCategoryName, externalUrls |
Post and reel fields
| Data | Fields |
|---|---|
| ๐ Identity | id, shortCode, url, type, productType, isReel, isPinned |
| ๐ Text and tags | caption, captionEdited, hashtags, mentions, taggedUsers, coauthors, sponsors, isPaidPartnership |
| ๐ Engagement | likesCount, likesHidden, commentsCount, videoPlayCount, engagementRate, commentsDisabled |
| ๐ Time | timestamp, takenAtUnix |
| ๐ท Media | displayUrl, videoUrl, images, childPosts, width, height, videoDuration, hasAudio, alt, aiLabel, aiLabelText |
| ๐ค Author | ownerUsername, ownerId, ownerFullName, ownerIsVerified, ownerFollowersCount |
| ๐ Place and music | location, locationName, locationId, music |
| ๐ฌ Comments inside the post | latestComments |
| ๐งพ Run details | recordType, source, scrapedAt, inputUrl, searchTerm, dataSource |
| ๐ Same value, common names | dimensionsWidth, dimensionsHeight, musicInfo, coauthorProducers, paidPartnership, isCommentsDisabled |
Comment fields
| Data | Fields |
|---|---|
| ๐ฌ Comment | id, text, hashtags, mentions, timestamp, createdAtUnix, likesCount, repliesCount, parentId, isGif, gifUrl |
| ๐ค Commenter | ownerUsername, ownerId, ownerIsVerified, ownerProfilePicUrl, isPostOwner |
| ๐ Post | postShortCode, postUrl, postOwnerUsername |
| ๐งพ Run details | recordType, scrapedAt, inputUrl |
Place, topic and input fields
| Data | Fields |
|---|---|
| ๐ Place | id, name, slug, url, category, lat, lng, address, city, zip, phone, website, priceRange, postsCount, hours, source, recordType, scrapedAt, inputUrl |
| ๐ Topic | keyword, url, relatedKeywords, description, descriptionSources, searchType, searchTerm, recordType, scrapedAt, inputUrl |
| ๐งญ Input overview | input, kind, value, status, rowsSaved, error, errorDescription, notes, seconds |
Note: Fields appear only when a value is available. Emails, phones and addresses exist only on profiles that publish them,
likesCountis empty when the owner hides likes, andvideoPlayCountapplies to videos and reels.
What data can't Instagram Scraper extract?
It reads public pages only, so private profiles' posts are not available, and the output has no stories, direct messages or follower lists. Comment likesCount and repliesCount are often empty.
How to scrape Instagram profiles, posts and comments
- Create a free Apify account at console.apify.com/sign-up.
- Open Instagram Scraper in Apify Console.
- Add your inputs to
urls: profile links, @usernames, post or reel links, #hashtags, topic keywords or place links. - Pick what to return in
resultsType:details,posts,reels,commentsorrelatedProfiles. - Set
resultsLimitfor posts per input,commentsLimitfor comments per post, and any optional filters. - Click Start and watch rows appear in the Output tab as they are saved.
- Download the results as JSON, CSV, Excel, XML, HTML or RSS, or read them through the API.
The scraped site is Instagram.
How much does it cost to scrape Instagram?
Instagram Scraper uses pay-per-event pricing. You pay a small start fee per run plus a fee for each saved result, and your Apify platform usage is billed in addition. Your price per result depends on your Apify plan.
| Apify plan | Price per result | Price per 1,000 results |
|---|---|---|
| ๐ Free | $0.002 | $2.00 |
| ๐ฅ Bronze | $0.0018 | $1.80 |
| ๐ฅ Silver | $0.0016 | $1.60 |
| ๐ฅ Gold | $0.0014 | $1.40 |
The start event costs $0.00005 per GB of memory, with a minimum of one event. The Actor's default memory is 1024 MB, so each run is charged one start event, $0.00005.
Worked example: on the Gold plan, a run that saves 1,000 results costs 1,000 x $0.0014 = $1.40, plus the $0.00005 start event and platform usage billed in addition.
Profiles, posts, comments, places and topics each count as one result. The inputs overview rows are free.
Is scraping Instagram free?
You can try it without paying. The $5 monthly credit on the Apify Free plan covers about 2,500 results at $0.002 each, before platform usage. See the pricing tab for the current prices.
Input
Only urls is required. Everything else has a default. Open the full input schema for the form layout. This is the prefilled input:
{"urls": ["https://www.instagram.com/natgeo/"],"resultsType": ["details", "posts"],"commentsLimit": 10,"proxyConfiguration": { "useApifyProxy": false }}
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
urls | array | Yes | none | Profile links or @usernames, post and reel links, #hashtags or hashtag links, topic keywords, place links, numeric user ids. |
resultsType | array | No | ["details","posts"] | details, posts, reels, comments, relatedProfiles. |
resultsLimit | integer | No | 10 | Posts or reels per profile, hashtag, topic or place (1 to 100000). |
commentsLimit | integer | No | 0 | Comments per post (0 to 50000). Above 0 turns comments on. |
search | string | No | empty | Extra hashtag or topic added to your links. |
searchType | string | No | hashtag | hashtag or keyword. |
onlyPostsNewerThan | string | No | empty | Date or relative value such as 7 days. |
onlyPostsOlderThan | string | No | empty | Date or relative value. |
skipPinnedPosts | boolean | No | false | Leave out pinned posts. |
postTypes | array | No | all | image, video, carousel, reel. |
minLikes | integer | No | 0 | Minimum likes. |
minComments | integer | No | 0 | Minimum comments. |
minVideoPlays | integer | No | 0 | Minimum plays for videos and reels. |
captionKeywords | array | No | empty | Keep posts whose caption contains any of these. |
excludeCaptionKeywords | array | No | empty | Drop posts whose caption contains any of these. |
onlyPaidPartnerships | boolean | No | false | Keep only paid partnership posts. |
commentsNewerThan | string | No | empty | Keep comments after this date. |
profileStats | boolean | No | true | Add averages and engagement rate to profile rows. |
addParentData | boolean | No | false | Add a dataSource label to posts. |
embedCommentsInPosts | boolean | No | false | Store comments in latestComments instead of the comments table. |
enrichSearchResults | boolean | No | true | Fetch full details for hashtag, topic and reel results. |
enrichOwners | boolean | No | true | Read author followers so engagement rate can be calculated. |
addReelPlayCounts | boolean | No | true | Fill play counts of reels found in a profile feed. |
playCountLookupPages | integer | No | 10 | How far back to look for older reel play counts (0 to 100). |
includeAltText | boolean | No | true | Fill the alt field. |
maxRelatedProfiles | integer | No | 30 | Related profiles kept per profile (1 to 100). |
incrementalKey | string | No | empty | Monitoring name that returns only new posts and comments. |
excludeIds | array | No | empty | Post ids, short codes or comment ids to skip. |
maxTotalRecords | integer | No | 1000 | Hard stop for rows in the whole run. |
concurrency | integer | No | 4 | Parallel requests (1 to 10). |
requestDelay | number | No | 0.4 | Pause after each request in seconds (0 to 10). |
proxyConfiguration | object | No | {"useApifyProxy": false} | Optional proxy configuration. |
Tricky fields
commentsLimit and resultsType
- โ
Good: set
commentsLimitto20to get comments without ticking anything else. - โ Bad: leaving
commentsLimitat0and expecting comments withoutcommentsinresultsType.
Warning: Comments count as rows. Raise
maxTotalRecordswhen you ask for many comments per post, or the run stops at the limit.
maxTotalRecords
- โ
Good:
5000for 20 profiles with 10 posts and 20 comments each. - โ Bad: keeping
1000and wondering why a large comment run ends early.
incrementalKey
- โ
Good:
brand-watchon a scheduled run to get only posts not returned before. - โ Bad: changing the name every run, which returns everything again.
onlyPostsNewerThan
- โ
Good:
7 daysor2026-10-01. - โ Bad:
last week, which is not a valid format.
Warning: Pinned posts may still appear in date filters. Use
skipPinnedPoststo remove them.
Output
Results appear in the Output tab as separate tables: profiles, posts and reels, comments, places, topics and an inputs overview. The default dataset holds every row in the order it was found. Download any table as JSON, CSV, Excel, XML, HTML or RSS, or read it through the API. A SUMMARY record lists totals such as rows, rowsBilled, rowsByType, durationSeconds, stoppedBecause, inputs and notices.
JSON example
Profile row for the prefilled input (shortened):
{"recordType": "profile","id": "787132","username": "natgeo","fullName": "Example Profile","url": "https://www.instagram.com/natgeo/","biography": "Example bio text","externalUrl": "https://example.com","emails": ["press@example.com"],"phones": [],"followersCount": 1000000,"followsCount": 150,"postsCount": 32000,"isVerified": true,"isPrivate": false,"accountType": "business","stats": { "postsAnalyzed": 10, "avgLikes": 45000.5, "engagementRate": 2.4 },"source": { "type": "profile", "value": "natgeo" },"scrapedAt": "2026-10-12T10:00:00.000Z","inputUrl": "https://www.instagram.com/natgeo/"}
Post row (shortened):
{"recordType": "post","id": "3800000000000000000","shortCode": "ABC123","url": "https://www.instagram.com/p/ABC123/","type": "Image","caption": "Example caption","hashtags": ["example"],"timestamp": "2026-09-10T12:00:00.000Z","likesCount": 79600,"commentsCount": 577,"displayUrl": "https://example.com/post.jpg","ownerUsername": "natgeo","engagementRate": 2.4,"source": { "type": "profile", "value": "natgeo" },"scrapedAt": "2026-10-12T10:00:00.000Z","inputUrl": "https://www.instagram.com/natgeo/"}
Comment row (shortened):
{"recordType": "comment","id": "18000000000000000","postShortCode": "ABC123","postUrl": "https://www.instagram.com/p/ABC123/","text": "Example comment","timestamp": "2026-09-10T13:00:00.000Z","likesCount": 3,"repliesCount": 0,"ownerUsername": "example_user","isPostOwner": false,"scrapedAt": "2026-10-12T10:00:00.000Z","inputUrl": "https://www.instagram.com/natgeo/"}
Place row (shortened):
{"recordType": "location","id": "213385402","name": "Example Place","city": "New York","lat": 40.71,"lng": -74.0,"postsCount": 12000000,"url": "https://example.com/place","scrapedAt": "2026-10-12T10:00:00.000Z"}
Topic row (shortened):
{"recordType": "keyword","keyword": "travel","searchType": "hashtag","relatedKeywords": ["travel photography"],"url": "https://example.com/topic","scrapedAt": "2026-10-12T10:00:00.000Z","inputUrl": "#travel"}
Inputs overview row:
{"input": "https://www.instagram.com/natgeo/","kind": "profile","value": "natgeo","status": "ok","rowsSaved": { "profile": 1, "post": 10 },"error": null,"errorDescription": null,"notes": [],"seconds": 12.4}
Notes and limitations
- It collects public data only and needs no login or cookies.
- Comment
likesCountandrepliesCountcan be empty. likesCountcan be empty when the owner hides likes.- Hashtag, topic and place results can include fewer fields unless
enrichSearchResultsis on. - A run stops at
maxTotalRecordsor at your spend limit. Rows already saved are kept.
Tips and advanced usage
- Start small: the default of 10 posts per input finishes quickly. Raise
resultsLimitonce the output looks right. - Turn off
profileStats,enrichSearchResults,enrichOwnersandincludeAltTextwhen you do not need them. Each extra detail adds run time. - Use
postTypes,minLikesandcaptionKeywordsto keep only the posts you need, so you pay for fewer rows. - Schedule a run with
incrementalKeyto monitor a profile or hashtag without paying for the same posts twice. - If a run returns fewer rows than expected, check the inputs overview table for the status and notes of each input.
Integrations and API
Can I use Instagram Scraper as an API?
Yes. Start runs and read results with the Apify API or the apify-client packages for Node.js and Python. Open the API tab for ready-made calls.
How to scrape Instagram with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("data_minds/instagram-scraper").call(run_input={"urls": ["https://www.instagram.com/natgeo/"],"resultsType": ["details", "posts"],"commentsLimit": 10,"proxyConfiguration": {"useApifyProxy": False},})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Can I integrate Instagram Scraper with other apps?
Yes. Apify connects with Make, Zapier, Google Sheets and Slack, and supports webhooks that fire when a run finishes. You can also schedule runs, for example a daily hashtag check with a monitoring key.
Can I use Instagram Scraper with AI agents (MCP)?
Yes. Connect it through the Apify MCP server and the MCP tab, so an AI assistant can run it and read the results.
Other Instagram and social media scrapers
| Actor | What it does |
|---|---|
| ๐ Facebook Ads Library Scraper | Scrape public ads from the Meta Ad Library by keyword, Facebook page or Ad Library link: ad copy, creatives, landing pages, run dates, advertiser... |
| ๐ Facebook Event Scraper | Scrape public Facebook events in bulk from search queries, search/explore links, page and group event lists or single event links: dates, places... |
| Facebook Pages Scraper | Scrapes public Facebook Page data in bulk: name, category, likes, followers, email, phone, website and address. |
| Facebook Reels Scraper | Scrapes Facebook Reels from public pages, profiles or reel URLs: captions, play counts, reactions and comments. |
| ๐ X (Twitter) Scraper Unlimited โ No Limits | Scrape X (Twitter) posts, profiles, articles, threads and analytics from links, handles or search terms. |
FAQ
Is it legal to scrape Instagram?
Scraping publicly available data is generally considered lawful in many places, but the rules depend on your country, the data and how you use it. Avoid collecting private information, and respect Instagram's terms and data protection laws. Read Is web scraping legal?. This is not legal advice.
How does Instagram Scraper work?
You give it Instagram links, usernames, hashtags, topics or places and choose what to return. The Actor then reads the public information for each input and saves one row per profile, post, comment, place or topic. Rows appear in the Output tab as they are saved, and each input gets an overview row.
Why scrape Instagram data?
People scrape Instagram for influencer research, competitor content analysis, hashtag and brand monitoring, lead generation from public bio contacts, and comment analysis. Structured exports let you compare accounts, track engagement rate over time and feed spreadsheets, dashboards or other tools without copying data by hand.
Can you scrape Instagram without login?
Yes. Instagram Scraper needs no login, cookies or Instagram account, and it collects only public information. Private profiles are not available. Add public profile links, hashtags, topics or places, choose what to return, and start the run to get structured rows in your results tables.
Why did I get fewer results than expected?
Several settings can limit a run: resultsLimit, maxTotalRecords, your spend limit and the post filters you set. Check the inputs overview table for each input's status and notes. A profile may also simply have fewer posts than requested, or hide its like counts.
Can I export Instagram data to CSV or Excel?
Yes. Open the Output tab, choose a table such as profiles, posts or comments, and download it as CSV, Excel, JSON, XML, HTML or RSS. You can also fetch the same data through the Apify API for use in spreadsheets, databases or reporting tools.
How do I get only new Instagram posts?
Set incrementalKey to a name such as brand-watch and schedule the Actor. Each later run with the same name skips posts and comments that earlier runs already returned, so you pay only for new rows when monitoring a profile or hashtag over time.
Instagram Scraper is not working. What should I do?
Open the run log and the inputs overview table to see which input failed and why. Check that links are public and spelled correctly, then retry later. If the problem continues, report it in the Issues tab with the run link and your input.
Support and feedback
Found a bug or need a field added? Open the Issues tab. For custom solutions or questions, email hello.dataminds@gmail.com.
Built and maintained by the data_minds team on Apify.
This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by Instagram or Meta. You are responsible for using the data in line with applicable laws and platform terms.
