Instagram Scraper - Posts, Reels, Hashtags & Profiles
Pricing
from $0.40 / 1,000 post scrapeds
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
Maintained by CommunityActor stats
1
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
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
- 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.audioTypeandisTrendingInClips, every image rendition inimages, 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;
compacttrims 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
- Create a free Apify account - $5 of monthly credit, no card needed.
- Open Instagram Scraper and click Try for free.
- Paste usernames into Profiles, hashtags into Hashtags or keywords, or links into Post or reel URLs, and set Max posts per profile or hashtag.
- Click Start. Rows stream into the dataset as pages are read; a 50-post profile run finishes in a few seconds.
- Open the Storage tab and Export as JSON, CSV or Excel - or let a schedule run it for you.
โฌ๏ธ Input
| Parameter | Type | Description |
|---|---|---|
| ๐ What to scrape | ||
usernames | List | Usernames or profile URLs: nasa, @natgeo, https://www.instagram.com/instagram/. Default: ["nasa"] when nothing else is given |
hashtags | List | Hashtags or keywords: travel, #foodie, https://www.instagram.com/explore/tags/travel/. Read from Instagram's public keyword page |
postUrls | List | Post or reel URLs or shortcodes: https://www.instagram.com/p/Dd9RyBWBVih/, Dd9RyBWBVih |
| ๐ฏ Filters (decide how far back a profile is read) | ||
onlyPostsNewerThan | String | 2026-09-01, 7 days, 3 weeks, or a day count. Paging stops when a whole page is older |
onlyPostsOlderThan | String | Upper bound of the window, same formats |
skipPinnedPosts | Boolean | Leave out posts pinned to the top of the grid. Default: false |
| โ๏ธ Refine results | ||
postType | Select | all, image, video, carousel, reel. Default: all |
minLikes | Integer | Keep only posts with at least this many likes. Default: 0 |
keywordFilter | String | Keep only posts whose caption, hashtags, tagged users, place, music or owner contain the word(s); comma = any |
withLocationOnly | Boolean | Keep only posts tagged with a place. Default: false |
| โ Extra data | ||
includeProfileSummary | Boolean | Adds one Profile row per scraped profile - charged as profile-summary at $0.001 per profile |
| ๐ Monitoring | ||
monitorMode | Boolean | Return only posts not delivered by previous runs; pair with a daily schedule |
monitorStoreName | String | Name of the key-value store holding the monitor memory. Default: instagram-posts-monitor |
| ๐ฆ Output | ||
resultsLimit | Integer | Max posts per profile or hashtag after filters. Default 50; 0 = everything Instagram serves |
maxItems | Integer | Hard cap for the whole run. Default 0 = no total cap |
compact | Boolean | Core fields only, sized for AI agents and MCP |
| โ๏ธ Advanced | ||
proxyConfiguration | Object | Apify proxy settings. Default: Apify datacenter proxies, which serve every request this actor makes |
maxConcurrency | Integer | Parallel 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:
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
| Field | Type | What it is | Fill on the live run |
|---|---|---|---|
id, pk, shortCode, url | string | Instagram media id, shortcode and canonical URL (/reel/ for reels) | 100% |
type | string | Image, Video or Sidecar (carousel) | 100% |
productType | string | feed, clips (reel), carousel_container, igtv | 100% |
caption, hashtags, mentions | string / arrays | Caption text with its hashtags and @mentions parsed | 100% / 65% / 59% |
timestamp, captionCreatedAt | string (ISO 8601) | Publish time and caption time | 100% |
likesCount, commentsCount, engagementCount | integer | Likes, comments and their sum; likesCount is null when the owner hides likes | 100% |
engagementRate | number | (likes + comments) / owner followers, percent; filled for a profile's own posts and for post URLs | 35% |
videoPlayCount, videoViewCount | integer | Reel plays from the profile's reels tab or the keyword page; videoViewCount when Instagram exposes it | 53% (every reel) / 0% |
likeAndViewCountsDisabled, isCommentsDisabled | boolean | Owner-side visibility switches | 100% / 0% |
displayUrl, images, dimensionsWidth, dimensionsHeight | string / array | Largest image and every rendition with sizes (signed CDN links, they expire) | 100% |
videoUrl, videoDuration, hasAudio | string / number / boolean | Best video rendition, seconds, audio flag | 53% (every video) |
isPinned, isInProfileGrid | boolean | Pinned to the profile grid; shown in the grid | 100% |
paidPartnership, sponsors | boolean / array | Paid partnership label and its sponsor accounts | 100% / 6% |
taggedUsers, coauthorProducers | array | Tagged accounts with positions; collaborators | 35% / 24% |
locationName, locationId, locationCity, locationLat, locationLng | string / number | Tagged place | 24% |
musicInfo | object | audioType, songName, artistName, audioId, usesOriginalAudio, isExplicit, isTrendingInClips, originalAudioOwner | 53% (every reel) |
childPosts | array | Carousel items: id, type, displayUrl, dimensions, videoUrl, duration, alt, taggedUsers | 29% (every carousel) |
alt, aiLabel, latestComments | string / array | Accessibility caption, AI label, preview comments when Instagram ships them | 3% / 0% / 0% |
ownerUsername, ownerFullName, ownerId, ownerIsVerified, ownerProfilePicUrl, ownerFollowersCount | string / boolean / integer | The account that posted (the co-author on collab posts) | 100% (followers 35%) |
inputUrl, searchTerm, scrapedAt | string | Where the row came from | 100% / 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,paidPartnershipandcoauthorProducersto see real engagement and how often they run sponsored content. - ๐ Competitor and brand monitoring - schedule the competitor profiles daily with
monitorModeand get every new post, its format and its first-day likes and comments. - ๐ Trend and UGC research - read the keyword page for
travelorstreet food, rank reels byvideoPlayCount, pick the sounds inmusicInfothat trend. - ๐ Local marketing and venue research -
withLocationOnlykeeps posts tagged with a place; group them bylocationNameandlocationCity. - ๐ค AI and research teams - feed
caption,hashtags,altand the counts to an LLM withcompact: true; every row is one post, nothing nested you did not ask for. - ๐ Reporting - run weekly and track
likesCount,commentsCountandvideoPlayCountof 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.
| Rows | Cost |
|---|---|
| 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
monitorModeoronlyPostsNewerThanto 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;
resultsLimitand 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:
postsCounton a profile (Instagram no longer shows it to signed-out visitors), comments beyond Instagram's occasional preview,videoViewCounton most videos (reels carryvideoPlayCountinstead), follower counts of accounts that only appear on a keyword page. - Private accounts return a
Profilerow (if requested) and no posts; the run status says which accounts were private. - Media links expire:
displayUrl,images,videoUrland 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.
Is it legal to scrape Instagram data?
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.

