Instagram Tagged Posts & Co-Tagged Profiles Scraper avatar

Instagram Tagged Posts & Co-Tagged Profiles Scraper

Pricing

Pay per usage

Go to Apify Store
Instagram Tagged Posts & Co-Tagged Profiles Scraper

Instagram Tagged Posts & Co-Tagged Profiles Scraper

The Instagram Tagged Posts Scraper collects posts tagged with specific hashtags or mentions. It extracts captions, media URLs, likes, comments, and timestamps, helping marketers, analysts, and creators track brand mentions, trends, and user engagement efficiently.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

0

Monthly active users

7 days ago

Last modified

Share

Instagram Scraper — Extract Tagged Posts & Co-Tagged Profiles as JSON

Instagram scraper that extracts every post where a target account is tagged, plus the full list of every other account tagged in that same post. It returns two entity types — tagged posts and co-tagged profiles — as typed JSON, no HTML and no selectors to parse. Set watched accounts to keep only posts where a specific other account is also tagged alongside your target, turning a tagged-post feed into a co-tag discovery tool. After reading this, you'll know exactly what fields you get and how to run it.

What is Instagram Tagged Posts & Co-Tagged Profiles Scraper?

Instagram Tagged Posts & Co-Tagged Profiles Scraper reads a target account's public "Tagged" tab and returns every post that account is tagged in, together with the complete taggedUsers[] list (every other account tagged in the same post, not just the target). It runs fully logged out — no Instagram account, session cookie, or login is required. An optional co-tag filter keeps only posts where a specific "watched" account is tagged alongside the target, which is how the Actor surfaces real co-tagging relationships between accounts.

  • Scrape tagged posts from any public Instagram account's Tagged tab
  • Scrape co-tagged profiles — the full list of accounts tagged in each post, with tag position
  • Filter results to only posts where a chosen account is also co-tagged
  • Export as JSON, CSV, Excel, or any format Apify's dataset supports
  • No proxy management, no login, no cookie setup required

What data does Instagram Tagged Posts & Co-Tagged Profiles Scraper collect?

The Actor returns two distinct entity types per run: the tagged post itself, and the co-tagged profiles found in that post's tag list.

Data TypeKey FieldsJSON Field Names
Tagged postspost ID, shortcode, post URL, post date, media type, caption, engagement countspk, code, postUrl, postedAt, media_type, caption, like_count, comment_count, view_count
Co-tagged profilestagged user ID, username, full name, verified/private flags, tag position on imagetaggedUsers[].userId, taggedUsers[].username, taggedUsers[].fullName, taggedUsers[].isVerified, taggedUsers[].tagX, taggedUsers[].tagY
Co-tag filter matcheswhich watched account(s) matched in a post, and a match flagmatchedWatchedAccounts, isWatchedAccountTagged, taggedAccountCount
Post ownerthe account that published the tagged postuser.username, user.pk, owner.id

Need more Instagram data?

If you need the post's top comments, affiliate/paid-partnership flags, or true inbound @-mentions rather than tags, Instagram Tagged & Mentions Posts Scraper covers that angle with a comments sample per post. To go deeper on any account this Actor surfaces as a co-tagged profile — full bio, follower counts, and an engagement estimate from recent posts — pair this with Instagram Profile Scraper: Per-Post Likes & Comments.

Why not build this yourself?

Instagram has no arbitrary tagged-post lookup endpoint in its official Graph API and no way to fetch another account's full tag list on demand — building this yourself means reverse-engineering Instagram's internal GraphQL/web endpoints, handling login-wall redirects, rotating user agents and residential IPs to avoid rate limiting, and re-deriving the taken_at/usertags fields from each post's detail page since the tagged-tab feed connection doesn't carry them. That's ongoing maintenance work every time Instagram changes its internal payload shape, on top of proxy costs. This Actor already handles the retry logic, the detail-page fallback, and the co-tag matching, and ships it as one input form and a stable JSON schema.

Why do developers and teams scrape Instagram?

For AI engineers and agent builders

Tagged-post and co-tag data is a ready-made input for social graph and brand-relationship models: feed taggedUsers[] into a graph store to map which accounts are repeatedly co-tagged together, or index caption.text and taggedUsernames into a vector store so an agent can answer "which brands has this creator been tagged alongside recently?" Because every field is typed JSON — no HTML, no DOM selectors — it drops directly into an ingestion pipeline, a RAG index, or an agent tool call without a parsing step in between, and field names stay identical across runs so a downstream schema doesn't silently break.

For marketers and brand teams

Brand teams use watchedAccounts to monitor exactly when their brand handle is tagged in the same post as a specific creator or competitor, rather than scanning every tagged post manually. Setting watchedAccounts to a brand handle while scraping a roster of creator accounts surfaces only the posts where both appear — useful for spotting undisclosed partnerships, confirming a sponsorship placement actually went live with the expected co-tag, or tracking how often a specific creator tags a competitor's brand instead of yours. The taggedAccountCount and matchedWatchedAccounts fields make it easy to rank creators by how consistently they co-tag a given partner.

For researchers and analysts

Researchers studying influencer networks or brand-endorsement patterns can use the taggedUsers[] list across many target profiles to build a public co-tagging graph — which accounts appear together in tagged posts, and how often — using only publicly accessible Tagged-tab data, with no login or private-data access involved. Running the same set of target profiles with different watchedAccounts values lets a researcher map, one partner account at a time, how a whole roster of creators or organizations connects through shared tags, without touching anything Instagram doesn't already show to a logged-out visitor.

For developers building data products

Because output fields and structure stay stable across runs, developers can schedule this Actor on a recurring basis and diff taggedUsers[] or matchedWatchedAccounts between runs to build a co-tag change-monitoring product, or pipe postUrl and taggedUsernames straight into a downstream API without remapping fields each time. Since the Actor is callable over HTTP and returns the same JSON shape whether it's triggered manually, on a schedule, or through the Apify API, it fits directly into an existing data pipeline as one more scheduled step rather than a custom scraper to maintain.

How to scrape Instagram (step by step)

  1. Open the Actor's page on Apify and start a run (no separate signup beyond an Apify account).
  2. Add one or more usernames, @handles, or profile URLs to targetProfiles — the accounts whose Tagged tab you want scanned.
  3. Optionally set watchedAccounts to keep only posts where a specific other account is also tagged, and set maxTaggedPostsPerProfile to cap how many matching posts to collect per profile (0 returns all available).
  4. Start the run. A default RESIDENTIAL proxy group is applied automatically unless you configure your own in proxyConfiguration.
  5. Download results as JSON or CSV from the Dataset tab, or pull them via the Apify API.

What to do when Instagram changes its structure

The Actor is maintained, and its output schema is kept stable — field names and types don't change on your end even when Instagram alters its internal page structure. No specific turnaround time is promised for any given fix.

⬇️ Input

ParameterRequiredTypeDescriptionExample Value
targetProfilesNoarray (string list)Usernames, full URLs, or @handles to scan tagged posts from. Also accepts the legacy usernames key.["ronaldo", "https://www.instagram.com/cristiano/", "@leomessi"]
maxTaggedPostsPerProfileNointeger (0–10000)Limit on tagged posts collected per profile, applied after the co-tag filter if one is set. 0 = all available. Also accepts the legacy maxItems key. Default 10.100
watchedAccountsNoarray (string list)Usernames, URLs, or @handles; a post is kept only if one of these also appears in its full tag list. Empty = no filtering.["nike", "@adidas"]
proxyConfigurationNoobject (proxy)Apify Datacenter or Residential proxy configuration. Defaults to a RESIDENTIAL group if left unset.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}

Example JSON input:

{
"targetProfiles": ["ronaldo", "https://www.instagram.com/cristiano/", "@leomessi"],
"maxTaggedPostsPerProfile": 100,
"watchedAccounts": ["nike", "@adidas"],
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}

Common pitfall: setting a narrow watchedAccounts filter doesn't reduce the number of requests made — the Actor still fetches every candidate post's detail page to check its tag list before deciding whether it matches, so watching a rare co-tag account against a large maxTaggedPostsPerProfile still scans the full feed; you're only billed the row_result event for posts that actually pass the filter.

⬆️ Output

Every run produces typed, normalized JSON with a stable schema, exportable as JSON, CSV, Excel, or via the API. Each dataset row is a tagged post; nested inside it is the co-tagged-profiles list.

Scraped tagged post

{
"pk": "3372018475619203847",
"media_type": 1,
"code": "Cxyz123AbCd",
"id": "3372018475619203847_635642071",
"owner": { "id": "635642071" },
"accessibility_caption": "Photo by Nike Football on July 20, 2026.",
"caption": {
"pk": "17912345678901234",
"text": "Great session with the squad today. @cristiano @leomessi"
},
"audience": null,
"carousel_media_count": null,
"display_uri": "https://scontent.cdninstagram.com/v/t51.2885-15/xxxx_n.jpg",
"carousel_media": null,
"image_versions2": {
"candidates": [
{ "url": "https://scontent.cdninstagram.com/v/t51.2885-15/xxxx_n.jpg", "width": 1080, "height": 1080 },
{ "url": "https://scontent.cdninstagram.com/v/t51.2885-15/xxxx_s150x150.jpg", "width": 150, "height": 150 }
]
},
"media_cropping_info": null,
"product_type": "feed",
"thumbnailUrl": "https://scontent.cdninstagram.com/v/t51.2885-15/xxxx_s150x150.jpg",
"thumbnails": [],
"timeline_pinned_user_ids": [],
"user": { "pk": "635642071", "username": "nikefootball", "id": "635642071" },
"like_count": 842193,
"like_and_view_counts_disabled": false,
"comment_count": 3021,
"comments_disabled": false,
"view_count": null,
"original_height": 1350,
"original_width": 1080,
"__typename": "XDTMediaDict",
"takenAt": "2026-07-20T14:32:10+00:00",
"postedAt": "2026-07-20T14:32:10+00:00",
"scrapedAt": "2026-07-25T09:12:44.183921+00:00",
"queriedUsername": "cristiano",
"postUrl": "https://www.instagram.com/p/Cxyz123AbCd/",
"taggedUsers": [
{
"userId": "173560420",
"username": "cristiano",
"fullName": "Cristiano Ronaldo",
"isVerified": true,
"isPrivate": false,
"profilePicUrl": "https://scontent.cdninstagram.com/v/t51.2885-19/xxxx_s150x150.jpg",
"tagX": 0.42,
"tagY": 0.71
},
{
"userId": "204603721",
"username": "leomessi",
"fullName": "Leo Messi",
"isVerified": true,
"isPrivate": false,
"profilePicUrl": "https://scontent.cdninstagram.com/v/t51.2885-19/yyyy_s150x150.jpg",
"tagX": 0.68,
"tagY": 0.55
}
],
"taggedUsernames": "cristiano, leomessi",
"taggedAccountCount": 2,
"matchedWatchedAccounts": ["leomessi"],
"isWatchedAccountTagged": true
}

Co-tagged profile (taggedUsers[] entry)

{
"userId": "204603721",
"username": "leomessi",
"fullName": "Leo Messi",
"isVerified": true,
"isPrivate": false,
"profilePicUrl": "https://scontent.cdninstagram.com/v/t51.2885-19/yyyy_s150x150.jpg",
"tagX": 0.68,
"tagY": 0.55
}

How many results can you scrape with Instagram Tagged Posts & Co-Tagged Profiles Scraper?

maxTaggedPostsPerProfile accepts 0 (return every available tagged post) up to 10000 per target profile. Internally, each profile's tagged-post feed is paginated 12 posts at a time and the pagination loop stops after 100 pages, so a single profile scan tops out around 1,200 candidate posts before your limit or the watchedAccounts filter is applied. When a co-tag filter is set, the number of rows you actually receive is the subset of scanned posts where a watched account was also tagged — this will be smaller than the raw scan total. Multiple targetProfiles are processed one at a time within the same run.

Integrate Instagram Tagged Posts & Co-Tagged Profiles Scraper and automate your workflow

Instagram Tagged Posts & Co-Tagged Profiles Scraper works with any language or tool that can send an HTTP request.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run = client.actor("API-Empire/instagram-tagged-posts-and-co-tagged-profiles-scraper").call(
run_input={
"targetProfiles": ["cristiano"],
"maxTaggedPostsPerProfile": 50,
"watchedAccounts": ["nike"],
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["postUrl"], item["taggedUsernames"])

Works in Python, Node.js, Go, Ruby, cURL. Replace the actor ID with the exact one shown on this Actor's Apify Console page.

MCP for AI agents

This Actor is callable through Apify's own MCP server by adding it to the server URL: https://mcp.apify.com?tools=API-Empire/instagram-tagged-posts-and-co-tagged-profiles-scraper, registered as an MCP server endpoint in any MCP-compatible client (Claude, Cursor, and others). The agent then calls it like any other registered tool and gets typed JSON back — no scraping code in the agent itself.

Automation platforms (n8n, Make)

In n8n, the Apify node's "Run Actor and Get Dataset" operation can call this Actor by ID and pass targetProfiles/watchedAccounts as run input, then feed the returned items into downstream nodes. In Make, the Apify app's "Run an Actor" module does the same — trigger a run on a schedule, then use "Get Dataset Items" to pull the tagged posts into a scenario, e.g. writing new co-tag matches to a spreadsheet or CRM.

Scraping publicly accessible Instagram data is generally lawful; this Actor only returns tagged posts and co-tagged profile data from public Tagged-tab feeds, not private accounts or login-gated content. Because tagged posts and co-tagged profiles include personal data (usernames, full names, profile pictures), GDPR and CCPA apply to how you store, process, and reuse that data if you operate in or target users in the EU/UK or California — you need a lawful basis for holding it. Consult legal counsel for commercial use cases involving bulk personal data.

Frequently asked questions

Does this scraper work without an Instagram account?

Yes. It runs fully logged out using browser-signature impersonation — no Instagram account, session, or cookie is required or accepted in the input schema.

How often is the scraped data updated?

Every run fetches live from Instagram at request time; nothing is cached between runs. Each row carries its own scrapedAt timestamp alongside the post's actual postedAt date.

What happens if a target profile has no tagged posts, or a post's detail page fails to load?

If a profile has no tagged posts (or its user ID can't be resolved), the Actor logs a warning and returns zero rows for that profile rather than erroring out the whole run. If an individual post's detail-page fetch fails, that post's taken_at/usertags data comes back empty and the post is skipped by the row-conversion function's error handling rather than producing a malformed row.

Can I scrape tagged posts from private Instagram accounts?

No. Only tagged posts visible on a public account's Tagged tab are returned; private accounts' tagged-post feeds aren't accessible without a login this Actor doesn't perform.

Does this scraper work for AI agent workflows and LLM pipelines?

Yes. It's callable as an HTTP endpoint by any agent framework and via Apify's MCP server (https://mcp.apify.com?tools=API-Empire/instagram-tagged-posts-and-co-tagged-profiles-scraper). Every response is typed JSON — no parsing step before passing it to an LLM.

How does this scraper handle Instagram's anti-bot system?

It uses browser-signature impersonation (Chrome-shaped requests), rotates User-Agent strings on retry, applies exponential backoff with jitter on HTTP 429 responses, retries failed requests up to three times, and routes traffic through Apify Residential proxies by default.

Does this scraper return data in a format LLMs can use directly?

Yes. Typed, normalized JSON with stable field names — no HTML, no selectors. Pass it directly into an LLM context window, index it into a vector store, or route it through an agent tool call.

Can I use this scraper without managing proxies?

Yes. If you don't configure proxyConfiguration, the Actor requests a RESIDENTIAL Apify proxy group automatically; no proxy credentials are hardcoded or required from you.

No. Unlike cookie-gated variants elsewhere in this catalog, this Actor's input schema has no session/cookie field — every request runs logged out.

What's the difference between targetProfiles and watchedAccounts?

targetProfiles are the accounts whose Tagged-tab feed gets scanned. watchedAccounts is an optional filter on top of that scan — set it to keep only posts where one of those specific other accounts is also tagged alongside your target, rather than every tagged post.

What happens when Instagram changes its structure or blocks the scraper?

The Actor is maintained and its output schema stays stable — field names and types don't change on your end. No numeric turnaround time is promised for any specific fix.

Your feedback

Found a bug or missing a field? We want to know. Reach out through the Actor's Issues tab on Apify or API-Empire's support contact listed on the Actor's Store page — reports like this directly shape what gets fixed and maintained.