Instagram Hashtag Scraper - Posts and Reels
Pricing
from $0.38 / 1,000 posts
Instagram Hashtag Scraper - Posts and Reels
Scrape Instagram posts and reels by hashtag. One row per post: caption, likes, comments, video views, image and video URLs, owner, mentions and timestamp. A tag feed is the slice Instagram chooses to show, not every post ever tagged. $0.40 per 1,000 posts.
Pricing
from $0.38 / 1,000 posts
Rating
5.0
(2)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
139
Total users
63
Monthly active users
a day ago
Last modified
Categories
Share
Give it an Instagram hashtag and get the posts and reels under it as rows: caption, like and
comment counts, image and video URLs, owner, mentions and timestamp, one row per post. If you
already have /explore/tags/ links, paste those instead.
One thing to know before you start, because it changes what you should expect: a hashtag feed is a sample, not an archive. Instagram serves the slice it decides to show, which is nowhere near every post ever tagged. On the free Apify plan a run returns one page, up to 24 posts.
| Input | Hashtags, or /explore/tags/ URLs |
| Output | One row per post or reel: caption, likes, comments, video views, image and video URLs, owner, hashtags, mentions, timestamp |
| Ceiling | 2,000 posts per run |
| Account needed | None |
| Price | $0.40 per 1,000 posts on the free plan, down to $0.385 on Business. The free plan's $5 a month covers about 12,500 |
🔍 What Instagram Hashtag Scraper does
You type tags, it returns the posts sitting under them. Photos, videos and carousels all come back in the same row shape, so you can drop the lot into a sheet without branching on type.
You don't need an Instagram account or any API approval. Nothing for you to set up.
If you do have an Instagram cookie and want to use it, put it in sessionCookies. That adds the
recent tab on top of the top posts. Most people never bother and do not need to.
The same post under two of your tags is delivered once, not twice.
📋 What data you get from each Instagram hashtag post
| What you get | Field |
|---|---|
| What the post is: a photo, a video or a carousel | type, isVideo |
| Link and shortcode | url, shortCode |
| Caption, and the hashtags and handles in it | caption, hashtags, mentions |
| Likes, comments and video views | likesCount, commentsCount, videoViewCount |
| Cover image, video file and carousel frames | displayUrl, videoUrl, images, dimensions |
| Who posted it and when | ownerUsername, ownerId, timestamp |
| Instagram's alt text | accessibilityCaption |
| Which of your tags found it | hashtag |
| The tag's id and post count, when you supply a cookie | hashtagId, hashtagPostsCount |
▶️ How to scrape Instagram hashtags
- Open Instagram Hashtag Scraper and click Try for free.
- Type one or more tags into Hashtags. The
#is optional. - Set Max posts. Start at 50 while you look at the output shape.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.
Give it at least one tag. A run with nothing in either field fails rather than returning an empty dataset.
💰 How much does it cost to scrape Instagram hashtags?
$0.40 per 1,000 posts. That is the free plan's price; paid plans pay a little less: $0.395 on Starter, $0.39 on Scale and $0.385 on Business. On the free plan, the $5 Apify gives you each month covers about 12,500 posts. On the free plan a run stops after one page and says so in a free row; a paid plan gets the full run.
You pay per post delivered. The same post found under two of your tags is billed once. Diagnostic rows and a tag that returns nothing cost you nothing.
📥 What you give it
{"hashtags": ["coffee", "latteart"],"resultsLimit": 50}
| Field | Default | What it is |
|---|---|---|
hashtags | none | Tags with or without the #. No spaces, slashes or punctuation inside a tag. |
startUrls | none | Or paste /explore/tags/… URLs. Either works, and you can mix them. |
resultsLimit | 50 | Posts for the whole run, not per tag. 1 to 2,000. This is also your spend cap. |
sessionCookies | none | Optional. Your own Instagram cookie, which also gets you the recent tab. |
proxyConfiguration | none | Leave it alone unless you have your own servers to use. |
notionConnector, notionParentId | none | Optional. Write each post into a Notion database as well as the dataset. |
📤 What you get back
A real row from a run on 20 September 2026, with the long media links cut short so the block stays readable:
{"ok": true,"type": "video","shortCode": "DdgWc82xb8n","url": "https://www.instagram.com/p/DdgWc82xb8n/","caption": "#xingxing #monkey #nature #wildlife #monkeylife","hashtags": ["xingxing", "monkey", "nature", "wildlife", "monkeylife"],"mentions": [],"likesCount": 906,"commentsCount": 33,"videoViewCount": 7801,"displayUrl": "https://instagram.frix7-1.fna.fbcdn.net/v/t51.82787-15/...","videoUrl": "https://instagram.frix7-1.fna.fbcdn.net/o1/v/t2/f2/m86/...","images": ["https://instagram.frix7-1.fna.fbcdn.net/v/t51.82787-15/..."],"isVideo": true,"dimensions": null,"ownerUsername": "cutexingxing","ownerId": "44976210570","timestamp": "2026-09-20T10:18:08.000Z","accessibilityCaption": null,"hashtag": "nature"}
| Field | How to read it |
|---|---|
hashtag | Which of your input tags produced this row. Handy when you asked for several. |
shortCode | Unique per post. Use it as your dedupe key across runs. |
videoViewCount | 0 on stills. |
displayUrl, videoUrl, images | Direct links. Signed and time limited, so download anything you want to keep. |
dimensions, accessibilityCaption | null when Instagram did not supply them for that post, as above. Nothing is guessed or padded. |
🧾 Reading the output
Three kinds of row can land in your dataset, and only the first kind costs anything.
| Row | How to spot it | Charged |
|---|---|---|
| A real post | ok: true and a shortCode | yes |
| A sample post | _sample: true, charged: false | no |
| A diagnostic | ok: false and an errorCode | no |
Filter on ok == true and drop any row carrying _sample: true, and you have your posts. The
errorCode on a diagnostic row tells you what happened:
| Code | What it means |
|---|---|
NO_RESULTS | The tag came back empty. It may be new, misspelled or restricted. |
FREE_PLAN_LIMIT | You are on the free Apify plan, so the run read only part of your input. hashtagsNotRead lists what it skipped. A paid plan gets the full run. |
PARTIAL | The run stopped early on that tag, either because it reached the most posts one run can collect or because posts stopped coming. What arrived is complete and charged. A new run starts again from the top. |
NOT_FOUND | No such tag. |
RATE_LIMITED | Too much traffic on that tag just now. Try again shortly. |
AUTHENTICATION_FAILED | The tag could not be read this time. If you supplied a cookie, check it is still valid. |
NOT_SERVED | This post was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
SERVER_ERROR, NETWORK | Instagram was unreachable or answered badly. Re-run it. |
TIME_LIMIT | The run reached its time limit and stopped on its own. The posts delivered before that are complete and charged. Give the run more time, or ask for fewer posts, to get the rest. |
A diagnostic row never bills you. It doesn't fail the run either, unless the time limit stopped the run before
any post came back: that run ends as failed, with a TIME_LIMIT row saying so.
💡 What people use it for
- Watching a niche tag for a week to see which accounts keep showing up in it.
- Pulling a few thousand captions to find out what wording actually gets engagement in a category.
- Building a shortlist of creators posting under a branded or event tag, then checking them by hand.
From a tag to a shortlist of creators, in three steps:
- Run this on a tag in your niche and copy the
ownerUsernamecolumn. - Paste those handles into
Instagram Profile Scraper and sort on
followersCount. - For the accounts worth a closer look, run Instagram Scraper on their usernames to see everything on their grid.
🚧 What it does not do
- No comments. This returns posts. Comments are a separate actor, linked below.
- A tag feed is a sample. Instagram decides what to show, so you get a slice rather than the full history of a tag, however high you set the limit.
- A big ask can stop early. A run that asks for thousands can reach the most posts one run can
collect and stop there with a
PARTIALrow. The posts delivered are complete and charged, and a new run starts again from the top. - Media URLs expire. They are signed links, not permanent addresses.
- No private accounts. Public posts on public tags, nothing else.
- The recent tab needs your own cookie. Without one you get the top posts for a tag.
- An empty run fails rather than returning an empty dataset. Give it at least one tag.
- It is not an official Instagram tool. Dami's Studio is independent and is not affiliated with or endorsed by Instagram or Meta, or by any other company named on this page.
🧭 Which Instagram scraper do you need?
| If you want | Use |
|---|---|
| Posts under a hashtag | This one |
| Everything one profile has posted | Instagram Scraper |
| Bio and counts for the accounts behind those posts | Instagram Profile Scraper |
| One post or reel you already have the link for | Instagram Post Scraper |
| Comments under a post or reel | Instagram Comments Scraper |
| Reels found by keyword or hashtag | Instagram Reels Search |
| Posts tagged at a place | Instagram Location Scraper |
| Videos under a TikTok hashtag | TikTok Hashtag Scraper |
❓ Questions people ask
Do I need an Instagram account to scrape hashtags?
No. Nothing to paste. The cookie field is optional and only adds the recent tab.
Will I get every post ever tagged?
No. Instagram publishes a curated slice of a tag feed. You get what it serves.
Is resultsLimit per tag or per run?
Per run. Ask for 100 across three tags and you get 100 posts in total, not 300.
Why do the numbers differ from what I see in the app?
The app shows a tag's feed to you, signed in, and it shifts by the hour. Open the tag in a private browser window: what a logged-out visitor sees there is closer to what a run reads. Likes and comments are a snapshot at read time.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has
ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP
client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/instagram-hashtag-scraper.
Either way the run happens on your Apify account at the same price.
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. Include the hashtag you used and the run ID, and the log is enough for us to see what happened.