# Instagram Search Scraper · Accounts, Hashtags & Audio (`memo23/instagram-search-scraper`) Actor

Search Instagram by keyword — public accounts with optional follower counts, bio and contact email, hashtags with total post counts, and audio tracks with artist and direct audio URLs. No login, no cookies, no account risk. Many search terms per run. JSON, CSV, or Excel.

- **URL**: https://apify.com/memo23/instagram-search-scraper.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, AI, Automation
- **Stats:** 24 total users, 21 monthly users, 98.5% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $1.40 / 1,000 search results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Instagram Search Scraper

Turn any keyword into structured Instagram results — accounts, hashtags, and audio tracks.
Search exactly what you would type into Instagram's own search box, and get clean rows ready for analysis, outreach, or trend research. No login, no cookies, no account risk.

***

### Why Use This Scraper?

- ✅ Three result types from one keyword — accounts, hashtags, audio
- ✅ Expand any sound into the reels actually using it, with play counts and creators
- ✅ Optional account enrichment: follower counts, biography, category, public contact email
- ✅ Filter accounts by verification badge or minimum follower count
- ✅ Many search terms per run, searched in parallel
- ✅ Results deduplicated — Instagram's own search pages overlap, this one doesn't
- ✅ Flat rows that open cleanly in Excel, Sheets, or any CSV tool

***

### Overview

The Instagram Search Scraper is built for lead generation, influencer discovery, competitor research, and content trend analysis.

The output is **one row per result**, tagged with the `query` that produced it and a `resultType` of `accounts`, `hashtags`, or `audio`. Each row carries only the fields relevant to its type, so an account row has `username` and `followerCount` while an audio row has `title`, `artist`, and `audioDownloadUrl`. Filter or split by `resultType` after export.

Two things worth knowing before you buy:

**Instagram's account search is shallow.** Roughly 30 unique accounts per keyword, regardless of how high you set the cap. Instagram simply does not serve deep pagination on search, and its pages overlap heavily — this actor deduplicates and stops when a page adds nothing new rather than billing you for repeats. For deep account lists, start from a profile and use the Followers or Similar Profiles scrapers instead.

**Search results contain no follower counts.** That is an Instagram limitation, not an actor one. Enabling *Enrich accounts* performs a second lookup per account to add followers, bio, category, and contact details.

***

### Supported Inputs

#### Input types

| Input | What it does | Example |
|---|---|---|
| Keyword | Free-text search, as typed on Instagram | `coffee roaster` |
| Multi-word phrase | Treated as one search term | `vegan bakery london` |
| Brand or niche | Finds accounts, tags, and sounds around it | `lofi` |

#### Copy-pasteable input

```json
{
  "queries": ["coffee roaster", "vegan bakery london"],
  "searchType": "accounts",
  "maxResultsPerQuery": 50
}
```

#### Unsupported inputs

- Profile URLs — this actor searches by keyword, not by account. Use the Instagram Profile Scraper.
- Post or reel URLs — use the Instagram Profile Scraper or Comments Scraper.
- Hashtag *post* scraping — this returns matching hashtags and their post counts, not the posts themselves. Use the Instagram Hashtag Scraper for posts.
- Private accounts — never returned, as their data is not public.

***

### Use Cases

| Audience | What they use it for |
|---|---|
| Agencies | Build prospect lists of businesses in a niche, with contact emails |
| Influencer marketing | Discover creators by topic, filter by follower count and verification |
| Brand monitoring | Find accounts and hashtags using a brand term |
| Content strategy | Surface the hashtags and audio trending around a topic |
| SEO / research | Map the tag landscape for a niche with real post volumes |
| Sales | Enrich account results into a lead list with public business email |

***

### How It Works

![How the Instagram Search Scraper works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-instagram-search.png)

1. **Search** — each keyword is sent to Instagram's search, several terms in parallel.
2. **Collect** — accounts, hashtags, and audio tracks are gathered per the selected type. Your per-query cap is split evenly across the selected types, so choosing "All three" never returns only accounts.
3. **Deduplicate** — account pages overlap, so results are deduped by account ID and paging stops as soon as a page adds nothing new.
4. **Enrich (optional)** — each account gets a second lookup adding followers, bio, category, and public contact details.
5. **Filter and push** — verification and follower thresholds are applied, then rows are written to the dataset.

***

### Input Configuration

| Field | Type | Default | Description |
|---|---|---|---|
| `queries` | array | — | **Required.** Search terms, one per line. |
| `searchType` | string | `accounts` | `accounts`, `hashtags`, `audio`, or `all`. |
| `maxResultsPerQuery` | integer | all | Cap per search term. Split evenly across types when using `all`. |
| `enrichProfiles` | boolean | `false` | Add followers, bio, category, contact. Accounts only. Paid plans only. |
| `expandAudioToReels` | boolean | `false` | Return the reels using each sound. Audio only. Paid plans only. |
| `maxReelsPerTrack` | integer | `24` | Reels returned per sound when expansion is on. |
| `onlyVerified` | boolean | `false` | Keep only badge-verified accounts. Accounts only. |
| `minFollowers` | integer | — | Drop accounts below this. Automatically enables `enrichProfiles`. |

#### Example — lead list with contact details

```json
{
  "queries": ["coffee roaster", "specialty coffee"],
  "searchType": "accounts",
  "maxResultsPerQuery": 30,
  "enrichProfiles": true,
  "minFollowers": 1000
}
```

#### Example — trending sound research

```json
{
  "queries": ["lofi"],
  "searchType": "audio",
  "maxResultsPerQuery": 5,
  "expandAudioToReels": true,
  "maxReelsPerTrack": 24
}
```

#### Example — content trend research

```json
{
  "queries": ["lofi"],
  "searchType": "all",
  "maxResultsPerQuery": 60
}
```

***

### Output Overview

One row per result. Every row has `query`, `resultType`, and `rank` (position in Instagram's own ranking). The remaining fields depend on the type — account fields on account rows, hashtag fields on hashtag rows, audio fields on audio rows.

Enrichment fields (`followerCount`, `biography`, `publicEmail`, …) are present but `null` on account rows when *Enrich accounts* is off, and are always `null` on hashtag and audio rows.

***

### Output Samples

**Account row** (`searchType: "accounts"`, enrichment on):

```json
{
  "query": "coffee roaster",
  "resultType": "accounts",
  "rank": 8,
  "username": "ranah.coffeeroaster",
  "userId": "35651505852",
  "fullName": "Ranah Coffee Roaster",
  "profileUrl": "https://www.instagram.com/ranah.coffeeroaster/",
  "isVerified": false,
  "isPrivate": false,
  "followerCount": 348,
  "followingCount": 2,
  "postCount": 33,
  "biography": "• 100% Sumatran Coffee •",
  "externalUrl": "http://ranahcoffee.id",
  "publicEmail": null,
  "isBusiness": true
}
```

**Hashtag row** (`searchType: "hashtags"`):

```json
{
  "query": "lofi",
  "resultType": "hashtags",
  "rank": 4,
  "hashtag": "lofibeats",
  "hashtagId": "17843795683056124",
  "postCountTotal": 1648519,
  "hashtagUrl": "https://www.instagram.com/explore/tags/lofibeats/"
}
```

**Audio row** (`searchType: "audio"`):

```json
{
  "query": "lofi",
  "resultType": "audio",
  "rank": 5,
  "trackId": "3417044961783287",
  "title": "Purple Ube latte",
  "artist": "Mindu Sound Lab",
  "audioClusterId": "1929447931093400",
  "coverArtworkUrl": "https://scontent.cdninstagram.com/...",
  "audioDownloadUrl": "https://scontent.cdninstagram.com/..."
}
```

**Reel row** (`expandAudioToReels: true`):

```json
{
  "query": "lofi",
  "resultType": "reels",
  "rank": 1,
  "reelId": "3938221610419244876",
  "reelUrl": "https://www.instagram.com/reel/DanX7Bnzk9M/",
  "reelCaption": "Gunupur Primart monsoon. Mega offer flat 50% off",
  "playCount": 6954,
  "likeCount": 170,
  "commentCount": 4,
  "videoDuration": 114.915,
  "creatorUsername": "primartgunupur",
  "creatorIsVerified": false,
  "soundTrackId": "1755700311289275",
  "soundTitle": "Lofi",
  "soundArtist": "Fope"
}
```

***

### Key Output Fields

**Every row** — `query`, `resultType`, `rank`

**Account identity** — `username`, `userId`, `fullName`, `profileUrl`, `isVerified`, `isPrivate`, `profilePicUrl`

**Account enrichment** (opt-in) — `followerCount`, `followingCount`, `postCount`, `biography`, `externalUrl`, `publicEmail`, `publicPhone`, `category`, `isBusiness`

**Hashtag** — `hashtag`, `hashtagId`, `postCountTotal`, `hashtagUrl`

**Audio** — `trackId`, `title`, `artist`, `audioClusterId`, `coverArtworkUrl`, `audioDownloadUrl`, `totalReelsUsingSound`

**Reels by sound** (opt-in) — `reelId`, `reelUrl`, `reelCaption`, `playCount`, `likeCount`, `commentCount`, `videoDuration`, `videoUrl`, `creatorUsername`, `creatorFullName`, `creatorIsVerified`, `soundTrackId`, `soundTitle`, `soundArtist`

***

### FAQ

**Why do I only get about 30 accounts per keyword?**
Instagram's account search is shallow and its result pages overlap. The actor deduplicates and stops once a page adds nothing new, so you are never billed for repeats. This is an Instagram limit, not a cap in the actor.

**Why are follower counts empty?**
Instagram's search response does not include them. Enable *Enrich accounts* to add followers, bio, category, and contact details via a second lookup per account.

**Does this scrape posts from a hashtag?**
No. It returns hashtags matching your keyword with their total post counts. To scrape the posts themselves, use the Instagram Hashtag Scraper.

**Can I find every reel using a trending sound?**
Yes — enable *Expand sounds into the reels using them*. Each audio row also gains `totalReelsUsingSound`, the catalogue-wide count (over a million for a genuinely viral sound), so you can gauge a trend's size even without paging through the reels themselves.

**How long do the audio and image URLs last?**
Instagram's CDN links expire within a day or two. Download anything you need to keep soon after the run.

**Does `minFollowers` work without enrichment?**
It enables enrichment automatically, since follower counts only exist once accounts are enriched. On free plans, where enrichment is unavailable, the filter is skipped and the run says so in the log.

**Do I need a login, cookies, or a proxy?**
No. Only public data is returned, and no Instagram account is involved at any point.

***

### Support

Found a bug or need a field that is missing? Open an issue on the actor's **Issues** tab and it will be looked at directly.

- Issues: the Issues tab on this actor
- Email: muhamed.didovic@gmail.com

***

### Additional Services

Need a tailored export, a scheduled feed into your warehouse, or a custom scraper for a source not covered here? Custom builds are available — get in touch by email.

***

### Explore More Scrapers

- **Instagram Hashtag Scraper** — top posts and reels for any hashtag
- **Instagram Similar Profiles & Lookalike Finder** — accounts similar to any profile
- **Instagram Profile Scraper** — profiles, posts, and media
- **Instagram Comments Scraper** — comments and repliers on any post
- **Instagram Stories & Highlights Scraper** — active stories and permanent highlights
- **Instagram Followers & Following Scraper** — full follower and following lists

Browse the full catalogue: [muhamed-didovic.github.io](https://muhamed-didovic.github.io)

***

### 🤖 For AI Agents & LLM Apps

**Purpose:** keyword search over Instagram returning accounts, hashtags, or audio tracks as flat rows.

**Minimal input (tested):**

```json
{ "queries": ["coffee roaster"], "searchType": "accounts", "maxResultsPerQuery": 20 }
```

**Output fields (flat):** `query`, `resultType`, `rank`, `username`, `userId`, `fullName`, `profileUrl`, `isVerified`, `isPrivate`, `profilePicUrl`, `followerCount`, `followingCount`, `postCount`, `biography`, `externalUrl`, `publicEmail`, `publicPhone`, `category`, `isBusiness`, `hashtag`, `hashtagId`, `postCountTotal`, `hashtagUrl`, `trackId`, `title`, `artist`, `audioClusterId`, `coverArtworkUrl`, `audioDownloadUrl`, `totalReelsUsingSound`, `reelId`, `reelUrl`, `reelCaption`, `playCount`, `likeCount`, `commentCount`, `videoDuration`, `videoUrl`, `creatorUsername`, `creatorFullName`, `creatorIsVerified`, `soundTrackId`, `soundTitle`, `soundArtist`

**Billing:** one `search-result` event per row. One additional `enriched-profile` event per account when `enrichProfiles` is true — charged only for accounts where enrichment actually returned data.

**Behaviors that matter to agents:**

- Account search returns ~30 unique accounts per keyword maximum. Do not retry for more.
- `followerCount` is `null` unless `enrichProfiles` is true.
- `expandAudioToReels` adds `resultType: "reels"` rows, capped by `maxReelsPerTrack` per sound (not per query). A sound with no reels yields none and is not an error.
- With `searchType: "all"`, `maxResultsPerQuery` is split evenly across the three types.
- Unresolvable queries yield a row with `error` and `message` instead of results, and are not charged.
- CDN URLs (`profilePicUrl`, `coverArtworkUrl`, `audioDownloadUrl`) expire within roughly 48 hours.

***

### ⚠️ Disclaimer

This actor is not affiliated with, endorsed by, or sponsored by Instagram, Meta Platforms, Inc., or any of their subsidiaries. "Instagram" and related marks are trademarks of Meta Platforms, Inc., referenced here solely to describe what this tool works with.

This actor accesses only publicly available information — data any logged-out visitor can see. It does not access private accounts, bypass authentication, or collect data behind a login. Users are responsible for ensuring their use complies with Instagram's Terms of Service and with applicable data-protection law, including GDPR and CCPA, particularly where results contain personal data such as names, biographies, or contact details. Verify you have a lawful basis before processing personal data at scale.

***

### SEO Keywords

instagram search scraper, instagram keyword search, instagram account search, instagram profile finder, instagram hashtag search, instagram audio search, instagram music search, instagram sound finder, social media scraper, instagram data extraction, influencer discovery tool, instagram lead generation, instagram prospecting, competitor research instagram, instagram trend analysis, instagram content research, find instagram accounts by keyword, instagram business email finder, instagram follower count api, instagram reels by sound, trending audio scraper, instagram sound trend tracker, no login instagram scraper

# Actor input Schema

## `queries` (type: `array`):

Keywords to search Instagram for — one per line. Free text, exactly what you would type into Instagram's own search box. Example: \["coffee roaster", "vegan bakery london"].

## `searchType` (type: `string`):

Accounts (public profiles matching the keyword), Hashtags (tags matching it, each with its total post count), Audio (music and sounds, each with artist and a direct audio URL), or all three. With 'All', the per-query cap is split evenly across the three types.

## `maxResultsPerQuery` (type: `integer`):

Cap how many results to return per search term. Note Instagram's account search is shallow — expect roughly 30 unique accounts per keyword no matter how high you set this. Hashtag search returns about 55 tags and audio search about 10 tracks, both in a single page.

## `enrichProfiles` (type: `boolean`):

Look up each account result's full profile to add follower and following counts, post count, biography, external link, Instagram category, and any public business email or phone. Instagram's search results do not include follower counts, so this is the only way to get them. Costs one extra request per account and is charged separately. Applies to account results only. Paid Apify plans only. Default: off.

## `expandAudioToReels` (type: `boolean`):

For every audio result, also return the reels that actually use that sound — with play counts, likes, comments, creator, and video URL. Each audio row also gains totalReelsUsingSound, the catalogue-wide count of reels using it. Requires 'Audio / music' or 'All three' as the search type. Paid Apify plans only. Default: off.

## `maxReelsPerTrack` (type: `integer`):

How many reels to return per audio track when expansion is on. Popular sounds can have hundreds of thousands of reels, so this is capped per track rather than per query. Returned in Instagram's own ranking order, roughly 12 per request. Default: 24.

## `onlyVerified` (type: `boolean`):

Return only accounts with Instagram's blue verification badge. Applies to account results only. Default: off.

## `minFollowers` (type: `integer`):

Drop account results with fewer followers than this. Follower counts only exist when accounts are enriched, so switching this on automatically turns on 'Enrich accounts'. Hashtag and audio results are never dropped by this filter. Leave empty for no threshold.

## Actor input object example

```json
{
  "queries": [
    "coffee roaster",
    "vegan bakery london"
  ],
  "searchType": "accounts",
  "maxResultsPerQuery": 50,
  "enrichProfiles": false,
  "expandAudioToReels": false,
  "maxReelsPerTrack": 24,
  "onlyVerified": false
}
```

# 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 = {
    "queries": [
        "coffee roaster"
    ],
    "maxResultsPerQuery": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/instagram-search-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 = {
    "queries": ["coffee roaster"],
    "maxResultsPerQuery": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/instagram-search-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 '{
  "queries": [
    "coffee roaster"
  ],
  "maxResultsPerQuery": 50
}' |
apify call memo23/instagram-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,memo23/instagram-search-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/b4Qduj50HxLOXwhlH/builds/d10bfAXxCBXI1xovG/openapi.json
