Instagram Posts & Reels Scraper by Profile, No Login, $0.30/1K
Pricing
from $0.30 / 1,000 posts
Instagram Posts & Reels Scraper by Profile, No Login, $0.30/1K
Instagram scraper for posts and Reels of any public profile, no login. Captions, likes, comment and view counts, carousels, tagged users, co-authors, image and video URLs. Filter by date or by duration such as 7 days. $0.30 per 1,000 posts. Export to JSON, CSV or Excel.
Pricing
from $0.30 / 1,000 posts
Rating
4.8
(8)
Developer
Samy
Maintained by CommunityActor stats
26
Bookmarked
9.6K
Total users
1.1K
Monthly active users
2.1 days
Issues response
a day ago
Last modified
Categories
Share
Instagram Posts Scraper (Low-Cost)
⚡ Scrape posts and Reels from any public Instagram profile for $0.30 per 1,000 posts. No Instagram account required.
What does Instagram Posts Scraper do?
Instagram Posts Scraper extracts posts and Reels from public Instagram profiles: images, videos, carousels, captions, likes, comment and view counts, tagged users and co-authors. Reels are included with their video URL, and every post says whether it is a Reel (product_type: "clips"), a carousel or a photo. It works without an Instagram login.
Why choose this scraper?
- 🔐 No Instagram login needed - Just enter usernames or profile URLs
- 💰 Low cost - Lightweight, no browser, small memory footprint
- 📊 Clean data - Posts, carousels, tagged users, co-authors and engagement metrics in a consistent format
- 🔄 Automatic pagination - Up to 500 posts per profile
- 🎬 Reels included - Reels come with the profile's other posts, with their video URL and view count when Instagram supplies it
- 🆕 Incremental scraping - Only fetch posts newer than a date or a duration, such as
7 daysor3 hours - 🛡️ Built-in reliability - Automatic retries and rate limiting, no tuning required
- 💾 Resumable - Runs resume where they stopped after a platform migration or a restart
Why scrape Instagram posts?
Instagram post data extraction unlocks powerful business use cases:
📈 Marketing & Analytics
- Competitor analysis - Track what content performs best for rival brands
- Content strategy - Identify winning post types, captions, and hashtags
- Engagement benchmarking - Compare your performance against industry standards
- Trend forecasting - Spot emerging visual trends before competitors
🤝 Influencer Marketing
- Influencer research - Discover creators with authentic engagement for partnerships
- Campaign tracking - Monitor branded content and collaboration performance
- Audience insights - Analyze what resonates with target demographics
🎯 Business Intelligence
- Brand monitoring - Track mentions, tags, and brand sentiment
- Lead generation - Find potential customers engaging with relevant content
- Market research - Analyze visual trends and consumer preferences in your industry
- UGC collection - Gather user-generated content for marketing campaigns
How to scrape Instagram profiles
- Create a free Apify account
- Open the Actor in Apify Console
- Add Instagram profiles - Enter usernames, @usernames, or full Instagram profile URLs
- Configure settings - Set how many posts to fetch per profile
- Click "Start" and wait for the scraper to finish
- Download your data - Export as JSON, CSV, Excel, or HTML
How much does it cost to scrape Instagram?
You pay per result: $0.30 per 1,000 posts, plus $0.005 per run when it starts. Platform usage and proxies are included. Check the Actor's Pricing tab for the current prices.
| What you scrape | Runs | Posts | Cost |
|---|---|---|---|
| 100 profiles × 50 posts, in one run | 1 | 5,000 | $1.505 |
| 1,000 profiles × 12 posts, in one run | 1 | 12,000 | $3.605 |
| The same 20 profiles every hour, new posts only (about 30 a day) | 24 a day | 30 a day | about $0.13 a day |
💡 Put all your profiles in one run. The start fee is charged per run, not per profile: 100 profiles in one run cost $0.005 in start fees, 100 runs of one profile cost $0.50.
Posts left out by the date filter and profiles that turn out private or empty are never charged as posts.
Input
{"usernames": ["natgeo", "@nike", "https://www.instagram.com/cristiano/"],"postsPerProfile": 50,"newerThan": "7 days"}
Input parameters
| Field | Type | Required | Description |
|---|---|---|---|
usernames | Array | Yes | Instagram usernames, @usernames, or profile URLs. Example: ["natgeo", "@nike", "https://www.instagram.com/cristiano/"] |
postsPerProfile | Integer | No | Exact maximum number of posts exported per profile (1-500). The Actor stops as soon as this limit is reached. Default: 50 |
newerThan | String | No | Only posts published after this date are exported, pinned posts included. Accepts ISO date/time, YYYY-MM-DD, Unix seconds, Unix milliseconds, or a duration counted back from the start of the run (3 hours, 7 days, 2 weeks). |
Proxy. Leave it as is: the Actor manages its connections to Instagram itself. To send every request through your own proxies instead, set proxy.proxyUrls ("Own proxies" in the input form).
The former advanced fields (delayBetweenProfiles, delayBetweenRequests, maxRetries, maxConcurrentProfiles) are still accepted so existing integrations keep working, but they have no effect: pacing, retries and concurrency are managed automatically.
Invalid profile entries and duplicates are skipped without stopping valid profiles in the same batch. Profile URLs can include a trailing slash, query parameters, or a fragment. URLs for posts, Reels, Stories, and other non-profile pages are skipped.
Each run writes a RUN_SUMMARY record to its key-value store: the run's status and message, posts exported, profile counts, and for every profile its result (scraped, private_or_empty, not_found, not_scraped, stopped_at_spending_limit) and number of posts.
Incremental scraping behavior
newerThanis a strict filter: no post published at or before it is exported or charged, pinned posts included.postsPerProfileis a hard cap. If only part of the final fetched page is needed, the Actor exports only the remaining number of posts.postsPerProfilecounts the most recent posts. Posts pinned on the profile are included at their publication date, not at the top: a pinned post is exported only if it is among the most recent posts and newer thannewerThan. Pinned posts carryis_pinned: true.
Note: Check the Input tab for the complete list of input fields with descriptions.
How to monitor profiles for new posts
- Put every profile you follow in one input, with
newerThanslightly longer than the interval between runs, for example"newerThan": "2 hours"for an hourly run. - Save that input as a task and give it a schedule, such as every hour.
- Connect the task to Slack, Zapier, Make or a webhook to receive the new posts.
A run that finds no new post costs only its start fee ($0.005). Successive runs overlap a little when newerThan is longer than the interval: deduplicate on pk if you store the posts.
Output
The scraper saves posts to the Apify dataset in structured JSON format. Fields are optional and depend on what Instagram returns; profiles that could not be scraped are reported in the log and RUN_SUMMARY, not as dataset rows.
Post data extracted
- Identifiers:
pk,id,code(shortcode for URL) - Media files:
media_type,image_url,video_url,original_width,original_height - Video data:
view_countwhen supplied; see the missing-metadata note below - Content:
caption.text,caption.pk - Engagement:
like_count,comment_count - Metadata:
taken_at(timestamp),product_type,location - Author info:
user.pk,user.username,user.full_name,user.is_verified,user.profile_pic_url - Carousel posts:
carousel_media[](for multi-image/video posts with individual media items) - Tagged users:
usertags.in[](tagged users with X/Y positions) - Collaborations:
coauthor_producers[],invited_coauthor_producers[] - Scraper metadata:
scraped_username,scraped_at,post_url - Incremental metadata:
newer_than_cutoff,newer_than_cutoff_iso,is_newer_than_cutoff - Pinned posts:
is_pinned
Instagram often omits play_count and video_duration, including for carousel items. Missing values are left empty, never replaced with zero. Locations, tags, co-authors, and other metadata may also be absent.
The dataset's Overview view shows image_url, post_url, user.username, caption.text, engagement, media type, and Unix timestamps. Full JSON exports contain all fields.
Output example
{"pk": "3284567890123456789","id": "3284567890123456789","code": "C5xYzAbCdEf","taken_at": 1767312000,"media_type": 1,"product_type": "feed","caption": {"pk": "18012345678901234","text": "Exploring the beauty of nature 🌲 #wildlife #photography"},"like_count": 45892,"comment_count": 1247,"user": {"pk": "25025320","username": "natgeo","full_name": "National Geographic","is_verified": true,"profile_pic_url": "https://scontent.cdninstagram.com/..."},"image_url": "https://scontent.cdninstagram.com/example.jpg","scraped_username": "natgeo","scraped_at": 1791979200,"post_url": "https://www.instagram.com/p/C5xYzAbCdEf/","newer_than_cutoff": 1767225600,"newer_than_cutoff_iso": "2026-01-01T00:00:00.000Z","is_newer_than_cutoff": true,"is_pinned": false}
Export formats
Download your data in multiple formats:
- JSON - Structured data for APIs and databases
- CSV - For Excel and data analysis tools
- Excel - Ready-to-use spreadsheets
- HTML - Human-readable tables
- XML - Legacy system integration
Is it legal to scrape Instagram?
This Actor targets publicly accessible profile posts. Public availability does not itself grant permission to collect or reuse data; legality depends on your use case and applicable rules. The Actor does not:
- ❌ Extract private user data (emails, phone numbers, private posts)
- ❌ Bypass login walls or authentication
- ❌ Access content from private accounts
- ❌ Store personal data unnecessarily
However, you should:
- ✅ Review Instagram's Terms of Service
- ✅ Respect rate limits and implement delays
- ✅ Comply with GDPR if scraping EU users
- ✅ Have a legitimate purpose for data collection
- ✅ Not use data for spam, harassment, or unauthorized contact
Results can contain personal data even when profiles are public. Collect only what you have a legitimate reason to process; consult legal counsel if you are unsure.
Learn more: Is web scraping legal? (Apify Blog)
Using Instagram Posts Scraper with the Apify API
The Apify API gives you programmatic access to the Apify platform. Run any Actor, manage runs, access datasets, and more from your applications.
Run the Actor via API:
curl -X POST https://api.apify.com/v2/acts/sones~instagram-posts-scraper-lowcost/runs \-H "Authorization: Bearer YOUR_API_TOKEN" \-H "Content-Type: application/json" \-d '{"usernames": ["natgeo", "https://www.instagram.com/nike/"],"postsPerProfile": 50,"newerThan": "7 days"}'
Fetch results:
curl https://api.apify.com/v2/datasets/YOUR_DATASET_ID/items \-H "Authorization: Bearer YOUR_API_TOKEN"
Client libraries
- Node.js:
apify-clientNPM package - Python:
apify-clientPyPI package
Example (Node.js):
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: "YOUR_API_TOKEN" });const run = await client.actor("sones/instagram-posts-scraper-lowcost").call({usernames: ["natgeo", "https://www.instagram.com/nike/"],postsPerProfile: 50,newerThan: "7 days",});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Resources:
Integrations
Connect Instagram Posts Scraper to your favorite tools:
- Make (Integromat) - No-code automation workflows
- Zapier - Connect to 5,000+ apps
- Webhooks - Get notified when runs finish
- Slack - Send scraped data to Slack channels
- Google Sheets - Export directly to spreadsheets
- Airbyte - Data pipeline integration
- Keboola - ETL and data warehousing
Learn more: Apify Integrations Documentation
FAQ
Does this scraper require an Instagram account?
No. No Instagram login or session is needed.
Can I scrape private accounts?
No. Posts of private profiles are not visible without being logged in. A private profile completes with no posts, like a public profile that has none.
How many posts can I scrape per profile?
You can request an export cap of 1-500 posts per profile. This is an Actor input limit, not a guaranteed Instagram API limit; public visibility, rate limits, or anonymous pagination restrictions may result in fewer posts.
What if I get rate limited?
Nothing to configure: the Actor paces its requests and retries automatically. Profiles that still fail are retried once more at the end of the run.
Does it scrape Reels?
Yes. Reels posted on the profile come with its other posts, with product_type: "clips", video_url and, when Instagram supplies it, view_count. To keep only Reels, filter the dataset on product_type.
Can I scrape Stories or Highlights?
No. Stories and Highlights require authentication. This scraper only accesses public feed posts.
How do I scrape comments?
This Actor focuses on posts only. For comment scraping, check out other Apify Instagram scrapers with comment extraction features.
What data format is supported?
Data is saved to Apify datasets and can be exported as:
- JSON (for APIs)
- CSV (for Excel/analysis)
- Excel (.xlsx)
- HTML (readable tables)
- XML (legacy systems)
Can I schedule recurring scraping?
Yes! Use Apify Schedules to run the scraper automatically (hourly, daily, weekly, etc.). See How to monitor profiles for new posts.
The scraper failed. What do I do?
- Check the log and the
RUN_SUMMARYrecord for each profile's result - Verify usernames or profile URLs are correct; a profile that does not exist is reported as
profile not found - Resurrect the run to resume where it stopped: posts already exported are not exported or charged again
- If the issue persists, contact us through the Actor's Issues tab
⭐ Happy with the results? A review on the Actor's page helps other users find it.
Need help? Open an issue in the Actor's Issues tab, or check the Apify Documentation.