Instagram Posts Scraper — Profile Posts, Captions & Stats
Pricing
from $1.75 / 1,000 target checkeds
Instagram Posts Scraper — Profile Posts, Captions & Stats
Instagram posts scraper and API: every public post of a profile with caption, hashtags, mentions, likes, comments, plays, media links and location. No login, no cookies, no run fee.
Pricing
from $1.75 / 1,000 target checkeds
Rating
0.0
(0)
Developer
Matvey
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Instagram Posts Scraper turns public Instagram profiles, post links or hashtags into a flat table. One row per post or per comment: caption, hashtags and mentions pulled out of it, likes, comments, plays, the media file link, location and the author. No login, no cookies, no Instagram account of yours at risk.
Three modes, one Actor
| Mode | You give | One row is |
|---|---|---|
| 👤 Posts of a profile | handles or profile links | one post |
| 💬 Comments under a post | post or reel links | one comment |
| #️⃣ Posts under a hashtag | hashtags | one post |
Why this needs us at all
Instagram shows none of this to a logged-out visitor: the profile page answers with a redirect to the login screen and its internal API answers 401 require_login. Checked on 28 October 2026 from a plain server and again through a residential address — same answer both times. This Actor reads the data through a paid source that holds the sessions, so you never hand over your own cookies and never get an account flagged.
What it costs
Two charges, both stated before you press Start:
| What is charged | When |
|---|---|
| One target | Once per profile, post link or hashtag in your list — even if it turns out to be private, empty or deleted |
| One row | For every post or comment actually delivered |
There is also a run fee, and it is the smallest one in this niche — 30% below the cheapest competitor charges to start a run.
On the Apify Free plan
A run collects the first target in your list in full — every row it has, not a sample — and nothing is charged at all. The remaining targets come back as a free note saying they were left alone. So you can see the real shape and the real volume of the data before you pay anything.
The reason the rest is held back is plain: every target costs us a request to a paid data source, and the free plan does not cover it.
Why a target is charged even when it is empty: looking it up costs us one request to the data source whether it returns sixty posts or none. A private profile and a post with comments turned off are normal answers, not failures.
Output
{"type": "post","postUrl": "https://www.instagram.com/p/ABC123/","ownerUsername": "natgeo","takenAt": "2026-10-27T14:07:48.000Z","caption": "…","hashtags": ["wildlife", "photography"],"mentions": ["natgeotravel"],"likeCount": 27400,"commentCount": 312,"playCount": 905718,"imageUrl": "https://…","videoUrl": null,"locationName": "Serengeti"}
Comment rows carry the comment text, its author, when it was written, how many likes and replies it has, and whether the author of the post wrote it.
What it does not do
- Private accounts. The target is charged like any other lookup, no rows come back.
- Likes of a private post, or who viewed a story. Instagram does not publish those.
- Posting, liking or replying. This Actor only reads.
For AI agents
- Minimal input:
{"mode": "posts", "usernames": ["natgeo"]}— or{"mode": "comments", "postUrls": ["https://www.instagram.com/p/DemLxMGgoL_/"]}, or{"mode": "hashtags", "hashtags": ["wildlife"]}. - Returns: one row per post (
posts,hashtags) or per comment (comments);maxItemsPerTargetcaps each profile, post or hashtag. A target that gives nothing — private account, comments off, hidden hashtag — gets one freetype: "notice"row with the reason; filter it out withtype != "notice". - Time: about 10 seconds for 20 comments of one post, 30–50 seconds for 60 posts of one profile. A few targets — call synchronously (
run-sync-get-dataset-items); long lists — start the run and poll it.
Errors and empty runs
An empty run always says why in its own words — private account, comments turned off, hashtag hidden — in a free notice row. Filter it out with type != "notice". If the data source stops answering, the run passes its answer through word for word instead of guessing.
Your feedback
Found a bug or a missing field? Open an issue on the Actor page. Problems reported by buyers are fixed the same day.