Instagram Hashtag Scraper: posts, reels and engagement
Instagram Hashtag Scraper collects public posts and reels from any hashtag, with their likes, comments, captions, author and location.
Free Apify plan: 5 runs a month, 10 items a run. No credit card.
- $0.016
- per hashtag, first 60 items in
- $0.0004
- per item after the first 60
- 3,430
- users on Apify · 3.4 from 16 reviews
- 99.7%
- run success, last 30 days
Read on 21 September 2026.
What changes your results and your bill?
Pointing the scraper at a tag costs $0.016 either way you do it, and 60 items come with that fee. The two switches below are what actually decide the contents: which formats come back, and how far back the run reaches.
keyword$0.016per query
60 items included
You know the tag. Type it without the # symbol and the scraper searches Instagram for it.
streetphotographystartUrls$0.016per URL
60 items included
You want exact tag pages, several at once. Each URL is its own query.
instagram.com/explore/tags/cats/The one that surprises people
getPosts · getReelsposts onreels off
Schema default
Posts are on by default and reels are off, so a default run returns no reels at all.
getReels: trueuntilYYYY-MM-DDnewer than this
Posts-only for accuracy
Stops the run at a date instead of an item count. Built for campaign and trend windows.
2026-09-01
Every item past the first 60 of a query costs $0.0004, whichever input pointed the run at the tag. maxItems is the hard spending limit: budget ÷ $0.0004 is what you can afford.
| Apify actor | apidojo/instagram-hashtag-scraper |
|---|---|
| Inputs | keyword · startUrls · getPosts · getReels · until · maxItems · customMapFunction |
| Returns | One record per post or reel, with author, media, location and hashtags |
| Formats | Posts and reels. Stories are not returned |
| Date filter | until (YYYY-MM-DD), reliable on posts-only runs, approximate with reels |
| Login or proxy | Neither. Public hashtag pages only |
| Reliability | 99.69% of 73,983 runs succeeded in the last 30 days |
| Free plan | 5 runs a month, 10 items per run |
Which hashtag job are you running?
Instagram Hashtag Scraper runs 3 jobs: pull a hashtag’s recent posts, pull its reels instead, or reach back to a date for a campaign window. All three bill the same way, $0.016 a query with the first 60 items included.
How do you pull the posts on an Instagram hashtag?
Put the tag in keyword without the # symbol, or paste explore/tags/ URLs into startUrls. Each query costs $0.016 with the first 60 items included, then $0.0004 per item. A 1,000-post run from one hashtag costs $0.39.
Input
{
"keyword": "streetphotography",
"getPosts": true,
"getReels": false,
"maxItems": 1000
}$0.016 + 940 × $0.0004=$0.39
What comes back
The post record, Around 18 fields, including the caption, every hashtag in it, and the author object.
{
"id": "3245142029192513970_62815273217",
"code": "C0JD3tntcmy",
"url": "https://www.instagram.com/p/C0JD3tntcmy/",
"createdAt": "2023-11-27T07:48:34.000Z",
"likeCount": 114,
"commentCount": 5,
"isPaidPartnership": false,
"caption": "#dogs #love Na zajęciach z Pomkami…",
"hashtags": ["dogs", "love", "pomeranian"],
"owner": { "username": "jogi.lapki.bydgoszcz", "isVerified": false }
}Three searches beat one search three times over
Every query carries its own 60 included items, so "streetphotography", "urbanphoto" and "cityscape" as three queries return 180 items inside the fee where one query returns 60. Batch related tags into startUrls rather than running them separately.
How do you scrape Instagram reels from a hashtag?
Set getReels to true. It is off by default in the input schema, so a run left alone returns posts only. Turn getPosts off in the same run to get reels and nothing else, with playCount and duration on every one.
Input
{
"keyword": "grwm",
"getPosts": false,
"getReels": true,
"maxItems": 500
}$0.016 + 440 × $0.0004=$0.19
What comes back
The same record, video filled in, isVideo turns true and the video object carries the play count, duration and file.
{
"isVideo": true,
"isCarousel": false,
"video": {
"id": "235268832770811v",
"url": "https://scontent-fra5-1.cdninstagram.com/…mp4",
"width": 1078,
"height": 1916,
"duration": 28.281,
"playCount": 3321
}
}Reels are off by default
The input schema prefills getReels to false, so the most common first-run surprise is a dataset with no reels in it. The actor’s README table says the default is true; the schema is what the form loads, and the schema says false. Set both switches explicitly on any run you care about.
How do you scrape only recent posts from a hashtag?
Set until to a date in YYYY-MM-DD form and the run returns only items created on or after it. That turns a hashtag into a campaign window, and it is how you track a launch tag without paying for a year of history.
Input
{
"startUrls": ["https://www.instagram.com/explore/tags/cats/"],
"getPosts": true,
"getReels": false,
"until": "2026-09-01"
}$0.016 + items past 60 × $0.0004=From $0.016
What comes back
The post record, Identical to any other run. createdAt is the field the filter works on.
{
"createdAt": "2026-09-14T08:12:09.000Z",
"likeCount": 2841,
"commentCount": 96,
"isPaidPartnership": true,
"location": {
"name": "Bydgoszcz, Poland",
"lat": 53.1222,
"lng": 17.9986
}
}Accurate on posts, approximate on reels
The schema is explicit: until works most reliably with getPosts true and getReels false, because posts come back in date order. Mix reels in and the ordering is only roughly by date, so a few items near the cutoff can fall on the wrong side of it.
What comes back for each post?
Every run returns one record per post or reel, in a single shape of around 18 fields. They group into 4 things: the post, its engagement, who published it, and where and what it was.
7
The post
Always present
- id, code, url
- createdAt
- caption
- hashtags[]
- isPinned, isPaidPartnership
3
Engagement
Subject to creator settings
- likeCount
- commentCount
- video.playCount on reels
- isLikeAndViewCountsDisabled
6
Author
owner, plus coowners on collabs
- owner.username, owner.id
- owner.fullName
- owner.profilePicUrl
- owner.isVerified, isPrivate
- coowners[] on collab posts
5
Media and place
Depends on the post type
- isVideo, isCarousel
- video{ url, duration, playCount }
- image{ url, width, height }
- location{ name, lat, lng }
id · code | Internal ID and the shortcode in the post URL |
|---|---|
url | Permalink to the post or reel |
createdAt | Publish time, ISO 8601. What until filters on |
caption | Full caption text including the hashtags as written |
hashtags | Every hashtag in the caption, parsed into an array |
likeCount · commentCount | Engagement at the time of the run |
isLikeAndViewCountsDisabled | True where the creator hid their counts |
isPaidPartnership | Instagram’s own paid-partnership flag |
isPinned | Pinned to the top of the author’s profile |
owner | id, username, fullName, profilePicUrl, isPrivate, isVerified |
coowners | The other accounts on a collab post, same shape as owner |
isVideo · isCarousel | Which of the three post types this is |
video | id, url, width, height, duration, playCount |
image | url, width, height |
location | id, name, slug, address, city, lat, lng where tagged |
Reshape any of these with customMapFunction, a JavaScript function that receives one object and returns one object. Reshaping is fine; dropping records is not, and doing it can get the account restricted.
What can catch you out?
Six things decide whether a run returns what you expected. Four are Instagram’s doing; two are switches this actor ships in a particular position.
- 01
Reels are off by default
getReels prefills to false in the input schema, so a default run returns posts only. The README’s table disagrees and says true; the schema is what the form loads. Set both switches explicitly.
- 02
until is exact only without reels
Posts come back in date order, so the cutoff is clean. With reels in the mix results are only roughly ordered, and items near the boundary can land on the wrong side.
- 03
Each query includes 60 items, not each run
Five hashtags in one run carry 300 included items between them. One hashtag carries 60, however many items you ask for.
- 04
No # in the keyword
The field takes the tag text alone. Hashtag URLs use the explore/tags/ form: instagram.com/explore/tags/cats/.
- 05
Engagement counts can be hidden
Creators can hide likes and views. Those records come back with isLikeAndViewCountsDisabled true, and the counts are not reliable on them.
- 06
Stories are never returned, and neither is anything private
The scraper reads public hashtag pages with no login and no cookies. Posts and reels only.
The free Apify plan caps you at 5 runs a month, 10 items apiece.
What does one hashtag cost to pull?
A run costs $0.016 per hashtag query plus $0.0004 for every item past the first 60 that query includes. Ten thousand posts from one hashtag cost $3.99.
| Run | Method | Calculation | Cost |
|---|---|---|---|
| 60 items | 1 hashtag | $0.016 | $0.016 |
| 500 items | 1 hashtag | $0.016 + 440 × $0.0004 | $0.19 |
| 1,000 items | 1 hashtag | $0.016 + 940 × $0.0004 | $0.39 |
| 10,000 items | 1 hashtag | $0.016 + 9,940 × $0.0004 | $3.99 |
| 300 items | 5 hashtags | 5 × $0.016 | $0.08 |
| 2,000 items | 5 hashtags | 5 × $0.016 + 1,700 × $0.0004 | $0.76 |
| 20 tags × 500 items, weekly | 20 hashtags × 4 | 80 × $0.016 + 35,200 × $0.0004 | $15.36 |
Computed from the query fee and per-item price the Apify Store API reports. The actor’s own "5 hashtags, 2,000 posts" example reads $0.86 while stating the right breakdown beside it, 5 queries and 1,700 additional items, which is $0.76. Its other three examples check out.
Who scrapes Instagram hashtags, and why?
Instagram Hashtag Scraper is used by 6 kinds of team: social media managers, agencies, brand monitors, e-commerce researchers, influencer marketers and academic researchers. The three jobs below map onto them almost one to one.
Social media managers
Research a hashtag, weekly
Track which tags are carrying reach, and pull content ideas from what is performing under them
$0.39 per 1,000 posts
Digital marketing agencies
Since a date, per campaign tag
Measure a campaign hashtag inside its own window and report reach per client without paying for history
From $0.016 per tag
Brand monitoring
Research a hashtag, on brand terms
Watch brand and competitor tags, and read captions for sentiment around a launch
$0.76 per 5 tags, 2,000 posts
E-commerce and product research
Research a hashtag, on product tags
Find trending products and read what buyers say in captions before committing stock
$3.99 per 10,000 posts
Influencer marketing
Get the reels, on niche tags
Find creators by the tags they post under, and use isPaidPartnership to see who already takes brand work
$0.19 per 500 reels
Academic researchers
Since a date, across many tags
Build dated corpora of captions and hashtags for sentiment and trend analysis
$15.36 per 20 tags, monthly
How do you call it from code?
The actor is apidojo/instagram-hashtag-scraper. Build a run in the web form, copy the input JSON, and the REST API or either official client will take it unchanged.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
# Posts only, so the date cutoff is exact
run = client.actor("apidojo/instagram-hashtag-scraper").call(run_input={
"keyword": "streetphotography",
"getPosts": True,
"getReels": False,
"until": "2026-09-01",
"maxItems": 1000,
})
for post in client.dataset(run.default_dataset_id).iterate_items():
# Counts are unreliable where the creator hid them
hidden = post["isLikeAndViewCountsDisabled"]
print(post["createdAt"], post["owner"]["username"],
"hidden" if hidden else post["likeCount"])import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
// Five tags in one run: five query fees, 300 items included between them
const run = await client.actor('apidojo/instagram-hashtag-scraper').call({
startUrls: [
'https://www.instagram.com/explore/tags/cats/',
'https://www.instagram.com/explore/tags/kittens/',
],
getPosts: true,
getReels: true,
maxItems: 2000,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const sponsored = items.filter((p) => p.isPaidPartnership);
console.log(sponsored.length, 'paid partnerships of', items.length);curl -X POST \
"https://api.apify.com/v2/acts/apidojo~instagram-hashtag-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keyword":"grwm","getPosts":false,"getReels":true,"maxItems":500}'Runs write to an Apify dataset you can download or poll. Every key used above appears in the actor’s input schema. Nothing here is guesswork.
Instagram Hashtag Scraper FAQ
How much does it cost to scrape an Instagram hashtag?
One hashtag query costs $0.016 and includes the first 60 posts or reels. Items past 60 cost $0.0004 each, so 1,000 items from one tag cost $0.39 and 10,000 cost $3.99.
Why did my run return no reels?
getReels is off by default in the input schema, so a run left alone returns posts only. Set getReels to true, and set getPosts to false if you want reels alone.
Can I scrape only recent posts from a hashtag?
Yes. Set until to a date in YYYY-MM-DD form and only items created on or after it come back. Keep the run posts-only for an exact cutoff, because those results are returned in date order.
Do I include the # symbol in the keyword?
No. The keyword field takes the tag text on its own. If you prefer URLs, use the explore/tags/ form in startUrls instead.
Does it return the post’s location?
Where the author tagged one, yes. The location object carries the place name, slug, city and latitude and longitude.
Can I tell which posts are sponsored?
Every record carries isPaidPartnership, Instagram’s own flag. It is the fastest way to see which creators under a tag already take brand work.
Why are some like counts missing?
Creators can hide likes and view counts. Those records come back with isLikeAndViewCountsDisabled set to true, and the counts on them are not reliable.
Can I try Instagram Hashtag Scraper without paying?
Demo mode on the free Apify plan allows 5 runs a month at 10 items each, no card required. That is enough to check one tag and see whether reels are coming back.
Where Instagram Hashtag Scraper fits
Parent scraper
Instagram Scraper
The general Instagram scraper: six URL types in one actor, billed flat at $0.49 per 1,000 posts with nothing included. Reach for it when a run needs more than one kind of source; this one does a single thing and puts 60 items inside the query fee.
Sibling scrapers
- InstagramInstagram Profile Scraper
- InstagramInstagram Comments Scraper
- InstagramInstagram Location Scraper
Guides
- Finding the hashtags a competitor actually ranks underComing soon
- Measuring a campaign hashtag inside its own windowComing soon
- Posts or reels: which a hashtag really rewardsComing soon
Run it on one hashtag
$0.016, and the first 60 posts are in the price.
keyword: "streetphotography" · getReels: true
Apidojo is not affiliated with Meta Platforms, Inc.