Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Instagram Mentions Scraper icon

Instagram Mentions Scraper

Track who tags or mentions a public Instagram account. One row per post: link, caption, author, likes, comments, date, images. $0.44 per 1,000.

267 runs on Apify $0.00044 per mention ($0.44 / 1,000)
Run this in the cloudRun on Apify →

Developer & Research Tools

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust usernames, maxItems, resultsPerUsername (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.00044 per mention = $0.44 per 1,000

You are charged forWhenPrice
Mention scrapedCharged once per public post delivered that tags or mentions one of the accounts you asked about. Sample rows, diagnostic rows and posts removed by the onlyTagged filter are never charged.$0.00044

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-16, and they are what you are actually charged.

Inputs

FieldWhat it doesType
usernamesThe accounts you want mentions of. A plain handle, @handle or a full profile URL all work. Up to 200 per run.array
maxItemsTotal posts to return across every handle. This is the number you pay for, so keep it low while testing.integer
resultsPerUsernameCap the posts returned for each handle. Leave empty and the row limit above is shared evenly between your handles.integer
onlyTaggedKeep only posts where the account is tagged in the image or credited as a co-author, and drop posts that merely name it in the caption. Filtered posts are never charged.boolean
concurrencyHow many handles to read in parallel. Raise it for a long list; lower it if you supply your own proxy servers and they are few.integer
sessionCookiesLeave this empty for a normal run. Tagged posts are read without an account and that answers most handles. A minority of public accounts - age-restricted brands are the usual case - are not identified to a logged-out reader at all, and those come back as uncharged NOT_FOUND diagnostic rows. Paste your own Instagram cookie here to read them. In Chrome: F12 -> Application -> Cookies -> instagram.com. The sessionid cookie is the one that matters; csrftoken alongside it is better. Paste it as sessionid=...; csrftoken=..., one entry per account. Prefer a throwaway account over your main one. Use an account you own and are authorised to automate.array
proxyUrlsLeave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port.array

What you get

A structured dataset — each result includes fields like:

mentionedUsernamementionTypeurlownerUsernamecaptionlikesCountcommentsCounttimestamptypedisplayUrlviewsCountshortCode

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Developer & Research Tools

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

GitHub Scraper iconDeveloper & Research Tools

GitHub Scraper

Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.

18 use cases

Stack Overflow / Stack Exchange Scraper iconDeveloper & Research Tools

Stack Overflow / Stack Exchange Scraper

Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.

2 use cases

Package Registry Scraper (npm + PyPI) iconDeveloper & Research Tools

Package Registry Scraper (npm + PyPI)

Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.

2 use cases

arXiv Scraper iconDeveloper & Research Tools

arXiv Scraper

Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.

2 use cases

OpenAlex Scholarly Works Scraper iconDeveloper & Research Tools

OpenAlex Scholarly Works Scraper

Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.

2 use cases

Crossref Scholarly Works Scraper iconDeveloper & Research Tools

Crossref Scholarly Works Scraper

Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.

2 use cases

See all Developer & Research Tools →

Instagram Mentions Scraper: public posts other people made about a handle

Type an Instagram handle and get back the posts other accounts made about it. 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 and the images.

One thing to square away first, because it shows up in every row. Timestamps are worked out from the post id, not read off the post, so timestampIsApproximate is always true. Measured against real publish times it lands within about half a minute, which is fine for sorting and grouping by day and wrong for anything that needs the exact second.

InputInstagram handles, @handles or profile URLs
OutputOne row per post mentioning that handle
Ceiling10,000 rows and 200 handles per run
Account neededNone from you
Price$0.44 per 1,000 posts, flat on every plan

🔍 What Instagram Mentions Scraper does

It reads the tagged feed of the handles you name and returns what other people published about them. Four kinds of mention land in the same row shape, and mentionTypes tells you which you got: tagged in the photo, named in the caption, credited as a co-author, or tagged on the post.

Nothing to log into, no API key, no app review.

There is one gap worth knowing about. A minority of public accounts, and age-restricted brands are the usual case, are not identified to a reader who is not signed in. Those come back as a labelled NOT_FOUND row rather than silently empty, and your own cookie in sessionCookies is what opens them.

Set onlyTagged when you want the real endorsements and not every account that typed the brand name into a caption.

📥 What you give it

{
  "usernames": ["redbull", "gopro"],
  "maxItems": 100,
  "onlyTagged": false
}
FieldDefaultWhat it is
usernamesnoneredbull, @redbull or a full profile URL. Up to 200 in one run. Case does not matter.
maxItems100Rows for the whole run, 1 to 10,000. This is your spend cap, so keep it low while you are testing.
resultsPerUsernamenoneA per-handle cap. Leave it empty and maxItems is shared evenly between your handles.
onlyTaggedfalseKeep only posts where the account is tagged in the image or credited as co-author. Dropped posts are never billed.
concurrency4How many handles are read at once, 1 to 8.
sessionCookiesnoneOptional. Your own sessionid (and csrftoken if you have it), for the accounts that will not answer a signed-out reader.
proxyUrlsnoneOptional. Servers of your own you want the run to use, as http://user:pass@host:port.

Start a run with nothing filled in and you get one labelled sample row showing the output shape. That row is not charged.

📤 What you get back

A real row from a real run. The long image links are trimmed with ..., and the caption is cut short because it carries emoji:

{
  "ok": true,
  "recordType": "mention",
  "mentionedUsername": "redbull",
  "mentionedUserId": "476322",
  "mentionType": "coauthor",
  "mentionTypes": ["coauthor"],
  "url": "https://www.instagram.com/reel/CrQ8KTmuCrN/",
  "shortCode": "CrQ8KTmuCrN",
  "postId": "3085230335784921805",
  "type": "reel",
  "caption": "when worlds collide ...",
  "hashtags": ["RedBullFathom", "redbull", "givesyouwiiings", "redbullsnow", "snowboarding"],
  "mentions": ["mammothmountain"],
  "ownerUsername": "redbullusa",
  "ownerId": "40813406313",
  "likesCount": 52189,
  "commentsCount": 104,
  "viewsCount": null,
  "timestamp": "2023-04-20T16:28:58.150Z",
  "timestampIsApproximate": true,
  "displayUrl": "https://scontent-arn2-1.cdninstagram.com/v/t51.71878-15/...",
  "images": ["https://scontent-arn2-1.cdninstagram.com/v/t51.71878-15/..."],
  "taggedUserIds": [],
  "coauthorUsernames": ["redbull"],
  "isVideo": true,
  "productType": "clips",
  "carouselCount": 0,
  "dimensions": {"width": 720, "height": 1280},
  "accessibilityCaption": null,
  "inputUrl": "https://www.instagram.com/redbull/tagged/",
  "scrapedAt": "2026-09-21T01:25:45.062Z"
}

That row shows the shape well: you asked about redbull, redbullusa published the reel, and Red Bull is on it as a co-author.

FieldWhat it is
mentionedUsernameWhich of your handles this row is about.
mentionTypesAny of photo-tag, caption-mention, coauthor and tagged. mentionType is just the first of them.
shortCodeUnique per post. Use it as your dedupe key.
viewsCountOften null, including on videos. Instagram does not publish it on this feed.
imagesThe largest version of each frame. A carousel gives you one entry per frame, and carouselCount says how many.
displayUrl, imagesSigned links that expire within hours. Download what you want to keep.
accessibilityCaptionInstagram's own alt text, or null when there is none.

Nothing is guessed. A field Instagram did not send comes back null.

🧾 Reading the output

Three kinds of row land in your dataset, and only the first kind is billed.

RowHow to spot itBilled
A mentionrecordType: "mention" and a shortCodeyes
The sample row_sample: true, and only on a run with no handlesno
A diagnostic_diagnostic: true and an errorCodeno

Filter on recordType == "mention" and you have your posts. Rows also carry a charged flag, which is how the actor labels real rows against samples and diagnostics.

The errorCode names the handle it belongs to and says what happened:

CodeWhat it means
NOT_FOUNDNo such account, or a public account that is not identified to a signed-out reader. A cookie opens the second case.
NO_RESULTSThe handle resolved and nobody has mentioned it.
BAD_INPUTTwenty handles in a row returned nothing, so the run stopped rather than work through the rest.
BLOCKEDInstagram stopped answering for that handle this time.
RATE_LIMITEDToo many requests too close together. Space them out.
TIME_BUDGETThe run ran out of time before reaching that handle.
PROXY_INPUT_ADJUSTEDSomething in proxyUrls could not be used as written.
SERVER_ERROR, NETWORK, CHARGE_ERRORSomething went wrong that did not fit the list above.

A diagnostic row never bills you for results, and one bad handle does not stop the others.

▶️ How to run it

1. Open Instagram Mentions Scraper and click Try for free. 2. Put the handles you want mentions of into Instagram usernames, one per line. 3. Set Maximum rows. Start at 20 while you look at the output shape. 4. Tick Only posts tagged in the photo if caption name-drops are noise to you. 5. Click Start, then download the dataset as JSON, CSV or Excel.

💰 How much does it cost?

$0.44 per 1,000 posts. Flat on every Apify plan, no volume tiers.

One charge per row delivered. A post dropped by onlyTagged never becomes a row, so it is never billed. Sample rows and diagnostic rows are not billed, and a handle nobody has mentioned is not billed for results.

One case to know: a post that mentions two of your handles comes back as two rows, one under each handle, and both are billed. That is deliberate, because each row answers a different question, but it is worth knowing before you paste in 200 handles from the same brand family.

💡 What people use it for

  • Watching what creators post about a brand without asking the brand for its tagged feed.
  • Finding the accounts that keep showing up around a product, then approaching the good ones.
  • Measuring a campaign hashtag against real tagged posts rather than caption name-drops.
  • Collecting user photos of a product as reference, with the image links already in the row.

🚧 What it does not do

  • Timestamps are approximate. They come from the post id, close to the real time but not exact,

and every row is flagged as such.

  • No video files. You get the cover image. viewsCount is often null as well.
  • No follower counts or display names for the poster, only the handle and the id.
  • No private accounts, and no stories or highlights.
  • The order is Instagram's, not newest first. Sort on your own side.
  • The same post can be billed twice when it mentions two of your handles.
  • Twenty empty handles in a row stop the run early, with a row saying so.
  • 10,000 rows and 200 handles per run. Bigger jobs need splitting.

🧭 Which Instagram scraper do you need?

If you wantUse
Posts other people made about a handleThis one
What the account itself postedInstagram Profile Scraper
Posts under a hashtagInstagram Hashtag Scraper
One post or reel you have the link forInstagram Post Scraper
Comments under a postInstagram Comments Scraper
Who follows the accountInstagram Followers & Following Scraper

❓ Questions people ask

Do I need an Instagram account? No. The cookie field is there for the small number of accounts that will not answer a signed-out reader at all.

Why is the same post in my results twice? Because it mentioned two of the handles you asked about, so it appears once under each.

Why is viewsCount empty on a video? Instagram does not publish a view count on this feed. Likes and comments are there.

How exact are the timestamps? Close, not exact. They are derived from the post id and every row says so. Good enough to sort and group by day.

Is scraping Instagram legal? This reads public posts only, never private accounts or messages. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the handle you used and the run ID. The errorCode on the diagnostic row usually explains it on its own.