Instagram Hashtag Scraper
Scrape Instagram hashtags at scale for $0.40 per 1,000 posts. Captions, likes, comments, image and video URLs, owner and timestamp.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
hashtags,startUrls,resultsLimit(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0004 per post = $0.4 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Post returned | Charged per post returned. Failed/empty runs not charged. | $0.0004 |
Pay-per-event pricing: you are billed per result, not per subscription — a run that returns nothing costs nothing beyond the start fee. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-06-23, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
hashtags | Hashtags (with or without #) to scrape top & recent posts from. | array |
startUrls | Or paste /explore/tags/ URLs. | array |
resultsLimit | Max posts per hashtag. Charged per post. | integer |
notionConnector | Optional Notion delivery. | string |
notionParentId | Optional Notion data-source id. | string |
sessionCookies | Optional, and normally not needed — runs work with no cookie at all. Supply your own Instagram account cookie here to run on your own account's rate limit, and to reach feeds the no-setup route does not cover. In Chrome: F12 -> Application -> Cookies -> https://www.instagram.com -> copy the sessionid value. Use an account you own and are authorized to automate. Cookie values are never logged or written to output. | array |
What you get
A structured dataset — each result includes fields like:
ownerUsernamecaptionlikesCountcommentsCounturlExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
15 ready-to-run use cases
Monitor a branded hashtag campaign
Monitor a branded hashtag campaign. Runs on #justdoit — captions, likes, comments, media URLs, owner and timestamp. No login needed.
Track crypto conversation by hashtag
Track crypto conversation by hashtag. Runs on #bitcoin and #ethereum — captions, likes, comments, media URLs, owner and timestamp. No login needed.
Scrape #fashion Instagram Posts
Scrape #fashion Instagram Posts. Runs on #fashion — captions, likes, comments, media URLs, owner and timestamp. No login needed.
Scrape #fitness Instagram Posts
Scrape #fitness Instagram Posts. Runs on #fitness — captions, likes, comments, media URLs, owner and timestamp. No login needed.
Scrape #foodporn Instagram Posts
Scrape #foodporn Instagram Posts. Runs on #foodporn — captions, likes, comments, media URLs, owner and timestamp. No login needed.
Track gaming hashtags for community research
Track gaming hashtags for community research. Runs on #gaming and #esports — captions, likes, comments, media URLs, owner and timestamp. No login needed.
Build an ad-creative swipe file from a hashtag
Build an ad-creative swipe file from a hashtag. Runs on #adcreative and #marketingtips. No login needed.
Track pet-niche hashtags for brand partnerships
Track pet-niche hashtags for brand partnerships. Runs on #dogsofinstagram and #catsofinstagram. No login needed.
Collect real-estate listings posted to hashtags
Collect real-estate listings posted to hashtags. Runs on #realestate and #justlisted. No login needed.
Scrape #skincare Instagram Posts
Scrape #skincare Instagram Posts. Runs on #skincare — captions, likes, comments, media URLs, owner and timestamp. No login needed.
Discover tattoo artists by style hashtag
Discover tattoo artists by style hashtag. Runs on #tattooartist and #finelinetattoo. No login needed.
Scrape #travel Instagram Posts
Scrape #travel Instagram Posts. Runs on #travel — captions, likes, comments, media URLs, owner and timestamp. No login needed.
Find UGC under a branded hashtag to repost
Find UGC under a branded hashtag to repost. Runs on #sharecoke and #myamex — captions, likes, comments, media URLs, owner and timestamp. No login needed.
Find wedding vendors posting under industry hashtags
Find wedding vendors posting under industry hashtags. Runs on #weddingphotographer and #weddingflorist. No login needed.
Detect weekly movement in a hashtag
Detect weekly movement in a hashtag. Runs on #trending — captions, likes, comments, media URLs, owner and timestamp. No login needed.
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
Search GitHub repos or users and export clean rows: stars, forks, language, topics, license, plus user bio, company, location and follower count.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tags. Get structured questions with score, answers, views, tags, author, and link as JSON or CSV.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata - version, license, repo, keywords, and npm download counts. Search by keyword or look up exact names. No API key needed.
arXiv Scraper
Search arXiv and get clean JSON: titles, abstracts, authors, categories, DOI, dates and PDF links. No API key. Sort by relevance or date; push to Notion.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers by keyword. Get titles, authors, venue, year, citations, concepts, OA links and full abstracts as structured JSON. No API key.
Crossref Scholarly Works Scraper
Search 150M+ scholarly works on Crossref and export DOI, authors, journal, citation count, and abstracts as JSON or CSV. Filter by type and date.
Where this tool sits
- Categories
- Developer & Research Tools
⚡ Instagram Hashtag Scraper — Posts by Hashtag
Pull posts from any Instagram hashtag and get back clean, flat records — caption, like & comment counts, media URLs, owner, hashtags, mentions and timestamp. Feed it a list of hashtags (or /explore/tags/ URLs), set a cap, and export to JSON, CSV or Excel, hit it from the API, or have results delivered straight to Notion. Just $0.40 per 1,000 posts — billed only for posts actually returned.
> Instagram serves hashtag feeds only to a signed-in caller — there is no logged-out route to them at any address or fingerprint. This actor reads them through a licensed data source, so a run works out of the box: no login, no cookie, no app review, nothing to paste. Your own account cookie is optional — see Coverage, cookies and rate limits.
What you need to know before you run it
Hashtag feeds work out of the box. You supply nothing, and the run returns posts.
Out of the box you get the tag's top feed. This is the one real limitation and it is worth knowing before you start. Instagram has been retiring the chronological recent tag feed: our no-setup route returns an empty list for it on every tag we tested, so runs read the top feed and page through it. If you supply your own cookie in sessionCookies the run also *requests* the recent tab — but Instagram restricts that feed heavily now, so treat any newest-first coverage as a bonus rather than something to build on.
Why this scraper wins
- 🔓 Nothing to set up — the login the hashtag feed requires is handled for you by a licensed data source. No cookie, no bearer token, no app, no business API approval. An empty
sessionCookiesis the normal way to run this actor. - 🌐 No proxy to configure — default runs need none. When you do supply your own cookie, the actor rotates Apify datacenter addresses and hops on every block, included in the run cost; no metered per-gigabyte proxy to pay for. Leave the default and it just works.
- 💸 Flat $0.40 / 1,000 posts — charged per post returned, with no volume tiers. Empty or blocked runs cost nothing.
- 🧹 Clean, flat output — one tidy record per post, ready for spreadsheets, dashboards or LLM pipelines. No raw nested soup.
- 🔁 Auto-dedupe — the same post is never returned (or charged) twice in a run.
- 📬 Built-in delivery — optionally push every run straight into Notion via Apify connectors, zero extra code.
- 🚦 Honest errors — if a tag returns nothing or a request is refused, you get a clearly labeled diagnostic row (
RATE_LIMITED,BLOCKED,NOT_FOUND,SERVER_ERROR,NO_RESULTS,PARTIAL) explaining what happened, instead of silent emptiness. Diagnostic rows are never charged.
What you can scrape
| Mode | Input | Notes |
|---|---|---|
| Hashtag feed | hashtags (with or without #) | Top feed out of the box; with a cookie the run also tries the recent tab, which Instagram now restricts |
| Hashtag URLs | startUrls (/explore/tags/<tag>/) | Same as above, paste-friendly |
Input
hashtags— list of hashtags to scrape, e.g.nature,travel(the#is optional).startUrls— or pastehttps://www.instagram.com/explore/tags/<tag>/URLs instead.resultsLimit— max posts per hashtag (default50, up to2000). You pay per post.sessionCookies*(optional)* — normally left empty. Paste your own throwaway-accountsessionidcookie(s) here, one per line, to run on your own account's quota and to let the run also try therecenttab. See Coverage, cookies and rate limits.proxyConfiguration— leave the default (rotating Apify datacenter addresses). You can paste your own proxy servers instead and they are used as-is; metered residential groups are not offered by this actor.notionConnector/notionParentId— optional, deliver results to a Notion data source.
Output (one record per post)
{
"ok": true,
"type": "image",
"shortCode": "C1aBcDeFgHi",
"url": "https://www.instagram.com/p/C1aBcDeFgHi/",
"caption": "Golden hour over the fjord 🏔️ #nature #travel",
"hashtags": ["nature", "travel"],
"mentions": [],
"likesCount": 18423,
"commentsCount": 204,
"videoViewCount": null,
"displayUrl": "https://instagram.fxxx.fna.fbcdn.net/v/....jpg",
"videoUrl": null,
"images": ["https://instagram.fxxx.fna.fbcdn.net/v/....jpg"],
"isVideo": false,
"dimensions": { "height": 1080, "width": 1080 },
"ownerUsername": "wanderlust",
"ownerId": "1789456123",
"timestamp": "2026-06-21T07:14:02.000Z",
"hashtag": "nature"
}
Records look the same whichever lane produced them, and the same post is never delivered — or charged — twice in a run.
Coverage, cookies and rate limits
Runs work out of the box: the hashtag feed needs a signed-in caller, and this actor reads it through a licensed paid data source, so there is nothing for you to set up and nothing to keep alive.
Supply your own Instagram account cookie in sessionCookies when you want either of these:
- the
recenttab — the chronological feed, which the paid lane does not cover; - your own quota — a cookie run reads Instagram directly on your own account's rate limit, unaffected by this actor's per-run data-source budget (see Pricing).
When you supply a cookie it is used on its own — nothing else is mixed in — so the throughput you get is entirely yours. If Instagram refuses your cookie and the run collects nothing with it, the run falls back to the licensed source rather than handing you an empty dataset.
Getting the cookie (about a minute): log in to instagram.com on a throwaway account → F12 → Application → Cookies → copy the sessionid value → paste it into sessionCookies, one per line. Never use an account you care about: automated reading can get an account rate-limited or checkpointed, and Instagram invalidates sessions on its own schedule.
Cookie values, proxy URLs and request headers are never written to the log or the dataset. Logs carry counts, retry reasons and result totals only.
Pricing
$0.40 per 1,000 posts ($0.0004 each). Flat rate — no volume tiers, no plan gates — and you are charged only for posts actually returned.
That flat $0.40 is charged on every Apify plan, including the free one — tier-priced actors advertise the rate a top-plan account pays, not the one a new account lands on. Duplicates are removed before charging, and failed, blocked or empty runs cost nothing. Diagnostic rows — including the one that explains a run stopping early — are never charged.
Each run also carries its own budget at the licensed data source. A very large resultsLimit can reach it: when that happens the run delivers everything it already collected, adds one uncharged PARTIAL row saying it stopped and why, and finishes cleanly. Re-run to continue.
> From 19 August 2026: the per-post price stays at $0.0004, and a $0.001 run-start fee is charged once per run.
FAQ
Do I need to supply sessionid cookies? No. Instagram's hashtag feed is login-gated — there is no keyless path to it — but the actor reads it through a licensed data source, so runs work with an empty sessionCookies.
When is it worth supplying my own? When you want the run to read on your own account's quota instead of this actor's per-run data-source budget. It also lets the run try the chronological recent tab, though Instagram now restricts that feed and it frequently returns nothing.
Do I need to configure a proxy? No. Default runs need no proxy at all. If you supply your own cookie, the actor rotates its own exit addresses and hops on every block, and that is included in the run cost — or paste your own proxy servers in proxyConfiguration and they will be used exactly as given.
It returned an errorCode row — why? That's the actor telling you exactly what happened (RATE_LIMITED, BLOCKED, NOT_FOUND, SERVER_ERROR, NO_RESULTS, PARTIAL) instead of failing silently. Those rows are free. Retry, lower the volume, or check that the tag exists.
My run stopped before my limit — what happened? It reached the run's data-source budget. The posts already delivered are complete and correct, one uncharged row tells you it stopped, and a re-run continues from there.
Can I deliver to Notion? Yes — set notionConnector and notionParentId and every run lands in your Notion data source automatically.
What does a 2,000-post run cost? $0.80 for 2,000 posts returned. From 19 August 2026, $0.801 — the extra $0.001 is the run-start fee, charged once per run however many posts come back.