Instagram Posts Scraper With Tagged Accounts [π₯Cheapestπ₯]
Under maintenancePricing
$19.99/month + usage
Instagram Posts Scraper With Tagged Accounts [π₯Cheapestπ₯]
Under maintenanceInstagram Post Scraper lets you extract captions, images, likes, comments, and URLs from Instagram posts by hashtag, user, or location. This Instagram Post Scraper exports data to JSON, CSV, or Excel, making it perfect for research, insights, and social media trend tracking.
Pricing
$19.99/month + usage
Rating
5.0
(3)
Developer
Scraper Engine
Maintained by CommunityActor stats
1
Bookmarked
77
Total users
0
Monthly active users
18 hours ago
Last modified
Categories
Share
Instagram Post Scraper With Tagged Accounts
Instagram post scraper that expands who appears on each post: in-photo tagged accounts, official collab coauthors, and caption @mentions. Full post export (caption, likes, comments, media, timestamp) stays in place. Filter by collabs or a handle allow-list.
This is an Instagram data extractor / Instagram post scraper / Instagram tagged users scraper for profiles, post URLs, reel URLs and tv URLs. No login cookie is required for photo tags, collabs or caption mentions.
Two scraping modes
| Anonymous (default) | Authenticated (optional sessionCookie) | |
|---|---|---|
| Login required | No | Yes - a real Instagram account's session cookie |
| Posts per profile | Capped at that profile's ~12 most recent (Instagram's own anonymous-access limit as of Sept 2026 - its feed-pagination API now answers every anonymous request with 401 require_login) | Full post history, cursor-paginated until resultsLimit is reached or the profile runs out of posts |
| Risk | None | Requests are made as that logged-in account - not sanctioned by Instagram's Terms of Service; the account can be rate-limited, checkpointed or disabled. Use a secondary/throwaway account, never your primary one |
| How to enable | Nothing to do | Paste a sessionid cookie value (or a full copied cookie string) into the Session cookie input |
| Fallback | n/a | If the session is missing, expired, invalid, or Instagram rejects it, the actor automatically falls back to anonymous mode and logs why - the run still completes instead of failing |
All filters (skipPinnedPosts, onlyPostsNewerThan, dataDetailLevel, peopleFilter, taggedUsernames) work identically in both modes - authenticated mode just gives them a larger set of posts to filter.
Optional third layer: extra discovery (enableExtraDiscovery, off by default)
Both modes above are unaffected unless you explicitly turn this on. When you do, after the normal anonymous ~12-post preload (or the authenticated results, if a session cookie was supplied), the actor makes one additional best-effort, still-zero-extra-login attempt to find more posts:
- Search-engine site-search β
site:instagram.com/p/ <username>andsite:instagram.com/reel/ <username>on Google and Bing's public result pages, to pick up individual post URLs those engines happened to crawl and index (sometimes older than the live 12-post window). - Wayback Machine history β up to 5 archived snapshots of the profile page, spread across whatever timespan
web.archive.orghas for that profile, each parsed with the exact same preload parser used for the live page (archive.org stored that day's server-rendered HTML, complete with that day's ~12 most recent posts).
Honest expectations:
- This is opportunistic. Coverage depends entirely on what Google/Bing/Wayback happened to index or archive for that specific profile. Finding zero extra posts is a normal, correct outcome β not a bug.
- It never reduces or replaces the primary ~12-post or authenticated results. New shortcodes are only ever added, deduplicated against what the primary path already found, then run through the exact same per-post fetch, filters (
skipPinnedPosts,onlyPostsNewerThan,peopleFilter,taggedUsernames) and row shape as everything else β same quality, same fields. - It is automatically skipped when the primary path already returned enough shortcodes to satisfy
resultsLimiton its own (most notably: a workingsessionCookiethat already paginated past the limit) β there's nothing left to look for, so the extra requests are simply not made. - It fails silently: if Google/Bing/archive.org are unreachable, rate-limit the request, or return nothing usable, the run completes normally with just the primary results and a log line saying so β it can never fail the run.
- Every row carries a
discoverySourcefield (preload/authenticated/search_engine/wayback) only when this option is enabled, so it's always transparent where a given row came from.
What this actor does
- Instagram profile or post URL input β handles, profile URLs,
/p/,/reel/,/tv/. - Photo-tagged accounts from
usertags(username, id, verified, private, profile URL, tag X/Y when Instagram sends a position). - Official collab partners from
coauthor_producers. - Caption @mentions parsed separately (not mixed into photo tags; emails are not mined as handles).
- Union list
peopleOnPostwithsource=photoTag|coauthor|captionMention. - Filters β all posts (default), photo-tagged only, collabs only, caption-mention only, optional handle allow-list, scan ceiling.
- Optional people table
ig-people-<runId>β one uncharged child row per person (type,isChild,parentId). - Instagram post export fields β caption, hashtags, mentions, likes, comments, image renditions, video URL, carousel children.
Input example
{"username": ["https://www.instagram.com/nike/"],"resultsLimit": 12,"dataDetailLevel": "basicData","peopleFilter": "all","taggedUsernames": [],"emitPeopleDataset": true}
A base-shaped payload still works:
{"username": ["nike"],"resultsLimit": 5,"skipPinnedPosts": false,"dataDetailLevel": "detailedData"}
Input fields
| Field | Type | Default | What it does |
|---|---|---|---|
username | array (required) | nike profile URL | Usernames, profile URLs, post / reel / tv URLs |
resultsLimit | integer | 10 | Posts saved per profile |
onlyPostsNewerThan | date | empty | Absolute or relative cutoff |
skipPinnedPosts | boolean | false | Drop pins on this profile's grid |
dataDetailLevel | enum | detailedData | Extra post-page fields vs feed-only |
peopleFilter | enum | all | all / photoTagged / collabs / captionMention |
taggedUsernames | array | [] | Keep posts that include these handles as tag, coauthor or caption mention |
maxPostsToScan | integer | 300 | Scan budget when a people filter or allow-list is on |
emitPeopleDataset | boolean | true | Extra uncharged people table |
sessionCookie | string (secret) | empty | Optional Instagram sessionid (or full cookie string) for authenticated mode - see table above. Empty = anonymous mode |
enableExtraDiscovery | boolean | false | Optional, opportunistic extra-posts layer (search-engine + Wayback Machine) on top of the primary result - see the section above. Off = zero change to existing behavior |
proxyConfiguration | proxy | Apify RESIDENTIAL | Declared input (was hidden on the original) |
Output fields
Always on the post row (empty list / 0 / false when nobody is tagged):
| Field | Meaning |
|---|---|
taggedUsers | Photo tags with identity + tagX/tagY when present |
coauthorProducers | Official collab partners |
captionMentions | Handles parsed from the caption |
taggedUserCount / coauthorCount / captionMentionCount / peopleOnPostCount | Counts |
isCollab | True when coauthorCount > 0 |
peopleOnPost | Deduped union with a source label |
Base post fields remain: id, type, shortCode, caption, hashtags, mentions, url, commentsCount, likesCount, timestamp, displayUrl, images, childPosts, ownerUsername, ownerFullName, ownerId, isCommentsDisabled, plus detailed/video keys when those modes apply.
discoverySource (preload / authenticated / search_engine / wayback) is present on every profile row only when enableExtraDiscovery is turned on β it is absent otherwise, so the default output shape is completely unchanged.
Child people rows (optional dataset): type (taggedUser / coauthor / captionMention), isChild, parentId, parentUrl, username, profileUrl, tagX, tagY.
Coverage is creator-dependent. Fashion and brand collab accounts are dense; a news account can have almost no photo tags. Default peopleFilter=all so that does not empty the dataset.
Use cases
- Instagram tagged users export for UGC and rights tracking
- Instagram collab / coauthor audit for a brand profile
- Instagram caption mention scrape for campaign handles
- Instagram post scraper with a people table for spreadsheets
- Filter an Instagram profile scrape down to posts that tag a partner
Notes
- Photo tags, collabs and caption mentions come from the profile feed and work in both modes.
- Anonymous mode needs no login at all. Authenticated mode (optional
sessionCookieinput) makes requests as the logged-in account that cookie belongs to - see the mode comparison table above for the tradeoff before using it. peopleFilterother thanallcan legitimately return zero rows on low-tag accounts β raisemaxPostsToScanor leave the filter onall.images[]is filled from Instagram's own rendition list. Comments on detailed runs use the livecomments_connectioncontainer.- Monetization event id is
row_result(one charge per saved post). People-table rows are not charged. enableExtraDiscovery(default off) is a purely additive, best-effort layer - see the dedicated section above. It never removes/replaces primary results, may legitimately find zero extra posts, and is skipped automatically once the primary path already has enough posts to satisfyresultsLimit.
