How to Search Instagram by Hashtag Without Logging In
Try searching a hashtag on Instagram right now without being logged in. You can't really. You'll get a wall asking you to sign in, and even once you're in, the hashtag page is a slow, endless scroll that's awful to pull anything useful out of.
That's a problem if your job is to watch what people post under a tag. Maybe you're tracking a campaign hashtag, scouting creators in a niche, or just trying to see what's catching on before it's obvious. Opening a logged-in browser tab and scrolling by hand doesn't scale past about five minutes of patience.
So here's a way to get public posts and reels for a hashtag with code, no account required. I'll show the workflow, the real fields you get back, and, because it matters, the parts where it won't magically do everything.
Why hashtag search got harder
Instagram has spent the last couple of years quietly moving things behind authentication. Hashtag browsing is one of them. The tag pages still exist, and individual public posts are still, well, public, they show up in Google, they open without a login if you have the direct link. What went away is the easy, open front door for browsing a tag.
The workaround leans on that gap. Instead of hitting Instagram's login-gated search, you find the posts Google has already indexed under a hashtag, then read those public pages. It's public data the whole way through, and it skips the sign-in wall entirely. The tradeoff, and there's always a tradeoff, is that you're working from what Google has indexed, not a live firehose of every post in the last thirty seconds. More on that below, because it shapes how you should use this.
Pulling a hashtag with code
We'll use SociaVault for this since it returns clean JSON and handles the Google-plus-public-page dance for you. Grab a key from the dashboard (new accounts get 50 free credits, enough to test this properly).
const API_KEY = process.env.SOCIAVAULT_API_KEY;
const BASE = "https://api.sociavault.com/v1";
async function searchHashtag(hashtag, opts = {}) {
const params = new URLSearchParams({ hashtag });
if (opts.mediaType) params.set("media_type", opts.mediaType); // "all" or "reels"
if (opts.datePosted) params.set("date_posted", opts.datePosted); // e.g. "last-week"
if (opts.cursor) params.set("cursor", opts.cursor);
const res = await fetch(
`${BASE}/scrape/instagram/search/hashtag?${params.toString()}`,
{ headers: { "x-api-key": API_KEY } },
);
const json = await res.json();
if (!json.success) throw new Error(json.error);
return json.data;
}
const data = await searchHashtag("football", {
mediaType: "all",
datePosted: "last-week",
});
const posts = Object.values(data.posts ?? {});
console.log(`Got ${posts.length} posts. Next page: ${data.cursor}`);
The # is optional, pass football or #football, both work. Results come back under data.posts keyed by index ("0", "1", and so on), which is why we run it through Object.values to get a normal array.
What you actually get back
This is the part people underestimate. It's not just a list of links, each post carries real engagement and creator data. Here's a single reel from the #football results, trimmed to the fields you'll actually use:
{
"shortcode": "DadAT-ZMUSL",
"url": "https://www.instagram.com/reel/DadAT-ZMUSL/",
"caption": "⚽️❤️🩹 #football #explorepage #trending",
"is_video": true,
"product_type": "clips",
"video_play_count": 230155,
"video_view_count": 98748,
"like_count": 18962,
"comment_count": 38,
"taken_at": "2026-07-06T13:42:44.000Z",
"owner": {
"username": "ameyranawade04",
"is_verified": true,
"follower_count": 118495
}
}
So for one hashtag query you're getting the shortcode and direct URL, the caption (hashtags included), whether it's a reel, play and view counts, likes, comment count, when it was posted, and the creator's handle, verification status, and follower count. That reel pulled 230k plays and nearly 19k likes from a verified account with ~118k followers. That's enough to rank what you found by engagement, spot which creators are driving the tag, or flag anything punching above its follower weight, without opening Instagram once.
A quick pass to sort a niche by who's actually landing:
const ranked = posts
.map((p) => ({
user: p.owner?.username,
followers: p.owner?.follower_count ?? 0,
likes: p.like_count ?? 0,
plays: p.video_play_count ?? null,
url: p.url,
}))
.sort((a, b) => b.likes - a.likes);
console.table(ranked.slice(0, 10));
Read fields defensively like that (?. and ??), Instagram's payload shifts between photos and reels, and a photo post won't have video_play_count. Log a raw response once to confirm what you're getting for your specific tag before you build on it.
Reels only, and narrowing by recency
Two filters do most of the heavy lifting.
Set media_type to reels when you only care about video, which is most of the time now if you're chasing trends:
const reels = await searchHashtag("skincare", { mediaType: "reels" });
And date_posted limits results to what Google indexed inside a recent window, last-hour, last-day, last-week, last-month, or last-year. If you're monitoring a live campaign, last-day keeps the noise down. If you're doing a broader landscape sweep, leave it off and take everything.
Paginating
There's a small quirk worth knowing: the cursor here is the next Google results page number, not one of those opaque base64 tokens. So the first response hands you cursor: "2", and you pass that back to get the next batch.
async function collect(hashtag, pages = 3) {
let all = [];
let cursor;
for (let i = 0; i < pages; i++) {
const data = await searchHashtag(hashtag, { mediaType: "all", cursor });
all.push(...Object.values(data.posts ?? {}));
cursor = data.cursor;
if (!cursor) break;
await new Promise((r) => setTimeout(r, 400)); // don't hammer it
}
return all;
}
Cap the pages. There's no prize for pulling forty pages of a tag in a tight loop, you'll just burn credits and hit thinner, older results.
The honest limits
I'd rather you know these going in than be annoyed later.
- It's Google-indexed public data, not a real-time stream. Brand-new posts from the last few minutes may not be indexed yet. This is great for "what's been posted under this tag lately," not for "alert me the instant someone posts."
- Coverage varies by hashtag. Huge tags return plenty; tiny or brand-new ones may return little simply because Google hasn't indexed much.
- Public posts only. Private accounts, and anything Instagram hides behind the login wall, are out of scope by design. That's the point, it keeps this on public data.
- Fields differ by media type. Photos, carousels, and reels don't return identical shapes. Handle missing fields instead of assuming.
None of that is a dealbreaker for the common jobs, competitor tracking, creator discovery, trend research, but it does mean you should treat this as a smart, fast sweep of public content rather than a complete census of a hashtag.
What people build with it
A few things that come up a lot:
- Creator discovery. Search a niche tag, sort by engagement, and you've got a shortlist of creators already making content in your space, with follower counts attached. Pair it with a way to find their contact details and you've got the start of an outreach list.
- Campaign monitoring. Track your branded hashtag on a schedule and watch who's posting, how it's performing, and whether the volume is climbing.
- Trend research. See what formats and captions are landing under a tag before the trend is common knowledge. This pairs well with the broader approach in finding trending content on any platform.
Frequently Asked Questions
Can you search Instagram hashtags without an account?
Yes. This approach reads public posts that Google has indexed under a hashtag, so it doesn't require an Instagram login or account. It only ever touches publicly visible content.
How do I get only reels for a hashtag?
Set the media_type parameter to reels. Leave it as all (the default) to get both posts and reels. Reels come back with product_type of clips and include play and view counts.
Can I limit results to recent posts?
Use date_posted with one of last-hour, last-day, last-week, last-month, or last-year. It restricts results to what Google indexed within that window, which is handy for monitoring an active campaign.
Is this real-time?
Not exactly. Because it relies on Google's index of public Instagram pages, there's a lag before brand-new posts show up. It's built for "what's been posted under this tag recently," not instant alerts.
Is it legal to search Instagram hashtags this way?
It reads publicly available data, the same posts anyone can open without logging in. As always, how you use the data matters more than how you collect it: respect people's privacy, and don't repurpose personal data in ways they wouldn't expect.
How many credits does a hashtag search cost?
One credit per request, and each request returns a page of results. Paginating through three pages costs three credits. New accounts start with 50 free credits, so you can test a few tags before paying anything.
Wrapping up
Instagram made hashtag browsing annoying on purpose. The way around it isn't to fight the login wall, it's to read the public posts that are already out there and indexed, then let code do the sorting you'd never do by hand. Pull a tag, rank it by engagement, filter to reels or the last week, and you've got a genuinely useful view of a hashtag in a few seconds.
Want to try it on your own hashtags? Start free with SociaVault, 50 credits, no card, and run your first search in a couple of minutes.
Related Articles
Found this helpful?
Share it with others who might benefit
Ready to Try SociaVault?
Start extracting social media data with our powerful API. No credit card required.