Instagram Scraper
Pricing
from $0.80 / 1,000 contents
Instagram Scraper
Collect public Instagram profiles, posts, reels, hashtags, places, search results, and tagged posts through anonymous web requests.
Pricing
from $0.80 / 1,000 contents
Rating
0.0
(0)
Developer
Kai
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Collect public Instagram profiles, posts, reels, and places as structured data. Search for profiles, hashtags, and places, read available posts, or fetch a known post. Each result is one item in the default dataset.
You do not need an Instagram account or login cookies. Collection uses public Instagram data. Instagram can still block a request, even for public content.
Profile posts and tagged posts can continue across pages when Instagram permits access. Profile reels, place posts, and hashtag posts use one public page. Hashtag results include only posts whose full caption contains the exact hashtag. These results are a limited sample, not a complete hashtag feed.
Use cases
- Creator research: compare public profile details and available engagement counts.
- Brand monitoring: collect posts from known public accounts.
- Content research: collect captions, hashtags, images, reels, and carousel media.
- Location research: collect details and posts from known places.
- Reporting: export results for analysis in a spreadsheet or another application.
Data you can collect
- Profiles: username, name, biography, links, profile image, follower and post counts, account flags, and available related profiles.
- Posts and reels: caption, author, posting time, available like, comment, view, and play counts, media links, dimensions, and video duration.
- Carousels: images and videos in their original order, inside one post item.
- Post context: hashtags, text mentions, tagged users, co-authors, location, music details, and comment previews when Instagram supplies them.
- Places: name, coordinates, address, city, country, website, category, and available post count.
- Hashtags: name, post count, and available profile image.
A field can be missing or null when Instagram does not supply it. Full comment threads, replies, Stories, audio lookup, and private account data are not supported.
Choose how to collect
Set one mode and put its targets in the targets list.
| What you want | Set mode to | Put in targets |
|---|---|---|
| Profile details | profile | Usernames or profile URLs |
| One or more known posts or reels | post | Post/reel URLs, shortcodes, or numeric media IDs |
| Posts from a profile | posts | Usernames or profile URLs |
| Reels from a profile | reels | Usernames or profile/reels URLs |
| Available posts with an exact hashtag | hashtag | Hashtags or hashtag URLs |
| Hashtag details | hashtagDetails | Hashtags or hashtag URLs |
| Place details | place | Place IDs or place URLs |
| Posts shown on a place page | placePosts | Place IDs or place URLs |
| Profiles, hashtags, or places that match a phrase | search | Search phrases; select searchType and searchResults |
| Posts that tag an account | mentions | Usernames or profile URLs |
mentions mode collects posts that tag the account. It does not search for text mentions in captions. Place pages can include posts from the surrounding area; each post keeps its own location when available.
Use @123 for a username that contains only digits. Numeric profile IDs are not supported. In post mode, a target that contains only digits is treated as a media ID.
Start a run
- Open the Actor's Input tab in Apify Console.
- Select a mode and enter its targets, or use one of the JSON examples below.
- Set the maximum results and check the proxy settings.
- Select Start.
- Open Output to view the results. Select Export to download them.
For Console instructions, see Apify's run guide.
Read profile details
{"mode": "profile","targets": ["instagram", "nasa"],"maxItems": 2}
Collect recent posts
Collect up to 10 posts from the profile's public page. Keep posts from the last seven days and omit posts marked as pinned.
{"mode": "posts","targets": ["instagram"],"maxItems": 10,"onlyNewerThan": "7 days","skipPinnedPosts": true,"addParentData": true}
Collect reels and save media files
{"mode": "reels","targets": ["instagram"],"maxItems": 10,"downloadMedia": true}
Fetch a known post
Replace the URL with the post or reel you need.
{"mode": "post","targets": ["https://www.instagram.com/p/DZxvMgyH8yR/"],"maxItems": 1}
Read place details
{"mode": "place","targets": ["213385402"],"maxItems": 1}
Search for a public profile
Search by a phrase, then collect details for the first matching public profile.
{"mode": "search","targets": ["national geographic"],"searchType": "profile","searchResults": "details","searchLimit": 1,"maxItems": 1}
Use searchType: "place" to find places or searchType: "hashtag" to find hashtags. Set searchResults to posts or reels to collect available media from the matches. Profile search also accepts mentions for tagged posts. Search reads one batch of available matches; it does not return every match. A phrase can have no matches. A public page can have no posts that meet your filters.
Input
Both mode and targets are required. Invalid targets or incompatible options stop the run before collection.
| Field | Type | Default | Behaviour |
|---|---|---|---|
mode | string | Required | One mode from the selection table. |
targets | string[] | Required | 1–100 targets of the same type. Duplicate targets are removed. |
maxItems | integer | 100 | Maximum saved items across the run. Range: 1–10,000. |
maxItemsPerTarget | integer | 100 | Maximum saved items for each input target. Range: 1–1,000. A search query is one target. |
maxRequests | integer | 500 | Maximum request attempts. Range: 1–10,000. Includes connection setup, retries, detail checks, and downloads. |
onlyNewerThan | string | None | Keep posts after a UTC date, timestamp, or relative time such as 7 days. |
skipPinnedPosts | boolean | false | Omit posts marked as pinned. |
onlyReels | boolean | false | Keep only posts identified as reels. |
addParentData | boolean | false | Add the source profile, hashtag, or place identity to post results. |
addProfileStatistics | boolean | false | Add statistics from a sample of posts. Profile detail output only. |
statisticsLimit | integer | 12 | Maximum posts in the statistics sample. Range: 1–100. |
searchType | string | hashtag | profile, hashtag, or place. user is an alias for profile. Search mode only. |
searchResults | string | details | details, posts, or reels. Profile search also accepts mentions. |
searchLimit | integer | 10 | Maximum matches to process for each search query. Range: 1–250. |
downloadMedia | boolean | false | Save available post, reel, and carousel media files. |
maxMediaBytes | integer | 26214400 | Maximum bytes per media file. Default: 25 MiB. Range: 1–104,857,600 bytes. |
proxyConfiguration | object | {"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]} | Use Apify Proxy, supply HTTP/HTTPS proxy URLs, or set useApifyProxy to false. |
Filters and statistics
Dates, pinned-post exclusion, reel filters, and downloads apply to post output. They cannot be used with profile, hashtag, or place detail output. Posts with missing dates are excluded when a date filter is set. Relative dates use the start time of the original run, including after a restart. A month means 30 days; a year means 365 days.
Profile statistics use the first available posts, up to statisticsLimit. The result includes sampleSize, averageLikes, averageComments, and engagementRate. Engagement rate is (average likes + average comments) / followers × 100. Missing counts produce null values. These statistics describe the sample; they do not measure reach or impressions.
Proxies and costs
Apify Residential Proxy is enabled by default. Direct cloud requests and the default data-center proxy were redirected to login in the latest checks. A proxy does not guarantee access to Instagram. If you supply several custom proxy URLs, the Actor uses the first one.
A result can require several requests. Use maxItems to limit saved results and maxRequests to limit collection work. Proxy traffic, media transfer, and file storage can add costs.
Output
The default dataset contains one item per profile, post, hashtag, or place. The recordType field identifies its type. Reels and carousels use recordType: "post".
View the dataset in Apify Console or export it as JSON, CSV, Excel, XML, or HTML. JSON keeps nested objects and arrays, such as carousel media and comment previews. See Apify's dataset guide for export options.
Output at a glance
| Group | Main fields |
|---|---|
| Every item | recordType, schemaVersion, id, inputUrl, url, scrapedAt |
| Profile identity and links | username, fullName, biography, externalUrl, bioLinks, profilePicUrl |
| Profile counts and flags | followersCount, followingCount, postsCount, isPrivate, isVerified, isBusinessAccount, categoryName |
| Optional profile data | relatedProfiles, statistics |
| Post content and author | shortCode, caption, timestamp, author, hashtags, mentions, taggedUsers, coauthors |
| Post counts | likesCount, commentsCount, viewCount, playCount, shareCount, reshareCount |
| Post media | mediaType, productType, displayUrl, videoUrl, dimensions, videoDuration, childPosts |
| Available post context | location, musicInfo, firstComment, latestComments, isPinned, isSponsored, isCommentsDisabled, accessibilityCaption |
| Hashtag details | name, postsCount, profilePicUrl, relatedTags, postsPerDay |
| Place details | name, latitude, longitude, address, city, country, website, category, postsCount |
| Added source and files | parentData, downloads |
IDs are strings. Dates use UTC ISO 8601. scrapedAt is the collection time; a post's timestamp is its posting time. Unavailable counts are null. If the full post page omits a count, the Actor keeps an available count from the public feed. A known zero stays 0. Views and plays are separate counts.
This example uses fictional values to show a post item. It is not a live result.
{"schemaVersion": 1,"recordType": "post","id": "1","inputUrl": "https://www.instagram.com/example_creator/","url": "https://www.instagram.com/p/B/","scrapedAt": "2026-09-24T10:00:00.000Z","shortCode": "B","mediaType": "image","productType": "feed","timestamp": "2026-09-23T09:00:00.000Z","caption": "A sample photo #travel","likesCount": 42,"commentsCount": 3,"viewCount": null,"playCount": null,"author": {"id": "10","username": "example_creator","fullName": "Example Creator","profilePicUrl": null,"isVerified": false,"isPrivate": false},"displayUrl": "https://example.com/photo.jpg","videoUrl": null,"dimensions": { "width": 1080, "height": 1080 },"videoDuration": null,"childPosts": [],"hashtags": ["travel"],"mentions": [],"downloads": []}
Carousels, previews, and media files
A carousel counts as one result. Its ordered childPosts array contains each image or video, its URL, dimensions, and available duration. Available comment previews stay inside the post's latestComments array. These previews are not complete comment threads.
With downloadMedia: true, available media files are saved in the run's key-value store. Each downloads entry contains the media ID, file type, source URL, storage key, and download URL. Videos can also include a poster image. Files above maxMediaBytes are rejected. Source media URLs can expire, so save files you need to keep.
Collection behaviour
Limits and duplicate results
For profile posts, the Actor requests more pages until it reaches a selected limit or the end of the available feed. Instagram can refuse a later page. If the first feed request fails, the Actor can use posts from the public profile page when that page contains valid data. This fallback is limited to one page.
Reel feeds and place feeds also use one public page. Profile and reel pages currently supply up to 12 posts; place pages can supply a different count. When this page contains only part of the feed, saved results are partial. Increasing the result limit does not remove that page limit. Filters and duplicate removal can reduce the number of saved results.
Each record type and ID is saved once across all input targets. If the same post appears under two targets, it keeps the first target's inputUrl. It does not count again under the second target. maxItems and maxItemsPerTarget count saved items after filtering.
Access and unsupported features
Only public profiles and media are collected. If the Actor cannot confirm that an account is public, it does not save its profile or posts.
The Actor does not accept account cookies or offer login. It does not collect full comment threads, replies, Stories, standalone audio details, or profiles by numeric ID. Music fields and comment previews can still appear when Instagram supplies them with a post.
Missing or partial results
Saved results remain available when a later request fails. Open Run summary, the OUTPUT record in the run's key-value store, to see the saved count and the reason collection stopped for each target.
Check that the target exists and is public. Check your date filters and result, request, and budget limits. A valid target can return no results. If Instagram temporarily refuses access, try a smaller run later. A retry does not guarantee access.
Restart an interrupted run
Use the same input and storage to resume an interrupted run. Previously saved items are kept and are not saved again. Relative dates use the original start time. Request counts continue from the saved total.
Restarting does not retry targets already marked complete, partial, or failed. Start a new run to retry those targets or change the input.