Instagram Influencer Search, Discovery — Instagram Search Users
Pricing
$10.00 / 1,000 profiles
Instagram Influencer Search, Discovery — Instagram Search Users
Scrape Instagram influencers by hashtag and keyword search — influencer finder to find creators, coaches and brands in any niche, for influencer discovery and creator search. Filter by followers and engagement rate; every profile returns emails, phone, bio links and Reels views for lead generation.
Pricing
$10.00 / 1,000 profiles
Rating
0.0
(0)
Developer
Andrey Afanasenko
Maintained by CommunityActor stats
0
Bookmarked
392
Total users
110
Monthly active users
3 hours ago
Last modified
Categories
Share
Give it a niche — a keyword or a hashtag — and get back the Instagram accounts in it, each enriched with email, phone, bio links, follower counts, engagement rate and Reels views. 20+ filters run before you pay attention to a row, so what lands in the dataset is the shortlist, not the raw search.
Instagram's own search gives you names. This actor gives you the accounts behind them, already qualified: set a follower range, an engagement floor and a language, and only the profiles that match your target persona reach the dataset. No login, no cookies, no Instagram account of yours involved.
Choose a search mode
| Mode | Input | Check limit |
|---|---|---|
| Mode 1: Keyword / Hashtag Search (default) | searchQueries and/or searchHashtags | maxCountDiscovery |
| Mode 2: AI Search | searchMode: "aiDiscovery" and request | maxCountAiDiscovery; maxResults separately sets the matching-result goal |
Fill in the selected mode's section. Data Extraction, Optional Filters and Run & Storage Options apply to both modes.
Existing keyword/hashtag inputs and saved Tasks work without adding searchMode or changing their keys, filters or limits. Providing request alone does not switch an existing input to AI.
🎯 Mode 1: Keyword / Hashtag Search
You give the actor search terms — plain keywords, hashtags, or both:
- Search Queries are matched against Instagram account names and bios.
fitness coach,veterinario,marketing agency. Any language. - Search Hashtags collect the authors of that hashtag's top posts. Those accounts skew larger and already-popular, so a follower floor keeps a far higher share of them than plain keyword search does.
Every term is searched in parallel, and the results are merged round-robin — one candidate from each term in turn — so a single broad term cannot swallow your whole budget while a narrower one returns nothing.
For every account that comes back you get:
- Identity — handle (Account URL), Full Name, Profile Picture, verified flag.
- Audience — Followers Count, Following Count, Total Posts, Posts per Month, Last Post age in days.
- Reels analytics — Reels Count, Last Reel age, Median Views, Views/Followers ratio.
- Engagement — Avg Likes, Avg Comments, Median Engagement Rate, Quality flag (Good / Poor).
- Contact — Email, Email Source, Phone, Phone Source, External URL, Physical Address. When a profile shows no email or phone, the page its bio link opens (a Linktree-style page or the account's own website) is checked too, and the source columns say where each contact came from.
- Classification — Business Category, Detected Language, Account Type.
- Optional post sample — captions of the 8 most recent posts, plus contacts parsed out of them.
Then your filters run — follower band, engagement floor, language, business category, contact-channel presence, posting cadence, Reels view ratio, verification — and only the matches are saved.
Quick start
A minimal input that works on the free plan (5 accounts, no setup):
{"searchQueries": ["fitness coach"],"searchHashtags": ["personaltrainer"],"extractEmail": true}
Leave both search fields empty and the run does a small capped demo search instead of failing, so you can see the output shape before deciding what to ask for.
🆕 Mode 2: AI Search
Choose Mode 2: AI Search, or send searchMode: "aiDiscovery". Describe the niche, role, geography, contacts and exclusions in request (1–4,000 characters). All explicit form filters also apply. Conflicting conditions stop the run before reading profiles. The effective plan appears in Live Status and AI_SEARCH_PLAN.
{"searchMode": "aiDiscovery","request": "Find 10 fitness coaches based in Spain who sell online programs, with a public email. Exclude gyms and shops.","minFollowers": 5000,"maxFollowers": 50000,"maxResults": 10,"maxCountAiDiscovery": 100,"extractEmail": true}
The form also asks the questions a good researcher would ask, all optional: example accounts (perfect fits to find others like), where they should be based and whether that is required or only preferred, people or businesses, account size, a required contact (public email, or email or phone), what they must sell, and how recently they posted (aiExampleAccounts, aiLocation, aiLocationMode, aiAccountKind, aiFollowerSize, aiContact, aiSells, aiActiveWithinDays). Each answer is added to your description as a follow-up, so saying it in the description works the same way. Example accounts alone, without a description, run a lookalike search. Example accounts are starting points, not results: they are read free and never returned, and accounts related to them are searched first. In the description, write an example as @handle or a profile link; a handle with a dot, an underscore or a digit (selena.sgo) also counts without the @. An account the description does not name is never used as an example, and the run says which ones it left out.
Every profile the AI accepts is read a second time by a skeptical reviewer before it is delivered. A profile that is only next to the niche you asked for, a brand when you asked for people, or that breaks one of your exclusions is turned down, and the search continues.
Live Status shows the search as it happens: progress toward your result goal, each match as it is confirmed with the quotes that prove it, what the AI is reading and checking right now, your requirements, and every search source with its own counts. After the run it stays as the run's report.
maxResults limits confirmed AI matches to 1–100. Without it, the count in your description is used, or 20 when unspecified. maxCountAiDiscovery separately limits AI checks, including rejected profiles. Profiles turned down before AI analysis by the follower range, a required email or a required absence of a website are free and do not count toward it; a run reads at most eight profiles per AI check plus 40. A positive value of 1–1,000 sets the limit; absent or 0 uses the existing maxCountDiscovery value, or 100 if that is also absent or 0. This keeps previously saved AI inputs working. A positive maxCountAiDiscovery takes precedence over maxCountDiscovery. Mode 1 keeps its existing limits and ignores these AI-only options.
When a description requires a country, a profile counts as based there when it states a place there as its own: the country, or a city, state or region in it, next to 📍 or words such as "based" or "serving" in the bio or a post; a place the bio or the profile name gives as part of describing the account ("Coach in Madrid", "Wisconsin Sports Photographer", "Sophie | Cleveland, OH"); the profile's city or address field; location tags on its own posts; a website or email ending in that country's domain (for example .com.br or .co.uk); or a public contact phone with that country's international prefix (for example +34 for Spain). Instagram's own About this account panel counts too: "Account based in" that country proves it, and an account the panel places elsewhere, with nothing on its profile pointing to the required country (its city or address field, the location tag of the video it was found by, its phone prefix, website, currency or link-in-bio page; a place in another country does not), is turned down free before its posts and Reels are read, so location tags on its posts no longer keep it. When the form says the location is only preferred, it stays a preference even if the description also says where the accounts are based. Prefixes shared by several countries, such as +1, vanity domain endings such as .co or .io, language, flags, hashtags and trips do not count, and a place in another country never does.
Word an email requirement the way you mean it. "With a public email" accepts an email in the bio or in the profile's contact button. "With an email in the bio" accepts only an email written in the bio text, which far fewer accounts have, so the same number of checks finds fewer matches. If a run finds fewer matches than you asked for, its message names the most common reason profiles were turned down and what to change.
No keywords or hashtags are required for Mode 2. If an AI input includes searchQueries or searchHashtags, they are optional search hints and are searched first, ahead of the AI's own searches (up to six searches and three hashtags; the status page names any left out). Shared form filters still apply together with the description.
AI Search reads the public profile, public contacts and eight latest post captions. It searches account names, what creators say in their Reels, hashtag authors, accounts related to every confirmed match or user-named example (up to ten named examples), and saved accounts most similar to the matches already confirmed. When the first searches run dry or rarely match, it plans new searches from what it has learned in the same run — for example the cities of the accounts that matched. Named examples are checked first, and accounts related to a match are searched as soon as it is confirmed and checked before the rest. Several profiles are read and checked at the same time; required online-delivery hints in search names are prioritized while every profile still gets a complete verification. An example can be outside your follower range and still help discover similar accounts; all returned profiles must meet your filters. Follow-up corrections in the description use the latest stated requirement. Alternative countries accept a profile based in any listed country.
It does not inspect images, videos, external websites or private audience demographics. Requirements no public profile can show, such as where an account's audience lives, are kept as preferences and labeled as not verifiable instead of turning every profile down. A creator's gender counts when the profile says it or the name field carries a clearly gendered first name; age and ethnicity are never guessed. Missing proof for a mandatory condition means the profile is not returned. Posting in a language does not establish the author's country. “Without a website” means no website listed in the public profile, including bio text and bio links; it cannot prove that a business has no website elsewhere. This conflicts with an enabled Has website filter.
AI checks also carry a verification version. After upgrading to the checks in 0.0.107 or later, run an existing AI description online once to create a current saved check before using Offline Mode. Older AI checks remain saved but are not reused as evidence for the new version. Classic Offline Mode is unchanged.
Results contain AI Score, AI Match Reason and AI Evidence with literal source quotes and Instagram links, and AI Match Level. confirmed means every requirement is proven. When a run ends short of its goal, it adds possible matches: every requirement proven except one that the profile does not show — such as its language, its offer or what its posts are about (a required location must always be shown) — and nothing contradicting it; AI Missing Proof names that requirement. A possible match has at least 50 followers unless you asked for tiny pages, and one whose posts could not show the required content has at least 10,000. Possible matches never count toward maxResults and cost nothing beyond their check. Score sorts confirmed matches; it never overrides an unconfirmed requirement. Classic rows retain their values and have empty AI fields.
Checked Profiles, in Output, lists every completed check, including rejected and unconfirmed profiles, profiles filtered free before AI analysis, reasons, evidence and payment status. Checks still in progress when the goal was reached are listed as not needed and are not charged. These rows do not count as matching results. For API access, read AI_CHECKED_PROFILES in the run's key-value store and use its itemsUrl. RUN_SUMMARY gives the stop reason, checks, matches, rejected profiles, charged profiles and incomplete-result diagnostics. Its appliedFilters lists the requirements every profile was checked for, the follower range and other filters, the preferences that only rank results, and anything in your description that no public profile text can show (for example the audience's age), which is used only to rank; the run's message names the same. Source or analysis failures are reported explicitly.
If AI Search cannot complete, AI_DIAGNOSTIC identifies whether it failed during planning or profile verification. RUN_SUMMARY.aiResponseDiagnostics records bounded response metadata and schema-validation paths; aiPlanDiagnostics records rejected plans. Invalid JSON, incomplete responses, schema errors and blocked responses have distinct diagnostics. Retry attempts consume the existing AI spending allowance; planning never incurs a profile charge. Raw model output and thinking are excluded from diagnostics.
For cost auditing, RUN_SUMMARY also records source-declared dataRequestUnits, dataRequestCostUsd at the configured unit rate, and aiAnalysisUsd, the AI analysis spend confirmed by the answers, including retries. AI calls that got no answer (a timeout or a dropped connection) or an answer without usage are reported apart in aiAnalysisUnconfirmedMaxUsd, the most they can have cost; the AI spending allowance counts them in full (aiAnalysisReservedUsd). Responses explicitly exempted by the source's billing policy, such as rate limits and server errors, have zero source cost. dataCostStatus: "incomplete" and dataCostUnconfirmedAttempts identify calls whose cost could not be observed, including interrupted calls and older checkpoints. These are operating costs, separate from the customer price below. Offline replay reports zero new operating costs.
Each profile the AI analyzes is a paid AI check, including rejected and unconfirmed checks: $0.01 until November 9, 2026, then $0.028–$0.04 depending on your Apify plan (see Pricing). Profiles turned down before AI analysis by the follower range, a required email or a required absence of a website are free, and so is a profile whose AI answer could not be verified against its public text (listed as unconfirmed, payment status unverified). The existing first-run waiver for up to 100 filter rejects before the first match remains. Description planning and searches without a completed profile check have no separate customer charge. Free plan: five real AI checks per run, within the existing 15 runs per calendar month. The run respects both Apify's maximum cost and optional maxBudgetUsd. Reaching the goal stops further checks. A run that is clearly not finding matches stops early too, with stop reason hopeless: after about 67 AI checks without a match (about 128 with one), and only once its own re-planned searches have been tried and while it has no possible match; its message names the requirement most profiles failed and what to change. With 10,000 or more accounts in the exclusion list (excludeAccounts), a run stops after 40 AI checks without a match, because such a list usually leaves few new accounts for the same request; its message says how many search results were already on the list.
For Offline Mode, keep the same description and use enableOfflineMode: true. Saved checks are replayed without profile or AI calls and without new profile charges. You can tighten or loosen form filters over those saved verdicts; a profile without a confirmed saved AI check cannot become a match. A changed description requires an online run. The AI cache is scoped to your account and description; an interrupted run restores its own durable check journal and reconciles billing before continuing. If an old charge cannot be confirmed safely, the run stops with a billing diagnostic and retains the check for review.
📦 Output sample
Mode 1 returns profiles that pass your filters; Mode 2 returns profiles with confirmed mandatory conditions. Each returned profile is one dataset item. Here is a Mode 1 row from a real run — the search was nike running with a 50 000-follower floor (Profile Picture URL and post captions truncated for readability):
{"Account": "https://instagram.com/nikerunning","Source": "Keyword Discovery","Full Name": "Nike Running","Followers Count": 6187625,"Following Count": 599,"Biography": "Don't lose your cool. \nAero-FIT is available now.","Email": "N/A","Email Source": "N/A","Phone": "N/A","Phone Source": "N/A","External URL": "https://example.com/links","Category": "N/A","Address": "N/A","Profile Picture": "https://scontent.cdninstagram.com/v/t51.../profile.jpg","Reels Count": 12,"Last Reel (Days Ago)": 0,"Median Views": 282564,"Avg Likes": 10634,"Avg Comments": 0,"Views/Followers Ratio": "4.57%","Posts in Last 30 Days": 11,"Posts per Month": 11,"Total Posts": 2076,"Detected Language": "English","Last Post Within (Days)": 0,"Median ER": "0.13%","Quality": "Poor","Post 1": "Introducing air conditioning for athletes. Aero-FIT keeps 2x Olympic Medalist…","Post 2": "Don't lose your cool. No matter how hot it gets. Aero-FIT is coming soon.","Post 3": "Beat the heat. Introducing Aero-FIT, air conditioning for athletes…","Post 4": "Six cities. One starting line. Thousands of stories…","Post 5": "After a 10-month hiatus, @jakobing takes 5000m gold in Birmingham. Welcome back.","Post 6": "The harder you run, the harder you cool. Feel the airflow of Aero-FIT…","Post 7": "\"I really feel the air when I pick up the pace.\" When @kenny_bednarek turns up…","Post 8": "\"I don't feel the shirt. I feel air.\" For 100x Half-Marathon Champion Yin Xiao…","Analysis Status": "analyzed","Why Not Analyzed": "N/A"}
That "Quality": "Poor" on a 6-million-follower brand account is the actor working, not failing: a 0.13 % engagement rate is what a huge follower count usually buys, and it is exactly the row you would want filtered out of an outreach list. Set minEngagementRate and it never reaches your dataset.
Missing optional values come back as the string "N/A" rather than null, so every key is always present and downstream code (Sheets, Airtable, CSV) can rely on a stable shape. The full per-column schema — types, descriptions, examples — is in .actor/dataset_schema.json, which is also what an AI agent reads when it calls this actor through Apify's MCP server.
On the free plan, the results also tell you what was left behind. The free plan returns up to 5 matching accounts per run; with a filter on, it checks up to 25 candidates and stops at 5 matches or 20 accounts your filters rejected, whichever comes first. When a search term still had candidates left when the run stopped, the actor adds one extra row per term — "Analysis Status": "not_analyzed" and, in Why Not Analyzed, how many more accounts that term still had. Those rows come after your results, they are never charged, and a paid run never produces them. When a free-plan limit stopped a run that found accounts, the last row has Source «Free plan» and says which limit applied and where to lift it in Apify Console. On these rows a blank cell is whatever the column accepts — "N/A" in a text column, null in a numeric one.
A paid run that kept few of the accounts it checked says so in the results too. When a run on a paid plan analyzed 20 or more profiles and your filters kept fewer than 1 in 5, it ends with one more row after your results — "Source": "Run diagnosis" — whose Why Not Analyzed gives the kept share with both numbers, the filters that rejected the rest (by their names on the Input form) and how to get more rows. When the low share shows early — 100 or more profiles analyzed and fewer than 1 in 10 kept so far — one such row also goes in right away, within the first 20 rows, so an app or agent that reads only the first page sees it too. It gives the numbers so far and points to the last row for the final count. These rows are not accounts, are never charged, and are not counted in the run's totals.
🧭 When to use it
- Influencer sourcing. Name the niche, set a follower band (3 000–100 000 is the most common), and get creators in it with engagement rate already computed and emails already extracted.
- Lead generation. Search the category your buyers describe themselves with —
nutrition coach,dentist,wedding photographer— and get their contact details in one pass. - Hashtag research. Find who is actually behind a hashtag's top posts, not just the posts, then qualify them by audience size and engagement.
- New-market entry. Search in any language to build a starting list in a country or vertical you have no accounts in yet.
- Competitor-adjacent discovery. Search the words your rivals use in their bios and see who else claims the same ground.
🎯 Example tasks
Ready-to-run examples — each opens a pre-configured task you can run in one click (no setup):
- Find influencers on Instagram by keyword — Search any niche and get the accounts in it, each with follower count, engagement rate, email, phone, website and business category.
- Find micro influencers by follower count — Set a follower range and a minimum engagement rate, and get creators in your niche that fit it, with contact details already attached.
- Build an Instagram influencer database — Run several niches at once and export one sheet: handle, followers, engagement rate, email, phone, website, category and Reels views.
- Find Instagram influencers with emails — Keep only the accounts that publish a way to reach them. Every row carries the email plus audience size, engagement rate and category.
- Find Instagram creators by hashtag — Give it a hashtag and get the accounts behind its top posts, each with follower count, engagement rate and public contact details.
🛠 Input
The input form is grouped into four sections:
| Section | Purpose |
|---|---|
| 🎯 Find accounts by keyword or hashtag | The search terms, how many pages to read per term, and the cost ceiling. |
| ⚙️ Data Extraction Options | Which enrichments to run (email, phone, posts, engagement). Off = skip the call → faster and cheaper. |
| 🔬 Advanced Filtering (Optional) | 20+ filters that drop non-matching accounts. |
| ▶️ Run & Storage Options | Resume from checkpoint, offline re-filter mode, exclusion list. |
The fields that matter most:
searchQueries— search terms, one per line. Single common words return far more candidates than long phrases.searchHashtags— hashtags, with or without#. Returns the authors of the hashtag's top posts.maxSearchPagesPerQuery— how deep to read each term's results (1–50, default 5). More pages = more candidates, slower.maxCountDiscovery— hard cost ceiling in accounts. Set it to your spend budget × 100 (e.g.1000= $10).minFollowers/maxFollowers— the most-used filter, set as a band (3 000–100 000 for micro-influencers).minEngagementRate— a common floor is 1–3 %.analyzeQuality— on by default; computes Engagement Rate and the Quality flag. In AI Search,falsealso skips the separate Reels read unless a Reels filter (lastReelDays, median views, views/followers ratio) or a requirement about Reels or videos needs it; the Reels columns then come from the Reels among the latest posts, or stay empty.extractPosts— fetch the 8 most recent captions; required forlastPostDays,minPostsInPeriod,keywordLocation=postsandsearchContactsInPosts.contactInfoType— keep only accounts that have the contact channel you will actually use.profileLanguage— restrict to one of 44 detected languages.
💰 Pricing
The actor uses Apify's Pay Per Event model. Keyword search (Mode 1) is charged per Profile; AI Search (Mode 2) is charged per AI check:
| Event | Price | Triggered |
|---|---|---|
| Profile | $0.01 | Mode 1: once per discovered account that is successfully retrieved and analyzed, whether or not it passes your filters. |
| AI check | $0.028–$0.04 by Apify plan, from November 9, 2026: Free $0.04 · Bronze $0.035 · Silver $0.03 · Gold and above $0.028. Until then an AI check is charged as a Profile, $0.01. | Mode 2: once per profile the AI checks against your description, whether or not it matches. Profiles turned down earlier by the follower, contact or website filters are free. |
Accounts that could not be read — not found, private, or failed — are not charged. You are billed per account, not per API call, so maxCountDiscovery translates directly into your maximum spend in Mode 1, and maxCountAiDiscovery caps the paid AI checks in Mode 2.
Filters run after the fetch. An account has to be read before the actor can tell whether it matches your follower band or language, so a narrow filter stack costs the same as a wide one and returns fewer rows. Start loose, look at the yield, then tighten — and use Offline Mode (below) to re-filter what you already paid for, free.
🆓 Free vs paid plan
| Free plan | Paid plan | |
|---|---|---|
| Matching accounts per run | 5 (with a filter on, up to 25 checked — up to 20 rejected by your filters, charged the same way as on a paid plan) | unlimited |
| Runs per calendar month | 15 | unlimited |
| Search terms per run | unlimited | unlimited |
| Filters (followers, language, engagement, …) | ✓ | ✓ |
| Reels analytics (Median Views, Views/Followers) | ✓ | ✓ |
| Offline re-filtering | ✓ | ✓ |
| Resume from checkpoint | ✓ | ✓ |
A run you stop part-way uses one of the 15 monthly runs, the same as a run that finishes (demo runs and Offline Mode re-filters never count).
When your filters reject every profile a free run checks, those profiles still come back as full rows marked "Analysis Status": "filtered_out", and Why Not Analyzed names the filter each one did not pass, the value you set and the account's own value. They are not results and add no charge of their own — loosen that filter and re-filter them for free with Offline Mode, or upgrade so the same filters check the rest of your search.
Upgrade to a paid plan to remove the 5-account cap.
🧪 Filter recipes
Micro-influencer sourcing (fitness / wellness)
{"searchQueries": ["fitness coach", "nutrition coach"],"searchHashtags": ["fitnesscoach", "personaltrainer"],"maxCountDiscovery": 500,"minFollowers": 3000,"maxFollowers": 100000,"minEngagementRate": 2,"extractEmail": true,"contactInfoType": "emailOrPhone","filterForInfluencers": true}
Local-business lead list
{"searchQueries": ["dental clinic", "dentist", "orthodontist"],"maxCountDiscovery": 300,"accountType": "business","extractPhysicalAddress": true,"locationKeywords": "London, Croydon, Wembley, Stratford, Camden, United Kingdom","hasWebsite": true}
extractPhysicalAddress adds the Address column so you can see exactly what each row matched — the filter itself works without it.
The Business-Address filter reads the address a business published about itself — not a place you search. Write it the way Instagram writes it: "Miami, Florida" in the US, Canada, Mexico and India (city, then state), "Berlin, Germany" everywhere else (city, then country in English). Six rules from our own run history:
- Separate terms with a comma. A space-separated list is read as one long term — of 21 runs that tried, one delivered.
- Give it a list, not a word. Name the city, the towns around it, and the region. Customers who wrote lists of six or more terms got rows 38% of the time; customers who never went past five, 11%. Terms are OR-ed — an extra term can only help, never hurt.
- Add the region written out. "Florida", "Ontario", "Germany", "Nigeria" — Instagram spells these in full; the field carries "United Arab Emirates", not "UAE", and a list of nothing but country abbreviations has not returned a row yet.
- Copy Instagram's spelling, accents included. "São Paulo", not "Sao Paulo".
- Search for business types, not people. "dental clinic" surfaces profiles with addresses; "fitness coach" surfaces creators, who have none.
- Neighborhoods work too. The street line is searched as well, so "Marina", "Lagos Island" or "Borivali West" can match where a city name is too broad.
Non-English market entry
{"searchQueries": ["coach immobilier", "agent immobilier"],"maxCountDiscovery": 200,"profileLanguage": "French","minFollowers": 1000,"extractEmail": true}
🔁 Resume / checkpoint
Long runs can be interrupted (timeout, manual stop, abort). The actor writes a checkpoint after every batch. To resume, run it again with clearSavedData unchecked — accounts already analyzed are not re-billed.
📡 Live status & storage records
| Storage key | Type | What it holds |
|---|---|---|
status.html | HTML page | Live progress, cost, ETA. Open it from the run's Storage tab. |
RUN_SUMMARY | JSON | Aggregate run statistics — counts, plan, filter breakdown, request totals. |
SKIPPED_ACCOUNTS | JSON | Every account skipped, with reason and category (filter / not_found / private / error). |
USER_MESSAGE | JSON | The one thing this run most needs to tell you — a demo notice, a zero-result diagnosis, or a free-plan cap. |
FILTER_BURN_PREDICTION | JSON | Written whenever a post-fetch filter is active: how much of the fetch your filter stack is likely to reject. |
API_USAGE | JSON | Request count for this run, split into fetches vs searches. |
🤖 Programmatic / API use
REST API:
curl -X POST "https://api.apify.com/v2/acts/afanasenko~instagram-influencer-search/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries": ["fitness coach"],"searchHashtags": ["personaltrainer"],"maxCountDiscovery": 100,"minFollowers": 3000,"maxFollowers": 100000}'
After the run succeeds, read rows from its default dataset; run-level statistics live in the RUN_SUMMARY record of the same run.
MCP / agentic clients (Claude, ChatGPT, Cursor, LangGraph, OpenAI Agents SDK, Mastra, …):
The actor is exposed as a tool through Apify's MCP server at mcp.apify.com. To mount it in your agent as a dedicated tool in one command:
$apify mcp install claude-code --tools afanasenko/instagram-influencer-search
Then ask in natural language — "find 50 fitness coaches with 10–50k followers and an engagement rate above 3%, with emails" — and the agent fills the input schema itself.
💡 Tips & best practices
- Start with no filters. Over-filtering is the most common cause of an empty run. Search filterless once to see what the term's pool looks like, then narrow.
- Filter offline, not online. Accounts are discovered before filters run — on the free plan up to 25 with a filter on, stopping at 5 matches or 20 rejected — so one strict filter can still empty a run. Harvest filterless first, then turn on Enable Offline Mode to try any filter combination against the accounts already saved. Re-filtering makes no requests and charges nothing.
- Combine keywords with hashtags. They surface different populations: keyword search reads names and bios, hashtag search reads who posts under the tag. Customers who use both get the widest funnel.
- Prefer short terms.
fitness coachreturns an order of magnitude more candidates thanonline fitness coach for women over 40. Narrow with the filters, not with the query. - Raise
maxSearchPagesPerQuerybefore adding terms. Reading deeper into one good term is usually cheaper than adding a term that overlaps it.
❓ FAQ
Q: How does the actor find accounts for a keyword?
A: It queries Instagram's own account search for each term — the same search the app performs — and reads as many result pages as maxSearchPagesPerQuery allows. For hashtags it reads the hashtag's top posts and takes their authors.
Q: Do I need an Instagram account, login, or cookies? A: No. You provide search terms and get public profile data back. No credentials of any kind are involved, so there is no risk to any Instagram account of yours.
Q: Why did my search return so few accounts? A: Usually a long phrase. Instagram's search is biased toward short, high-volume terms. Try the two- or three-word version, or add a hashtag.
Q: Are filtered-out accounts charged?
A: Yes — an account must be fetched before it can be filtered, so it counts as one paid event even if a filter then rejects it. That is why the actor writes FILTER_BURN_PREDICTION before fetching and warns you when your filter stack looks too narrow.
Q: How is engagement rate calculated?
A: For each recent post, (likes + comments) / followers, then the median across the sample. The median resists viral outliers better than the mean.
Q: What does the Quality flag mean? A: A heuristic combining engagement rate and audience signals. Good = worth reaching out to. Poor = likely low-engagement or inflated. A quick filter, not a verdict.
Q: Why are my Reels metrics blank?
A: Not because of your plan — the free plan runs every filter and every Reels metric exactly like paid. Reels are read only when something needs them: Calculate Engagement Rate (ER), or a Reels filter such as minMedianViews or lastReelDays. With both off, the Reels columns stay blank on every plan. With them on, a blank column means Instagram returned no clip data for that account — it has no Reels, or its posts could not be read. Those accounts are still charged, because the profile itself was retrieved.
Q: Will I get the same accounts for the same term across runs? A: Mostly, but not exactly. Instagram's search ranking shifts day to day. Re-running the same term a week later typically overlaps 70–90 % with the previous list.
Q: Which input field names does the API expect?
A: Classic uses searchQueries and searchHashtags (arrays of strings), maxSearchPagesPerQuery and maxCountDiscovery (numbers). AI uses searchMode: "aiDiscovery", request and optional maxResults in addition to the form filters. Common wrong guesses — query, keyword, maxItems, or account fields such as startUsernames, targetUsernames and profileUrls — are not recognized; the run log and the run report name them back to you with the field you probably meant.
Q: Can I re-filter results without paying again? A: Yes. Turn on Enable Offline Mode and the actor re-applies your current filters to accounts cached from previous runs — no Instagram reads, no paid events.
Q: Can I schedule it? A: Yes, on any plan including free. Save your input as a Task in Apify Console, then add a Schedule to the Task (⋮ menu → Schedule).
🔗 Other Instagram scrapers (same author)
Pick the one that matches what you start with:
| You start with… | You want to find… | Use this actor |
|---|---|---|
| A keyword or a hashtag | The accounts in that niche, enriched and filtered | This actor |
| 1–5 seed handles you like | Similar / suggested accounts in the same niche | Instagram Related Profiles Scraper |
| One known account | Its full followers or following list, with filters and enrichment | Instagram Followers & Following Extractor |
| One known account | Track who follows / unfollows it over time (scheduled) | Instagram Follower Tracker |
| Anything else (handles, post links, locations, keywords) | All of the above plus five other discovery modes in one tool | Instagram Profile Scraper |
| A reel link or a creator handle | What their reels say and show — spoken transcript, on-screen text, hook and structure | Instagram Reel Script Extractor |
| A post or reel link | The accounts that liked or commented on it, enriched and filtered | Instagram Likes Scraper |
| A post or reel link | What the comments say — every comment and reply as a row, @mentions split out | Instagram Comments Scraper |
| An AI agent (Claude, Cursor, ChatGPT) | The same Instagram data from inside your agent — MCP tools it picks by intent | Instagram Profile MCP Server |
| A list of usernames you already have | The contact details each one publishes — email, phone, website | Instagram Email Scraper |
🛟 Support & feedback
- Open an issue on the actor's Issues tab in Apify Console — the fastest way to get a fix shipped.
- Feature requests in the same tab; we read every one.
- Ratings & reviews on the Apify Store page help other users find the actor.
⚖️ Disclaimer
This actor reads publicly available Instagram profile data. It does not bypass authentication, read private profiles, or interact with content on your behalf. Use it in compliance with Instagram's Terms of Service and applicable privacy laws (GDPR, CCPA) — for outreach lists, make sure you have a legitimate interest and a clear unsubscribe path. The contact details returned are what the profile owner chose to publish on Instagram.