# Instagram Creator Discovery Keyword Niche (`coregent/instagram-creator-discovery-keyword-niche`) Actor

- **URL**: https://apify.com/coregent/instagram-creator-discovery-keyword-niche.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 discovered accounts

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 Creator Discovery by Keyword / Niche

![Instagram Creator Discovery by Keyword / Niche](https://raw.githubusercontent.com/coregentdevspace/instagram-creator-discovery-keyword-niche-assets/main/thumbnail-instagram-creator-discovery-keyword-niche.png)

Find public Instagram creators and business accounts by keyword or niche. Export flat, CSV-friendly discovery results with profile metrics, bio signals, activity snapshot, follower buckets, and lead-fit fields for outreach, research, and creator scouting.

This is a **discovery-first** specialist actor — not a generic Instagram scraper. It turns niche ideas into structured account lists you can open in Google Sheets, Airtable, Notion, or a CRM without cleanup.

### What it does

1. Takes a list of keywords or niche phrases (e.g. `"fitness coach australia"`, `"melbourne beauty creator"`, `"sydney electrician"`).
2. Runs an account search for each keyword (up to 50 accounts per keyword).
3. Enriches each discovered account with lightweight public profile data (bio, followers, category, external link, etc.).
4. Computes match signals (bio/name keyword match, business/creator/local signals), follower bucket, and a 0–100 `leadFitScore` with a plain-English `leadFitReason`.
5. Deduplicates the same account across multiple keywords and emits one flat row per account.

You can also skip the search and pass handles or profile URLs in `seedUsernames` — they're enriched and scored the same way.

### Input

| Field | Type | Description |
|-------|------|-------------|
| `keywords` | string\[] | Keywords or niche phrases to discover accounts for. Provide `keywords`, `seedUsernames`, or both. |
| `seedUsernames` | string\[] | Instagram handles or profile URLs to enrich directly, skipping search. |
| `maxResultsPerKeyword` | integer | Cap per keyword (default 50, maximum 50). |
| `searchType` | string | `profile` (default) or `mixed`. Both run the same account search. |
| `countryHint` | string | Optional country hint for `localSignal` / `locationHint` heuristics. |
| `languageHint` | string | Optional two-letter language hint. |
| `minFollowers` / `maxFollowers` | integer | Follower-range filters (0 = disabled). See [Filters and the lookup cap](#filters-and-the-lookup-cap). |
| `requireBusinessSignals` | boolean | Only keep accounts that look business/creator-like. |
| `requireExternalLink` | boolean | Only keep accounts with a public external URL. |
| `includeProfileEnrichment` | boolean | Fetch each account's public profile and recent posts (default true). Without it, rows carry only the search preview: no follower counts, bio or activity fields. |
| `dedupeAcrossKeywords` | boolean | Default true. |
| `includeKeywordMetadata` | boolean | Include keyword context fields on each row. |
| `maxConcurrency` | integer | Profiles fetched in parallel (default 1, maximum 5). |

See `input_schema.json` for the full schema.

#### Example inputs

Two niche keywords plus one seed account, about 10 accounts each — the run behind the sample output and screenshot below:

```json
{
  "keywords": ["fitness coach australia", "melbourne beauty creator"],
  "seedUsernames": ["kayla_itsines"],
  "maxResultsPerKeyword": 10,
  "countryHint": "Australia",
  "languageHint": "en",
  "includeProfileEnrichment": true,
  "dedupeAcrossKeywords": true,
  "includeKeywordMetadata": true,
  "maxConcurrency": 2
}
```

Lead list for outreach — small-to-mid accounts that link out to a website or booking page:

```json
{
  "keywords": ["sydney personal trainer", "brisbane yoga studio", "perth pilates instructor"],
  "maxResultsPerKeyword": 50,
  "countryHint": "Australia",
  "minFollowers": 1000,
  "maxFollowers": 100000,
  "requireExternalLink": true,
  "includeProfileEnrichment": true,
  "dedupeAcrossKeywords": true
}
```

Enrich known accounts only, no search:

```json
{
  "keywords": [],
  "seedUsernames": ["@kayla_itsines", "https://www.instagram.com/bhanu_padmini/"]
}
```

### Output

One flat row per discovered account. Field groups (PRD §11):

- **A. Discovery context:** `inputKeyword`, `normalizedKeyword`, `searchType`, `resultRank`, `keywordResultPosition`, `discoverySource`, `discoveryTimestamp`, `runId`
- **B. Account identity:** `username`, `fullName`, `profileUrl`, `instagramUserId`, `isVerified`, `isPrivate`, `isBusinessAccount`, `categoryName`
- **C. Profile summary:** `biography`, `externalUrl`, `hasExternalUrl`, `profilePicUrl`, `followersCount`, `followsCount`, `postsCount`, `reelsCount`, `followersBucket`
- **D. Niche / match:** `matchedKeyword`, `bioKeywordMatch`, `nameKeywordMatch`, `keywordMatchType`, `nicheHint`, `businessSignal`, `creatorSignal`, `localSignal`, `locationHint`
- **E. Activity / quality:** `lastPostTimestamp`, `daysSinceLastPost`, `recentPostCount`, `recentReelCount`, `recentActivitySignal`, `engagementSnapshotAvailable`, `avgLikesRecent`, `avgCommentsRecent`, `engagementRateEstimate`, `contentFormatMix` (best-effort, nullable)
- **F. Commercial / outreach:** `contactabilitySignal`, `hasEmailInBio`, `hasPhoneInBio`, `externalUrlDomain`, `commercialIntentSignal`, `brandCollabSignal`, `leadFitScore`, `leadFitReason`
- **G. Metadata:** `scrapedAt`, `sourceType`, `actorVersion`

#### Follower buckets

`0-999` · `1k-4.9k` · `5k-9.9k` · `10k-49.9k` · `50k-99.9k` · `100k-499.9k` · `500k+`

#### Dataset views

Three ready-made table views are configured. Each one shows a different set of columns over the same rows; sort or filter by `leadFitScore`, `isVerified` or `isBusinessAccount` in the Console or your spreadsheet to narrow the list.

- **Discovered Accounts** — keyword context, identity, profile metrics, match signals and the lead-fit score
- **Qualified Leads** — outreach columns: category, followers, bio, external link, bio email/phone, score and reason
- **Verified or Business Accounts** — verification and business flags, category, followers and score

**Discovered Accounts** (from the example run above):

![Discovered Accounts table view](https://raw.githubusercontent.com/coregentdevspace/instagram-creator-discovery-keyword-niche-assets/main/instagram-creator-discovery-keyword-niche-output-discovered-accounts-table-view.png)

#### Sample output

One real row from the example run (`profilePicUrl` omitted for length):

```json
{
  "inputKeyword": "melbourne beauty creator",
  "normalizedKeyword": "melbourne beauty creator",
  "searchType": "profile",
  "resultRank": 11,
  "keywordResultPosition": 1,
  "discoverySource": "tikhub_v2_search_users",
  "username": "bhanu_padmini",
  "fullName": "Bhanu Karanam | Melbourne Beauty Creator",
  "profileUrl": "https://www.instagram.com/bhanu_padmini/",
  "instagramUserId": "8653260855",
  "isVerified": false,
  "isPrivate": false,
  "isBusinessAccount": false,
  "categoryName": "Digital creator",
  "biography": "🇮🇳 - 🇦🇺 \n Makeup, Skincare & Some Hair care. \n🫶🏻 Acne Prone With Scarring. \n💌 bhanukaranam9@gmail.com\n#acneproneskinapproved",
  "externalUrl": "https://linktr.ee/Embraceyourself",
  "hasExternalUrl": true,
  "followersCount": 3562,
  "followsCount": 3742,
  "postsCount": 336,
  "followersBucket": "1k-4.9k",
  "matchedKeyword": "melbourne beauty creator",
  "bioKeywordMatch": false,
  "nameKeywordMatch": true,
  "keywordMatchType": "exact",
  "nicheHint": "Digital creator",
  "businessSignal": true,
  "creatorSignal": true,
  "localSignal": false,
  "locationHint": null,
  "lastPostTimestamp": "2026-10-28T05:50:59.000Z",
  "daysSinceLastPost": 0,
  "recentPostCount": 12,
  "recentReelCount": 6,
  "recentActivitySignal": true,
  "engagementSnapshotAvailable": true,
  "avgLikesRecent": 13,
  "avgCommentsRecent": 12,
  "engagementRateEstimate": 0.7,
  "contentFormatMix": "images:6|videos:0|reels:6",
  "contactabilitySignal": true,
  "hasEmailInBio": true,
  "hasPhoneInBio": false,
  "externalUrlDomain": "linktr.ee",
  "commercialIntentSignal": true,
  "brandCollabSignal": true,
  "leadFitScore": 80,
  "leadFitReason": "name matches keyword; exact phrase match; business signal; has external link",
  "scrapedAt": "2026-10-29T02:02:22.417Z",
  "sourceType": "instagram",
  "actorVersion": "1.0"
}
```

Activity fields are best-effort: an account whose recent posts aren't returned has `null` for `lastPostTimestamp`, `recentPostCount`, `avgLikesRecent` and the rest of group E. `localSignal` and `locationHint` are read from the bio (a 📍 pin, "based in …", or your `countryHint`), not from the username.

### Filters and the lookup cap

The follower, link and business filters need each account's profile, so they apply after the profile is fetched. A run that fetches 25 profiles producing no row (filtered out or unavailable), and at least three times as many as it returns, stops looking up new profiles and skips its remaining keywords. Normal runs never reach this; very strict filters can return fewer accounts than exist. `RUN_SUMMARY.workCap` shows whether it applied. To get more accounts, loosen the filters or add more specific keywords.

### Lead-fit score

`leadFitScore` is a 0–100 heuristic adapted from PRD §13. Positive signals: keyword match in name or bio, verified, business/creator signal, external link, strong follower range, recent activity. Negative signals: private account, empty bio, no keyword match, inactive account. `leadFitReason` is a short plain-English explanation — not a definitive quality truth.

### Pricing

Pay-per-event:

- **Discovered Account** — one event per account row delivered to your dataset, after all filters pass. Accounts removed by your filters, duplicates across keywords, and profiles that could not be fetched are not charged.
- **Actor start** — Apify's standard start fee, charged by Apify when a run starts and scaled by the run's memory.

Your bill is the start fee plus `charged_events × price_per_event`. Live rates, which can differ by Apify plan, are on the actor's **Pricing** tab; this README deliberately doesn't quote figures.

### Compliance

Only public Instagram data is used, retrieved through TikHub (a third-party Instagram data API). The actor does not:

- access private content
- bypass account permissions
- guarantee contact extraction
- automate outreach or messaging

### Local development

```bash
cd actor
npm install
$env:TIKHUB_API_KEY = "<key>"   # TikHub key; on Apify it comes from a secret
npm start      # run with INPUT.json
npm run dev    # run with local storage
```

Do not run `apify push` unless you are the repository owner deploying the actor — deployment is a manual step.

# Actor input Schema

## `keywords` (type: `array`):

Niche phrases (not URLs). Each keyword runs one account search and returns up to 50 accounts. Examples: 'fitness coach australia', 'melbourne beauty creator', 'parenting creator'.

## `seedUsernames` (type: `array`):

Instagram usernames to enrich directly, skipping the search stage. Paste usernames (with or without '@'), profile URLs, or bare handles — they are normalized automatically.

## `maxResultsPerKeyword` (type: `integer`):

Maximum number of accounts to return per keyword (up to 50 — one search page; the actual count depends on how many accounts match).

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

Discovery mode. Both values run the same account search today; 'mixed' is kept for compatibility and returns the same accounts as 'profile'.

## `countryHint` (type: `string`):

Optional country hint (e.g. 'Australia', 'US'). Used for the localSignal / locationHint heuristics — not a filter.

## `languageHint` (type: `string`):

Optional two-letter language hint (e.g. 'en', 'es'). Used for heuristics only.

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

Only return accounts with at least this many followers. 0 = no minimum.

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

Only return accounts with at most this many followers. 0 = no maximum.

## `requireBusinessSignals` (type: `boolean`):

Only return accounts that look like business / creator accounts (category, business flag, or commercial bio).

## `requireExternalLink` (type: `boolean`):

Only return accounts that have a public external URL in their profile.

## `includeProfileEnrichment` (type: `boolean`):

Fetch each discovered account's public profile (followers, bio, external URL, category, recent posts). Recommended. Without it, rows carry only the search preview, so follower filters and the lead-fit score have little to work with.

## `dedupeAcrossKeywords` (type: `boolean`):

If an account appears under multiple keywords, only emit one row and aggregate matched keywords in the matchedKeyword field.

## `includeKeywordMetadata` (type: `boolean`):

Include inputKeyword / normalizedKeyword / keywordResultPosition / discoverySource fields on each row.

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

Maximum number of profiles fetched in parallel.

## `debugMode` (type: `boolean`):

Enable verbose logging for debugging.

## Actor input object example

```json
{
  "keywords": [
    "fitness coach australia",
    "melbourne beauty creator"
  ],
  "seedUsernames": [],
  "maxResultsPerKeyword": 50,
  "searchType": "profile",
  "countryHint": "",
  "languageHint": "",
  "minFollowers": 0,
  "maxFollowers": 0,
  "requireBusinessSignals": false,
  "requireExternalLink": false,
  "includeProfileEnrichment": true,
  "dedupeAcrossKeywords": true,
  "includeKeywordMetadata": true,
  "maxConcurrency": 1,
  "debugMode": false
}
```

# Actor output Schema

## `accounts` (type: `string`):

No description

## `qualified_leads` (type: `string`):

No description

## `verified_or_business` (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 = {
    "keywords": [
        "fitness coach australia",
        "melbourne beauty creator"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/instagram-creator-discovery-keyword-niche").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 = { "keywords": [
        "fitness coach australia",
        "melbourne beauty creator",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("coregent/instagram-creator-discovery-keyword-niche").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 '{
  "keywords": [
    "fitness coach australia",
    "melbourne beauty creator"
  ]
}' |
apify call coregent/instagram-creator-discovery-keyword-niche --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,coregent/instagram-creator-discovery-keyword-niche"
        }
    }
}
```

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/wI8xQ2wAly8Q9Hg9r/builds/CBoAis2nIkgkhpBld/openapi.json
