Instagram Post Scraper: Photos, Carousels, Likes, No Login
Pricing
from $0.99 / 1,000 posts
Instagram Post Scraper: Photos, Carousels, Likes, No Login
Scrape public Instagram posts from profiles or post links: caption, hashtags, mentions, likes, comments, post time, type, every carousel image, video URL, location with coordinates, tagged users, coauthors and owner. No login or cookies. Pay per post.
Pricing
from $0.99 / 1,000 posts
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
6
Total users
5
Monthly active users
a day ago
Last modified
Categories
Share
From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.
Why choose this actor?
- Every post type, fully filled. In our test on 5 October 2026, five brand profiles (Starbucks, The New York Times, Louis Vuitton, Coca-Cola, Google) returned 100 posts in 35 seconds: photos, carousels and videos, each with likes, comments, caption, exact post time and owner, and every carousel slide's image link (436 image links across 121 sampled posts). No Instagram account, no cookies of yours, no browser.
- Profiles or single post links, in one run. Give usernames to get each profile's newest posts, paste post links to get exactly those posts, or mix both. A post that shows up twice is delivered and charged once.
- You pay only for posts you receive. Private accounts, usernames that do not exist and posts Instagram refused are listed in the run summary and never charged. Every outcome is explained in the
OUTPUTrecord of the run.
Part of The Mine Works Social media and video family: Threads Scraper, Reddit Scraper, Threads Search Scraper, Instagram Profile Scraper, Instagram Followers & Following, Reddit Search Scraper.
Try it in one minute
Paste this into the JSON tab of the input page. It returns the 10 newest posts of National Geographic in under 30 seconds.
{"usernames": ["natgeo"],"maxPostsPerProfile": 10}
You can give the actor two kinds of input, in any mix: usernames (a username like natgeo, a handle like @natgeo, or a profile link such as https://www.instagram.com/natgeo/) and postUrls (links to single posts: https://www.instagram.com/p/<code>/ for a photo, carousel or video, or /reel/<code>/). A post link put in usernames, or a profile put in postUrls, is moved to the right list for you.
Apify's free plan includes $5 of credit every month, which covers about 2,700 posts at this actor's price.
Copy to your AI assistant
themineworks/instagram-post-scraper on Apify. Scrapes public Instagram posts (photos, carousels and videos) with no login, from profiles (newest posts first) or from single post links, and returns one row per post with shortCode, url, type (Image, Sidecar or Video), caption, hashtags, mentions, alt, likesCount, commentsCount, timestamp, ownerUsername, ownerFullName, ownerId, displayUrl, images (every carousel slide), childPosts, videoUrl, videoDuration, locationName, locationLat, locationLng, taggedUsers, coauthorProducers and isPaidPartnership. Call ApifyClient("TOKEN").actor("themineworks/instagram-post-scraper").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: usernames (array of usernames or profile links) and/or postUrls (array of post links). Optional: maxPostsPerProfile (default 12, 10 to 300), postTypes (any of image, carousel, video; default all), newerThan (a date like 2026-09-01 or a period like "30 days"), skipPinned (default true). Skip rows with _type "info"; the per profile and per link run summary is the key-value store record OUTPUT. Full spec: GET https://api.apify.com/v2/acts/themineworks~instagram-post-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- Up to 37 fields per post. In our 121 sampled rows, 23 fields were filled in every row, including type, caption, likes, comments, exact time, owner, main image, size and the list of image links. Carousels add
carouselCountandchildPosts, videos addvideoUrlandvideoDuration, and a geotagged post adds its location name, id, latitude and longitude. - Every carousel slide.
imageslists every slide's image link in order, andchildPostsgives each slide's type, id, size, image link, video link (for a video slide) and the accounts tagged on that slide. Our sample held 56 carousels with up to 17 slides each. - Up to 300 posts per profile, up to 500 profiles per run. Instagram serves a profile grid 12 posts at a time. In our tests we read NASA's grid 312 posts deep (26 pages, and Instagram still had more) without a login or a wall.
- Filters that save money.
postTypeskeeps only photos, carousels or videos;newerThanstops reading a profile as soon as its posts are older than your date, so a weekly run reads one or two pages per profile. - Location with coordinates. A geotagged post comes with
locationName,locationId,locationLatandlocationLng, ready for a map. - Pinned posts handled. Pinned posts sit on top of a grid whatever their age. They are skipped by default so you get the latest posts in date order; switch
skipPinnedoff to keep them, flagged withisPinned.
How to use it
Basic: the newest posts of one profile
{"usernames": ["starbucks"],"maxPostsPerProfile": 24}
Several profiles and a few post links in one run
{"usernames": ["natgeo", "louisvuitton", "https://www.instagram.com/nytimes/"],"postUrls": ["https://www.instagram.com/p/DdHyaYAifb6/","https://www.instagram.com/p/Dd1mj_IIOW-/"],"maxPostsPerProfile": 12}
Profiles run three at a time. If a linked post was already delivered from a profile in the same run, it is not repeated and not charged twice; the summary marks it duplicate.
Monthly brand content audit
Pull everything a set of brands posted last month, with likes and comments per post, to compare formats (photo, carousel or video) and posting frequency.
{"usernames": ["starbucks", "dunkin", "costacoffee", "timhortons"],"maxPostsPerProfile": 100,"newerThan": "30 days"}
Reading each profile stops at the first post older than 30 days. Scheduling tip: add a monthly schedule in Apify Console with this input and send the dataset to Google Sheets, so each month is its own tab.
Carousel swipe file for a design team
Collect only carousels from accounts known for strong carousels, with every slide's image link in images, so a designer can review them side by side.
{"usernames": ["natgeo", "nytimes", "google"],"postTypes": ["carousel"],"maxPostsPerProfile": 30}
With a type filter the actor reads up to three times more of each grid to find matches, and you pay only for the posts it returns.
Location map of a travel creator's posts
Pull a photographer's recent posts and plot the geotagged ones with locationLat and locationLng.
{"usernames": ["chrisburkard"],"maxPostsPerProfile": 100}
Track engagement on a list of campaign posts
Paste the links of the posts you paid for and run daily on a schedule to watch likes and comments grow.
{"postUrls": ["https://www.instagram.com/p/DdHyaYAifb6/","https://www.instagram.com/p/Dd1mj_IIOW-/"]}
When you give only post links, the example profiles prefilled in the form are left out automatically, so they are never scraped by accident.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
usernames | array of strings | ["natgeo", "nasa"] | Public profiles to read posts from, newest first, up to 500 per run. Usernames, @handles and profile links all work. Post links here are moved to postUrls. Left out automatically when you give post links but keep this example list unchanged. |
postUrls | array of strings | empty | Links to single posts (photo, carousel, video or reel), up to 1,000 per run. |
maxPostsPerProfile | integer | 12 | Newest posts to return per profile, from 10 to 300. |
postTypes | array of strings | ["image", "carousel", "video"] | Which kinds of posts to return from profiles. All three means no filter. |
newerThan | string | empty | Only posts newer than this, for profiles: a date (2026-09-01) or a period (30 days, 2 weeks, 3 months, 1 year). Empty means no date limit. |
skipPinned | boolean | true | Leave out posts pinned on top of a profile grid. |
proxyConfiguration | object | {"useApifyProxy": true} | Apify datacenter proxy, all this actor needs. Residential groups are removed if selected. |
The actor also accepts the field names other post scrapers use, so existing integrations keep working: username, directUrls, startUrls and urls for input, resultsLimit for the per profile count, onlyPostsNewerThan for the date window and skipPinnedPosts for pinned posts.
What data do you get?
One row per post. Fields, grouped:
- The post:
shortCode,id,url,type(Image,Sidecarfor a carousel, orVideo),productType(feed,carousel_container,clipsfor a reel),timestamp(exact publish time, UTC),dimensionsWidth,dimensionsHeight,captionIsEdited. - Engagement:
likesCount,commentsCount,countsHidden(true when the owner hid the like count). - Text:
caption,hashtagsandmentions(parsed from the caption, in the order written, without the # or @), andalt, Instagram's automatic description of the image. - Media:
displayUrl(main image, largest size served),images(every slide's image link, or the single photo),carouselCount,childPosts(per slide:type,id,displayUrl,videoUrl,width,height,taggedUsers), and for videosvideoUrlandvideoDurationin seconds. Instagram's media links are signed and expire after a few days, so download what you need soon after the run. - Owner and people:
ownerUsername,ownerFullName,ownerId,ownerIsVerified,coauthorProducers(collab partners),taggedUsers(on the post or any slide). - Context:
locationName,locationId,locationLat,locationLngwhen the post is geotagged,isPaidPartnership,isPinned(profile rows). - Where it came from:
inputUrl(the username or link you gave),source(profileorpost_url),scrapedAt.
A collab post appears on the grid of every coauthor. When you read a coauthor's profile, ownerUsername is the account that posted it and coauthorProducers lists the partners. In our test, 5 of Chris Burkard's 10 newest grid posts were collabs posted by partners.
Stable fields for automations
These fields were present in every one of the 121 rows we sampled on 5 October 2026:
| Field | What it holds |
|---|---|
shortCode | The post's code, the part after /p/ in its link |
url | Link to the post |
id | Instagram's numeric media id |
type | Image, Sidecar or Video |
source | profile or post_url |
inputUrl | The username or link from your input |
caption | Caption text |
likesCount | Likes |
commentsCount | Comments |
timestamp | Publish time, ISO 8601 in UTC |
ownerUsername | Account that posted it |
displayUrl | Main image link |
images | List of image links |
scrapedAt | When the row was read |
These names will not change. New fields may be added, never renamed or removed.
Output examples
A carousel read from a profile (Louis Vuitton), trimmed:
{"inputUrl": "louisvuitton","source": "profile","id": "3997817264719891340","shortCode": "Dd7GZ70jYuM","url": "https://www.instagram.com/p/Dd7GZ70jYuM/","type": "Sidecar","productType": "carousel_container","caption": "Time in motion. Part of the pioneering Spin Time Air complication, an ethereal h...","hashtags": ["LVTambour", "LVHighWatchmaking", "LaFabriqueduTemps", "LouisVuitton"],"alt": "Photo by Louis Vuitton on October 01, 2026. May be an image of text.","likesCount": 7306,"commentsCount": 82,"timestamp": "2026-10-01T16:00:01.000Z","ownerUsername": "louisvuitton","ownerFullName": "Louis Vuitton","ownerIsVerified": true,"displayUrl": "https://scontent-lga3-2.cdninstagram.com/v/t51.82787-15/827773931_...jpg","dimensionsWidth": 1080,"dimensionsHeight": 1350,"images": ["https://scontent-lga3-2.cdninstagram.com/v/t51.82787-15/827773931_...jpg", "https://scontent-lga3-3.cdninstagram.com/v/t51.71878-15/828563330_...jpg"],"carouselCount": 4,"childPosts": [{ "type": "Image", "id": "3997816862226711997", "width": 1080, "height": 1350, "taggedUsers": ["lafabriquedutemps"] },{ "type": "Video", "id": "3997816871260560136", "videoUrl": "https://scontent-lga3-2.cdninstagram.com/o1/v/t16/f2/m84/AQNsR9O3...mp4", "width": 1080, "height": 1350 }],"taggedUsers": ["lafabriquedutemps"],"coauthorProducers": ["lafabriquedutemps"],"isPaidPartnership": false,"isPinned": false,"scrapedAt": "2026-10-05T17:53:58.075Z"}
A geotagged collab carousel on Chris Burkard's grid, trimmed:
{"inputUrl": "chrisburkard","source": "profile","shortCode": "Dd1mj_IIOW-","type": "Sidecar","caption": "Greenland.\n\nI always assumed my first time to Greenland would involve ...","likesCount": 9367,"commentsCount": 97,"timestamp": "2026-09-28T16:21:50.000Z","ownerUsername": "chrismshane","carouselCount": 17,"locationName": "Sisimiut","locationId": "253284224","locationLat": 66.9333,"locationLng": -53.6833,"coauthorProducers": ["brodyleven", "joshreids", "chrisburkard"]}
A single photo (Starbucks), trimmed:
{"inputUrl": "starbucks","shortCode": "Dd4DlN6N6b9","url": "https://www.instagram.com/p/Dd4DlN6N6b9/","type": "Image","productType": "feed","caption": "somewhere between grilled cheese and straight espresso","alt": "Photo by Starbucks on September 29, 2026. May be an image of drink and text.","likesCount": 79415,"commentsCount": 804,"timestamp": "2026-09-29T15:13:57.000Z","ownerUsername": "starbucks","dimensionsWidth": 1440,"dimensionsHeight": 1920}
A post from a pasted link (NASA), trimmed:
{"inputUrl": "https://www.instagram.com/p/DdHyaYAifb6/","source": "post_url","shortCode": "DdHyaYAifb6","type": "Sidecar","caption": "Cementing their names in history.\n\nThe Artemis III crew is leaving the...","mentions": ["NASAKennedy", "EuropeanSpaceAgency", "Astro_Luca", "Astro_FrankRubio"],"likesCount": 120825,"commentsCount": 1023,"timestamp": "2026-09-10T21:20:24.000Z","ownerUsername": "nasa","carouselCount": 4,"coauthorProducers": ["nasakennedy", "nasaartemis"]}
Pricing
Pay per event: you pay for each post delivered to your dataset, plus a flat $0.005 per run, whatever memory you choose.
| Event | Free plan | Starter (Bronze) | Scale (Silver) | Business (Gold) and above |
|---|---|---|---|---|
Post delivered (post-scraped), per 1,000 posts | $1.79 | $1.49 | $1.29 | $0.99 |
Run start (run-start), once per run | $0.005 | $0.005 | $0.005 | $0.005 |
The start fee is our own flat run-start event, not Apify's per GB start event, so it stays $0.005 at any memory setting. It is charged once when a run with at least one usable username or link starts. Carousel slides, video links, locations, the filters, the proxy and the run summary are all included in the per post price; a carousel of 17 slides costs the same as a single photo.
Never charged: private accounts, usernames that do not exist, restricted profiles, posts Instagram refused to serve, posts filtered out by type or date, posts repeated within a run, invalid input, and the info row. A run whose input holds nothing usable stops before the start fee. You can also cap a run's spend with Apify's "Max cost per run" setting; once the cap is reached the actor stops and writes its OUTPUT summary.
FAQ
What does this actor collect?
Public Instagram posts: single photos, carousels (several photos or videos in one post) and videos, as they appear on a profile's grid or at a post link. For each post you get likes, comments, caption, hashtags, mentions, publish time, owner, every image link, video link and location. It reads what Instagram shows a logged out visitor, nothing more.
How many posts can I get per profile?
Up to 300 per profile per run, newest first. Instagram serves a profile grid 12 posts at a time. In our tests on 5 October 2026 we read 312 of NASA's posts (26 pages) and Instagram still offered more, with no login and no wall. A profile with fewer posts returns what it has.
How fresh is the data?
Every run reads Instagram live, so likes and comments are as of scrapedAt. Nothing is cached between runs.
Do I need an Instagram account, cookies or my own proxy?
No. The actor reads Instagram as a logged out visitor over Apify's datacenter proxy, which is included. You never share a login or a cookie.
What happens with private accounts, missing usernames or deleted posts?
They are not charged. Each one is listed in the OUTPUT record of the run with a status (private, not_found, unavailable, no_posts, filtered_out, blocked) and a plain note.
Do I get video views?
Not in this actor: Instagram does not show a video post's view count on the post itself to logged out visitors. For reel views, use our Instagram Reels Views Scraper, which reads them from the reels tab.
Can I get the comments themselves?
This actor returns the number of comments, not their text.
Why do some rows belong to another account than the profile I asked for?
Those are collab posts. Instagram shows a collab on the grid of every coauthor. ownerUsername is the account that posted it and coauthorProducers lists the partners, so you can keep or filter them.
How does it know a post is pinned?
The profile grid does not label pinned posts. Instagram puts up to three pinned posts at the very top, whatever their age, so a top post that is older than a post below it is treated as pinned. A pinned post that is also the newest looks like any other post and is returned as one.
Can I search posts by hashtag, keyword or location?
No. Give profiles or post links. Hashtag, keyword and location search on Instagram need a login, which this actor never uses.
Can I run it on a schedule?
Yes. In Apify Console open the actor, go to Schedules and add one with your input. Use newerThan (for example 7 days on a weekly schedule) so each run reads only the new posts.
What formats can I export?
JSON, CSV, Excel, XML, HTML table and RSS from the run's dataset, or through the Apify API. Rows with _type set to info are a run note; skip them in your pipeline.
Can I use it from Claude, ChatGPT or another AI assistant?
Yes, through Apify's MCP server.
- Connector URL: https://mcp.apify.com/?tools=themineworks/instagram-post-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http instagram-post-scraper "https://mcp.apify.com/?tools=themineworks/instagram-post-scraper"
Is it legal to scrape Instagram posts?
The actor collects only public data that Instagram shows to anyone without logging in. You are responsible for how you use it: follow Instagram's terms where they apply to you and data protection law such as GDPR and CCPA, especially if the accounts belong to private individuals.
Integrations
- Google Sheets, Excel, CSV, JSON: export the dataset from the run page, or link a Google Sheet with Apify's Google Sheets integration.
- Make, Zapier, n8n: use the Apify app to start a run and pick up the posts when it finishes, for example to post a monthly brand report to Slack.
- Webhooks: get a call to your own endpoint when a run succeeds or fails.
- API: start runs and read results with the Apify API or the
apify-clientpackage for Python and JavaScript. - MCP clients: Claude, ChatGPT, Cursor and other MCP clients can call the actor through Apify's MCP server.
More from The Mine Works
Social media and video
- Threads Scraper
- Reddit Scraper
- Threads Search Scraper
- Instagram Profile Scraper
- Instagram Followers & Following
- Reddit Search Scraper
- Twitter / X Scraper
- YouTube Transcript
- Xiaohongshu (RED) Scraper
- Telegram Channel Scraper
- Telegram Channel Finder
- Pinterest Profile Scraper
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
Company and business data
E-commerce and marketplaces
Food and local services
Developer and AI tools
More tools
Support
Found a problem or need a field we do not return? Open an issue on the actor's Issues tab and we will answer there. To ask for a new source, email dmineworks@gmail.com.
Instagram Post Scraper turns public profiles and post links into one row per post with likes, comments, captions and every carousel image, with no login and no charge for anything it does not deliver.

