πŸ“Έ Instagram Tagged Posts Scraper Plus avatar

πŸ“Έ Instagram Tagged Posts Scraper Plus

Pricing

$14.99/month + usage

Go to Apify Store
πŸ“Έ Instagram Tagged Posts Scraper Plus

πŸ“Έ Instagram Tagged Posts Scraper Plus

Extract all tagged posts from any public Instagram profile using the Instagram Tagged Posts Scraper. This Apify actor gathers tagged photos, captions, usernames, post URLs, and engagement statsβ€”perfect for brand monitoring, influencer tracking, and content analysis.

Pricing

$14.99/month + usage

Rating

5.0

(1)

Developer

Scraper Engine

Scraper Engine

Maintained by Community

Actor stats

1

Bookmarked

49

Total users

0

Monthly active users

5 days ago

Last modified

Share

Instagram Tagged Posts Scraper β€” Tags, Captions, Media and Engagement

Instagram Tagged Posts Scraper extracts every post an Instagram account is tagged in β€” the profile's "Tagged" tab β€” and returns takenAt timestamps, the full array of taggedUsers with photo coordinates, likeCount/commentCount/engagementRate, image and video URLs, location, hashtags and mentions as structured JSON. No Instagram login or session cookie is required. Run it directly on the Apify platform with any public username or a list of post URLs.

What is Instagram Tagged Posts Scraper?

Instagram Tagged Posts Scraper is an Apify Actor that pages through a public Instagram profile's Tagged tab (or resolves specific post URLs/shortcodes) and normalizes each post into one dataset row β€” timestamps, tagged users, engagement counts, media assets, location, hashtags and derived metrics. No Instagram account, password, or session cookie is required to run it; every field it returns is visible to any logged-out visitor of the public Tagged tab. It's built for social-media analysts, influencer-marketing and brand-monitoring teams, and developers feeding Instagram tag data into dashboards, LLM pipelines, or AI agents.

What Instagram tagged-post data is publicly available to scrape?

Instagram exposes a public, logged-out "Tagged" tab for every non-private profile, and a public post page for every shortcode β€” both readable without an account. What sits behind that wall is anything tied to a private account or a logged-in session.

Data CategoryPublicly AvailableRequires Login
Post caption, timestamp, shortcodeYesβ€”
Tagged users + tag coordinatesYesβ€”
Like count, comment countYesβ€”
Image/video URLs, carousel mediaYesβ€”
Location name and coordinatesYesβ€”
First page of top-level commentsYesβ€”
Video/reel view and play countsNo β€” hidden from logged-out requestsYes
Licensed-music/audio track metadataNo β€” hidden from logged-out requestsYes
Private-account tagged postsNoYes (and only with approved access)

Instagram Tagged Posts Scraper only returns publicly visible data β€” what any visitor sees. Nothing behind a login wall.

What data can I extract with Instagram Tagged Posts Scraper?

Each dataset row is either a post row (type: "post") or, when comments are enabled, a child comment row (type: "comment", isChild: true). The Actor's source (src/main.py, build_post_row()) writes the following fields per post, well beyond the 22 columns shown in the default dataset view.

Identity & descriptive fields

Field NameDescription
id / pkInstagram's internal media id / numeric primary key.
shortcodeThe post's short code (e.g. CxAbC12dEfG).
postUrlFull instagram.com/p/<shortcode>/ URL.
takenAtPost publish time, ISO-8601 UTC.
mediaTypeimage, video, carousel, or reel.
ownerUsername / ownerThe post's author username, plus a nested object (id, username, full_name, is_verified, is_private, profile_pic_url).
taggedAccount / profileThe username that was tagged (the account you searched for), plus its profile object (followers, following, postsCount, biography, externalUrl, isVerified, isPrivate, isBusiness, category, profilePicUrl).
taggedUsers / taggedUsersCountArray of every user tagged in the media, each with username, id, full_name, is_verified, profile_pic_url, and tag position x/y (0–1 coordinates on the image).
caption / captionCreatedAt / captionLength / captionWordCountFull caption text, its own timestamp, and length metrics.
hashtags / mentionsArrays parsed from the caption text.
locationName / locationTagged place name, plus a nested object (id, name, lat, lng, address, city).
accessibilityCaptionInstagram's auto-generated alt text, when present.

Quantitative & media fields

Field NameDescription
likeCount / commentCountRaw engagement counts.
engagementTotallikeCount + commentCount.
engagementRateengagementTotal divided by the tagged account's follower count (from profile.followers), as a percentage β€” null when follower count isn't resolvable (e.g. direct post-URL mode).
velocityPerHourengagementTotal divided by hours since takenAt.
commentsToLikesRatiocommentCount / likeCount.
isVideo / isCarousel / isReelBooleans derived from mediaType.
displayUrl / imageVariantsHighest-resolution image URL plus every available resolution/URL variant.
videoUrl / videoVariants / videoDuration / hasAudioVideo/reel asset URL, resolution variants, duration in seconds, and audio-present flag β€” only populated when includeVideoUrls is on.
carouselMedia / carouselMediaCountPer-slide array (each with its own displayUrl, videoUrl, dimensions and tagged users) for carousel posts.
width / heightOriginal media pixel dimensions.
isPaidPartnershipBoolean flag from Instagram's branded-content data.
sentiment / emotion / language / topics / spamScorePresent only when aiEnhancement is enabled β€” LLM-derived classification of the caption (or comment text).
scrapedAtUTC timestamp the row was collected.

Comment child rows (when includeComments is on) carry type: "comment", isChild: true, parentId (the parent post's pk), text, takenAt, commentLikeCount, ownerUsername, authorId and authorIsVerified.

Add-on: Need additional Instagram data?

If you also need the tagged account's own profile stats, pair this with Instagram Followers & Following β€” Mutuals & Fans for follower/following set analysis, Instagram B2B Lead & Contact Scraper for contact extraction, or Instagram Reel Virality Intelligence Scraper if your focus is reel performance rather than tags.

Why not build this yourself?

Instagram has no official public API for reading another account's Tagged tab, tagged-post comments, or tag coordinates β€” the Instagram Graph API only exposes data for accounts you manage. Building this yourself means reverse-engineering Instagram's private GraphQL endpoints, maintaining Chrome TLS fingerprint impersonation as Instagram rotates its anti-bot checks, rotating residential proxies to avoid IP blocks, and keeping the doc_id and query shape in sync every time Instagram ships a web client update. Instagram Tagged Posts Scraper already does all of that and exposes a stable JSON schema, so you skip the scraper-maintenance burden and the proxy bill that comes with running it at scale.

How to use Instagram Tagged Posts Scraper

Instagram Tagged Posts Scraper runs on the Apify platform β€” no separate signup or API key is needed to start a run.

  1. Open Instagram Tagged Posts Scraper on the Apify Store and click Try for free (or Start) to open the run console.
  2. Provide input: add one or more entries to usernames (plain usernames, @handles, or profile URLs) and/or postUrls for specific posts. Neither field is required by the schema, but you must supply at least one β€” the Actor logs an error and exits with zero rows if both are empty.
  3. Set optional filters worth tuning for your use case: maxItems per account, onlyPostsNewerThan, keywords/excludeKeywords, minLikes/minComments, and mediaType.
  4. Click Start to launch the run.
  5. Download results in JSON, JSONL, CSV, Excel, HTML table, or XML from the run's Storage β†’ Dataset tab, or pull them via the Apify API.

How to scale to bulk tagged-post extraction

usernames and postUrls both accept arrays, so a single run can process many accounts or many specific posts in one go β€” the Actor loops over each username sequentially, pausing briefly between accounts, and appends every account's postUrls at the end. There's no separate "bulk mode" toggle; just list every account or URL you need in the corresponding array field.

What can you do with Instagram tagged-post data?

  • A brand-monitoring analyst tracking user-generated content uses taggedAccount, taggedUsers, and caption to identify who is tagging the brand and in what context.
  • An influencer-marketing manager vetting creators uses engagementRate and velocityPerHour to compare how fast tagged posts gain traction relative to the account's follower base.
  • A social-listening tool ingests hashtags and mentions alongside sentiment (when aiEnhancement is on) to surface emerging campaign narratives.
  • A researcher studying paid partnerships filters on isPaidPartnership and cross-references ownerUsername to map sponsored-content networks.
  • An AI engineer feeds caption, taggedUsers, and commentCount into a RAG pipeline or agent tool to answer natural-language questions about a brand's tagged-post history without writing a single Instagram parser.

How does Instagram Tagged Posts Scraper handle rate limits and blocking?

The Actor honors the proxy configuration you provide in proxyConfiguration and defaults to Apify Residential proxies when none is set, since Instagram blocks datacenter IPs. It uses impit with Chrome TLS/browser impersonation to pass Instagram's anti-bot fingerprinting on every request, and rotates its User-Agent header on retries. Requests that receive a 429 response are retried with exponential backoff (up to 3 attempts) plus randomized jitter between page fetches; a failed enrichment fetch for a single post falls back to emitting a slim row from the tagged-feed data (without takenAt/taggedUsers) instead of dropping the post. This does not solve CAPTCHA challenges β€” it works by presenting a realistic, rotated browser fingerprint over residential IPs.

Input

Configure Instagram Tagged Posts Scraper with the fields below, read directly from .actor/actor.json. None are required β€” you can also start a run with only usernames filled in and everything else left at its default.

ParameterRequiredTypeDescriptionExample Value
usernamesNoarrayInstagram usernames, @handles, or profile URLs whose tagged posts to scrape.["cristiano", "@leomessi"]
postUrlsNoarraySpecific post URLs or shortcodes to scrape directly, instead of or alongside a profile's tagged tab.["https://www.instagram.com/p/CxAbC12dEfG/"]
maxItemsNointegerMax tagged posts to collect per account (top-level posts only, not comments). 0 = all available. Default 20.50
onlyPostsNewerThanNostringAbsolute (2024-01-01) or relative (3 months, 30 days) date filter; pagination stops early once older posts are reached."3 months"
keywordsNoarrayKeep only posts whose caption contains at least one of these words/phrases (case-insensitive).["giveaway"]
excludeKeywordsNoarrayDrop posts whose caption contains any of these words/phrases (case-insensitive).["ad"]
minLikesNointegerKeep only posts with at least this many likes. Default 0.1000
minCommentsNointegerKeep only posts with at least this many comments. Default 0.10
mediaTypeNostring (enum)Keep only posts of this type: any, image, video, carousel, reel. Default "any"."reel"
includeCommentsNobooleanAlso fetch top-level comments per post as child rows (type="comment", mirrored to a comments-<runId> dataset). Default false.true
maxCommentsPerPostNointegerCap on comments fetched per post when includeComments is on. Default 20.10
includeVideoUrlsNobooleanInclude direct video URLs and variants for video/reel posts. Default true.true
downloadMediaNobooleanDownload each post's best image (and video) into the run's key-value store; adds storage keys to the row. Default false.false
aiEnhancementNobooleanAnalyze captions (and comments, if included) with an LLM for sentiment, emotion, language, topics and spam score. Requires an API key or provider env var. Default false.false
aiModelNostring (enum)Model/provider for AI enrichment; provider is auto-detected from the name prefix (claude-*, gpt-*/o1/o3, gemini-*, grok-*, deepseek-*, sonar*, mistral-*). Default "claude-haiku-4-5"."claude-haiku-4-5"
aiApiKeyNostring (secret)API key for the selected AI provider. If omitted, the Actor reads the matching env var (e.g. ANTHROPIC_API_KEY, OPENAI_API_KEY).β€”
proxyConfigurationNoobjectProxy settings. Defaults to Apify Residential proxies ({"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}); your selection is honored if provided.See example input below

Example input

{
"usernames": ["cristiano", "@leomessi"],
"postUrls": ["https://www.instagram.com/p/CxAbC12dEfG/"],
"maxItems": 50,
"onlyPostsNewerThan": "3 months",
"keywords": ["giveaway"],
"excludeKeywords": ["ad"],
"minLikes": 1000,
"minComments": 10,
"mediaType": "any",
"includeComments": true,
"maxCommentsPerPost": 10,
"includeVideoUrls": true,
"downloadMedia": false,
"aiEnhancement": false,
"aiModel": "claude-haiku-4-5",
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Output

Results are typed, normalized JSON with a consistent schema across runs β€” one row per tagged post, plus an optional child row per comment. Export any run's dataset as JSON, JSONL, CSV, Excel, HTML table, or XML from the Storage tab, or fetch it through the Apify API.

Example output

{
"type": "post",
"isChild": false,
"parentId": null,
"id": "3482602799815487662_50985923682",
"pk": "3482602799815487662",
"shortcode": "CxAbC12dEfG",
"postUrl": "https://www.instagram.com/p/CxAbC12dEfG/",
"takenAt": "2026-05-12T18:03:21Z",
"mediaType": "carousel",
"isVideo": false,
"isCarousel": true,
"isReel": false,
"ownerUsername": "some_brand",
"owner": {
"id": "50985923682",
"username": "some_brand",
"full_name": "Some Brand",
"is_verified": false,
"is_private": false,
"profile_pic_url": "https://scontent.cdninstagram.com/..."
},
"taggedAccount": "cristiano",
"profile": {
"id": "173560420",
"username": "cristiano",
"followers": 650000000,
"following": 570,
"postsCount": 3800,
"biography": "...",
"isVerified": true,
"isPrivate": false,
"isBusiness": true,
"category": "Athlete"
},
"taggedUsers": [
{"username": "cristiano", "id": "173560420", "full_name": "Cristiano Ronaldo", "is_verified": true, "x": 0.51, "y": 0.42}
],
"taggedUsersCount": 1,
"caption": "Great night with @cristiano #football",
"captionLength": 38,
"captionWordCount": 5,
"hashtags": ["football"],
"mentions": ["cristiano"],
"likeCount": 128034,
"commentCount": 842,
"engagementTotal": 128876,
"engagementRate": 0.0198,
"velocityPerHour": 536.2,
"commentsToLikesRatio": 0.0066,
"displayUrl": "https://scontent.cdninstagram.com/...",
"videoUrl": null,
"carouselMediaCount": 3,
"carouselMedia": [
{"id": "...", "mediaType": "image", "displayUrl": "https://scontent.cdninstagram.com/...", "width": 1080, "height": 1350}
],
"locationName": "Madrid, Spain",
"location": {"id": "213470398", "name": "Madrid, Spain", "lat": 40.4168, "lng": -3.7038},
"isPaidPartnership": false,
"scrapedAt": "2026-07-26T09:00:00Z"
}

How does it work?

Instagram Tagged Posts Scraper first loads the target profile's page to collect anonymous request tokens (an app id, CSRF token, and Facebook fb_dtsg/lsd tokens), then calls Instagram's web_profile_info endpoint to resolve the account's numeric user id and public profile details, and finally pages the Tagged tab's GraphQL feed using cursor-based pagination. Every request goes through impit with Chrome TLS/browser impersonation over your configured proxy, so requests look like ordinary logged-out browser traffic rather than an automated client. Only data genuinely present in Instagram's response is emitted β€” unavailable fields are returned as null rather than faked β€” and the output schema stays fixed regardless of how Instagram's own web UI changes.

Integrations

Instagram Tagged Posts Scraper works with the tools your team already uses for scraping, automation, and AI workflows.

Calling Instagram Tagged Posts Scraper programmatically

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"usernames": ["cristiano"],
"maxItems": 50,
}
run = client.actor("Scraper-Engine/instagram-tagged-posts-scraper-plus").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Works in Go, Ruby, Node.js, cURL β€” any language that can make an HTTP request.

No-code tools (n8n, Make, LangChain)

In n8n, use the HTTP Request node (or the Apify node) pointed at the actor's run endpoint with your input JSON in the body, then feed the returned dataset items into downstream nodes. In Make, the Apify app's "Run an Actor" module accepts the same input schema and can pass results straight into a scenario. In LangChain or a custom agent, wrap the Apify API call as a tool so an agent can request tagged-post data on demand and reason over the returned JSON directly.

Scraping publicly available data, such as public Instagram posts and profile information, is generally permissible under U.S. case law such as hiQ Labs v. LinkedIn. Instagram Tagged Posts Scraper returns only publicly available data β€” post captions, tagged users, engagement counts, and media that are visible to any logged-out visitor of a public Tagged tab. Because tagged posts and usernames can constitute personal data under regulations like GDPR and CCPA, you are responsible for establishing a lawful basis before storing, processing, or reusing this data, particularly for EU or California residents. Consult legal counsel if your use case involves bulk storage of personal data.

Frequently asked questions

What Instagram tagged-post fields does Instagram Tagged Posts Scraper return?

The top fields are takenAt, taggedUsers, caption, likeCount, and engagementRate β€” see the full data fields tables above for the complete list, including media, location and analytics fields.

Does Instagram Tagged Posts Scraper require an Instagram account or login?

No. The Actor authenticates each request with anonymous tokens pulled from Instagram's public pages and never uses a username, password, or session cookie.

How many tagged posts can I extract in one run?

maxItems caps posts per account at up to 10000, or set it to 0 to collect every available tagged post for that account; the actual number returned depends on how many posts Instagram's Tagged tab has and how many pass your filters (minLikes, minComments, mediaType, keyword filters, and onlyPostsNewerThan).

What happens if an account is private or a post can't be found?

If the target account is private or its user id can't be resolved, the Actor logs a warning and skips that username entirely β€” private accounts return no tagged feed. If an individual post URL can't be parsed into a shortcode, or the post page fails to load (private, removed, or blocked), the Actor logs a warning and moves to the next entry rather than failing the run. If Instagram's enrichment fetch for a specific post fails mid-run, the Actor falls back to a slimmer row built from the tagged-feed data instead of dropping the post.

Can I scrape multiple Instagram accounts or posts at once?

Yes. Both usernames and postUrls accept arrays, so one run can process any number of accounts and specific post URLs together β€” no separate run per account is required.

Does Instagram Tagged Posts Scraper work with Claude, ChatGPT, and other AI agent tools?

It's callable as an HTTP endpoint via the Apify API by any agent framework that can issue requests β€” LangChain, custom agent loops, or direct API calls. It also has a built-in aiEnhancement option that runs LLM classification (sentiment, emotion, language, topics, spam score) on captions and comments during the scrape itself, using Anthropic, OpenAI, Google Gemini, xAI, DeepSeek, Perplexity, or Mistral models.

How does Instagram Tagged Posts Scraper compare to other Instagram tagged-post scrapers?

As observed on the Apify Store on 2026-07-26, easyapi's Instagram Tagged Posts Scraper returns raw, unnormalized Instagram API fields (e.g. pk, media_type as a numeric code) rather than computed engagement metrics. powerful_bachelor's Instagram Tagged & Mentions Posts Scraper documents only two input fields (username and result count) and does not expose caption keyword or engagement-threshold filtering in its listing. Instagram Tagged Posts Scraper instead ships normalized fields (mediaType as a readable label, engagementRate, velocityPerHour, commentsToLikesRatio), plus built-in date/keyword/engagement filters, optional comment extraction, and optional multi-provider AI enrichment.

Does Instagram Tagged Posts Scraper return data in a format LLMs can use directly?

Yes. Every field is typed, normalized JSON with consistent field names across runs β€” no HTML parsing or CSS selectors required. Pass rows directly to an LLM prompt, index them into a vector store, or hand them to an agent tool as-is.

What happens when Instagram changes its layout or anti-bot system?

The scraper is actively maintained and the output schema is designed to stay stable across Instagram's front-end changes. No specific update turnaround time is published or guaranteed.

Can I use Instagram Tagged Posts Scraper without managing proxies or browser infrastructure?

Yes. The Actor handles TLS/browser fingerprint impersonation and proxy routing internally β€” if you don't supply proxyConfiguration, it defaults to Apify Residential proxies automatically, so you don't need to run or maintain your own headless browser or proxy pool.

Which Instagram tagged-post fields work best for AI training data and RAG indexing?

For RAG indexing, use the high-information text fields: caption, accessibilityCaption, and locationName. For structured training data, the most consistently populated fields across records are takenAt, likeCount, commentCount, engagementRate, and mediaType β€” all typed primitives (strings, numbers, booleans) rather than free text.

Scraper NameWhat it extracts
Instagram Followers & Following β€” Mutuals & FansFollower/following lists and set-relationship analytics for a profile.
Instagram B2B Lead & Contact ScraperBusiness contact details from Instagram profiles.
Instagram Reel Virality Intelligence ScraperReel performance and virality metrics.

Your feedback

Found a bug or missing a field? Let us know through the Actor's Issues tab in Apify Console so we can take a look and keep this scraper's output schema accurate.