Instagram Post Scraper
Pricing
from $0.70 / 1,000 posts
Instagram Post Scraper
Scrape Instagram posts from public profiles or post URLs, no login: captions, likes, comment count, dates, images, videos, carousels, co-authors, tags, music and optional latest comments.
Pricing
from $0.70 / 1,000 posts
Rating
0.0
(0)
Developer
Keklik Technologies
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
This Instagram post scraper lets you scrape the posts of public Instagram profiles, or single posts by URL, and export them to JSON, CSV or Excel. Paste a few usernames or post links, press Start, and get one row per post: caption, likes, comment count, date, images and videos, carousel slides, co-authors, tagged accounts, hashtags and music, plus optional latest comments. No Instagram account, no login and no cookies are needed.
What data can you extract from Instagram posts?
Each post comes back as one row with 46 fields.
| Group | Fields |
|---|---|
| Post | Post link, post ID, shortcode, caption, alt text, date (Unix seconds and ISO 8601 in UTC), type (image, video or carousel), product type (photo, carousel or reel), pinned flag, paid partnership flag, dimensions |
| Author | Username, display name, user ID, profile picture |
| Engagement | Number of likes and number of comments |
| Media | Main image or video cover, video file link, reel link for videos, up to 10 carousel slides (each with its ID, image, video, size, type and alt text) and the first 5 slide images as plain links |
| People | Collab co-authors and accounts tagged in the media (ID, username, display name, verified badge, profile picture), and the @mentions in the caption |
| Hashtags | Every hashtag in the caption |
| Music | The audio of a reel or video: licensed track or original audio, song name, artist, trending and explicit flags |
| Comments (optional) | The post's newest comments in a latest_comments list: comment ID, text, date, likes, edited and hidden flags, GIF, and the commenter's ID, username, verified badge and profile picture |
| Run details | The input the post came from, and when the row was scraped |
Use cases
- Social media marketing: track what competitors post, how often, in which format, and which posts get the most likes and comments.
- Influencer marketing: check an influencer's real engagement, spot paid partnerships and collab posts, and see which brands they tag.
- Content strategy: find the captions, hashtags, formats and music that perform best in your niche, and plan your own posts around them.
- Brand monitoring: follow your brand's accounts and partners, and see who tags and mentions you.
- Market and academic research: build a dataset of Instagram posts over a period with the Newer than filter, for trend, topic or sentiment analysis.
- Reporting and archiving: export a profile's posts to a spreadsheet or a BI tool on a schedule, with the media links saved alongside.
How to scrape Instagram posts
- Open Instagram Post Scraper in Apify Console and go to the Input tab.
- In Profiles or posts, paste one entry per line: a profile URL (
https://www.instagram.com/natgeo/), a username (natgeoor@natgeo), or a post or reel URL (https://www.instagram.com/p/DUvd6BykR38/). - Set Max posts per profile to cap how many posts each profile gives you, or leave it empty to get every post.
- To keep only recent posts, set Newer than to a date (
2026-01-31) or a duration (7d). - If you want comments too, set Comments per post to the number of newest comments you want on each post.
- Press Start and watch the posts appear in the Output tab.
- Download the results as JSON, CSV, Excel, XML or HTML, or read them through the Apify API.
Input
| Field | What it does |
|---|---|
| Profiles or posts | One per line. A profile URL or username (https://www.instagram.com/natgeo/, @natgeo, natgeo) scrapes the profile's posts, newest first. A post or reel URL scrapes that one post. Required. |
| Max posts per profile | Stops each profile after this many posts. Leave empty for every post. |
| Newer than | Keeps only posts published after a date in UTC (2026-01-31 or 2026-01-31 18:00) or within a duration back from now (24h, 7d, 2w). A profile stops at its first older post. |
| Skip pinned posts | Leaves out the posts pinned to the top of a profile. Off by default. |
| Comments per post | Adds up to this many of each post's newest comments, in a latest_comments list. 0 (the default) adds none. |
| Max results | Stops the whole run after this many posts. Leave empty for no limit. |
{"urls": ["https://www.instagram.com/natgeo/", "https://www.instagram.com/p/DeTUk4sDSp-/"],"maxPostsPerProfile": 50,"newerThan": "30d","commentsPerPost": 0}
Output
A shortened row from a real run (the full row has 46 fields):
{"url": "https://www.instagram.com/p/DeTUk4sDSp-/","post_id": "4004634989362489982","shortcode": "DeTUk4sDSp-","caption": "POV: you're watching the Earth set\n\nWe just released hundreds of new images and hours of n …","owner_username": "nasa","owner_full_name": "NASA","likes_count": 684438,"comments_count": 6785,"timestamp": 1791645302,"timestamp_datetime": "2026-10-10T15:15:02+00:00","product_type": "clips","media_type": "video","is_video": true,"is_pinned": true,"dimensions": "1074x1908","reel_url": "https://www.instagram.com/reel/DeTUk4sDSp-/","coauthors": [{"id": "1611722079","username": "nasasolarsystem","full_name": "NASA Solar System Exploration","is_verified": true}],"hashtags": ["#NASA", "#ArtemisII", "#Artemis"],"music": {"audio_id": "28589819277311219","song_name": "Original audio","artist_name": "nasa","uses_original_audio": true,"should_mute_audio": false,"is_explicit": false},"source_url": "nasa","scraping_time": "2026-10-16T09:29:28+00:00"}
Carousel posts also fill child_post_1 to child_post_10 and image_1 to image_5. With Comments per post set, each post that has comments gets a latest_comments list, newest first.
You can export the results to JSON, CSV, Excel, XML and HTML, or open them in the Output tab as a table.
How much does it cost to scrape Instagram?
This Actor uses pay-per-event pricing: you pay for the posts you get, not for the time the run takes.
- $1.00 per 1,000 posts on the Apify Free plan.
- Bronze, Silver and Gold Apify plans pay less: $0.90, $0.80 and $0.70 per 1,000 posts.
- Comments are optional and charged per comment: $1.00 per 1,000 comments on the Free plan, and $0.90, $0.80 and $0.70 on Bronze, Silver and Gold. With Comments per post at 0 (the default) you pay for posts only.
Comments make a run slower: in our tests, 500 posts took about 40 seconds without comments and about 3 minutes with the newest comments on every post. Ask only for the comments you need.
Integrations and API
You can run the Instagram Post Scraper from your own code through the Apify API and get the posts back as JSON.
Python, with apify-client:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("kekliktech/instagram-post-scraper").call(run_input={"urls": ["natgeo"],"maxPostsPerProfile": 20,})for post in client.dataset(run["defaultDatasetId"]).iterate_items():print(post["url"], post["likes_count"])
Node.js, with apify-client:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('kekliktech/instagram-post-scraper').call({urls: ['natgeo'],maxPostsPerProfile: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
You can also:
- Schedule runs to collect new posts every day or week.
- Send results to your system with webhooks when a run finishes.
- Connect it to Make, Zapier, Google Sheets, Slack and other apps through Apify integrations.
- Let AI agents call it through the Apify MCP server, so Claude, ChatGPT or Cursor can scrape Instagram posts on request.
FAQ
Is it legal to scrape Instagram?
This scraper collects only data that Instagram shows publicly to visitors who are not logged in. Posts can still contain personal data, such as usernames of tagged accounts or commenters. Personal data is protected by laws such as the GDPR in Europe, so make sure you have a lawful reason to collect and use it, and check with a lawyer if you are unsure.
Do I need an Instagram account?
No. You don't need an Instagram account, a login or cookies.
Can I scrape private Instagram profiles?
No. Instagram shows a private profile's posts only to approved followers, so private profiles are skipped.
Can I get view or play counts?
No. Instagram does not show view and play counts to logged-out visitors, so they are not in the results.
How do comments work?
Set Comments per post to add each post's newest comments to its row. Comments come newest first and are top-level comments only: replies and the "most relevant" order are not available without logging in. A post with no comments has no latest_comments. If Instagram refuses a post's comments, the post is still saved without them, and the run's status message says how many posts missed their comments. You pay only for the comments you get. For many comments per post, or one row per comment, use the Instagram Comments Scraper.
How do pinned posts and the date filter work together?
Pinned posts come first on a profile, whatever their date. With Newer than, older pinned posts are left out but don't stop the profile; the profile stops at its first older post that isn't pinned. Turn on Skip pinned posts to leave them out altogether. A post scraped from its own URL always has is_pinned set to false.
Why did some inputs fail?
Inputs that fail are listed with the reason in the FAILED record of the run's key-value store, not in the dataset:
invalid_input: not a profile, username or post URL (for example an explore or stories link).not_found: the profile or post does not exist or was removed.private_or_no_posts: the profile is private, or has no posts.blocked: Instagram refused every attempt. Run it again later.instagram_error: Instagram answered with an error the scraper does not recognise. Please report it.
Why do some media links stop working?
Instagram image and video links expire after a while. Download the media soon after the run if you need to keep it.
Can the same post appear twice?
No. A post appears only once per run, even if it is on two of your profiles (a collab post) or entered twice.
Are all carousel slides included?
The row keeps the first 10 slides of a carousel. carousel_media_count gives the full number of slides.
Related scrapers
- Instagram Profile Scraper: profile details such as bio, followers and links, one row per account.
- Instagram Reels Scraper: the reels of public profiles.
- Instagram Comments Scraper: every comment on a post, one row per comment.
Support
Found a bug or missing a field? Open an issue in the Issues tab of this Actor and we'll look into it. Need a scraper for another website, or a custom version of this one? Get in touch through the Issues tab and ask for a custom scraper.