Instagram Hashtag Scraper - Posts and Reels, No Login
Pricing
from $0.40 / 1,000 post returneds
Instagram Hashtag Scraper - Posts and Reels, No Login
Scrape Instagram posts and reels by hashtag. Rows have the caption, likes, comments, image and video URLs, owner, mentions and timestamp. No Instagram account or cookie needed from you. $0.40 per 1,000 posts, flat on every plan.
Pricing
from $0.40 / 1,000 post returneds
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
81
Total users
52
Monthly active users
2 days ago
Last modified
Categories
Share
Instagram Hashtag Scraper: posts and reels for any tag, no account needed
Give it a hashtag, get the posts back 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. No scraper changes that.
| Input | Hashtags, or /explore/tags/ URLs |
| Output | One row per post or reel |
| Ceiling | 2,000 posts per run |
| Account needed | None from you |
| Price | $0.40 per 1,000 posts, flat on every plan |
🔍 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.
Instagram keeps hashtag feeds behind a login, and you do not have to deal with that. No account, no cookie, no app review, no business API approval. Nothing for you to set up and nothing that expires next week.
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 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 | Apify default | 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. |
Give it at least one tag. A run with nothing in either field fails rather than returning an empty dataset.
📤 What you get back
A real row from a recent run, with the long CDN URLs 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 | What it is |
|---|---|
type | image, video or carousel. |
hashtag | Which of your input tags produced this row. Handy when you asked for several. |
hashtags, mentions | Parsed out of the caption for you, without the # or @. |
shortCode | Unique per post. Use it as your dedupe key across runs. |
videoViewCount | 0 on stills. |
displayUrl, videoUrl, images | Direct CDN links. Signed and time limited, so download anything you want to keep. |
Anything Instagram did not supply on a given post comes back null, as dimensions and
accessibilityCaption do 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 |
| The sample row | _sample: true | no |
| A diagnostic | ok: false and a code | no |
Filter on ok == true and you have your posts.
The code 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. |
PARTIAL | The run delivered some posts for that tag and then stopped early. What arrived is complete and correct. |
NOT_FOUND | No such tag. |
RATE_LIMITED | Too much traffic on that tag just now. Try again shortly. |
BLOCKED, AUTHENTICATION_FAILED | The tag could not be read this time. If you supplied a cookie, check it is still valid. |
SERVER_ERROR, NETWORK | Instagram was unreachable or answered badly. Re-run it. |
A diagnostic row never fails the run and never bills you.
▶️ How to run it
- 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.
💰 How much does it cost?
$0.40 per 1,000 posts. Flat on every Apify plan, no volume tiers.
You pay per post delivered. The same post found under two of your tags is billed once. Sample rows, diagnostic rows and a tag that returns nothing cost you nothing.
💡 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.
- Feeding image and video URLs into a labelling pipeline, where the caption doubles as a weak label.
🚧 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 may deliver fewer and write a
PARTIALrow. You are charged only for what arrived. - Media URLs expire. They are signed CDN 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.
🧭 Which Instagram scraper do you need?
| If you want | Use |
|---|---|
| Posts under a hashtag | This one |
| Everything one profile has posted | 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 | Instagram Reels Search |
| Posts tagged at a place | Instagram Location Scraper |
❓ Questions people ask
Do I need an Instagram account? No. Nothing to paste, nothing to keep alive. The cookie field is optional and only adds the recent tab.
Will I get every post ever tagged? No, and nothing can. 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.
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.
Can I run it on a schedule? Yes. Use Apify's scheduler, or start it from the API and read the dataset when it finishes.
What if a tag has nothing? You get a free labelled row saying so. The run succeeds and no posts are billed.
🆘 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.