Instagram Posts Scraper avatar

Instagram Posts Scraper

Pricing

from $2.25 / 1,000 posts

Go to Apify Store
Instagram Posts Scraper

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

Fahim Mahmud Chisti

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

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

  1. Create a free Apify account.
  2. Open Instagram Posts Scraper.
  3. Add one or more usernames, profile URLs, or post URLs.
  4. Keep Data detail level on Basic data (cheaper) unless you need video URLs, tagged users, or richer comments.
  5. Click Start and download results from the Dataset tab.

How to keep costs low

TipWhy it helps
Use Basic dataAvoids a detail request per post
Lower Maximum posts per profileFewer timeline pages and rows
Set Only posts newer thanStops scrolling older history early
Skip pinned posts when irrelevantAvoids old pinned items
Keep Latest comments smallSmaller payloads on Detailed runs
Enable duplicate check on schedulesSkips 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

FieldDescription
Instagram username, profile URL, or post URLRequired list. Mix usernames and URLs.
Maximum posts per profileDefault 20. Ignored for direct post URLs.
Only posts newer thanYYYY-MM-DD, ISO, or relative (1 day, 2 months). UTC.
Skip pinned postsOmit pinned timeline items.
Post type filterAll, Image, Video, Sidecar (carousel), or Reels (clips).
Data detail levelbasicData (default) or detailedData.
Latest comments to collectDefault 5 (0–20).
Session cookiesOptional. 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):

FieldDescription
url / shortCode / idPost identity
typeImage, Video, or Sidecar
caption, hashtags, mentionsCaption-derived text
likesCount, commentsCountEngagement (likesCount is -1 when hidden)
displayUrl, images, videoUrlMedia
latestComments, firstCommentComment sample
ownerUsername, ownerId, ownerFullNameAuthor
timestamp, isPinned, productTypeMetadata
reshareCountWhen Instagram provides it
childPostsCarousel children (mainly Detailed)
error, errorDescriptionStructured 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 namePrice
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 private error 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. Without sessionid, 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" with productType: "clips".
  • Profile timelines paginate via Instagram's feed/user HTTP 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.