Instagram Mentions Scraper - Tagged Posts, $0.44/1k avatar

Instagram Mentions Scraper - Tagged Posts, $0.44/1k

Pricing

from $0.44 / 1,000 mention scrapeds

Go to Apify Store
Instagram Mentions Scraper - Tagged Posts, $0.44/1k

Instagram Mentions Scraper - Tagged Posts, $0.44/1k

Find the public Instagram posts other people made about a handle: tagged in the photo, named in the caption, or credited as co-author. One row per post with link, caption, author, likes, comments, date and images. $0.44 per 1,000.

Pricing

from $0.44 / 1,000 mention scrapeds

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

2 days ago

Last modified

Share

Instagram Mentions & Tagged Posts Scraper

The posts this returns weren't written by the account you ask about. Hand it an Instagram handle and you get the public posts other people made: tagged in the photo, named in the caption, or credited as a co-author. One row per post, with the link, the caption, who posted it, likes, comments, when it went up, the image URLs, and which of your handles it mentions.

It reads Instagram's own server-side mentions index, the one behind the Tagged tab on a profile. No browser, no account of yours.

  • mentionType tells you how each post mentions the account, so you can filter photo tags away from caption name-drops.
  • Watch several handles in one run. A post that mentions two of your handles comes back once per handle, because that's two separate findings.
  • Empty input returns one labelled sample row, free.
  • A handle that stays unreadable comes back as a free diagnostic row, never a charged one.

Price

$0.44 per 1,000 mentions. Plus $0.0005 per run as the platform start fee, billed per gigabyte of run memory, so exactly that on the default 1 GB.

No volume tiers, no minimum spend, no subscription.

MentionsTotal
100$0.0445
1,000$0.4405
10,000$4.4005
100,000$44.0005

What gets charged

  • One mention-scraped event per mention row written to the dataset. Nothing else is metered per row.
  • Free: the sample row an empty run returns, and every diagnostic row. They all carry "charged": false.
  • Duplicate posts already returned for the same handle earlier in the run are dropped before they're charged.
  • Handles that don't exist, are hidden from logged-out visitors, or have nobody tagging them produce an uncharged diagnostic row instead of a bill.
  • Posts removed by onlyTagged are never charged. The filter runs before billing.
  • A run that finds nothing costs the start fee and nothing else.
  • Rows never leave the dataset without a charge and are never charged without a row. The billed event is a named one, so nothing is quietly attached to apify-default-dataset-item.

Input

{
"usernames": [
"redbull",
"gopro"
],
"maxItems": 60,
"resultsPerUsername": 30
}
FieldWhat it does
usernamesThe accounts you want mentions of. Up to 200 per run. redbull, @redbull and https://www.instagram.com/redbull/ are the same input.
maxItemsTotal rows across every handle. Default 100, hard ceiling 10,000. This is the number you pay for, so keep it low while testing.
resultsPerUsernameOptional per-handle cap. Leave it empty and maxItems is split evenly between your handles.
onlyTaggedOff by default. Turn it on to keep only posts where the account is tagged in the photo or credited as a co-author, and drop posts that merely name it in the caption.
concurrencyHow many handles to read at once. Default 4, maximum 8. Raise it for a long list, lower it if you supply your own proxies and they're few.
sessionCookiesLeave empty for a normal run. See When a handle can't be read logged out.
proxyUrlsLeave empty. Only for callers who want traffic to leave through proxy servers they already pay for, as http://user:pass@host:port.

Run it with empty input and you get one labelled sample row, free.

Output

One row per mention. This is a real row from a real run:

{
"ok": true,
"charged": true,
"recordType": "mention",
"mentionedUsername": "redbull",
"mentionedUserId": "476322",
"mentionType": "caption-mention",
"mentionTypes": ["caption-mention"],
"url": "https://www.instagram.com/p/B3M0F6ODksj/",
"shortCode": "B3M0F6ODksj",
"postId": "2147320226877688611",
"type": "image",
"caption": "Ducati V4R x @redbull built by @hvmotorcycles 🔥🔥@ducatiusa",
"hashtags": [],
"mentions": ["redbull", "hvmotorcycles", "ducatiusa"],
"ownerUsername": "2wheeltv",
"ownerId": "4516500559",
"likesCount": 5403,
"commentsCount": 25,
"viewsCount": null,
"timestamp": "2019-10-04T14:49:00.405Z",
"timestampIsApproximate": true,
"displayUrl": "https://scontent.cdninstagram.com/v/t51.82787-15/628070032_18391485244194380_n.jpg",
"images": [
"https://scontent.cdninstagram.com/v/t51.82787-15/628070032_18391485244194380_n.jpg"
],
"taggedUserIds": [],
"coauthorUsernames": [],
"isVideo": false,
"productType": "feed",
"carouselCount": 0,
"dimensions": { "width": 1121, "height": 1121 },
"accessibilityCaption": null,
"inputUrl": "https://www.instagram.com/redbull/tagged/",
"scrapedAt": "2026-08-16T05:12:33.953Z"
}

Field notes

  • mentionedUsername is which of your handles the post is about. It's the join key when you watch several accounts in one run.
  • mentionType is why the post is in the index. photo-tag means the account is tagged in the image, caption-mention means the caption names it with an @, coauthor means it's a credited co-author, and tagged means Instagram put the post in the index without saying which of the three applies. mentionTypes carries all that apply.
  • ownerUsername is the account that published the post. The person talking about you, not you.
  • caption is the full caption as written, newlines and emoji intact. hashtags and mentions are parsed out of it.
  • likesCount and commentsCount are a snapshot at read time, not at publication.
  • viewsCount is the video view count where Instagram publishes one to a logged-out viewer. Often null, including on videos.
  • timestamp is derived from the post id rather than read from a publish clock. timestampIsApproximate is true on every row to keep that explicit. See the limits.
  • displayUrl and images hold the largest still image Instagram serves. A carousel lists one image per slide. A video or reel gives its cover frame. These are signed CDN links that expire, so download what you need promptly.
  • taggedUserIds holds the numeric ids of accounts tagged in the media, when the public payload carries them. Ids only. This surface doesn't publish their handles.
  • url is the canonical post link. Reels get a /reel/ link, everything else /p/.

Real rows carry "charged": true. Sample rows carry "_sample": true, diagnostic rows carry "_diagnostic": true and an errorCode. Neither is billed.

How it works

Instagram keeps a server-side index of the posts that tag or mention an account. This Actor asks that index directly, so the work is proportional to the mentions you want rather than to the size of anybody's feed.

A handle is first resolved to its numeric account id through Instagram's public profile card, with the fuller public profile record as a fallback for the rare handle the card won't serve. Results are then read a page at a time, following the cursor Instagram hands back, until your row limit is reached or the index runs out.

Requests leave through a rotating pool of addresses. Instagram meters these surfaces per address, so a refusal is answered by moving rather than waiting. Nothing is rendered in a browser. It's plain HTTP against public endpoints, which is what keeps the price where it is.

When a handle can't be read logged out

Most handles answer an anonymous reader on the first attempt, because the Tagged tab is part of a public profile page.

Some don't. Age-restricted brand accounts are the usual case, and a handful of others behave the same way: Instagram won't identify them at all without a session. Screening 77 well-known brand handles logged out, 5 of them behaved like this. It's a property of the account rather than of the run, so retrying won't change it. Those handles come back as uncharged NOT_FOUND diagnostic rows.

If you need those handles, paste your own Instagram cookie into sessionCookies as sessionid=...; csrftoken=.... Chrome: F12 → Application → Cookies → instagram.com. One entry per account. The cookie is used for this run's requests and nothing else. It's never stored, never logged and never written to the dataset. Use an account you own and are willing to automate. If Instagram invalidates it mid-run, that session is dropped and the run finishes with what it collected rather than failing.

The closing log line carries sessionState: keyless when you supplied nothing, ok while yours is healthy, degraded after one was dropped, exhausted when none are left.

What people use it for

  • Brand monitoring. Run your own handle daily and see every public post that tagged or named you since yesterday, with the engagement each one got.
  • Finding advocates. Sort a run by likesCount and you have the accounts putting your brand in front of the biggest audiences, ranked, with links.
  • Sourcing user-generated content. mentionType: "photo-tag" plus images gives you a shortlist of photos featuring your product, with the author handle to ask permission.
  • Campaign reporting. Pull mentions of the campaign account for a date range and total the likes and comments.
  • Influencer verification. Check that a creator actually tagged the brand they invoiced for, and see what the post did.

Reading the output

  • Real rows carry "charged": true and "recordType": "mention". One billed event each.
  • The sample row carries "_sample": true and "charged": false. There's exactly one, only when the input had no usernames.
  • Diagnostic rows carry "_diagnostic": true, "charged": false, the handle in mentionedUsername, and an errorCode: NOT_FOUND when a handle can't be read without an account, NO_RESULTS when nobody has publicly tagged or mentioned it, RATE_LIMITED or BLOCKED when Instagram refused the index from every address tried, TIME_BUDGET when the run ran out of time, BAD_INPUT when the whole list turned out to be unreadable.

Filter on charged == true and you have exactly the rows you paid for.

How this differs from a profile posts scraper

A profile scraper answers "what did this account post". This one answers the opposite question: what did everyone else post about this account. The two barely overlap.

If you tried to get mentions by pulling a brand's own feed and searching the captions, you'd read hundreds of rows and find none of them, because the posts you want were written by other people. This reads the index Instagram already keeps for exactly that question, so you pay for mentions rather than for the search.

Limits

  • Public accounts only. A private account's tagged posts aren't public, and nothing here logs in to see them.
  • Some public accounts are hidden from logged-out visitors entirely. Those come back as uncharged NOT_FOUND rows unless you supply your own cookie. On a screen of 77 well-known brand handles, 5 were affected.
  • An account can hide its own tagged tab, and its owner can remove individual posts from it. Anything removed there is invisible here too. This reflects what Instagram publishes, not everything ever posted.
  • Timestamps come from the post id, not from a publish clock. Measured against Instagram's own value on 48 posts: half were within 33 seconds, nine in ten within two and a half minutes, worst case just under nine minutes, and every one landed on the correct date. Use them for ordering and date filtering. Don't use them to prove a post went up at an exact second.
  • No video files. This surface publishes cover images for videos and reels, not the MP4, so images holds stills only. viewsCount is frequently null for the same reason.
  • Author details are the handle and the numeric id. Follower counts, display names and verification badges aren't part of this payload. Run a profile scraper over ownerUsername if you need them.
  • Comments are counted, not returned.
  • Image URLs are signed CDN links and stop working after a while.
  • The index is ordered by Instagram, not strictly by date, and it mixes recent and old posts. Ask for more rows and sort on timestamp yourself if you need a strict window.
  • Hard ceilings: 10,000 rows and 200 handles per run.
  • Instagram meters these endpoints per address. A very large run can hit a stretch where every address is refused. That produces uncharged RATE_LIMITED rows for the affected handles, and the run still finishes as succeeded.

Questions

Does this find posts that only mention the account in a comment?

No. It covers posts that tag the account in the image, name it with an @ in the caption, or credit it as a co-author. The same set Instagram shows on the Tagged tab. Comments are a different surface.

What if a handle has no mentions at all?

One uncharged diagnostic row with errorCode: "NO_RESULTS", and the run carries on to your other handles.

Do I need an Instagram account or cookies?

Not for a normal run. Handles are read the way an anonymous visitor reads a Tagged tab. sessionCookies only matters for the minority of handles Instagram won't identify anonymously.

Do I need a proxy?

No. The run brings its own egress and its cost is already inside the price. proxyUrls exists only for callers who want traffic to leave through servers they already own.

Will the run fail if Instagram blocks it?

No. A blocked, empty or unreadable handle produces an uncharged diagnostic row explaining what happened, and the run still finishes as succeeded. A failed run would still bill the start fee, which would mean paying to be told something went wrong.

Can I run it on a schedule?

Yes, and that's the main way people use it. Nothing is held between runs. Diff on postId to see only what's new.

Why is the same post in my results twice?

Check mentionedUsername. If a post tags two of the handles you asked about, you get one row per handle, because for reporting purposes that's a mention of each. Within a single handle, duplicates are removed before anything is charged.