Instagram Scraper - Profiles, Posts & Reels
Pricing
from $2.00 / 1,000 results
Instagram Scraper - Profiles, Posts & Reels
Returns public Instagram profiles, posts, reels and the comments under posts, without a login: full captions, UTC dates, engagement counts and up to 100 comments per post. Filter posts by date and bound the pages read. A profile or post that does not exist is not charged.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Ben
Maintained by CommunityActor stats
0
Bookmarked
158
Total users
9
Monthly active users
2.6 hours
Issues response
11 hours ago
Last modified
Categories
Share
Instagram Scraper: Public Profiles, Posts and Reels
Read public Instagram profiles, timelines and post comments with source captions, timestamps and engagement fields. Filter posts by inclusive UTC dates and inspect how far the run paginated. Export to JSON, CSV or Excel, run on an Apify schedule, call via API, or connect to Make, Zapier or n8n.
Public data, clear limits: the modes profile, posts, reels and comments read public data without a login. Follower and following lists, hashtag pages, search and stories are shown by Instagram to signed-in users only: without your own session cookie those modes end with no results, and no result is charged. Free-plan result events cost $2.50 per 1,000 records, plus the start event described in Pricing.
Quick start
Start with a tested example for dated public NASA posts:
Open the example and choose Try for free to copy its input into your account. Check the input and set a maximum run charge before starting; Actor fees still follow the pricing below. When the run finishes, open the run's dataset and select the Overview view and download JSON for nested fields or CSV/Excel for a table.
| Your goal | Input to use |
|---|---|
| Inspect an account | mode: profile and its public username |
| Collect public posts in a date window | mode: posts, UTC dates and page/result caps |
| Read what people wrote under posts | mode: comments and the post links in postUrls |
The real output example shows the record shape. The Python workflow saves your own export to a local JSON file with a $0.05 maximum Actor charge.
What it extracts
The public HTTP route supports profile, posts, reels and comments. It reads Instagram's public web data without requiring a login cookie. A profile result must match the requested username and contain useful public information before the Actor accepts it. Posts retain their stable shortcode and complete source caption rather than truncating the caption at 2,000 characters.
Profiles can contain the displayed name, biography, website, follower/following counts, post count, verification status, profile image and public business contact fields. Optional contact extraction uses published profile data and bio text; it does not verify email deliverability or uncover private contacts.
Post and reel rows contain caption, like/comment counts, source timestamp, shortcode, post URL, image/video URLs, hashtags and mentions where the public source supplies them. A reel uses its /reel/ source URL. Media URLs can expire. Logged-out visibility is often narrower than the grid shown to a logged-in person, so a profile's advertised post count is not a guarantee of the number retrievable from its public timeline.
Input
| Field | Behavior |
|---|---|
mode | profile, posts, reels or comments without a login. followers, following, hashtag, search and stories need sessionCookie. |
username | A handle, @handle or public profile URL. Default: instagram. |
maxResults | Maximum exported rows. Public modes accept 1–1,000; default is two. In comments mode it is the number of posts read. |
postUrls | Post or reel links for the comments mode. |
maxCommentsPerPost | Comments per post in comments mode, up to 100; default 50. |
maxPages | Maximum source timeline pages, 1–50; default five. Applies to public posts/reels. |
postedAfter, postedBefore | Inclusive YYYY-MM-DD UTC dates. Public posts/reels only, with useInstagrapi=false. |
includeEngagement | Add a post engagement count or an available public profile sample rate. |
includeSentiment | Optional keyword-based positive/negative/neutral label. |
includeLeadScore | Optional rule-based profile score, 0–100. |
extractEmails, extractPhones | Include contacts published in the profile or its bio. |
minFollowers, maxFollowers, verifiedOnly | Filter the public profile before exporting profile or timeline rows. |
sessionCookie | The sessionid cookie of your own signed-in session, for the five modes that need one. Use only access you are authorized to use. |
useInstagrapi | Legacy authenticated route; keep false for the documented public date-filter workflow. |
Example input: September NASA posts
{"mode": "posts","username": "nasa","postedAfter": "2026-09-01","maxResults": 3,"maxPages": 2,"includeEngagement": false,"includeSentiment": false,"useInstagrapi": false}
The date filter applies to the source timestamp, converted to UTC. It includes the start and end dates. Missing or unparseable post timestamps do not pass an active date filter. An invalid calendar date, reversed date range or date filter used with another mode fails validation before network requests.
Pagination keeps scanning within maxPages when early rows are outside the requested date range. This matters for pinned posts and mixed-age timelines. It removes duplicate shortcodes across pages and retry routes, detects repeated source cursors and respects the run's charge cap. The number returned can be below maxResults when the public timeline ends or a filter removes records.
Example output
One complete record from a verified September 9, 2026 cloud run. Values and public media URLs can change or expire; this is a dated sample.
{"username": "nasa","url": "https://www.instagram.com/p/DdEy97xj9P-/","shortcode": "DdEy97xj9P-","caption": "Some things are worth repeating 📸\n\nLike observing a galaxy cluster! This image of the cluster Abell S0740 was created by combining several @NASAHubble science observations. Hubble's multiple looks at the cluster revealed a diverse collection of galaxies including a giant, bright elliptical galaxy just off center. That galaxy is as massive as 100 billion of our Suns, by the way.\n \nCredit: NASA\n\n#NASA #Hubble #Stars","likes": 67867,"comments_count": 247,"timestamp": "2026-09-09T17:27:34+00:00","images": ["https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=dst-jpg_e35_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQL1_e3AEwdyHPwo6Gw14N0ckYxlte0pZkxM0ZSU_1iIRA&oe=6AA79387","https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=dst-jpg_e35_p640x640_sh2.08_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQL0vxzE8MG20C_CtFgyj1KKQ0LoMQkYfDwtAUDUzemeBw&oe=6AA79387","https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=dst-jpg_e35_p480x480_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQLC8eWglY4JryDA8PM0naJPvTposWCFXtqnTaCxHqn0UA&oe=6AA79387","https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=dst-jpg_e35_p320x320_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQLMYHLyfpgNPS1o0L_ZxJ-zKoL94DCmL1H4DlNR3pru6Q&oe=6AA79387","https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=dst-jpg_e35_p240x240_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQKqItyV7EnevD-rq5i0oXf1CDOSdxRzf9RPjM1pYAPitg&oe=6AA79387","https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=c0.40.719.719a_dst-jpg_e35_s719x719_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQIwhStSSVysTH6dZG32AT8rMWvQI9ZRvIwvO4rCe3uFoQ&oe=6AA79387","https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=c0.40.719.719a_dst-jpg_e35_s719x719_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQIwhStSSVysTH6dZG32AT8rMWvQI9ZRvIwvO4rCe3uFoQ&oe=6AA79387","https://scontent-ord5-1.cdninstagram.com/v/t51.82787-15/801962799_18646148242049152_8221282425578912411_n.jpg?stp=c0.40.719.719a_dst-jpg_e35_s640x640_sh2.08_tt6&_nc_cat=1&ig_cache_key=Mzk4MjUzMjEyODg5ODI3NDMwMg%3D%3D.3-ccb7-5&ccb=7-5&_nc_sid=58cdad&efg=eyJ2ZW5jb2RlX3RhZyI6IkZFRUQueHBpZHMuNzE5LnNkci5yZWd1bGFyX3Bob3RvLkMzIn0%3D&_nc_ohc=jbFgdr3Pvs4Q7kNvwHusEMy&_nc_oc=Adrui-Y6wz_HWK-EM2wgrjsLVQhWvlQphht5CAUXLclqov2QcXhw7DB_Pw9rAvdGjfk&_nc_ad=z-m&_nc_cid=0&_nc_zt=23&_nc_ht=scontent-ord5-1.cdninstagram.com&_nc_gid=g1JC2NlYH0UmfsMVmxvu_A&_nc_ss=7a22e&oh=00_AQLPVV8wzxoPzSxNeQEr4hOZKMaCJWbeTgMkp4D4wOawuA&oe=6AA79387"],"videos": [],"hashtags": ["NASA","Hubble","Stars"],"mentions": ["NASAHubble"],"is_video": false,"product_type": "feed","scraped_at": "2026-09-09T19:30:46.098676+00:00"}
The dataset also includes caption, images, videos, hashtags, mentions, product_type and scraped_at for the public post route. Optional post fields are engagement_score and sentiment; reels add type. Profile fields differ from post fields, so use JSON when preserving all source attributes matters, or select the columns needed for a spreadsheet.
The run's SUMMARY key-value record reports processed items, fetched timeline pages, duplicate posts, date-filtered posts and the stop reason. result_limit, page_limit, time_limit and charge_limit describe bounded results; login_required, session_not_accepted and missing_input describe a run that had nothing to read. public_timeline_exhausted means the public source connection ended, not that every post visible to every logged-in account was available. A valid filter can produce no rows.
The Actor requests the profile directly first. If Instagram answers with its login page, it retries through up to three fresh US residential exits. When Instagram itself says the profile is not available, and a second exit gets the same answer, the run finishes successfully with zero rows, a status message and the stop reason profile_not_found. Check the spelling in that case; the account may also have been renamed, removed or made visible only after login. A private account returns its profile row but no posts.
If Instagram stops answering after some posts were saved, those rows stay in the dataset and the run ends with the stop reason source_unavailable. A run fails only when no exit could load the profile at all. It never treats an unrelated profile as a successful result.
Metrics and pricing
The post engagement score is likes plus twice the comment count. The optional profile rate is mean likes from an available public sample divided by follower count, expressed as a percentage. An unavailable sample leaves the optional rate absent. These observations are not audience-growth measurements or evidence of genuine engagement. Lead scoring and sentiment are simple rules, not trained predictions.
Established pricing remains unchanged: Free is $0.0025 per exported result, or $2.50 per 1,000, plus the existing start event of $0.00005 per GB with a minimum of one. Bronze is $2.25/1,000, Silver $2.125, Gold $2.00, Platinum $1.875 and Diamond $1.75. The Store pricing panel and actual run usage are authoritative. Optional proxy use affects resource usage; a spending cap can reduce the exported count.
Comments
mode: comments reads the comments under the posts and reels you list in postUrls, through the call Instagram's own post page makes for a visitor. It uses no login and no browser. You get one result per post:
{"post_url": "https://www.instagram.com/p/DdG4RIxIPyf/","comments": [{"username": "example_user","text": "Really great","timestamp": "2026-10-04T19:59:21+00:00","likes": 0,"sentiment": "positive","id": "18173697571459777","is_verified": false}],"comments_count": 50,"post_comment_count": 528,"scraped_at": "2026-10-05T08:06:48.706512+00:00"}
The sample is from a cloud run of October 5, 2026, cut to one comment whose author and wording are replaced here. comments_count is the number of comments in this result. post_comment_count is the number the post itself reports, and that one includes replies: Instagram lists top-level comments to visitors, so the two differ. maxCommentsPerPost sets how many you get per post, 50 by default and 100 at most. maxResults is the number of posts read, so raise it when you list more than two links; the status message says how many links were left out.
A link that leads to no public post, and a post that shows visitors no comment, give no result and no charge; the status message and the SUMMARY record name them. In that run, 50 comments of one post took 6 seconds, and a second link that led to no post added 5 seconds and no charge.
For whole comment lists with one row per comment, use the Instagram Comments Scraper.
Modes that need your own session
Instagram shows follower and following lists, hashtag pages, search results and stories to signed-in users only. The modes followers, following, hashtag, search and stories therefore read nothing unless sessionCookie holds the sessionid cookie of your own signed-in browser session. Without it, or when Instagram does not accept it, the run ends successfully with zero results, a status message that says why, and the stop reason login_required or session_not_accepted in SUMMARY. No result is charged.
With a session these modes open a browser. They were not verified in this release, the date filters are rejected on them, and this page does not promise a complete follower list, exhaustive keyword search or a Stories archive. The input also keeps an optional authenticated library path (useInstagrapi), which was not verified either.
Python API workflow
Copy the first input JSON above into input.json and save this code as export.py. In a Python virtual environment, install apify-client with python -m pip install apify-client. Set APIFY_TOKEN to your own Apify token in your environment, then run python export.py. Keep the token out of source files and shared screenshots.
import jsonimport osfrom decimal import Decimalfrom pathlib import Pathfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("benthepythondev/instagram-intelligence-scraper").call(run_input=json.loads(Path("input.json").read_text(encoding="utf-8")),max_total_charge_usd=Decimal("0.05"),memory_mbytes=1024,timeout_secs=300,)if not run or run["status"] != "SUCCEEDED":raise RuntimeError(f"Inspect the run before retrying: {run and run['id']}")rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())Path("nasa-instagram-posts.json").write_text(json.dumps(rows, ensure_ascii=False, indent=2), encoding="utf-8")print(f"Saved {len(rows)} records from run {run['id']}")
This starts a run in your account, waits for completion and saves nasa-instagram-posts.json. The $0.05 limit bounds Actor charges; it is not a promised bill or result count. Check the printed run ID and server log if the result is shorter than expected. If your client loses its connection, inspect the existing run in Console before starting another one. See the official Python client for other run options.
Use shortcode as the post key and retain the complete caption and UTC timestamp. Upsert by shortcode to avoid duplicate posts, or keep scraped_at for an observation history. Scheduling does not create a complete timeline archive; public visibility and scan bounds still apply.
For recurring runs without writing a scheduler, copy a tested public Task into your account and attach an Apify Schedule to that copy. Keep its maximum-charge limit and avoid overlapping runs when using monitor state. The Python example above is also suitable for an existing scheduler; run it from the directory containing input.json and provide the token through that scheduler's secret settings.
FAQ
Can I get every post from a profile? Only posts exposed by the public timeline within the page, time and result bounds. Logged-in counts can be higher.
Why can a recent-date search return fewer rows? The Actor filters actual source dates. Old or pinned content can fill part of the scanned window, and the public timeline may expose only a subset.
Are captions complete? The public timeline caption is kept without the previous 2,000-character truncation. This does not add text missing from Instagram's own response.
Does the date filter apply to comments or follower lists? No. It applies to public post/reel timestamps and rejects other mode combinations.
Will retries charge duplicate posts? Successful shortcode exports are tracked within the run and excluded on a retry. As with any interrupted export, use shortcodes to reconcile partial datasets downstream.
Does it need my Instagram password? No. Profile, posts, reels and comments need no login at all. Five further modes need the session cookie of your own signed-in session; see Modes that need your own session.
Why are there fewer comments than the post shows? The post's count includes replies, and Instagram lists only top-level comments to visitors. This Actor returns up to 100 of them per post.
What changed in the comments, search, hashtag, follower and stories modes on October 5, 2026? Before, these modes opened a browser without a login and could save and charge results that held no data: an empty comment list, links of Instagram's login page, a "no stories" row. Now comments come from Instagram's data call, with three fields added (id and is_verified per comment, post_comment_count per post), and the other modes end without results unless you provide a session. A run with a missing input field ends with a status message instead of failing.
Can I build daily alerts? Yes. Schedule a Task and compare shortcodes in your database. This Actor does not keep cross-run only-new state itself.
Are all metrics exact or independently verified? They are values exposed by the source. Missing visibility and hidden counts limit what can be reported.
How should I use the data? Follow applicable law, Instagram's terms and your organization's data rules. Public visibility does not grant unrestricted permission for every downstream use.
Related tools
For one job at larger volume: Instagram Posts Scraper reads whole timelines, Instagram Reels Scraper adds play counts and video links, Instagram Comments Scraper returns one row per comment, and Instagram Profile Scraper takes long lists of accounts.
Meta Ad Library is a separate advertising-data workflow, not organic Instagram posts. Facebook Pages exports public organizational Page metadata. LinkedIn Company Scraper checks exact company identity before export.
Keywords: Instagram scraper, public profile data, Instagram posts, Instagram reels, full captions, date filter, UTC timestamps, shortcodes, engagement counts, public biography, social media research, JSON export, CSV export, timeline pagination.