Instagram Posts Scraper
Pricing
from $2.25 / 1,000 posts
Instagram Posts Scraper
Scrape public Instagram posts, reels, captions, hashtags, media URLs, and engagement data from usernames, profile URLs, or post links. Fast, HTTP-first, reliable, and cost-optimized for research, monitoring, and lead generation.
Pricing
from $2.25 / 1,000 posts
Rating
0.0
(0)
Developer
Fahim Mahmud Chisti
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
What does Instagram Posts Scraper do?
Instagram Posts Scraper extracts public Instagram post data from usernames, profile URLs, or specific post/reel URLs. It is an HTTP-first Apify Actor designed to keep compute costs low while still returning structured fields compatible with common Instagram post scrapers (caption, engagement, media URLs, comments sample, tagged users, and more).
Run it on the Apify platform to schedule scrapes, export JSON/CSV/Excel, call it from the API, or connect webhooks and integrations.
Why use this scraper?
- Cost-aware defaults — Basic detail level and modest post limits out of the box
- Simple input — Paste
@username, a profile URL, or a/p///reel/link - Useful filters in the UI — Date cutoff, skip pinned posts, post-type filter
- Clear errors — Private, login-required, blocked, and not-found cases return structured error rows instead of empty junk
- Incremental runs — Optional cross-run duplicate URL skipping for scheduled monitoring
How to use Instagram Posts Scraper
- Create a free Apify account.
- Open Instagram Posts Scraper.
- Add one or more usernames, profile URLs, or post URLs.
- Keep Data detail level on Basic data (cheaper) unless you need video URLs, tagged users, or richer comments.
- Click Start and download results from the Dataset tab.
How to keep costs low
| Tip | Why it helps |
|---|---|
| Use Basic data | Avoids a detail request per post |
| Lower Maximum posts per profile | Fewer timeline pages and rows |
| Set Only posts newer than | Stops scrolling older history early |
| Skip pinned posts when irrelevant | Avoids old pinned items |
| Keep Latest comments small | Smaller payloads on Detailed runs |
| Enable duplicate check on schedules | Skips posts you already scraped |
Detailed data is available when you need video URLs, carousel children, music info, coauthors, tagged users, or a larger comment sample — expect higher usage than Basic.
Input
| Field | Description |
|---|---|
| Instagram username, profile URL, or post URL | Required list. Mix usernames and URLs. |
| Maximum posts per profile | Default 20. Ignored for direct post URLs. |
| Only posts newer than | YYYY-MM-DD, ISO, or relative (1 day, 2 months). UTC. |
| Skip pinned posts | Omit pinned timeline items. |
| Post type filter | All, Image, Video, Sidecar (carousel), or Reels (clips). |
| Data detail level | basicData (default) or detailedData. |
| Latest comments to collect | Default 5 (0–20). |
| Session cookies | Optional. Empty = anonymous HTML-first mode for public data. |
| Proxy | Residential US recommended. |
Example:
{"username": ["natgeo", "https://www.instagram.com/p/DLNsnpUTdVS/"],"resultsLimit": 20,"skipPinnedPosts": false,"postTypeFilter": "all","dataDetailLevel": "basicData","latestCommentsLimit": 5}
Output
Results land in the default dataset. You can download JSON, CSV, Excel, HTML, or XML.
Sample fields (drop-in friendly with common Instagram post scrapers):
| Field | Description |
|---|---|
url / shortCode / id | Post identity |
type | Image, Video, or Sidecar |
caption, hashtags, mentions | Caption-derived text |
likesCount, commentsCount | Engagement (likesCount is -1 when hidden) |
displayUrl, images, videoUrl | Media |
latestComments, firstComment | Comment sample |
ownerUsername, ownerId, ownerFullName | Author |
timestamp, isPinned, productType | Metadata |
reshareCount | When Instagram provides it |
childPosts | Carousel children (mainly Detailed) |
error, errorDescription | Structured failure info |
Example item:
{"inputUrl": "https://www.instagram.com/natgeo/","id": "3660778310592222546","type": "Image","shortCode": "DLNsnpUTdVS","caption": "Brain science #Nature @disney","hashtags": ["Nature"],"mentions": ["disney"],"url": "https://www.instagram.com/p/DLNsnpUTdVS/","commentsCount": 230,"likesCount": 73473,"displayUrl": "https://example.com/image1.jpg","timestamp": "2025-06-22T19:00:10.000Z","ownerUsername": "natgeo","ownerId": "787132","isPinned": false,"reshareCount": null,"error": null}
Pricing / cost estimation
Pay per event (PPE). Charges apply when a post is written to the dataset:
Mode (dataDetailLevel) | Event name | Price |
|---|---|---|
Basic (basicData) | post | $2.25 / 1,000 ($0.00225 each) |
Advanced (detailedData) | details | $4.25 / 1,000 ($0.00425 each) |
Also keep Apify’s synthetic apify-actor-start event (covers the first ~5s of compute). Remove apify-default-dataset-item in Console so dataset writes are not double-charged.
Platform compute/proxy usage is separate from event fees unless you enable “PPE + usage”. The Actor stops when the user’s max spend limit is reached (docs).
This Actor is built to minimize compute: no headless browser, Basic mode by default, early stop on date filters and duplicate streaks.
Tips
- Public accounts only. Private profiles return a
privateerror row. - Cookies are optional. Leave empty for anonymous public scraping via Instagram’s web API + residential proxy rotation (same approach as other public IG scrapers).
- Add cookies only when needed: paste
sessionid=...; csrftoken=...or a JSON cookie export. Withoutsessionid, the Actor stays in anonymous mode. - Unlike Apify Instagram Post Scraper, this Actor does not use Apify’s private session pool — cookies you provide are your own browser session.
- In Detailed mode without cookies, failed post detail fetches fall back to the basic timeline snapshot instead of only error rows.
- Keep Apify Residential proxies enabled. Anonymous mode rotates proxy sessions when Instagram blocks a request.
- Sidecar means carousel (multiple images/videos in one post).
- Reels appear as
type: "Video"withproductType: "clips". - Profile timelines paginate via Instagram's
feed/userHTTP API after the first page (cookie mode). Anonymous mode usually stops after the first HTML page. - For full comment threads, use a dedicated comments scraper; this Actor only samples latest comments.
- Old pinned posts are ignored when applying the date cutoff stop, so they won't block scraping of newer posts.
FAQ
Can it scrape private accounts?
No. Only public profiles and posts.
Why is likesCount -1?
The author hid like counts. Instagram does not expose the number publicly.
Does it extract reels?
Yes. Filter with Post type → Reels (clips) if you only want reels.
Is reshare/repost count included?
When Instagram includes reshare/share counts in the payload, they are mapped to reshareCount.
Is scraping Instagram legal?
This Actor only collects publicly available data. You are responsible for complying with Instagram’s terms and applicable privacy laws (including GDPR where relevant). If unsure, consult a lawyer.
Support
Found a bug or have feedback? Open an issue on the Actor’s Issues tab on Apify.