# Instagram Hashtag Scraper - Reels & Keyword Search (`socialscrapers/instagram-hashtag-scraper`) Actor

Instagram hashtag scraper and keyword search: get the top public reels and video posts for any hashtag or keyword, with caption, plays/views, likes, comments, date, creator account, location and sound. No login, no cookies. Export via API, JSON or CSV. $0.25 per 1,000 reels.

- **URL**: https://apify.com/socialscrapers/instagram-hashtag-scraper.md
- **Developed by:** [Social Scrapers](https://apify.com/socialscrapers) (community)
- **Categories:** Social media, Marketing
- **Features:** Limited permissions
- **Stats:** 3 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.20 / 1,000 reels

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**Instagram Hashtag Scraper** gets the top public reels for any Instagram hashtag or keyword, with no Instagram account, login or cookies. Enter hashtags like `sourdough` or keywords like `running shoes` and get each reel's caption, hashtags, mentions, plays, likes, comments count, posting date, creator, location, sound, cover image and video URL, as JSON, CSV or Excel. It costs **$0.25 per 1,000 reels**.

### What does Instagram Hashtag Scraper do?

Instagram Hashtag Scraper reads what Instagram shows a visitor who opens a hashtag link without logging in: the top reels for that hashtag or keyword, ranked by Instagram. For each reel it then reads the reel's own page for the full details. You can:

- 🔎 **Scrape Instagram hashtags and keywords**: `#hiking`, `sourdough`, `running shoes`, `skincare routine`, or hashtag links such as `https://www.instagram.com/explore/tags/hiking/`.
- 📈 **See what performs**: play count, likes and comments count of every top reel, with its rank for the hashtag.
- 👤 **Find creators**: the account behind each reel, its verified badge, tagged accounts and collaborators.
- 🗓️ **Filter by date**: keep only reels posted after a date or within the last days, weeks or months.
- ⚡ **Go fast or go deep**: turn reel details off for the fastest run with what the hashtag feed shows.
- 💸 **Pay only for results**: hashtags with no reels, and reels left out by your filters, cost nothing.

Everything the Apify platform gives you comes with it: the Apify API, scheduled runs, webhooks, integrations with Make, Zapier, n8n and Google Sheets, and datasets you can download in any format.

### What data can you extract from Instagram hashtags?

| Field | What it is |
|---|---|
| `searchTerm`, `position` | The hashtag or keyword that found the reel, and the reel's rank for it |
| `shortCode`, `url`, `id`, `type`, `productType` | The reel's code, link, media id and type |
| `caption`, `hashtags`, `mentions` | Caption text, hashtags and @mentions in it |
| `videoPlayCount`, `likesCount`, `commentsCount` | Plays, likes and comments |
| `timestamp`, `videoDuration` | When it was posted (UTC) and its length in seconds |
| `ownerUsername`, `ownerFullName`, `ownerId`, `ownerIsVerified`, `ownerProfilePicUrl` | The creator |
| `taggedUsers`, `coauthorProducers`, `isPaidPartnership`, `sponsors` | Tagged accounts, collaborators and brand partnerships |
| `locationName`, `locationId` | The tagged location |
| `musicInfo` | The sound: a licensed track or the creator's original audio |
| `displayUrl`, `videoUrl`, `dimensionsWidth`, `dimensionsHeight` | Cover image, video file and size |
| `hasDetails`, `scrapedAt` | Whether the reel's own details were read, and when |

The **Overview**, **Creators** and **Content** views of the dataset show the most useful columns as a table.

### How to scrape Instagram hashtags

1. Open Instagram Hashtag Scraper and click **Try for free**.
2. In **Hashtags or keywords**, add one or more hashtags (with or without `#`) or keywords.
3. Set **Max reels per hashtag or keyword**, or `0` for every reel Instagram shows.
4. Optionally set **Only reels posted after** to keep recent reels only.
5. Click **Start**. Reels appear in the dataset as they are read.
6. Download the results as JSON, CSV, Excel or HTML, or read them with the Apify API.

### How much does it cost to scrape Instagram hashtags?

You pay per reel saved: **$0.25 per 1,000 reels**. Platform usage and proxies are included. On Apify's Silver plan the price drops to $0.225 per 1,000 reels, and on Gold to $0.20.

- 3 hashtags × 50 reels = 150 reels → **about $0.04**
- 100 hashtags × all their reels (about 7,000 reels) → **about $1.75**

Hashtags with no reels, reels skipped by the date filter and reels already saved for an earlier hashtag in the same run cost nothing. To cap the cost of a run, set **Maximum cost per run** in the run options: the scraper saves reels until the next one would go over it, then stops cleanly. Apify's free plan includes monthly platform credit, enough to try the scraper on thousands of reels.

### Input example

```json
{
  "hashtags": ["sourdough", "running shoes", "https://www.instagram.com/explore/tags/hiking/"],
  "resultsLimit": 20,
  "includeDetails": true,
  "onlyPostsNewerThan": "3 months"
}
```

| Field | Type | Description |
|---|---|---|
| `hashtags` | array of strings | Hashtags with or without `#`, keywords of several words, or Instagram hashtag links. Each is searched separately; several hashtags on one line (`#sourdough #bread`, or separated by commas) are searched one by one. |
| `resultsLimit` | integer | Reels to save for each hashtag or keyword, best ranked first. `0` saves every reel Instagram shows. Default: 20. |
| `includeDetails` | boolean | Read each reel's own page for likes, comments count, exact date, location, sound and tagged accounts. Default: `true`. |
| `onlyPostsNewerThan` | string | Only reels posted after a date (`2026-01-31`, `31/01/2026`, `Jan 31 2026`) or within an age (`7 days`, `2w`, `3 months`, `yesterday`). |
| `proxyConfiguration` | object | The scraper picks Apify Proxy's tier itself: datacenter first, residential only when Instagram refuses a request. Your own proxy URLs are used as given. |

### Output example

One item per reel (shortened):

```json
{
  "searchTerm": "nba",
  "position": 4,
  "id": "4024904159194488233",
  "type": "Video",
  "productType": "clips",
  "shortCode": "DfbVQIHx52p",
  "url": "https://www.instagram.com/p/DfbVQIHx52p/",
  "caption": "@lukadoncic MAGIC to end the 1H! 🪄 POR-LAL | West Group C @emirates NBA CUP • LIVE NOW on PRIME <link in bio>",
  "hashtags": [],
  "mentions": ["lukadoncic", "emirates"],
  "likesCount": 296026,
  "commentsCount": 2791,
  "videoPlayCount": 5565829,
  "videoDuration": 17.5,
  "timestamp": "2026-11-07T04:33:54.000Z",
  "displayUrl": "https://scontent-dfw6-1.cdninstagram.com/v/t51.82787-15/...",
  "videoUrl": "https://scontent-dfw6-1.cdninstagram.com/o1/v/t2/f2/m86/...",
  "dimensionsHeight": 1280,
  "dimensionsWidth": 720,
  "ownerId": "20824486",
  "ownerUsername": "nba",
  "ownerFullName": "NBA",
  "ownerIsVerified": true,
  "taggedUsers": [{ "id": "16917874", "username": "lakers", "fullName": "Los Angeles Lakers", "isVerified": true }],
  "coauthorProducers": [{ "id": "66155909760", "username": "nbaonprime", "fullName": "NBA on Prime", "isVerified": true }],
  "isPaidPartnership": false,
  "locationName": null,
  "musicInfo": { "artistName": "nba", "songName": "Original audio", "usesOriginalAudio": true, "audioId": "29445688668396972" },
  "hasDetails": true,
  "scrapedAt": "2026-11-08T10:58:49.532Z"
}
```

Every item has the same fields in the same order (null when Instagram does not show a value), so CSV and Excel exports line up.

### Use cases

- **Trend and content research**: see which reels lead a hashtag, how many plays they get, and which sounds, formats and captions they use.
- **Influencer discovery**: find the creators behind the top reels for your niche, with their verified badges and collaborations.
- **Brand and campaign monitoring**: track the top reels for your brand, product or campaign keywords over time with a scheduled run.
- **Competitor analysis**: compare what performs for competing products and categories.
- **Market and academic research**: build datasets of public reels by topic.

### Use it via API, Python, JavaScript and integrations

Run Instagram Hashtag Scraper from your own code with the Apify API or the Apify clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("socialscrapers/instagram-hashtag-scraper").call(
    run_input={"hashtags": ["sourdough", "running shoes"], "resultsLimit": 50}
)
for reel in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(reel["searchTerm"], reel["url"], reel["videoPlayCount"])
```

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('socialscrapers/instagram-hashtag-scraper').call({ hashtags: ['sourdough'], resultsLimit: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

You can also schedule runs (for example every morning), get a webhook when a run finishes, send results to Google Sheets, Slack or a database with [Apify integrations](https://docs.apify.com/integrations), connect it to Make, Zapier or n8n, or let AI agents run it through the [Apify MCP server](https://docs.apify.com/mcp).

### Limits

- **Top reels only.** Without a login, Instagram shows the top reels for a hashtag or keyword, usually 50 to 100 of them, ranked by Instagram rather than by date. Photo posts, the "recent" tab and stories are shown to logged-in users only.
- **Some broad hashtags have no public page.** Instagram has no logged-out page for some very broad single words (for example `fitness` or `food`). Those return nothing and cost nothing; a more specific keyword such as `fitness workout` or `food recipes` usually works. A hashtag joined with underscores or written in CamelCase (`#cats_of_instagram`, `#CatsOfInstagram`) is also tried as separate words.
- **Without details**, likes, comments count, location and sound are empty, and the posting time is the upload time read from the reel's id.
- **Hashtags and searches only.** Hashtag links (`/explore/tags/…`) and search links (`/popular/…`) are read as their hashtag or keyword; a post, reel or share link (`instagram.com/share/…`) opens a single post, which [Instagram Post Scraper](https://apify.com/socialscrapers/instagram-post-scraper) reads.
- **A run with 0 results still succeeds when your input was fine.** When Instagram shows nothing for a hashtag or keyword (no public page, or every reel left out by your filters), the run ends as Succeeded with a status message naming each one and why, and nothing is charged. A run fails only when no entry holds a hashtag or keyword at all, or when Instagram refuses every one of 3 or more searches.

### FAQ

**Is it legal to scrape Instagram hashtags?**
Instagram Hashtag Scraper collects only public data that anyone can see without logging in. You are responsible for how you use it: personal data is protected by laws such as the GDPR, so have a legitimate reason to collect it and follow Instagram's terms and the laws that apply to you.

**Do I need an Instagram account or cookies?**
No. Instagram Hashtag Scraper never logs in and never asks for cookies, so no account of yours is ever at risk.

**How many reels can I get per hashtag?**
Every reel Instagram shows a logged-out visitor for it, usually 50 to 100. Set `resultsLimit` to `0` to get them all, and add related keywords to collect more.

**Why did I get fewer reels than I asked for?**
Instagram showed fewer reels for that hashtag, the date filter left some out, a reel had already been saved for an earlier hashtag in the same run, or the run reached its maximum cost. The run log says which, for each hashtag.

**Can I get only new reels?**
Yes. Set **Only reels posted after** to a date or an age such as `7 days`, and schedule the run to repeat.

**Can I search by keyword instead of a hashtag?**
Yes. Write the keyword as words (`running shoes`); it is searched the same way as a hashtag.

### Other scrapers by Social Scrapers

| Scraper | What it does |
|---|---|
| [Instagram Profile Scraper](https://apify.com/socialscrapers/instagram-profile-scraper) | Profiles: bio, followers, posts count and recent posts |
| [Instagram Post Scraper](https://apify.com/socialscrapers/instagram-post-scraper) | Posts and reels by URL, with comments |
| [Facebook Groups Scraper](https://apify.com/socialscrapers/facebook-groups-scraper) | Posts from public Facebook groups |
| [Facebook Profile Scraper](https://apify.com/socialscrapers/facebook-profile-scraper) | Public details of Facebook profiles and Pages |
| [Facebook Profile Posts Scraper](https://apify.com/socialscrapers/facebook-profile-posts-scraper) | Recent posts of Facebook profiles and Pages |
| [Facebook Ads Library Scraper](https://apify.com/socialscrapers/facebook-ads-library-scraper) | Ads from Meta's Ad Library |
| [Threads Scraper](https://apify.com/socialscrapers/threads-scraper) | Threads profiles, posts, replies and search |
| [X (Twitter) Profile Scraper](https://apify.com/socialscrapers/x-profile-scraper) | X profiles: bio, followers and counts |
| [YouTube Scraper](https://apify.com/socialscrapers/youtube-scraper) | YouTube videos, channels, search and comments |
| [YouTube Transcript Scraper](https://apify.com/socialscrapers/youtube-transcript-scraper) | Transcripts of YouTube videos |
| [Reddit Scraper](https://apify.com/socialscrapers/reddit-scraper) | Reddit posts, comments, users and search |
| [Quora Scraper](https://apify.com/socialscrapers/quora-scraper) | Quora questions, answers and profiles |
| [LinkedIn Jobs Scraper](https://apify.com/socialscrapers/linkedin-jobs-scraper) | LinkedIn job listings |

# Actor input Schema

## `hashtags` (type: `array`):

Hashtags with or without <code>#</code> (<code>sourdough</code>, <code>#hiking</code>), keywords of several words (<code>running shoes</code>), or Instagram hashtag links such as <code>https://www.instagram.com/explore/tags/hiking/</code>. Each one is searched separately; several hashtags on one line (<code>#sourdough #bread</code>, or separated by commas) are searched one by one, and a link inside other text is read as that link. A hashtag joined with underscores or written in CamelCase (<code>#cats_of_instagram</code>, <code>#CatsOfInstagram</code>) is also tried as separate words when Instagram has nothing under it.

## `resultsLimit` (type: `integer`):

How many reels to save for each hashtag or keyword, best ranked first. <code>0</code> saves every reel Instagram shows, usually 50 to 100 per hashtag or keyword. Example: <code>20</code> with 3 hashtags saves up to 60 reels.

## `includeDetails` (type: `boolean`):

Read each reel's own page for its likes, comments count, exact posting date, location, sound, tagged accounts and the creator's name. Turn off for a faster run with what the hashtag feed shows: caption, plays, creator, cover and video URL, and the upload time.

## `onlyPostsNewerThan` (type: `string`):

Skip reels posted before this. Pick a date or an age, or type one: a date (<code>2026-01-31</code>, <code>31/01/2026</code>, <code>Jan 31 2026</code>; a UTC day), an ISO date-time through the API (<code>2026-01-31T18:00:00Z</code>), or an age such as <code>7 days</code>, <code>2w</code>, <code>3 months</code> or <code>yesterday</code>. Skipped reels are never charged. Leave empty for no date limit.

## `proxyConfiguration` (type: `object`):

The scraper picks Apify Proxy's tier itself: datacenter first, residential only when Instagram refuses a request (a country you choose applies to the residential retries). Your own proxy URLs are used exactly as given.

## Actor input object example

```json
{
  "hashtags": [
    "sourdough",
    "running shoes"
  ],
  "resultsLimit": 20,
  "includeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "hashtags": [
        "sourdough",
        "running shoes"
    ],
    "resultsLimit": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialscrapers/instagram-hashtag-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "hashtags": [
        "sourdough",
        "running shoes",
    ],
    "resultsLimit": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("socialscrapers/instagram-hashtag-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "hashtags": [
    "sourdough",
    "running shoes"
  ],
  "resultsLimit": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call socialscrapers/instagram-hashtag-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,socialscrapers/instagram-hashtag-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/JUdxRIqQdeP2NypdA/builds/fgMdNKW1oFbHTUunx/openapi.json
