Instagram Posts Scraper for Public Profiles
Pricing
$1.00 / 1,000 instagram posts
Instagram Posts Scraper for Public Profiles
Scrape Instagram posts, Reels, videos, and carousels from public profiles in bulk. No login required. Pay only $1 per 1,000 unique posts delivered.
Pricing
$1.00 / 1,000 instagram posts
Rating
0.0
(0)
Developer
DataScraperES
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Collect posts, Reels, videos, and carousels from one or many public Instagram profiles. Enter usernames or profile URLs and receive clean, structured records ready for analysis, reporting, or automation. No Instagram login or account cookies are required.
What this Actor does
- Scrapes public profile timelines in single-profile or bulk runs.
- Returns images, videos, Reels, and carousel posts.
- Extracts captions, hashtags, mentions, timestamps, media links, engagement counts, owners, collaborators, tagged users, and locations when publicly available.
- Accepts up to 10,000 input profiles and returns up to 100,000 unique posts per run.
- Removes duplicate profiles and posts automatically.
- Charges only for unique posts successfully added to the default dataset.
- Saves results in an Apify dataset for download and downstream analysis.
Common use cases
- Monitor public content published by brands, creators, or competitors.
- Compare posting frequency, formats, captions, and public engagement.
- Build datasets for social media research and trend analysis.
- Track collaborations, tagged accounts, hashtags, and mentions.
- Feed public post data into dashboards, spreadsheets, databases, or AI workflows.
Pricing
This Actor uses pay-per-event pricing. A charge is created only when a unique post is successfully delivered.
| Delivered posts | Result charge |
|---|---|
| 100 | $0.10 |
| 1,000 | $1.00 |
| 5,000 | $5.00 |
| 10,000 | $10.00 |
The post-result event costs $0.001 per post, equivalent to $1 per 1,000 unique posts.
You are not charged for:
- duplicate input profiles;
- the same post encountered more than once in a run;
- private, invalid, unavailable, or failed profiles;
- Reels excluded by your input;
- results that are not written to the default dataset.
Use resultsLimit to set the maximum number of paid results. You can also configure a maximum run charge in Apify for an additional spending limit.
Quick start
- Open the Actor in Apify Console.
- Add one or more public Instagram usernames or profile URLs to Instagram profiles.
- Set the maximum total posts and maximum posts per profile.
- Choose whether to include Reels.
- Click Start.
- Open the Output or Dataset tab to preview and download the results.
Input
| Field | Type | Required | Default | Allowed values | Description |
|---|---|---|---|---|---|
profiles | array of strings | Yes | — | 1–10,000 items | Instagram usernames, @handles, or complete public profile URLs. Duplicate forms of the same profile are processed once. |
resultsLimit | integer | No | 1000 | 1–100,000 | Maximum unique posts across the entire run. This is the main result and spending limit. |
maxPostsPerProfile | integer | No | 100 | 1–10,000 | Maximum unique posts attributed to each profile. |
includeReels | boolean | No | true | true or false | Include Reels found in public profile timelines. |
Accepted profile formats:
nasa@nasahttps://www.instagram.com/nasa/
All three values identify the same profile and are deduplicated within the run.
Single-profile example
{"profiles": ["nasa"],"resultsLimit": 50,"maxPostsPerProfile": 50}
Bulk example
{"profiles": ["nasa","@instagram","https://www.instagram.com/nike/"],"resultsLimit": 5000,"maxPostsPerProfile": 500,"includeReels": true}
Exclude Reels
{"profiles": ["nasa"],"resultsLimit": 100,"maxPostsPerProfile": 100,"includeReels": false}
How limits are applied
resultsLimit applies to the whole run, while maxPostsPerProfile applies separately to every profile.
For example, with three profiles, resultsLimit: 500 and maxPostsPerProfile: 250:
- no profile can contribute more than 250 posts;
- the combined dataset cannot contain more than 500 posts;
- the Actor stops when the global limit is reached, even if profiles remain;
- the maximum post-result charge is $0.50.
The dataset can contain fewer rows than requested when a profile has fewer public posts, a profile is private or unavailable, Reels are excluded, duplicates are removed, or the Apify run charge limit is reached.
Output
Each row in the default dataset represents one unique, successfully delivered post. Results can be previewed in Apify Console or exported in formats such as JSON, CSV, Excel, and XML.
Output example
{"schemaVersion": 1,"id": "3945683423788482956","shortCode": "DbB4is3D0GM","url": "https://www.instagram.com/reel/DbB4is3D0GM/","type": "reel","productType": "clips","caption": "Example public caption #Space @nasa","hashtags": ["Space"],"mentions": ["nasa"],"timestamp": "2026-07-20T18:00:00+00:00","displayUrl": "https://...","videoUrl": "https://...","width": 1080,"height": 1920,"likesCount": 1000,"commentsCount": 25,"videoViewsCount": 5000,"videoPlaysCount": 5100,"videoDurationSeconds": 18.4,"hasAudio": true,"isPaidPartnership": false,"isPinned": false,"accessibilityCaption": "Photo by NASA on July 20, 2026.","owner": {"id": "528817151","username": "nasa","fullName": "NASA","isVerified": true,"isPrivate": false,"profilePicUrl": "https://..."},"location": null,"coauthors": [],"taggedUsers": [],"carousel": [],"sourceUsername": "nasa","sourceProfileUrl": "https://www.instagram.com/nasa/","scrapedAt": "2026-07-22T13:45:00+00:00"}
Output fields
| Field | Type | Description |
|---|---|---|
schemaVersion | integer | Version of the output record structure. |
id | string | Stable Instagram media ID used to identify and deduplicate the post. |
shortCode | string | Instagram shortcode contained in the post URL. |
url | string | Direct public URL of the post or Reel. |
type | string | Normalized media type: image, video, carousel, or reel. |
productType | string or null | Instagram product type when publicly provided, for example feed or clips. |
caption | string or null | Public caption text. |
hashtags | array | Unique hashtags extracted from the caption, without #. |
mentions | array | Unique usernames mentioned in the caption, without @. |
timestamp | string or null | Publication time in ISO 8601 format. |
displayUrl | string or null | Best available image or thumbnail URL. |
videoUrl | string or null | Best available public video URL. |
width, height | integer or null | Original media dimensions when available. |
likesCount | integer or null | Public like count. |
commentsCount | integer or null | Public comment count. Comments themselves are not scraped. |
videoViewsCount | integer or null | Public video view count when available. |
videoPlaysCount | integer or null | Public video play count when available. |
videoDurationSeconds | number or null | Video or Reel duration in seconds. |
hasAudio | boolean | Whether Instagram marks the media as having audio. |
isPaidPartnership | boolean | Whether the post is marked as a paid partnership. |
isPinned | boolean | Whether the post is marked as pinned in the returned profile timeline. |
accessibilityCaption | string or null | Public accessibility or alt-text description. |
owner | object or null | Post owner's ID, username, full name, verification status, and profile image when available. |
location | object or null | Public location attached to the post when available. |
coauthors | array | Public coauthor account records. |
taggedUsers | array | Publicly tagged users and tag positions when available. |
carousel | array | Individual image or video items belonging to a carousel. Empty for non-carousel posts. |
sourceUsername | string | Input profile from whose timeline the post was collected. |
sourceProfileUrl | string | Normalized URL of the source profile. |
scrapedAt | string | Collection time in ISO 8601 format. |
Instagram may hide or omit some public fields. When a value is unavailable, nullable fields are returned as null and list fields as empty arrays. Media links are hosted by Instagram and can expire, so download required files soon after the run.
Run summary and profile report
The Output tab includes two additional JSON records that are not charged as post results:
SUMMARYshows delivered and billable posts, input limits, duplicate and filtered counts, profile status totals, spending-limit status, duration, and completion time.PROFILE_REPORTshows the outcome for each submitted value, including completed, duplicate, invalid, private, unavailable, or failed profiles and the number of posts delivered for each one.
Use PROFILE_REPORT to identify individual profiles that need attention without searching the full run log.
Reliability and expected behavior
- Temporary profile failures are retried automatically using the Actor's internal retry policy.
- A failed or unavailable profile does not discard successful results from other profiles.
- Duplicate usernames, URLs, pages, and posts are removed within the run.
- If the same run resumes after an interruption, existing dataset records are recognized to avoid duplicate output and duplicate result charges.
- The Actor respects the total result limit, per-profile limit, and available Apify run-charge budget.
Limitations
- Only public Instagram profiles are supported. Private profiles do not return posts.
- This Actor accepts profile usernames and profile URLs, not individual post URLs.
- Reels are collected only when they appear in the returned public profile timeline.
- Public counts and metadata can be hidden by an account or omitted by Instagram and may be
null. - Image and video URLs can expire because Instagram controls the source files.
- This Actor does not scrape comments, followers, Stories, highlights, hashtag feeds, search results, or private data.
- Instagram can change or temporarily restrict its public pages, so the number of available results can vary between runs.
FAQ
Do I need an Instagram account or login?
No. The Actor collects data exposed on public profile pages and does not require Instagram credentials or cookies.
Can it scrape private profiles?
No. Only public profiles are supported. A private, invalid, or unavailable profile is reported without a post-result charge.
Why did I receive fewer posts than requested?
The profile may have fewer available public posts, some items may be duplicates, Reels may be excluded, Instagram may temporarily omit pages, or the global result or run-charge limit may have been reached. Check PROFILE_REPORT and SUMMARY for the specific outcome.
Are duplicate inputs charged twice?
No. Equivalent usernames, @handles, and profile URLs are processed once. A post is also delivered and charged only once per run, even if it appears under multiple input profiles.
How can I control the maximum cost?
Set resultsLimit to the maximum paid posts you want. At $0.001 per result, resultsLimit: 1000 allows at most $1.00 in post-result charges. You can also set a maximum run charge in Apify.
Can I exclude Reels?
Yes. Set includeReels to false. Images, regular videos, and carousels remain eligible for output.
Why are some fields null?
The Actor returns only data publicly provided by Instagram. Counts, locations, accessibility text, media details, or owner fields can be absent or hidden for individual posts.
Are media files stored permanently?
No. displayUrl and videoUrl point to Instagram-hosted files and can expire. Download the media promptly if you need permanent storage.
Does the Actor scrape comments?
No. commentsCount is the public number of comments when available; comment text and commenter details are outside this Actor's scope.
Responsible use
This Actor extracts information publicly visible on Instagram. Results can still contain personal data. Make sure your collection and use have a lawful purpose and comply with applicable laws, privacy requirements, and platform terms. This Actor is not affiliated with Instagram or Meta.
Support
If a run does not behave as expected, create an issue from the Actor page and include:
- the Actor run ID;
- the public profile input that reproduces the problem;
- the approximate run time;
- the relevant
PROFILE_REPORTstatus orSUMMARYvalues; - the expected result and the result you received.
Do not include Instagram credentials, Apify API tokens, or other secrets in a support request.