Instagram Scraper: Posts, Reels, Comments & Hashtags
Pricing
from $0.36 / 1,000 posts
Instagram Scraper: Posts, Reels, Comments & Hashtags
Public Instagram data without login. Flat low prices, no charge for empty or duplicate results, free filters, monitoring mode and a coverage report for every input.
Pricing
from $0.36 / 1,000 posts
Rating
5.0
(1)
Developer
abdelrahman hatem
Maintained by CommunityActor stats
2
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
Instagram Scraper — Profiles, Posts, Reels, Comments, Hashtags & Locations
Scrape public Instagram data without logging in: profiles, posts, reels, comments, hashtags, keywords in any language, and locations. Put anything in one box: usernames, profile links, post links, #hashtags, keywords or location links. The scraper works out what each one is.
Two things make it different:
- You only pay for real results. You are never charged for empty results, duplicates, posts your filters removed, or posts a monitor already gave you. Filters are free.
- Every input gets a coverage report. It says how many items you asked for, how many you got, and exactly why it stopped.
This Actor is not affiliated with, endorsed by, or sponsored by Instagram or Meta. It only reads data that Instagram shows publicly to logged-out visitors.
What you can scrape
| Input | Example | What you get |
|---|---|---|
| Profile | natgeo, @natgeo, https://www.instagram.com/natgeo/ | Profile details plus the latest posts and reels (up to ~24, merged and de-duplicated), and optionally older posts found through Google |
| Post or reel | https://www.instagram.com/p/DdG4RIxIPyf/ | Full post details plus up to ~15 comments |
| Hashtag | #travel | ~12 top posts per hashtag, its related keywords, and a topic description |
| Keyword (any language) | cairo food, مصر, keyword:travel | Same as hashtags |
| Location | https://www.instagram.com/explore/locations/212988663/new-york-new-york/ or location:212988663 | Location details plus top and recent posts (up to ~48) |
Paste inputs however you have them: one per line, several on one line separated by commas, with or without @, # or quotes, or as links copied from the app (share links, story links and search links work too). Duplicates such as natgeo, @NatGeo and the profile URL are scraped once.
Need more posts on a topic? Turn on Related keyword expansion. Each related keyword adds about 12 more posts on the same topic, so one hashtag can return hundreds of posts.
What Instagram shows logged-out visitors
Instagram limits what anyone can see without an account, and every logged-out scraper hits the same limits. Here they are up front:
- Profiles: the latest ~12 posts and ~12 reels. Older posts need a login.
- Comments: about 15 per post.
- Hashtags and keywords: about 12 posts per keyword. Use related keyword expansion to get more.
- Locations: about 24 top posts and 24 recent posts.
- Not available without login: follower lists, stories, private accounts, and tagged-posts tabs.
When an input stops because of one of these limits, its coverage row says INSTAGRAM_LOGGED_OUT_CAP, so you know nothing went wrong.
Want older posts? Turn on Older posts from Google (beta). It searches Google for the profile's older posts and opens each one for full details. Only the profile's own posts are kept, and posts by other accounts are dropped without charge. How many you get depends on how much of the profile Google has indexed. In our tests with six searches that was 57 older posts (2020 to 2026) for a large brand, 11 for a mid-size creator, and none for an account with a very common name, where searching stopped after one search. It adds older posts on top of the latest ones, not the complete history.
Want to build a complete history from now on? Use monitoring mode on a schedule. Each run adds the newest posts, so your dataset builds the full history over time, and you never pay twice for the same post. With monitoring on, each profile is searched on Google at most once every 30 days.
Monitoring mode
- Set Monitor name (for example
competitors). - Save the input as a task and give it a schedule (hourly, daily…).
- Each run returns only posts this monitor has never delivered before.
Each input checked costs one monitor check event. That covers the page load even when nothing new was posted. New posts are charged as usual.
Output
Each record type gets its own table, so every table stays clean: Posts (the main dataset), Profiles, Comments, Keywords, Locations and Coverage report. You can open each one from the run's Output tab or through the API. Records in a table always have the same fields; a field that is unknown comes back as null instead of disappearing.
Post
{"recordType": "post","shortcode": "DdG4RIxIPyf","url": "https://www.instagram.com/reel/DdG4RIxIPyf/","type": "reel","detailLevel": "full","caption": "Presented by @Rolex. Welcome to Africa…","hashtags": ["rolex", "perpetualplanet"],"mentions": ["rolex", "wunmimosaku", "disneyplus", "hulu"],"takenAt": "2026-09-10T13:00:14.000Z","owner": { "id": "787132", "username": "natgeo", "fullName": "National Geographic", "isVerified": true },"likesCount": 78080,"likesHidden": false,"commentsCount": 516,"viewsCount": null,"imageUrl": "https://…","videoUrl": "https://…","carousel": [],"taggedUsers": [{ "username": "rolex", "isVerified": true }],"coauthors": [{ "username": "disneyplus" }],"music": { "title": "Original audio", "artist": "natgeo", "isOriginalAudio": true },"metrics": { "engagementRate": 0.00029, "ageHours": 533.5, "viewsPerHour": null },"source": { "kind": "post", "value": "DdG4RIxIPyf" },"input": "https://www.instagram.com/p/DdG4RIxIPyf/"}
detailLevel tells you how complete a post record is:
basic: the post came from a feed grid (shortcode, caption, image, type, and a date read from the accessibility text).standard: the feed also gave counts (reels tab, location feeds).full: the post's own page was opened (exact time, counts, carousel, music, tags, coauthors, location).partial: Instagram withheld the full page, so the scraper used the public embed page instead.
Hidden likes come back as likesCount: null with likesHidden: true, never as -1.
Profile
The profile record has the user ID, username, name, bio, bio links, follower and following counts, and post count (marked as approximate when Instagram rounds it, e.g. "32K"). It also has verified, private, has-reels and active-story flags, the linked Threads username, and the profile picture.
It also includes computed metrics from the visible posts: average likes, comments and views, engagement rate, and posts per week.
Comment
Each comment has its text, likes, reply count, date and post link. Commenter usernames are hidden by default for privacy: each commenter gets a stable anonymous ownerHash instead. Turn on Include commenter usernames if you need them and have a lawful reason to process them.
Coverage report (free)
The Coverage report table has one row per input. The same rows are also saved as the COVERAGE record in the run's key-value store.
{"input": "natgeo","detectedType": "profile","requested": 100,"delivered": { "posts": 17, "profiles": 1, "comments": 0, "keywords": 0, "locations": 0 },"skipped": { "filtered": 0, "duplicate": 0, "seenBefore": 0 },"stopCode": "INSTAGRAM_LOGGED_OUT_CAP","message": "Delivered everything Instagram shows to logged-out visitors here; more exists but needs a login.","charged": { "post": 17, "profile": 1 }}
The possible stop codes are:
LIMIT_REACHEDNO_MORE_DATAINSTAGRAM_LOGGED_OUT_CAPPRIVATE_ACCOUNTNOT_FOUNDLOGIN_REQUIREDBLOCKEDLAYOUT_CHANGEDSPENDING_LIMITRUN_LIMITINVALID_INPUT
The SUMMARY record has the run totals and every event charged.
Pricing
Pay per event. No monthly rental, no minimum results per query, and no extra charge for filters, sorting or country targeting.
| Event | Price per 1,000 |
|---|---|
| Post | $0.45 |
| Profile | $2.20 |
| Full post details (extra, when a post page is opened) | $1.80 |
| Comment | $0.30 |
| Monitor check (per input, monitoring mode only) | $3.00 |
| Saved media file | $2.00 |
Posts, comments and saved media files cost less on higher Apify plans. Each run also has a start fee of $0.00005, which is practically free.
Example: 100 profiles with their latest posts (about 2,400 posts) cost about $1.30.
Never charged:
- empty results
- duplicates
- filtered posts
- posts a monitor already delivered
- errors
- keyword and location records
- coverage rows
Set Maximum cost per run when you start a run, and the scraper will stop cleanly when it reaches it.
Tips
- Use residential proxies (the default). Instagram blocks datacenter IPs.
- Turn on Full post details for exact timestamps. The same goes for likes on photo posts from profiles, and for comment counts. Grid-only records often lack them.
- Filters on likes or views drop posts whose counts are unknown or hidden. Turn on full post details if you filter photo posts by likes.
- Date filters take a date or a relative value. Use the date picker in the form. Through the API you can send
2026-09-01,7 days,7d,2 weeks ago,3 monthsoryesterday. If a date cannot be read safely, for example03/04/2026, the run stops before any request and tells you how to write it. Nothing is charged in that case. - Comments need each post's page, so turning on comments also turns on full post details.
- Use Flat output and snake_case for spreadsheets and databases.
- Use Run tag to label batches when you run the same task many times.
Legal
This scraper only collects data Instagram shows publicly to logged-out visitors. It never logs in, never uses accounts or cookies, and never bypasses privacy settings.
Some results, such as names, bios and comments, can still be personal data under laws like the GDPR. You are responsible for having a lawful basis to collect and use it, and for collecting only what you need. If you are unsure, ask a lawyer.
Coming soon
- AI transcripts: transcripts for reels.