Instagram Engaged Audience Exporter
Pricing
from $0.60 / 1,000 unique audience users
Instagram Engaged Audience Exporter
Combine public Instagram likers and commenters from multiple posts and Reels into one deduplicated audience dataset with source-post provenance and optional public profile enrichment.
Pricing
from $0.60 / 1,000 unique audience users
Rating
0.0
(0)
Developer
Data Slayer
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
5 hours ago
Last modified
Categories
Share
Turn the public likes and comments across multiple Instagram posts and Reels into one deduplicated audience table, with every user linked back to the interactions and source posts where they were observed.
Watch the demo
YouTube video coming soon.
What this Actor does
Most engagement exports make you choose between likers and commenters, then leave you to merge repeated users yourself. This Actor checks both engagement sources for every accepted post, combines the observed users, removes duplicates across posts, and preserves provenance.
Each dataset row represents one unique public Instagram user. The row can show:
- Whether the user liked, commented, or appeared in an embedded comment reply preview
- Every processed source post where that engagement was observed
- Comment IDs, parent-comment references, text, timestamps, and like counts when publicly available
- Public username, display name, profile URL, profile picture, privacy state, and verification state
- Optional public profile enrichment such as biography, follower count, following count, post count, category, and website
- An explicit enrichment status so missing or unrequested profile details are never ambiguous
The run summary reports how many engagement records were examined, how many unique users were found and saved, how many duplicates were collapsed, which limits were reached, and where coverage was partial.
Use cases
- Campaign audience export: combine the people who reacted to several campaign posts into one reusable audience table.
- Competitor audience research: identify recurring public engagers across a competitor's selected posts.
- Creator and community research: separate commenter-level intent from liker-only engagement while retaining both signals.
- Cross-post overlap analysis: see which users engaged with more than one source post.
- Audience qualification: optionally add current public profile context to a bounded subset of users.
- Voice-of-customer research: retain comment text and comment references alongside the author record.
Quick start
- Add one or more public Instagram post, Reel, or TV URLs.
- Choose per-post and whole-run audience limits.
- Optionally enable public profile enrichment and set its separate lookup limit.
- Start the Actor.
- Open the dataset for one row per unique audience user, and open
OUTPUTfor the coverage summary.
Both likes and comments are checked automatically. There is no likes-versus-comments mode to manage.
Input
| Field | Type | Required | Default | Accepted range | Description |
|---|---|---|---|---|---|
postUrls | array of strings | Yes | — | 1–10 URLs | Public Instagram /p/, /reel/, or /tv/ URLs. Duplicate canonical URLs are removed before collection. |
maxUsersPerPost | integer | No | 250 | 1–1,000 | Maximum unique users attributed to each post after combining likes and comments. |
maxUniqueUsers | integer | No | 1000 | 1–5,000 | Maximum unique users saved across all posts after cross-post deduplication. |
includeProfileDetails | boolean | No | false | — | Add current public profile context to a capped subset of the audience. |
maxProfileLookups | integer | No | 100 | 1–500 | Maximum unique users to enrich when profile details are enabled. |
Example:
{"postUrls": ["https://www.instagram.com/reel/DdRf9lktEb1/","https://www.instagram.com/p/EXAMPLE123/"],"maxUsersPerPost": 500,"maxUniqueUsers": 1000,"includeProfileDetails": true,"maxProfileLookups": 100}
The example URL containing EXAMPLE123 is illustrative and should be replaced with a real public post URL.
Free-plan test limits
Free-plan runs are intended for evaluation and are limited to the first accepted post URL, 100 unique audience users, and five profile enrichments. The Actor exits gracefully with a clear summary when a Free-plan limit is reached. Paid plans can use the full input ceilings above.
Output
The default dataset contains one row per unique audience user. One saved row is the primary billable audience-user unit; repeated observations for the same userKey are merged into that row.
Dataset row fields
| Key | Type | Nullable | Meaning |
|---|---|---|---|
userKey | string | No | Row identity: id:<public user ID> when available, otherwise username:<normalized username>. |
userId | string | Yes | Public user ID, kept as a string to avoid precision loss. |
username | string | Yes | Public username observed at collection time. |
fullName | string | Yes | Public display name. |
profileUrl | string (URL) | Yes | Canonical public profile URL. |
profilePictureUrl | string (URL) | Yes | Public profile-image URL; it can expire. |
isPrivate | boolean | Yes | Publicly reported privacy state. |
isVerified | boolean | Yes | Publicly reported verification state. |
engagementTypes | array of strings | No | Unique values from like, comment, and reply_preview. |
sourcePostCount | integer | No | Number of retained source posts for this user. |
engagementObservationCount | integer | No | Retained like, comment, and reply-preview observations before they are merged into one user row. |
likedPostCount | integer | No | Source posts where a like was observed. |
commentedPostCount | integer | No | Source posts with at least one observed top-level comment by the user. |
replyPreviewPostCount | integer | No | Source posts with at least one embedded reply preview by the user. |
sourcePosts | array of objects | No | Per-post provenance described below. |
enrichmentStatus | string | No | not_requested, enriched, limit_reached, unavailable, or failed. |
profile | object | Yes | Optional public profile enrichment; null unless enrichment succeeds. |
collectedAt | string (date-time) | No | UTC ISO 8601 collection time. |
Each sourcePosts item contains postUrl (URL), postType (post, reel, or tv), shortCode (string), engagementTypes (array), liked (boolean), and comments (array). Each comment contains commentId (string), parentCommentId (string or null), isReplyPreview (boolean), text (string or null), createdAt (UTC date-time or null), likeCount (non-negative integer or null), hashtags (string array), and mentions (string array).
When enrichment succeeds, profile contains biography (string or null), followerCount, followingCount, and postCount (non-negative integers or null), category (string or null), and externalUrl (URL or null).
Illustrative JSON row:
{"userKey": "id:1234567890","userId": "1234567890","username": "example_user","fullName": "Example User","profileUrl": "https://www.instagram.com/example_user/","profilePictureUrl": "https://example.com/profile.jpg","isPrivate": false,"isVerified": false,"engagementTypes": ["like", "comment"],"sourcePostCount": 1,"engagementObservationCount": 2,"likedPostCount": 1,"commentedPostCount": 1,"replyPreviewPostCount": 0,"sourcePosts": [{"postUrl": "https://www.instagram.com/reel/EXAMPLE123/","postType": "reel","shortCode": "EXAMPLE123","engagementTypes": ["like", "comment"],"liked": true,"comments": [{"commentId": "9876543210","parentCommentId": null,"isReplyPreview": false,"text": "Illustrative public comment text","createdAt": "2026-09-20T08:30:00Z","likeCount": 2,"hashtags": [],"mentions": []}]}],"enrichmentStatus": "enriched","profile": {"biography": "Illustrative public biography","followerCount": 12000,"followingCount": 430,"postCount": 215,"category": "Digital creator","externalUrl": "https://example.com"},"collectedAt": "2026-09-20T09:00:00Z"}
This example is illustrative, not an observed customer record. Optional values can be null when they are not publicly available. JSON is the canonical nested output. In CSV exports, arrays and objects are serialized as JSON text so provenance is retained.
Enrichment statuses
not_requested— profile enrichment was disabled.enriched— current public profile details were attached successfully.limit_reached— the audience user was outside the configured enrichment budget.unavailable— the profile was private, removed, restricted, or otherwise unavailable.failed— the profile lookup failed after the bounded attempt; the base audience row remains available.
Coverage summary
The OUTPUT key-value-store record contains status; input, accepted, duplicate, processed, partial, and failed post counts; likes, top-level comments, reply previews, and total observations examined; unique users found and saved; duplicates collapsed; profile outcome counts; limitsReached; per-post summaries in posts; and stable customer-facing problems in errors.
Run status is one of succeeded, empty, partial, failed, charge_limit_reached, or free_plan_limit_reached. Each post reports its URL, type, shortcode, status, examined counts, unique-user counts, duplicates, and a stopReason such as natural_end, per_post_limit, global_limit, free_plan_limit, maximum_charge, content_unavailable, data_temporarily_unavailable, or invalid_data.
Each public error has code, scope, optional postUrl, optional userKey, a functional message, and retryable. Errors describe the actionable outcome and whether retrying may help.
The summary distinguishes a natural end from a cap, an unavailable post, a partial result, or a service failure. Status information is not mixed into the audience dataset and is not billed as an audience result.
Deduplication and provenance
- Stable public user ID is the primary deduplication key.
- Normalized username is used only as a documented fallback when no user ID is present.
- Duplicate users are merged into one row rather than discarded.
- Every retained observation keeps its source post.
- Comment records keep their comment ID and parent-comment reference when available.
- Dataset ordering is deterministic: first observed input post, then higher-intent comment or reply-preview users before liker-only users from the same post.
- Per-post and global caps apply after deduplication; available public users can be lower than requested.
Coverage and limitations
- Only publicly accessible engagement information can be processed.
- A displayed Instagram like or comment total does not guarantee that every underlying user or comment is publicly exposed.
- Likes are collected from the bounded public results available for each post. The Actor does not promise additional liker pages beyond those available results.
- Additional top-level comments are collected only while more public results are available and the configured budgets allow useful records.
- Embedded reply previews can contribute audience users. The initial version does not open every comment thread, so reply coverage is partial.
- Private, deleted, age-restricted, region-restricted, or otherwise unavailable posts can return partial or no data.
- Ordering and public availability can change between runs.
- Profile enrichment is best-effort and does not turn unavailable private profile fields into public data.
Pricing
The pricing model is pay per event. Platform usage during the run is included in the event prices; normal Apify charges can still apply when datasets or other storage are accessed after the run.
| Event | When charged | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|---|
| Actor start | Once when a run starts at the configured 256 MB | $0.002 | $0.002 | $0.002 | $0.002 | $0.002 | $0.002 |
| Source post processed | Once per accepted post when it is successfully checked for at least one engagement type, including an empty, partial, or complete result | $0.0045 | $0.0040 | $0.0035 | $0.0030 | $0.0030 | $0.0030 |
| Unique audience user | Once per unique user row saved to the default dataset | $0.80 / 1,000 | $0.70 / 1,000 | $0.65 / 1,000 | $0.60 / 1,000 | $0.60 / 1,000 | $0.60 / 1,000 |
| Profile enrichment | Once per public profile successfully attached | $2.00 / 1,000 | $1.80 / 1,000 | $1.65 / 1,000 | $1.50 / 1,000 | $1.50 / 1,000 | $1.50 / 1,000 |
Invalid input is rejected before collection. A source-post event is not charged when the post cannot be checked successfully for either engagement type. Failed or unavailable profile lookups are not billed as profile enrichments. Empty status rows are never added to the dataset or billed as audience users.
You can set a maximum run charge in Apify. The Actor is designed to stop gracefully before producing chargeable events beyond that limit and to preserve already saved rows and the run summary.
Example estimate
A Bronze run with one processed post, 250 unique audience users, and no profile enrichment would cost:
$0.002 actor start+ $0.004 source post+ 250 × $0.0007 unique audience user= $0.1810
Actual cost depends on the number of accepted posts, unique saved users, successful profile enrichments, the user's Apify pricing tier, and the maximum-charge limit.
Empty, partial, and failed runs
- Invalid input stops before any collection event.
- If one post fails, completed rows from other posts remain available.
- If one engagement type is unavailable but the other is collected successfully, the post is marked partial and its usable users are retained.
- If neither engagement type can be collected successfully, the post is marked failed and is not charged as processed.
- Profile failures never remove the underlying audience user.
- Every stop reason is written in neutral customer-facing language without exposing internal routing or credentials.
API example
curl -X POST \"https://api.apify.com/v2/acts/data-slayer~instagram-engaged-audience-exporter/runs?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"postUrls": ["https://www.instagram.com/reel/DdRf9lktEb1/"],"maxUsersPerPost": 250,"maxUniqueUsers": 1000,"includeProfileDetails": false,"maxProfileLookups": 100}'
After the run, download the default dataset as JSON, CSV, Excel, XML, or another format supported by Apify, or connect it to schedules, webhooks, Make, Zapier, Google Sheets, or your own API workflow.
Responsible use
Use public data responsibly and follow applicable laws, platform terms, and your organization's policies. Do not use exported audience data for spam, harassment, discrimination, deception, or other harmful activity. Review whether you have an appropriate purpose and legal basis before contacting or profiling people.
FAQ
Does this Actor collect both likers and commenters?
Yes. Both sources are checked for every accepted post. You do not need two separate runs or a source-mode selector.
Does it return every person shown in Instagram's engagement totals?
No. Instagram can expose fewer public records than the displayed total. The coverage summary reports what was examined and whether the result was capped or partial.
Does it collect every comment reply?
No. The initial version includes reply authors already present in embedded reply previews but does not open every comment thread. Reply coverage is explicitly partial.
What happens when the same user engages with several posts?
The user appears once. Their row keeps all observed engagement types and source-post references, so overlap is preserved as information rather than returned as duplicate rows.
Can I enrich every user profile?
You can request enrichment up to the plan and input limits. Successful public profiles are billed separately; unavailable and failed lookups are not billed as enrichments.
Does the Actor expose private profile information?
No. It returns only information publicly available at collection time. Private or restricted fields are not bypassed or guessed.
Do I need an Instagram login or cookies?
No Instagram account, password, cookie, or session token is requested in the Actor input.
Is this an official Instagram tool?
No. This is an independent Actor and is not affiliated with, endorsed by, or sponsored by Instagram or Meta.
When should I use a separate likes or comments Actor?
Use this Actor when you want one deduplicated cross-post audience with combined provenance. A likes-only or comments-only Actor can be more suitable when you need a single-source export rather than an audience join.
Start with one post
Use one representative public post first, inspect the coverage summary, and then increase post, audience, or enrichment limits for the full workflow.
Related actors
More Instagram actors from the same portfolio. Apify only auto-recommends actors in the same category, so here are the rest of ours: