Instagram Posts Scraper
Pricing
from $1.50 / 1,000 results
Instagram Posts Scraper
Instagram Posts Scraper SD - Instagram Posts Scraper is a social media data tool that extracts posts with captions, likes, comments, dates, images, carousels, tagged users and locations from public profiles - Instagram post extractor.
Pricing
from $1.50 / 1,000 results
Rating
0.0
(0)
Developer
Neuro Scraper
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
2
Monthly active users
18 days ago
Last modified
Categories
Share
Instagram Posts Scraper — captions, likes, dates and media of public posts
The Instagram Posts Scraper exports every public post of the Instagram profiles you list: caption, hashtags, mentions, likes, comments count, date, images, carousel items, tagged users, co-authors and location.
It runs on Apify, needs no Instagram login and no cookies, and exports to JSON, CSV, Excel or an API call. Every session key it needs (tokens, query ids, cursors) is read from Instagram on each run, so it keeps working when Instagram ships new code.
What the Instagram Posts Scraper does
- Reads the profile's post list and follows Instagram's cursor until your per-profile limit.
- Opens each post's own data for likes, comments count, date, tagged users and location.
- Accepts single post links, and still accepts the old input fields username / max_items.
- Has a light mode that skips per-post details for the fastest run.
Who uses the Instagram Posts Scraper
- Marketers auditing a brand's content history.
- Agencies reporting engagement per post.
- Analysts building caption and hashtag datasets.
- Influencer platforms refreshing creator content.
How the Instagram Posts Scraper works
Instagram serves every public page to logged-out visitors together with the queries that fill it.
The Actor loads the page the way a browser does, reads the session values Instagram puts into it, and then asks Instagram's own GraphQL endpoint for the next page with the cursor the previous page returned.
Query ids that a page does not preload are read from the JavaScript bundles that page lists. Large files from Instagram's CDN (images, videos) are fetched directly with their signed links, so proxy traffic stays small.
Nothing is guessed: if Instagram stops publishing a value the Instagram Posts Scraper needs, the run log names it and the item is skipped instead of being filled with a stale value.
What is new in the Instagram Posts Scraper (October 2026)
These features were added on 2026-10-03 after comparing the Instagram Posts Scraper with the ten most used Actors of its kind on the Apify Store. Defaults keep the earlier behaviour.
- Posts now come from Instagram's own post list, which carries likes, comments, dates, pinned and paid-partnership flags (the logged-out grid stays as automatic fallback).
onlyPostsNewerThan/onlyPostsOlderThanwith an early stop: measured, natgeo with "2 days" gave 8 posts in 26 to 29 seconds.skipPinnedPostsleaves out the posts pinned to the top of the profile.- New fields: isPinned, paidPartnership, sponsors, musicInfo, audioUrl, images, coauthorProducers, latestComments, firstComment, locationLat / locationLng, hasAudio, captionIsEdited.
Input of the Instagram Posts Scraper
| Field | Type | Default | What it does |
|---|---|---|---|
usernames | array | ["nasa"] | One per line: a username (nasa), an @handle (@nasa) or a profile URL (https://www.instagram.com/nasa/). |
postUrls | array | [] | Single post or reel links to scrape directly. |
maxPostsPerProfile | integer | 24 | Newest posts per profile (12 per page, paginated). |
includeDetails | boolean | True | Reads each post's own data (likes, comments count, date, caption, tagged users, location, audio, video link). One extra request per post. Turn off for the faste |
onlyPostsNewerThan | string | — | Leave out posts published before this date: 2026-09-01, an ISO time (2026-09-01T10:00:00Z) or relative ("7 days", "2 weeks", "1 month"). UTC. Profile lists stop |
onlyPostsOlderThan | string | — | Leave out posts published after this date (same formats). Combine with "newer than" for a date range. |
skipPinnedPosts | boolean | False | Leave out the posts a profile pinned to the top of its grid (often months old). Instagram flags them in the profile's post list. |
maxItems | integer | 0 | Stops the whole run after this many dataset rows. 0 means only the per-target limits apply. |
proxyConfiguration | object | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} | Instagram limits logged-out visitors per IP address. Residential proxies (the default) give the most reliable results; the Actor switches to a fresh IP when Ins |
Example input for the Instagram Posts Scraper:
{"usernames": ["nasa"],"maxPostsPerProfile": 24,"includeDetails": true}
Output of the Instagram Posts Scraper
Each dataset row is one post. These are the fields the Instagram Posts Scraper produced in its test runs:
| Field | Meaning |
|---|---|
altText | altText |
audio | Music or original audio used |
caption | Caption text |
carouselCount | carouselCount |
childPosts | Items of a carousel |
coauthors | Collab co-authors |
commentsCount | Comments count |
detailsAvailable | detailsAvailable |
displayUrl | Image link (largest size) |
hashtags | Hashtags found in the caption |
height | height |
id | Platform id of the item |
inputUsername | inputUsername |
likesAndViewsHidden | likesAndViewsHidden |
likesCount | Likes (or reactions) count |
locationId | locationId |
locationName | Tagged place |
mentions | @accounts mentioned in the caption |
ownerFullName | Owner display name |
ownerId | Owner account id |
ownerUsername | Account that posted it |
productType | productType |
scrapedAt | When this row was read |
shortCode | Instagram short code |
taggedUsers | Accounts tagged in the media |
timestamp | Publication time (UTC, ISO 8601) |
topics | topics |
type | Image, Video or Sidecar (carousel) |
url | Public link of the item |
videoDurationSec | Video length in seconds |
videoPlayCount | Video plays |
videoUrl | Video file link (signed CDN link, expires) |
width | width |
inputUrl | inputUrl |
audioUrl | Audio-only track link (signed CDN link, expires) |
captionIsEdited | Caption was edited after posting |
coauthorProducers | Collab co-authors with name, id and verified flag |
firstComment | Text of the newest comment |
hasAudio | The video has sound |
images | Every image link of the post (carousel items too) |
isPinned | Pinned to the top of the profile (Instagram's own flag) |
latestComments | Newest comments (about 13-15) with author, likes and date |
locationLat | Latitude of the tagged place |
locationLng | Longitude of the tagged place |
musicInfo | Audio: id, title, artist, original or licensed, explicit, trending |
ownerIsVerified | Owner has the verified badge |
ownerProfilePicUrl | Owner profile picture link |
paidPartnership | Marked as a paid partnership |
sponsors | Brands of the paid partnership |
Fields that Instagram does not publish for an item are left empty rather than guessed. Download the dataset as JSON, CSV, Excel, XML or HTML, or read it through the Apify API.
Example row from a Instagram Posts Scraper test run
A real row from the local test run (long values shortened):
{"id": "3999218460830778664","shortCode": "DeAFABZAMUo","url": "https://www.instagram.com/reel/DeAFABZAMUo/","type": "Video","productType": "clips","caption": "\"Expect a generational performance.\"\n \nYouTuber and former faithful Niko has said King ...","hashtags": ["BBCNews","KingKenny","NikoOmilana","..."],"mentions": ["BBCNews"],"likesCount": 367,"commentsCount": 42,"videoPlayCount": null,"timestamp": "2026-10-02T18:00:54.000Z","ownerUsername": "bbcnews","ownerId": "16278726","ownerFullName": "BBC News","displayUrl": "https://instagram.fdac5-2.fna.fbcdn.net/v/t51.71878-15/831313349_1634408214879530_55964...","videoUrl": "https://instagram.fdac5-2.fna.fbcdn.net/o1/v/t2/f2/m86/AQP4k4IGCdIxEqZ27nAjL-7U4VTPyWJl...","videoDurationSec": 31.49,"width": 1080,"height": 1920,"altText": "Video by BBC News on October 02, 2026. May be a meme of one or more people and text.","childPosts": null}
Data quality of the Instagram Posts Scraper
- Every value in a Instagram Posts Scraper row is read from Instagram during your run; nothing is filled from a cache or an old snapshot.
- Rows are de-duplicated by id inside a run, so the same post never appears twice in one dataset.
- Counts are numbers you can sort and sum (not "1.2K" text) wherever Instagram publishes the exact number.
- Dates are UTC in ISO 8601 format, which Excel, Google Sheets, Python and SQL all read directly.
Instagram Posts Scraper test results
These numbers come from live test runs of the Instagram Posts Scraper on 2026-10-03 (home connection, no proxy). Runs on the Apify platform use residential proxies and can be faster or slower.
| Test | Rows | Time |
|---|---|---|
| prefill input (regression) | 24 | 23 s |
| paginate past page 1 (30 posts) | 30 | 24 s |
| post URL + light mode | 14 | 16 s |
| legacy input (username, max_items) | 5 | 18 s |
| NEW date filter + skip pinned (natgeo) | 8 | 28 s |
| NEW date window, light mode | 5 | 17 s |
Instagram Posts Scraper limits, stated plainly
- Instagram does not show a profile's total post count to logged-out visitors, so the row set ends when the grid ends or your limit is reached.
- Private accounts return nothing.
- Measured locally: 30 posts with full details in 45 seconds; light mode 14 rows in 16 seconds.
How to run the Instagram Posts Scraper
- Open the Instagram Posts Scraper in Apify Console and fill in the input fields described above.
- Keep the default residential proxy unless you have a reason to change it; Instagram limits logged-out visitors per IP address.
- Start the run, watch the log, and download the dataset when the status says Done.
- To automate it, call the Instagram Posts Scraper from the Apify API, schedule it, or connect it to Make, Zapier, n8n or Google Sheets through an integration or webhook.
Python example with the Apify API client:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run_input = {"usernames": ["nasa"],"maxPostsPerProfile": 24,"includeDetails": True}run = client.actor("neuro-scraper/instagram-posts-scraper").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
Instagram Posts Scraper pricing
The Instagram Posts Scraper uses pay-per-event pricing: you pay per dataset row (event "result"), plus the Apify platform usage of your run. Free-plan users get up to 30 rows per run, which is enough to test the Instagram Posts Scraper on real data.
Set a maximum cost per run in Apify and the Instagram Posts Scraper stops cleanly when it is reached.
Tips for large runs of the Instagram Posts Scraper
- Start with a small limit to check the Instagram Posts Scraper output, then raise it; the first rows arrive within seconds.
- Split very large jobs into several inputs and run them in parallel tasks; each run gets its own proxy sessions.
- Set a maximum cost per run in Apify; the Instagram Posts Scraper stops cleanly when the budget is reached and keeps every row it already saved.
- Schedule repeat runs instead of one huge run when you track the same targets over time.
- Keep the residential proxy: datacenter IPs are refused by Instagram far more often for logged-out visitors.
Instagram Posts Scraper compared with copying by hand
| Instagram Posts Scraper | Manual work | |
|---|---|---|
| Speed | Seconds per page of results | Minutes per item |
| Fields | Every public field, same order every time | Whatever you copy |
| Format | JSON, CSV, Excel, API | Spreadsheet you build yourself |
| Repeatable | Schedule it daily | Start again each time |
| Errors | Logged per item | Unnoticed typos |
Using the Instagram Posts Scraper in a workflow
- Send every new row to Google Sheets or Airtable with the Apify integration and keep a live table.
- Trigger a Make, Zapier or n8n scenario with a webhook when the run finishes.
- Load the JSON export into Python or BigQuery for analysis and dashboards.
- Use the Apify API: start the Instagram Posts Scraper with a POST request and read the dataset items endpoint when the run finishes.
- Chain it: pass the Instagram Posts Scraper output to another Apify Actor (for example a downloader or a transcript Actor) in an Apify task.
- Export straight to Excel from the dataset tab when you only need a one-off report.
Troubleshooting the Instagram Posts Scraper
- The run ends with no rows: open the log. The Instagram Posts Scraper writes one line per target saying what Instagram returned, for example a login wall or a missing item.
- Fewer rows than expected: the target may have fewer public items, or Instagram may stop serving more pages to logged-out visitors. The log names the reason.
- Slow run: large limits mean many pages; the Instagram Posts Scraper waits briefly between pages so Instagram keeps answering. Split big jobs into several runs.
- Proxy errors: keep the RESIDENTIAL group. The Instagram Posts Scraper already switches to a fresh IP when one is blocked.
- Free plan stops at 30 rows: that is the free-plan cap of the Instagram Posts Scraper; any paid Apify plan removes it.
What changed in this version of the Instagram Posts Scraper
- Rebuilt in October 2026 on Instagram's logged-out web endpoints; every token, query id and cursor is read at run time.
- Pay-per-event pricing (one event per row) replaces the old monthly rental; free-plan users can test with 30 rows per run.
- Residential proxy by default, with automatic switch to a fresh IP when Instagram blocks one.
- October 2026 feature round: new filters and fields matching the most used Instagram Actors on the Store, every one measured in a live test; existing inputs and fields are unchanged.
Is it legal to use the Instagram Posts Scraper?
The Instagram Posts Scraper reads only data that Instagram shows to any logged-out visitor. It never logs in and never touches private content. Personal data may still be in public posts, so check GDPR and the other laws that apply to you before you store or reuse it, and respect Instagram's terms.
Related scrapers
| Actor | Link |
|---|---|
| Instagram Scraper | neuro-scraper/instagram-video-scraper |
| Instagram Profile Scraper | neuro-scraper/instagram-reels-scraper-downloader-pro |
| Instagram Reels Scraper | neuro-scraper/instagram-reels-scraper |
| Instagram Hashtag Scraper | neuro-scraper/instagram-reeel-scraper |
| Instagram Comments Scraper | neuro-scraper/instagram-reels-scraper-and-downloader-premium |
| Instagram Search Scraper | neuro-scraper/instagram-video-scraper-advanced |
| Instagram Video Downloader | neuro-scraper/instagram-video-downloader |
| Instagram Reels Downloader | neuro-scraper/instagram-reels-downloader |
| Instagram Image Downloader | neuro-scraper/instagram-video-scraper-and-downloader |
| Instagram Transcript Scraper | neuro-scraper/instagram-video-scraper-and-downloader-pro |
| Instagram Mentions Scraper | neuro-scraper/instagram-video-scraper-and-downloader-premium |
| Instagram Keyword Scraper | neuro-scraper/instagram-video-scraper-and-downloader-fastest |
Leave a review
If the Instagram Posts Scraper saved you time, please leave a star rating and a short review on its Apify page. Reviews help other users find the Instagram Posts Scraper and tell us what to improve next.
Frequently asked questions
What is the light mode of the Instagram Posts Scraper?
Turn off "Full post details" and the Instagram Posts Scraper returns the data of Instagram's post list (link, type, caption, image, likes, comments, date, pinned flag) without one extra request per post; topics and the latest comments need full details.
Does the Instagram Posts Scraper need my Instagram login?
No. The Instagram Posts Scraper works logged out and never asks for your password or cookies. It reads only what Instagram shows to any visitor.
Do I need my own proxy for the Instagram Posts Scraper?
No. The Instagram Posts Scraper uses Apify residential proxies by default and switches to a fresh IP when Instagram blocks one. You can choose another proxy in the input.
What formats can I export from the Instagram Posts Scraper?
JSON, CSV, Excel, XML, HTML and RSS from the dataset tab, or any format through the Apify API, webhooks and integrations.
How fast is the Instagram Posts Scraper?
In the test runs above the Instagram Posts Scraper took between 16 and 28 seconds per run. Speed depends on how many items you ask for and on the proxy.
Why did the Instagram Posts Scraper return fewer rows than I asked for?
The Instagram Posts Scraper stops when Instagram has nothing more to show logged out, when your limit is reached, or when the free-plan cap of 30 rows applies. The run log always says which one happened.
Can I schedule the Instagram Posts Scraper?
Yes. Create a schedule in Apify Console to run the Instagram Posts Scraper daily or hourly and send the results to Google Sheets, Make, Zapier or n8n through an integration.
Can the Instagram Posts Scraper read private accounts or private groups?
No. The Instagram Posts Scraper reads public data only. Private content needs a login, and the Instagram Posts Scraper never logs in.
What happens when Instagram changes its website?
The Instagram Posts Scraper reads every key it needs from Instagram at run time, so routine changes are picked up automatically. If something can no longer be read, the log says so instead of returning wrong data.
Can I use the Instagram Posts Scraper with Make, Zapier or n8n?
Yes. Add the Instagram Posts Scraper as an Apify step in Make, Zapier or n8n, or send a webhook when the run finishes and fetch the dataset items from the Apify API.
Does the Instagram Posts Scraper work in every country?
The Instagram Posts Scraper reads Instagram through residential proxies that rotate across countries. Content that Instagram restricts by country follows those rules.
How do I collect only new items with the Instagram Posts Scraper?
Schedule the Instagram Posts Scraper and keep the item ids from earlier runs. Every row has a stable id, so a simple de-duplication against your previous export keeps only the new ones.
Can the Instagram Posts Scraper process many targets in one run?
Yes. Put as many targets as you like in the input; the Instagram Posts Scraper handles them one after another and a failing target never stops the others.
Can the Instagram Posts Scraper skip pinned posts?
Yes. Turn on skipPinnedPosts. Instagram flags pinned posts in its post list and the Instagram Posts Scraper leaves them out.
Can the Instagram Posts Scraper return only recent posts?
Yes. Set onlyPostsNewerThan, for example "7 days" or 2026-09-01. The Instagram Posts Scraper stops paging once it reaches older posts.