Instagram Scraper - Posts, Reels, Hashtags & Profiles avatar

Instagram Scraper - Posts, Reels, Hashtags & Profiles

Pricing

from $0.40 / 1,000 post scrapeds

Go to Apify Store
Instagram Scraper - Posts, Reels, Hashtags & Profiles

Instagram Scraper - Posts, Reels, Hashtags & Profiles

Scrape Instagram posts, reels and carousels by profile, hashtag or post URL: caption, likes, comments, plays, engagement rate, date, image/video URLs, music, tagged users, co-authors, location, pinned and paid-partnership flags. Date, type and keyword filters, monitor mode. No login.

Pricing

from $0.40 / 1,000 post scrapeds

Rating

0.0

(0)

Developer

Top Api

Top Api

Maintained by Community

Actor stats

1

Bookmarked

1

Total users

0

Monthly active users

3 days ago

Last modified

Share

What does Instagram Scraper do?

Instagram Scraper extracts Instagram posts from instagram.com and turns profile names, hashtags or post URLs into structured rows: one row per post, reel or carousel with caption, likes, comments, plays, publish date, media URLs, music, tagged users and the owner. Built for marketing teams, influencer and brand researchers, and data pipelines that need Instagram posts data without a login, cookies or an API key.

Instagram Posts Scraper - Instagram Reels Scraper - Instagram Hashtag Scraper - Instagram Profile Posts API

Instagram posts grid of a public profile that Instagram Scraper turns into rows

  • Posts, reels and carousels from any public profile: newest first, pinned posts flagged, 10 posts per page, as deep as you set the cap.
  • Hashtags and keywords: the reels Instagram shows on its public keyword page for a term, with play counts, 12 per page.
  • Single posts and reels by URL: paste any /p/ or /reel/ link or a bare shortcode and get the full record in one request.
  • One better than the rest: engagementRate (likes + comments over the owner's followers), captionCreatedAt, likeAndViewCountsDisabled, musicInfo.audioType and isTrendingInClips, every image rendition in images, carousel items with their own tagged users, and reel play counts even for posts in a profile timeline.
  • No login, cookies or Instagram API key: the actor reads only what Instagram shows a signed-out visitor.
  • Filters: date window, post type, minimum likes, keyword, tagged place and pinned posts; pay-per-result with no start fee.
  • Export anywhere: JSON, CSV, Excel, XML, RSS; schedules, webhooks, Make, Zapier, n8n, Google Sheets, Slack.
  • Works with AI agents: call it through the Apify API or the MCP server; compact trims rows for LLM context windows.

What data can you get from Instagram?

๐Ÿ”— Post URL and shortcode (`url`, `shortCode`)๐Ÿ“ Caption, hashtags, mentions๐Ÿ“… Publish date (`timestamp`)
โค๏ธ Likes (`likesCount`)๐Ÿ’ฌ Comments (`commentsCount`)โ–ถ๏ธ Reel plays (`videoPlayCount`)
๐Ÿ“ˆ Engagement count and rate๐Ÿ–ผ๏ธ Image URLs in every size (`displayUrl`, `images`)๐ŸŽฌ Video URL, duration, audio flag
๐ŸŽต Music: song, artist, audio type, trending๐Ÿท๏ธ Tagged users with positions๐Ÿค Co-authors and paid-partnership sponsors
๐Ÿ“ Location name, id, city, coordinates๐Ÿงฉ Carousel items (`childPosts`)๐Ÿ“Œ Pinned, type, product type (reel / feed / carousel)
๐Ÿ‘ค Owner username, name, id, verified, avatar, followers๐Ÿชช Optional profile row: bio, links, followers, category, business address๐Ÿ” Which input and keyword each row came from

On the first live run (17 posts from a profile, a keyword and a URL) every row had a caption, date, likes, comments, image URL, dimensions and owner; 65% carried hashtags, 53% a play count (every reel), 35% tagged users, 24% a location.

How to scrape Instagram with Instagram Scraper

  1. Create a free Apify account - $5 of monthly credit, no card needed.
  2. Open Instagram Scraper and click Try for free.
  3. Paste usernames into Profiles, hashtags into Hashtags or keywords, or links into Post or reel URLs, and set Max posts per profile or hashtag.
  4. Click Start. Rows stream into the dataset as pages are read; a 50-post profile run finishes in a few seconds.
  5. Open the Storage tab and Export as JSON, CSV or Excel - or let a schedule run it for you.

โฌ‡๏ธ Input

ParameterTypeDescription
๐Ÿ” What to scrape
usernamesListUsernames or profile URLs: nasa, @natgeo, https://www.instagram.com/instagram/. Default: ["nasa"] when nothing else is given
hashtagsListHashtags or keywords: travel, #foodie, https://www.instagram.com/explore/tags/travel/. Read from Instagram's public keyword page
postUrlsListPost or reel URLs or shortcodes: https://www.instagram.com/p/Dd9RyBWBVih/, Dd9RyBWBVih
๐ŸŽฏ Filters (decide how far back a profile is read)
onlyPostsNewerThanString2026-09-01, 7 days, 3 weeks, or a day count. Paging stops when a whole page is older
onlyPostsOlderThanStringUpper bound of the window, same formats
skipPinnedPostsBooleanLeave out posts pinned to the top of the grid. Default: false
โœ‚๏ธ Refine results
postTypeSelectall, image, video, carousel, reel. Default: all
minLikesIntegerKeep only posts with at least this many likes. Default: 0
keywordFilterStringKeep only posts whose caption, hashtags, tagged users, place, music or owner contain the word(s); comma = any
withLocationOnlyBooleanKeep only posts tagged with a place. Default: false
โž• Extra data
includeProfileSummaryBooleanAdds one Profile row per scraped profile - charged as profile-summary at $0.001 per profile
๐Ÿ” Monitoring
monitorModeBooleanReturn only posts not delivered by previous runs; pair with a daily schedule
monitorStoreNameStringName of the key-value store holding the monitor memory. Default: instagram-posts-monitor
๐Ÿ“ฆ Output
resultsLimitIntegerMax posts per profile or hashtag after filters. Default 50; 0 = everything Instagram serves
maxItemsIntegerHard cap for the whole run. Default 0 = no total cap
compactBooleanCore fields only, sized for AI agents and MCP
โš™๏ธ Advanced
proxyConfigurationObjectApify proxy settings. Default: Apify datacenter proxies, which serve every request this actor makes
maxConcurrencyIntegerParallel single-post requests. Default 4

Input JSON

{
"usernames": ["nasa", "natgeo"],
"hashtags": ["travel"],
"postUrls": ["https://www.instagram.com/reel/Dd9RyBWBVih/"],
"onlyPostsNewerThan": "30 days",
"resultsLimit": 50,
"includeProfileSummary": true
}

Paste profiles when you want a timeline, URLs when you want specific posts

A profile walks the grid newest first and stops at your cap or date window. A post URL costs one request and returns the full record of that one post. Do: nasa in Profiles ยท Don't: https://www.instagram.com/nasa/p/Dd9RyBWBVih/ in Profiles expecting the whole timeline (the actor routes a post URL to the single-post path and returns one row).

Hashtags are Instagram's public keyword page, not the signed-in hashtag feed

Signed-out visitors get a keyword page of popular reels for a term, 12 per page, in Instagram's ranking. It exists for many terms (travel, foodie, street food all returned pages in testing) and not for others (sunset, coffee, nasa returned a description and no posts). An empty term delivers nothing and says so in the run status. For a specific account's posts, use usernames.

Use the date window for scheduled Instagram runs

onlyPostsNewerThan: "1 day" on a profile reads one page and stops as soon as the page is older than yesterday; with monitorMode on, a daily schedule delivers each post exactly once.

โฌ†๏ธ Output

Every post becomes one dataset item. Here is the table view of a run for nasa, travel and one reel URL:

Instagram Scraper output table of Instagram posts with likes, comments, plays and engagement

And one row as JSON (trimmed):

{
"id": "3998430248382584993",
"type": "Video",
"shortCode": "Dd9RyBWBVih",
"url": "https://www.instagram.com/reel/Dd9RyBWBVih/",
"caption": "DIY fish squishy ๐ŸŸ @yano4kaa.a made this squishy using stuff she already had at home...",
"hashtags": [],
"mentions": ["yano4kaa.a", "stuckinreboot"],
"timestamp": "2026-10-01T09:59:45.000Z",
"likesCount": 534292,
"commentsCount": 11572,
"engagementCount": 545864,
"engagementRate": 0.08,
"videoPlayCount": 123170887,
"videoDuration": 16.74,
"videoUrl": "https://scontent-....cdninstagram.com/o1/v/t2/f2/m86/....mp4?...",
"displayUrl": "https://scontent-....cdninstagram.com/v/t51.82787-15/....jpg?...",
"productType": "clips",
"isPinned": false,
"paidPartnership": false,
"taggedUsers": [{ "id": "7198319588", "username": "yano4kaa.a", "fullName": "yano4kaa", "position": [0, 0] }],
"musicInfo": { "audioType": "licensed_music", "songName": "Tell Me (Rap Version)", "artistName": "Wonder Girls", "isTrendingInClips": true },
"ownerUsername": "instagram",
"ownerFollowersCount": 686588239
}

Fields

FieldTypeWhat it isFill on the live run
id, pk, shortCode, urlstringInstagram media id, shortcode and canonical URL (/reel/ for reels)100%
typestringImage, Video or Sidecar (carousel)100%
productTypestringfeed, clips (reel), carousel_container, igtv100%
caption, hashtags, mentionsstring / arraysCaption text with its hashtags and @mentions parsed100% / 65% / 59%
timestamp, captionCreatedAtstring (ISO 8601)Publish time and caption time100%
likesCount, commentsCount, engagementCountintegerLikes, comments and their sum; likesCount is null when the owner hides likes100%
engagementRatenumber(likes + comments) / owner followers, percent; filled for a profile's own posts and for post URLs35%
videoPlayCount, videoViewCountintegerReel plays from the profile's reels tab or the keyword page; videoViewCount when Instagram exposes it53% (every reel) / 0%
likeAndViewCountsDisabled, isCommentsDisabledbooleanOwner-side visibility switches100% / 0%
displayUrl, images, dimensionsWidth, dimensionsHeightstring / arrayLargest image and every rendition with sizes (signed CDN links, they expire)100%
videoUrl, videoDuration, hasAudiostring / number / booleanBest video rendition, seconds, audio flag53% (every video)
isPinned, isInProfileGridbooleanPinned to the profile grid; shown in the grid100%
paidPartnership, sponsorsboolean / arrayPaid partnership label and its sponsor accounts100% / 6%
taggedUsers, coauthorProducersarrayTagged accounts with positions; collaborators35% / 24%
locationName, locationId, locationCity, locationLat, locationLngstring / numberTagged place24%
musicInfoobjectaudioType, songName, artistName, audioId, usesOriginalAudio, isExplicit, isTrendingInClips, originalAudioOwner53% (every reel)
childPostsarrayCarousel items: id, type, displayUrl, dimensions, videoUrl, duration, alt, taggedUsers29% (every carousel)
alt, aiLabel, latestCommentsstring / arrayAccessibility caption, AI label, preview comments when Instagram ships them3% / 0% / 0%
ownerUsername, ownerFullName, ownerId, ownerIsVerified, ownerProfilePicUrl, ownerFollowersCountstring / boolean / integerThe account that posted (the co-author on collab posts)100% (followers 35%)
inputUrl, searchTerm, scrapedAtstringWhere the row came from100% / 47% / 100%

A Profile row (add-on) carries username, fullName, biography, externalUrl, bioLinks[], followersCount, followsCount, postsCount, isPrivate, isVerified, isBusinessAccount, isProfessionalAccount, businessCategoryName, businessAddress, profilePicUrl, profilePicUrlHD, hasActiveStory, highlightReelCount, hasClips, threadsBadge, fbid.

How can I use Instagram posts data?

  • ๐ŸŽฏ Influencer and creator vetting - pull a creator's last 100 posts, read engagementRate, paidPartnership and coauthorProducers to see real engagement and how often they run sponsored content.
  • ๐Ÿ“Š Competitor and brand monitoring - schedule the competitor profiles daily with monitorMode and get every new post, its format and its first-day likes and comments.
  • ๐Ÿ”Ž Trend and UGC research - read the keyword page for travel or street food, rank reels by videoPlayCount, pick the sounds in musicInfo that trend.
  • ๐Ÿ“ Local marketing and venue research - withLocationOnly keeps posts tagged with a place; group them by locationName and locationCity.
  • ๐Ÿค– AI and research teams - feed caption, hashtags, alt and the counts to an LLM with compact: true; every row is one post, nothing nested you did not ask for.
  • ๐Ÿ“ˆ Reporting - run weekly and track likesCount, commentsCount and videoPlayCount of the same posts over time.

How much does it cost to scrape Instagram?

Instagram Scraper is pay-per-result: $0.40 per 1,000 posts, no start fee. One result is one post written to the dataset. The optional profile row is $0.001 per profile.

RowsCost
10$0.004
100$0.04
1,000$0.40
10,000$4.00

There is nothing else to pay: Apify platform usage (compute, proxy) is included in these prices. The actor runs on 256 MB with no browser: a 50-post profile run read 5 pages in 3.6 seconds, a 17-post mixed run took 2.8 seconds over 20 requests.

Integrations, API, scheduling & MCP

  • Schedules: run Instagram Scraper hourly, daily or weekly from the Schedules tab; combine with monitorMode or onlyPostsNewerThan to get only new posts.
  • Webhooks: fire a URL when a run finishes - push rows to your CRM, Slack or a sheet.
  • No-code: Make, Zapier, n8n, Google Sheets, Airtable, Slack via Apify integrations.
  • API: call it from Node.js or Python with apify-client - code on the API tab and the Apify API reference.
  • MCP / AI agents: connect Claude, Cursor or any MCP client through the MCP tab and ask for Instagram posts in plain language.

More TopApi scrapers

๐ŸŽต TikTok Scraper - videos by profile, hashtag or URL with stats, sound and transcriptโญ Google Maps Reviews Scraper - every review of a place with owner replies and dates๐Ÿงญ All TopApi actors - social media, reviews and lead-gen scrapers built for scheduled runs

Limits & empty runs

  • Results per run: Instagram serves 10 posts per profile page and 12 per keyword page; resultsLimit and the date window are the cost controls. A profile with 3,000 posts is about 300 pages.
  • Keyword pages are partial: Instagram publishes a signed-out keyword page only for some terms (3 of 6 common words in testing). Terms without one deliver nothing.
  • Not available signed-out: postsCount on a profile (Instagram no longer shows it to signed-out visitors), comments beyond Instagram's occasional preview, videoViewCount on most videos (reels carry videoPlayCount instead), follower counts of accounts that only appear on a keyword page.
  • Private accounts return a Profile row (if requested) and no posts; the run status says which accounts were private.
  • Media links expire: displayUrl, images, videoUrl and avatars are signed CDN URLs valid for a few hours; download what you need.
  • Empty dataset means the profiles were private or do not exist, the keyword has no public page, or every post was removed by your filters - the run status names which.

FAQ

How many Instagram posts can Instagram Scraper collect in one run?

As many as the cap allows: 10 per profile page, 12 per keyword page, one request per post URL. A run reads pages until resultsLimit, maxItems, the date window or the end of the profile is reached. The default 50 per profile is 5 pages; set 0 to read a whole profile.

Can I run Instagram Scraper on a schedule to get new Instagram posts automatically?

Yes. Save your input as a task, open Schedules, pick the cadence and turn on monitorMode: each run remembers the posts it delivered per profile or keyword. On a profile it stops at the last run's newest post; on a keyword page it walks past the posts it already delivered and returns the next ones up to your cap. A run with nothing new delivers nothing.

Can I scrape Instagram reels with Instagram Scraper?

Yes. Reels appear in profile timelines with productType: "clips", on keyword pages and as /reel/ URLs; postType: "reel" keeps only them. Reel play counts come from the profile's reels tab or the keyword page.

Can I integrate Instagram Scraper with other apps?

Yes - Make, Zapier, n8n, Google Sheets, Slack and more via Apify integrations, or use webhooks to trigger an action when a run finishes.

Can I use Instagram Scraper with the Apify API?

Yes. The API lets you start runs, fetch datasets and manage schedules. Use apify-client for Node.js or Python; the API tab has ready-to-paste code.

Can I use Instagram Scraper through an MCP server?

Yes. Open the MCP tab, connect your MCP client (Claude Desktop, Cursor, LibreChat...), and ask for Instagram posts in plain language. Turn on compact to keep rows small.

Do I need an Instagram account, cookies or an API key?

No. Instagram Scraper reads only what Instagram shows publicly to a signed-out visitor; you pass usernames, hashtags or URLs and nothing else.

Why did my Instagram Scraper run return no results?

In order of frequency seen in testing: the keyword has no public page (try a broader term), the account is private or misspelled, or the date window and filters removed every post. The run status message names the cause.

How is Instagram Scraper different from other Instagram scrapers?

It runs without a browser on 256 MB, so a 50-post profile takes seconds; it ships engagementRate, captionCreatedAt, trending-audio flags, every image rendition and reel play counts inside profile timelines; and it filters by date window, post type, likes, keyword, place and pinned posts.

Instagram Scraper extracts only publicly available Instagram posts; it does not log in or collect private data. Results may still contain personal data, which is regulated (for example by GDPR). Make sure you have a legitimate purpose before you use it.

Your feedback

We keep improving Instagram Scraper. Found a bug or missing a field? Open an issue on the Issues tab - we answer within one business day.