# Instagram Search Scraper - Accounts, Hashtags & Places (`topapi/instagram-search-scraper`) Actor

Search Instagram by keyword for accounts, hashtags and places: followers, verified flag, linked Facebook page and the full public profile; hashtag post counts and related hashtags; place address, phone, coordinates, category and top posts. Filters and monitor mode. No login.

- **URL**: https://apify.com/topapi/instagram-search-scraper.md
- **Developed by:** [Top Api](https://apify.com/topapi) (community)
- **Categories:** Social media, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 account founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### What does Instagram Search Scraper do?

**Instagram Search Scraper** searches Instagram by keyword and returns one row per result: **accounts** (username, followers, verified flag, the linked Facebook page and, optionally, the full public profile), **hashtags** (post count and related hashtags) and **places** (Instagram locations with address, phone, coordinates, category, opening status and their top or recent posts). Built for marketers, agencies and researchers who need Instagram search results as a spreadsheet or an API feed.

Instagram search scraper · Instagram user search · Instagram hashtag search · Instagram location search

<a href="https://console.apify.com/actors/Fv6ie6Ld2KcoFLl9Q"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/instagram-search-scraper-source.png" alt="Instagram place page that Instagram Search Scraper turns into a place row" style="width:70%"></a>

- **Three searches in one actor:** places, accounts or hashtags for every keyword, or all three at once (`searchType: "all"`).
- **Accounts with their profile:** followers, verified badge and the linked Facebook page on every account, plus bio, links, exact counts, category, business address and the 12 latest posts with engagement when the profile add-on is on.
- **Hashtags with related hashtags:** Instagram's post count for each hashtag and its related hashtags with their own counts, grouped as frequent, average and rare.
- **Places with posts:** address, phone, coordinates, category, price range, opening status, the linked business account and 12-18 top posts (or the 12 most recent).
- **No login, cookies or Instagram API key:** type keywords, or paste place and hashtag URLs.
- **Pay only for delivered results:** no start fee; a keyword that finds nothing, and results your filters remove, cost nothing.
- **Schedule-ready:** monitor mode returns only results that are new since the last run.
- **Export anywhere:** JSON, CSV, Excel, XML; schedules, webhooks, Make, Zapier, n8n, Google Sheets, the Apify API and MCP.

### What data can you get from Instagram search?

<table>
<tr>
<td>👤 Username, name and profile URL</td>
<td>👥 Followers and following (`followersCount`)</td>
<td>✅ Verified badge, private flag</td>
</tr>
<tr>
<td>🏢 Business category and account type</td>
<td>🔗 Bio links and website (`externalUrls`)</td>
<td>📘 Linked Facebook page (`facebookPage`)</td>
</tr>
<tr>
<td>🖼️ 12 latest posts with likes and comments</td>
<td>📈 Engagement rate and posts per week</td>
<td>🏷️ Hashtag name and post count (`postsCount`)</td>
</tr>
<tr>
<td>🔁 Related hashtags with counts (`related`)</td>
<td>📊 Frequent / average / rare hashtags</td>
<td>📍 Place name, category and location id</td>
</tr>
<tr>
<td>🏠 Street address, zip and coordinates</td>
<td>☎️ Place phone and price range</td>
<td>🕒 Opening status (`hours`)</td>
</tr>
<tr>
<td>📸 Top and recent posts tagged at the place</td>
<td>🔎 Keyword, rank and source of every result</td>
<td>🗓️ Date of the newest post (`lastPostAt`)</td>
</tr>
</table>

On the test runs: 100% of account rows had followers and a bio, 86% a link in bio and 54% a business category; 100% of hashtag rows had a post count and 99% related hashtags; of 271 place rows 100% had a category, 94% coordinates, 87% top posts (12 per row on average), 77% an opening status, 60% a linked business account and 32% a phone.

### How to scrape Instagram search results with Instagram Search Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up): $5 of monthly credit, no card needed.
2. Open [Instagram Search Scraper](https://apify.com/topapi/instagram-search-scraper) and click **Try for free**.
3. Type one or more keywords into **Search terms** (comma-separated) and pick what to **Search for**: places, accounts, hashtags or all three.
4. Set **Results per keyword**, and the filters you need.
5. Click **Start**. Results appear in the dataset as they are found.
6. Open the **Storage** tab and **Export** as JSON, CSV or Excel, or schedule the run.

### ⬇️ Instagram Search Scraper input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | |
| `search` | string | Keywords, comma-separated, e.g. `"cakes prague, dentist chicago"`. Without any keyword the run searches places for `"restaurant prague"`. |
| `searchType` | string | `place` (default), `user` (accounts), `hashtag`, or `all`. |
| `startUrls` | array | Instagram place pages or ids and hashtag pages to read directly. |
| `searchLimit` | integer | Results per keyword and type, 1-250. Default 20. |
| **🎯 Filters** | | |
| `countries` | array | Country codes the Meta Ad Library search is run in for accounts and places (each adds up to 15 matches). Default: ALL plus 9 large markets. |
| `placePosts` | string | `top` (default), `recent`, `both` or `none`: the posts nested in each place row. |
| `placeSourceOrder` | string | `adLibraryFirst` (default, more places) or `googleFirst` (pages about the keyword, usually closer to the city you typed). |
| **✂️ Refine results** | | |
| `minFollowers` / `maxFollowers` | integer | Accounts with at least / at most this many followers. |
| `verifiedOnly` | boolean | Accounts with the verified badge only. |
| `accountType` | string | `any`, `business`, `creator`, `professional` or `personal`. |
| `excludePrivate` | boolean | Leave out private accounts. |
| `minPosts` | integer | Minimum posts (a hashtag's or place's post count, an account's posts). |
| `keywordFilter` | string | Keep results whose name, username, category, bio or address contain one of these words. |
| `activeWithinDays` | integer | Accounts and places with a post in the last N days. |
| **➕ Extra data** | | |
| `enrichProfiles` | boolean | Add each account's full public profile (the profile add-on). Default on. |
| `includeRelated` | boolean | Add related hashtags with their counts to hashtag rows. Default on, no extra charge. |
| **🔁 Monitoring** | | |
| `monitorMode` | boolean | Only results not delivered by previous runs with the same memory name. |
| `monitorStoreName` | string | Name of the memory, one per watchlist. |
| **📦 Output** | | |
| `maxItems` | integer | Hard cap across the whole run. 0 = no total cap. |
| `compact` | boolean | Core fields only, for AI agents and MCP clients. |
| **⚙️ Advanced** | | |
| `proxyConfiguration` | object | Apify Proxy by default. |
| `maxConcurrency` | integer | Places or profiles read at once. Default 8. |
| `maxSerpPagesPerRun` | integer | Google searches the run may use to find places beyond the Ad Library matches (one per keyword). Default 10, 0 = none. |

The input names of the most-used Instagram search actor work unchanged: `search` as a comma-separated string, `searchType` `place` / `user` / `hashtag`, `searchLimit`.

#### Input JSON

```json
{
  "search": "cakes prague, dentist chicago",
  "searchType": "all",
  "searchLimit": 20,
  "minFollowers": 500,
  "placePosts": "both"
}
```

#### Pick the search type before anything else

`place` returns Instagram locations (the businesses, venues and landmarks people tag), `user` returns accounts, `hashtag` returns hashtags. The same keyword gives different results per type: `cakes prague` finds bakeries and cafes as places, and cake makers and shops as accounts. `all` runs the three for every keyword, each with its own `searchLimit`.

#### Write keywords the way people name things

Accounts and places first come from Meta's own page search, which matches names: `yoga studio`, `dentist chicago` and `cakes prague` work better than long sentences. Because it matches names, `sushi tokyo` also finds restaurants called Sushi Tokyo outside Japan. When the city matters more than the name, set `placeSourceOrder` to `googleFirst`: Google's results are pages about the keyword (florists in Amsterdam, barbers in Toronto in testing). Hashtags match from the start of the word: `coffee` returns `coffeehouse`, `coffeelife` and 53 more.

#### Paste places you already know

A place URL (`https://www.instagram.com/explore/locations/270309914/bakeshop-praha/`) or a bare location id in `startUrls` returns that place's row with its posts, without a search.

### ⬆️ Instagram Search Scraper output

<a href="https://console.apify.com/actors/Fv6ie6Ld2KcoFLl9Q"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/instagram-search-scraper-output.png" alt="Instagram Search Scraper output table with accounts, hashtags and places" style="width:70%"></a>

Each row has `type` (`account`, `hashtag` or `place`), the `searchTerm` that found it, its `rank` for that keyword and the `searchSource` it came from.

#### Account row (profile add-on on)

From platform run `ficPeeY9etHPid13Y` (`"pilates studio"`, 100 accounts), long values shortened:

```json
{
  "type": "account", "searchTerm": "pilates studio", "searchSource": "facebook-ads", "rank": 1,
  "username": "studio_pilates", "fullName": "Studio Pilates",
  "followersCount": 85509, "followsCount": 897, "postsCount": 3031, "verified": true,
  "biography": "CHANGING THE WAY THE WORLD WORKS OUT ⚡️ Reformer Pilates classes for all levels ...",
  "externalUrl": "http://linktr.ee/studiopilatesinternational",
  "accountType": "business", "businessCategoryName": "Pilates Studio",
  "facebookPage": { "page_id": "146085692104314", "name": "Studio Pilates", "category": "Local Business", "likes": 44526, "ig_username": "studio_pilates", "ig_followers": 85509 },
  "latestPosts": ["... 6 posts (web profile)"], "engagementRate": 0.152, "enriched": true, "profileSource": "web"
}
```

#### Hashtag row

From platform run `AgScDxsRPkHTwAcdZ` (20 keywords, 951 hashtags):

```json
{
  "type": "hashtag", "searchTerm": "coffee", "searchSource": "instagram", "rank": 4,
  "name": "coffeelove", "postsCount": 5257410, "posts": "5.2M",
  "url": "https://www.instagram.com/explore/tags/coffeelove/",
  "related": [{ "hash": "#coffeelover", "info": "33M", "postsCount": 33096750 }],
  "frequent": [{ "hash": "#coffeelover", "info": "33M", "postsCount": 33096750 }],
  "average": [{ "hash": "#coffeeloversclub", "info": "280K", "postsCount": 280741 }],
  "rare": [{ "hash": "#coffeelover☕❤️", "info": "1000+", "postsCount": 1025 }]
}
```

#### Place row

From platform run `Zb3lMMnxaQgE0oY18` (20 keywords, 271 places), posts shortened:

```json
{
  "type": "place", "searchTerm": "florist amsterdam", "searchSource": "google", "rank": 24,
  "location_id": "728466614156448", "name": "Amsterdam Flowers", "category": "Florist",
  "phone": "+31 20 619 1818", "location_address": "Belgiëplein 68-70",
  "lat": 52.350104, "lng": 4.815625, "media_count": 191,
  "url": "https://www.instagram.com/explore/locations/728466614156448/amsterdam-flowers/",
  "posts": ["... 15 top posts: shortCode, type, caption, likeCount, commentCount, displayUrl, ownerUsername, timestamp"]
}
```

The **Overview**, **Accounts**, **Hashtags** and **Places** views in the dataset show the fields of each type as a table.

### How can I use Instagram search data?

- 🎯 **Influencer and creator discovery:** find accounts by niche and city, filter by followers, keep the ones with a website.
- 🏪 **Local lead lists:** places with phone, address and the linked business account for a category in a city.
- \#️⃣ **Hashtag research:** post counts and related hashtags to plan captions and campaigns.
- 📍 **Location intelligence:** what is tagged where, how many posts a venue has, what was posted there this week.
- 🔁 **Brand and competitor watch:** a weekly monitor run returns only the new accounts, places or hashtags for your keywords.
- 🤖 **AI agents:** compact rows over the API or MCP for assistants that answer "find yoga studios in Austin on Instagram".

### How much does it cost to scrape Instagram search results?

Instagram Search Scraper is pay-per-result, with no start fee and Apify platform usage included:

| Result | Price per 1,000 |
|---|---:|
| Hashtag row | $0.27 |
| Account row | $1.30 |
| Profile add-on (on account rows that carry the full profile) | $1.10 |
| Place row (with its posts) | $1.80 |

| Run | Cost |
|---|---:|
| 50 hashtags | $0.0135 |
| 100 accounts with profiles | $0.24 |
| 100 accounts without profiles | $0.13 |
| 20 places | $0.036 |
| 1,000 places | $1.80 |

Free notice rows (a keyword that found nothing) are not charged.

### Integrations, API, scheduling & MCP

- **Schedules:** run the same keywords daily or weekly; with `monitorMode` each run returns only what is new.
- **Webhooks:** call a URL when a run finishes and push the rows to a CRM, Slack or a sheet.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable and Slack through [Apify integrations](https://docs.apify.com/integrations).
- **API:** start runs and read datasets from Node.js or Python with `apify-client`; code is on the [API tab](https://apify.com/topapi/instagram-search-scraper/api/python).
- **MCP / AI agents:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/topapi/instagram-search-scraper/api/mcp); `compact` keeps rows small.

### More TopApi scrapers

<table>
<tr>
<td>📸 <a href="https://apify.com/topapi/instagram-scraper">Instagram Scraper</a> - posts and reels by profile, hashtag or keyword (use it for popular reels by keyword)</td>
<td>👤 <a href="https://apify.com/topapi/instagram-profile-scraper">Instagram Profile Scraper</a> - full profiles for a list of usernames</td>
<td>✉️ <a href="https://apify.com/topapi/instagram-contact-scraper">Instagram Email Scraper</a> - emails, phones and websites of accounts</td>
</tr>
<tr>
<td>🔎 <a href="https://apify.com/topapi/facebook-search-posts-scraper">Facebook Search Posts Scraper</a> - public posts by keyword</td>
<td>🎵 <a href="https://apify.com/topapi/tiktok-scraper">TikTok Scraper</a> - videos by profile, hashtag or URL</td>
<td>🧭 <a href="https://apify.com/topapi">All TopApi actors</a> - social, reviews and lead-gen scrapers built for scheduled runs</td>
</tr>
</table>

### Instagram search limits & empty runs

- **Where results come from:** Instagram shows its own account and place search only to logged-in users, so accounts come from Meta's public Ad Library page search (`searchSource: "facebook-ads"`) and Threads search (`"threads"`), places from Facebook pages that are Instagram locations and from Google (`"google"`), and hashtags from Instagram's hashtag search (`"instagram"`). Results are what these public searches return, not your personal Instagram search.
- **Results per keyword:** hashtags at most 55 (Instagram's fixed page); accounts about 60-115 (Ad Library matches across 10-20 countries plus about 20 Threads authors; 112-114 candidates for "pilates studio" and "yoga studio" with 20 countries); places about 10-38 candidates, of which 60-100% are Instagram places (271 places for 20 keywords at 20 per keyword).
- **Google varies by keyword:** one Google search per keyword adds about 10 places, but for some keywords Google answers without Instagram place pages (6 of 20 keywords in one test run); those keywords get Ad Library places only. The run summary shows `fromGoogle` per keyword.
- **Place posts:** the first page Instagram shows a signed-out visitor: 12-18 top posts, or the 12 most recent. Older posts need a login.
- **Profiles:** for many business accounts Instagram's profile answer is read from its web profile instead (`profileSource: "web"`), which carries the 6 latest posts instead of 12 and no IGTV count. Business email and phone buttons are hidden from signed-out visitors, so `emails` and `phones` come from the bio.
- **Related hashtags:** each hashtag's own Instagram search (`relatedSource: "hashtag-search"`). Instagram allows about 50 hashtag searches per IP before it asks to wait; on long runs, once every session is refused, rows carry the keyword's results that share the hashtag's name instead (`relatedSource: "keyword-search"`). No extra charge either way.
- **Not in this actor:** popular reels by keyword (they are posts: use [Instagram Scraper](https://apify.com/topapi/instagram-scraper)), live account search and places near a GPS point (both need a login), hashtag posts-per-day and difficulty scores.
- **Empty dataset:** the keyword matched nothing, or your filters removed everything; the status message and `RUN_SUMMARY` say which, and nothing is charged.

### FAQ

#### How much does Instagram Search Scraper cost?

$0.27 per 1,000 hashtags, $1.30 per 1,000 accounts (plus $1.10 per 1,000 for the full profile) and $1.80 per 1,000 places, with no start fee. A run of 50 hashtags costs about one cent.

#### How many results can Instagram Search Scraper return per keyword?

Up to 250 per keyword and type can be requested. In testing a keyword gave up to 55 hashtags, about 60-115 accounts and 10-38 place candidates. More keywords, and more `countries` for accounts, give more results.

#### Can Instagram Search Scraper find Instagram accounts by keyword?

Yes. It returns accounts whose Facebook page or Threads posts match the keyword, with their followers and, with the profile add-on, the full public profile.

#### Can I search Instagram places and locations with Instagram Search Scraper?

Yes: `searchType: "place"` returns Instagram locations with address, phone, coordinates, category, opening status and their posts. A location URL or id in `startUrls` reads that place directly.

#### Can I run Instagram Search Scraper on a schedule?

Yes. Create a schedule in the Console and turn on `monitorMode`: each run returns only accounts, hashtags and places that earlier runs did not deliver.

#### Do I need an Instagram account, cookies or an API key?

No. Instagram Search Scraper uses public, signed-out pages and searches only.

#### Can I use Instagram Search Scraper with the Apify API?

Yes. Start runs and read results with the Apify API or `apify-client` for Node.js and Python; examples are on the API tab.

#### Can I use Instagram Search Scraper through an MCP server?

Yes. Add it to Claude, Cursor or another MCP client from the MCP tab; `compact` keeps each row short.

#### Why did my Instagram Search Scraper run return no results?

The keyword matched nothing in that search type (try a shorter keyword or another type), or the filters removed every result. The free notice row and `RUN_SUMMARY` show the counts per keyword.

#### Is it legal to scrape Instagram search results?

Instagram Search Scraper collects only publicly available data and does not log in. Results can contain personal data, which is protected by regulations such as the GDPR, so make sure you have a legitimate reason to process it.

#### Your feedback

Found a bug or missing a field? Open an issue on the [Issues tab](https://apify.com/topapi/instagram-search-scraper/issues/open) and we will look at it.

# Actor input Schema

## `search` (type: `string`):

One or more keywords, comma-separated, e.g. "coffee", "cakes prague, dentist chicago". Each keyword is searched for the type below and returns up to the limit per keyword.

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

Places (Instagram locations), accounts (profiles), hashtags, or all three for every keyword.

## `startUrls` (type: `array`):

Instagram place pages or ids and hashtag pages to read directly, e.g. "https://www.instagram.com/explore/locations/270309914/bakeshop-praha/", "212988663", "#coffee".

## `searchLimit` (type: `integer`):

Maximum results per keyword and type (1-250). Instagram's hashtag search returns at most 55 per keyword.

## `countries` (type: `array`):

Two-letter country codes the Meta Ad Library search is run in (each adds up to 15 matches), "ALL" for worldwide. More countries = more accounts per keyword.

## `placePosts` (type: `string`):

Which of the place's posts to nest in its row: the top posts Instagram shows first (12-18), the 12 most recent, both, or none.

## `placeSourceOrder` (type: `string`):

Places only: Ad Library first (matches place names, more results per keyword) or Google first (pages about the keyword, usually closer to the city you typed). The other source fills the rest.

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

Accounts only: keep accounts with at least this many followers. 0 = no minimum.

## `maxFollowers` (type: `integer`):

Accounts only: keep accounts with at most this many followers, e.g. 50000 for micro-influencers. 0 = no maximum.

## `verifiedOnly` (type: `boolean`):

Accounts only: keep accounts with Instagram's verified badge.

## `accountType` (type: `string`):

Accounts only: keep business, creator, professional (business or creator) or personal accounts. Reads each account's profile.

## `excludePrivate` (type: `boolean`):

Accounts only: leave out private accounts. Reads each account's profile.

## `minPosts` (type: `integer`):

Keep hashtags, places and accounts with at least this many posts (a hashtag's or place's post count, an account's posts). 0 = no minimum.

## `keywordFilter` (type: `string`):

Keep results whose name, username, category, bio or address contain one of these words (comma = any), e.g. "vegan, gluten".

## `activeWithinDays` (type: `integer`):

Keep accounts and places with a post in the last N days (an account's latest post, a place's recent posts). 0 = no date filter.

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

Accounts only: add each account's public profile (bio, links, exact counts, category, business address, 12 latest posts, related accounts). Charged as the profile-enrichment add-on.

## `includeRelated` (type: `boolean`):

Hashtags only: add each hashtag's related hashtags with their post counts, grouped as frequent (1M+), average (100k-1M) and rare. No extra charge.

## `monitorMode` (type: `boolean`):

Remembers, per keyword, which accounts, hashtags and places were already delivered and returns only new ones. Pairs with a daily or weekly schedule.

## `monitorStoreName` (type: `string`):

Name of the key-value store that keeps the memory for monitor mode. Give each separate watchlist its own name. Letters, digits and hyphens.

## `maxItems` (type: `integer`):

Hard cap for the whole run across all keywords and types. 0 = no total cap (each keyword is still capped above).

## `compact` (type: `boolean`):

Core fields only (type, keyword, rank, name or username, counts, category, URL): small rows for AI agents and MCP clients.

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

Apify Proxy is the default; the actor falls back to direct egress, and to residential for the small requests, when a session is refused.

## `maxConcurrency` (type: `integer`):

How many places, profiles or related-hashtag lookups run at once. 8 is the default; these reads wait on the network, not the CPU.

## `maxSerpPagesPerRun` (type: `integer`):

Places only: after the free Ad Library matches, one Google search per keyword (about 10 more places) while this many remain for the run. 0 = Ad Library only.

## Actor input object example

```json
{
  "search": "coffee",
  "searchType": "hashtag",
  "searchLimit": 50,
  "countries": [
    "ALL",
    "US",
    "GB",
    "DE",
    "FR",
    "ES",
    "IT",
    "BR",
    "IN",
    "CA"
  ],
  "placePosts": "top",
  "placeSourceOrder": "adLibraryFirst",
  "minFollowers": 0,
  "maxFollowers": 0,
  "verifiedOnly": false,
  "accountType": "any",
  "excludePrivate": false,
  "minPosts": 0,
  "activeWithinDays": 0,
  "enrichProfiles": true,
  "includeRelated": true,
  "monitorMode": false,
  "monitorStoreName": "instagram-search-monitor",
  "maxItems": 0,
  "compact": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 8,
  "maxSerpPagesPerRun": 10
}
```

# Actor output Schema

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

The dataset: one item per account, hashtag or place found (field `type`), in Instagram's / the source's ranking per keyword.

## `summary` (type: `string`):

Per-keyword outcome (found, delivered, filtered, already delivered, not a place, unreachable), which source served each result, Google pages used and requests per egress.

# 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 = {
    "search": "coffee",
    "searchType": "hashtag",
    "searchLimit": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/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 = {
    "search": "coffee",
    "searchType": "hashtag",
    "searchLimit": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("topapi/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 '{
  "search": "coffee",
  "searchType": "hashtag",
  "searchLimit": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call topapi/instagram-search-scraper --silent --output-dataset

```

## MCP server setup

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