Instagram User Search Scraper: Profiles by Keyword avatar

Instagram User Search Scraper: Profiles by Keyword

Pricing

from $1.33 / 1,000 profiles

Go to Apify Store
Instagram User Search Scraper: Profiles by Keyword

Instagram User Search Scraper: Profiles by Keyword

Instagram user search by keyword, no login: accounts from Threads' user search, Meta's Ad Library and Instagram's reel creators for each niche, trade or place. Rows carry followers, posts, bio, links, category, engagement and the linked Facebook Page; 24 filters. JSON, CSV or API; pay per profile.

Pricing

from $1.33 / 1,000 profiles

Rating

0.0

(0)

Developer

Automation Craft

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

Share

Instagram User Search Scraper: Profiles by Keyword

Find Instagram accounts by keyword and get every public account Meta's own searches show for your words, read on Instagram with its followers, following, posts, bio, links, category, account type, recent posts and engagement, without an Instagram account, cookies or login. Give a niche, a trade, a brand or a place ("coffee roaster", "wedding photographer miami", "vegan bakery"), a list of usernames, or post links, and get one row per account plus a free row per keyword that says what each search found and why the work stopped.

  • Three searches per keyword, merged. Threads' user search (accounts whose name or username matches, about 100 a search), Meta's Ad Library search (businesses with a Facebook Page and their Instagram account, up to 15 a search) and Instagram's popular reels search (the creators of 24 reels about your words, up to about 96 reels with more pages). On request: the keyword's name variants and the accounts Instagram suggests next to the ones found, one or two levels deep, for keywords, username lists and post links.
  • Every account read on Instagram. Exact followers and following, post count, bio, website and bio links, category, account type (personal, business, creator), verified, private, Threads profile, highlights, the linked Facebook Page, the 6 newest posts with likes and comments, and engagement figures computed from them.
  • 24 filters that cost nothing. Followers, posts, verified, account type, influencers only, words in the name, bio or posts, category, language, place words, an e-mail or a phone shown, a website, engagement rate, posting activity, reel plays and more. Accounts a filter leaves out are never charged.
  • Add-ons when you need them. Reel figures (median plays of the 12 newest reels), profile info (the business address, joined recently) and the linked Facebook Page's public contact (e-mail, phone, website, address, hours).
  • Fair billing. Each account is charged once per run, even when several keywords or searches find it. Searches that find nothing, accounts Instagram does not show logged out, failed calls, repeats and refused entries are free rows.

Quick start

  1. Open the Actor's Input tab and type your keywords, one per line (for example coffee roaster, yoga studio, wedding photographer miami), or paste usernames or post links.
  2. Set Max profiles per keyword (the searches together list up to about 140 accounts a keyword; variants and suggested accounts find more).
  3. Optional: add filters (minimum followers, account types, words that must be in the bio, a contact shown) or the add-ons.
  4. Click Start. Each account arrives as a row of the dataset, followed by one free row per keyword and a run summary.
  5. Download the dataset as JSON, CSV or Excel, or read it through the Apify API, a schedule, Make, n8n or Zapier.

What you get

One profile row per account. The fill rates below were measured on 392 distinct accounts read on the platform on 2026-10-28 (the 30 checking runs of the released build).

FieldWhat it holdsFilled
keyword, searchedAs, foundVia, rankyour keyword, the text searched, how the account was found (threads, ad_library, reel_creator, threads_variant, related_profile, username, commenter), its place in the keyword's merged list100%
username, id, url, fullNamethe account's username, Instagram id, link and name100%, name 99.2%
biographythe bio as Instagram serves it97.2%
followerCount, followingCount, followerToFollowingRatioexact followers and following, and their ratio100%
postsCountthe post count (private accounts show none)95.7%
accountType, isProfessional, categorypersonal, business or creator, and the category the account shows100%, category 58.2%
isVerified, isPrivate, isMemorialized, isMetaVerifiedthe badges and states Instagram serves100% (verified 29.8%, private 1.5%)
externalUrl, bioLinksthe website and the bio links (title, link, type)77.8%, 81.4%
profilePicUrl, profilePicUrlHdthe picture, small and full size100%
threadsUsername, threadsUrlthe account's Threads profile66.8%
highlightTitles, latestStoryAt, hasPublicStory, hasReels, reelsCount, pronounsstory highlights, the latest story, reels86.7%, 56.4%, reels count 93.9%
facebookPagethe Facebook Page the account links: id, name, alias, url, and for Ad Library finds category, likes, country27.3%
recentPosts, recentPostTimesthe 6 newest posts: link, type, date, likes, comments, caption, pinned, paid partnership, place94.1%
avgLikes, avgComments, engagementRate, engagementGrade, postsPerWeek, lastPostAtengagement of the newest posts (likes plus comments over followers, in percent; grade high from 3%, average from 1%, else low), the posting pace and the newest post90.3%, last post 94.1%
biographyLanguagethe language of the bio and recent captions, our own estimate (see the FAQ)81.4%
keywordMatch, matchedTermshow the username, name and bio hold your keyword's words: all, some or none100% (all 79.4%)
hasEmail, hasPhonewhether the bio, bio links or recent captions show an e-mail address or a phone number8.4%, 13.3%
emails, phonesthose addresses and numbers with where each was found: empty unless you turn on Include personal datawhen asked
reelStatsadd-on: reelsRead, medianPlays, averagePlays, maxPlays, newestReelCreatedAt, medianPlaysToFollowersPercentwhen asked
businessAddress, businessContactMethod, joinedRecently, businessCategory, isBusinessAccount, highlightCount, hasGuides, hasChannel, igtvVideoCount, facebookIdadd-on: profile info, read when Instagram answers that read (profileInfoStatus says when it did not); Instagram limits this read hard, so expect it on about a quarter of the accounts (131 of 500 on 2026-10-28)when asked
facebookPageContactadd-on: the Facebook Page's public emails, phones, whatsapp, websites, addresses, hours, priceRange, services, categories, ratingswhen asked
relatedProfilesadd-on: the accounts Instagram suggests next to this one (often none logged out); needs Include personal datawhen asked
commentsOnPostfor post links: how many of the comments read the account wrotepost links

Example row (from a run on coffee roaster; recent posts cut short):

{
"type": "profile",
"keyword": "coffee roaster",
"foundVia": "ad_library",
"rank": 2,
"username": "origincoffeeroasters",
"url": "https://www.instagram.com/origincoffeeroasters/",
"fullName": "Origin Coffee",
"biography": "Progressive coffee\nProudly B Corp\nBorn in Cornwall",
"followerCount": 101231,
"followingCount": 1426,
"postsCount": 2144,
"accountType": "business",
"isVerified": false,
"externalUrl": "https://linktr.ee/origincoffeeroasters",
"facebookPage": { "id": "109396825744233", "name": "Origin Coffee Roasters", "alias": "origincoffeeroasters", "category": "Coffee shop", "likes": 15035 },
"keywordMatch": "all",
"matchedTerms": ["coffee", "roaster"],
"avgLikes": 231.3,
"avgComments": 8.7,
"engagementRate": 0.237,
"engagementGrade": "low",
"lastPostAt": "2026-10-26T17:00:03.000Z",
"postsPerWeek": 2.19,
"recentPosts": [{ "url": "https://www.instagram.com/p/De9xQ3hiKTS/", "postedAt": "2026-10-26T17:00:03.000Z", "likeCount": 164, "commentCount": 2 }],
"emails": null,
"phones": null
}

The subject row (free). One per keyword (and one for the account list, one per post link): its status (ok, no_accounts, no_matching_accounts, failed, stopped), finished, stopReason, how many accounts were found, read, delivered and left out by each check (leftOut), and every search with the text sent and the accounts it found. The last row of every run is a free summary row with the run's counts.

How much does it cost to scrape Instagram profiles?

You pay per result (pay per event). Prices per 1,000 events:

EventFreeBronzeSilverGold
Profile (one account delivered as a row, with its details)$1.86$1.70$1.54$1.33
Basic profile (one account without details, when details are off)$0.40$0.36$0.32$0.28
Facebook Page contact (add-on, a linked Page that shows contact details)$2.10$1.92$1.74$1.50
Re-filtered profile (a profile of an earlier run that passes this run's filters)$0.10$0.09$0.08$0.07

Platinum and Diamond plans pay the Gold price. Each run also pays the Actor start event of $0.0075 (256 MB), which has no plan discount. The Store pricing card shows these same prices per 1,000 events: "$1.33 / 1,000" on the Profile row means one profile costs about a seventh of a cent.

Examples at the Gold price: 50 profiles of one keyword cost $0.0075 + 50 x $0.00133 = $0.074; 1,000 profiles of twenty keywords cost $0.0075 + 1,000 x $0.00133 = $1.34; the same 1,000 with the Facebook Page contact read for the 200 of them whose Page shows one add 200 x $0.0015 = $0.30.

Free: subject rows, status rows, left out rows, the summary, accounts another keyword of the run already delivered, accounts a filter leaves out, accounts Instagram does not show logged out, accounts whose recent posts could not be read (a failed read, or embeds switched off by a public account: delivered free with detailsStatus partial), Facebook Pages without contact details, searches that find nothing, failed calls, refused entries and invalid input. An invalid input charges only the run's start fee.

Input

SettingWhat it doesDefault
keywordswords or phrases, up to 500 (see below)none
usernamesaccounts to read directly: usernames, @handles, profile links or numeric ids, up to 5,000none
postUrlspost or reel links: the authors of their public comments are read, up to 100 linksnone
maxProfilesPerKeyword, maxProfilesthe most profiles of one keyword or post link (1 to 1,000), and of the run50, none
maxCommentersPerPostthe most distinct comment authors collected from one post50
searchThreads, searchAdLibrary, searchReelCreatorswhich searches a keyword runsall on
reelSearchPagespages of the reels search read for its creators (1 to 8: 24 reels, then about 50 a page, about 96 in all; one search call a page)1
adLibraryCountrythe country the Ad Library search favours (ALL or a two letter code in capitals, such as US)ALL
searchVariantsalso search Threads for the keyword's joined, underscored and dotted forms (coffeeroaster, coffee_roaster, coffee.roaster)off
expandWithRelatedProfiles, expansionDepthalso deliver the accounts Instagram suggests next to each profile a keyword, a username list or a post link delivered (foundVia related_profile), one level or two (level 2 expands the accounts level 1 delivered); a username list's suggested accounts count against maxProfilesPerKeyword; Instagram suggests accounts for about 13 of 100 profiles logged outoff, 1
includeDetailsread each account on Instagram (off: basic rows from the search only, billed as Basic profile)on
includeRecentPostsput the 6 newest posts on the row (engagement is computed either way)on
includeReelStatsthe reel figures (one more read per account, included in the Profile price)off
includeProfileInfothe profile info (one more read per account, included in the Profile price)off
includeFacebookPageContactthe Facebook Page contact add-onoff
includeRelatedProfilesthe suggested accounts on the row (needs Include personal data)off
minFollowers, maxFollowers, minPosts, maxPostsfollower and post count bandsnone
verified, accountTypes, influencersOnly, includePrivateverified only or not verified, account types (professional = business or creator), creators and influencer categories only, private accounts in or outany, any, off, in
requireKeywordMatchkeep only accounts whose username, name or bio holds every word of the keywordoff
mustContain, mustContainInwords that must appear, and where: username, name or bio (default), bio, name, recent captions, anywherenone
excludeWordsleave out accounts whose username, name or bio holds any of these wordsnone
categories, combineCategoryAndWordsInstagram categories to keep (any of, whole words), and whether categories and mustContain must both pass or eithernone, both
languageskeep only accounts whose bio and recent captions read as these languages (44 two letter codes)any
locationMustContainplace words in the bio, the business address (with profile info) or the Facebook Page countrynone
contactFilter, requireWebsitea contact shown (an e-mail or a phone, an e-mail, a phone, both) and a websiteany, off
minEngagementRate, activeWithinDays, minRecentPosts, recentPostsDaysengagement rate floor (percent), newest post within days, at least N of the 6 newest posts within daysnone, none, none, 30
minMedianReelPlays, reelPostedWithinDays, minPlaysToFollowersPercent, maxPlaysToFollowersPercentreel filters (need Reel figures)none
excludeUsernamesaccounts never to deliver, up to 10,000none
minMatchRatePercentstop the run once 100 accounts were judged and fewer than this percent passed your filtersnone
includeLeftOutAccountsa free row for every account read and left out, with the reasonoff
refilterDatasetIdcheck an earlier run's profiles again with this run's filters, without reading Instagram (Re-filtered profile); rows saved without details carry no id and no bio, so with id or bio word exclusions they are left out (free); on a re-filter alone the options that read Instagram or Facebook are refused, and reel filters judge the reel figures the rows carrynone
includePersonalDatafill emails, phones and relatedProfiles, and keep links to Instagram, Facebook, Messenger, Threads or WhatsApp and contact links (mailto, tel, sms, callto, Telegram, Signal, Viber, Skype) in the website and bio linksoff
maxRunSeconds, requestTimeoutSecs, maxRetriesa time limit, the request timeout (5 to 60 s) and retries per request (0 to 5)none, 30, 2
proxyConfigurationApify Proxy setting (see below)Apify Proxy

Keywords. A word or phrase in any language; a leading # is dropped. Each keyword is searched lower cased. Threads' user search matches account names and usernames loosely and finds accounts that use Threads; for a phrase with a place, few accounts carry every word (on "real estate agent miami", 8 of the 118 readable accounts the three searches found held every word in their username, name or bio), so use Every keyword word in the account or Place words for a strict list. An entry that is empty, a link, starts with @ (put accounts in usernames), looks like a token or API key, or repeats an earlier keyword is refused with one free row per reason that names its position (the value is never shown); the other keywords run.

Proxy. By default the Actor reads from its own server address first and moves a request type to Apify's datacenter proxy when it is refused there. Choose a proxy group or country to read only through Apify Proxy, or give your own proxy links. A residential group is read through the datacenter pool instead, at no extra cost, and a free status row says so.

Work that earns nothing. Searches that find nothing, filters no account passes and calls that are answered badly cost time but deliver nothing. A run spends at most a small fixed amount of such work before its first charged profile, and more as it delivers; when it is spent the run stops with the stop reason work_allowance and a free skipped row naming the entries not searched. Measured on the platform: about 40 accounts read and left out before the first charged profile, and about 13 more for each profile delivered; 150 keywords that find nothing stopped after 22 and after 30 of them in two runs, the rest skipped. A filter set that passes fewer than about one account in 13 (a rare language, a very high follower minimum) therefore ends early: loosen a filter, or start from keywords closer to the accounts you want. A round of account reads that Instagram keeps failing (half the reads of two rounds in a row) stops the run as source_failing, and the run's status message names the failing side.

Filters

Every filter is judged once, on the row as it will be delivered; an account a filter leaves out is free (with Left out accounts on, a free left_out row says which filter). Influencers only keeps creator accounts and accounts whose category is one of these 34: Digital creator, Video creator, Gaming video creator, Blogger, Personal blog, Public figure, Artist, Musician, Musician/band, Athlete, Fitness model, Fashion model, Model, Actor, Comedian, Writer, Author, Photographer, Gamer, Dancer, Chef, Entrepreneur, Coach, Personal coach, Fitness trainer, Makeup artist, Podcast, Journalist, News personality, Motivational speaker, DJ, Producer, Designer, Fashion designer.

Languages accepts these 44 two letter codes (any other code refuses the run, which then charges only its start fee): en, es, pt, fr, de, it, nl, pl, tr, ru, uk, ar, fa, ur, hi, bn, mr, ta, te, gu, kn, ml, pa, ne, id, ms, tl, vi, th, ja, ko, zh, sw, ro, hu, cs, sv, el, bg, sr, hr, az, uz, kk.

API examples

curl -X POST "https://api.apify.com/v2/acts/automation_craft~instagram-user-search-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords": ["coffee roaster", "yoga studio"], "maxProfilesPerKeyword": 30, "minFollowers": 1000}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('automation_craft/instagram-user-search-scraper').call({ keywords: ['wedding photographer miami'], requireKeywordMatch: true, accountTypes: ['professional'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((row) => row.type === 'profile').map((row) => row.username));
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("automation_craft/instagram-user-search-scraper").call(run_input={"keywords": ["vegan recipes"], "influencersOnly": True, "minEngagementRate": 1})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
if row["type"] == "profile":
print(row["username"], row["followerCount"], row["engagementRate"])

What this Actor does NOT do

  • No follower or following lists, no likers. Instagram shows them only to logged in viewers; this Actor reads logged out only. Commenters of a post are public and are read (post links).
  • No Instagram search box results, hashtag search or place search. Instagram's own account search and its hashtag feeds need a login; a #hashtag keyword is searched as its word on the three searches above. Accounts by place come from place words in the keyword and the place filter, not from a place's feed.
  • No search engine results and no AI. The Actor reads only Meta's own pages: no Google or other search engine, and no outside AI service (no AI scoring or natural language search).
  • No business e-mail or phone of Instagram's contact button, no account creation date or country, no WhatsApp linked flag and no private collections. A logged out reader does not get them; the bio, bio links, recent captions and the linked Facebook Page's contact are read instead.
  • No pages outside Meta. The website a bio links to is not opened, and no e-mail address is verified against its mail server.
  • No posts, reels or comments of the accounts as rows of their own, beyond the 6 newest posts and the reel figures on each row.
  • No monitoring across runs. There is no memory of earlier runs, no "new accounts only" mode and no rising creators (a jump in followers between runs); pass the accounts you already have in Accounts to leave out and schedule runs as you like.
  • No delivery into other apps and no custom code. The Actor writes only to its own dataset: it has no input that pushes rows into Notion, Todoist or other apps through connectors (Apify's integrations, webhooks and the API deliver the dataset anywhere), and it runs no mapping function you send.
  • No logins, cookies or accounts of yours.
  • No more than Meta's searches list. About 100 accounts per Threads search, up to 15 per Ad Library search, the creators of about 96 reels per reels search (24 on its first page, the default); variants, more reel search pages and suggested accounts widen a keyword.

FAQ

How do I find Instagram accounts by keywords in their bio?

Give the keywords and the Actor finds accounts for each one on Threads' user search, Meta's Ad Library and Instagram's reel creators, then reads every account's bio. Must contain any of keeps the accounts whose bio (or name, or recent posts) holds your words.

How do I find Instagram influencers in my niche?

Search your niche ("vegan recipes", "fitness coach"), then keep creator accounts with Influencers only and set followers, engagement rate and posted within days; every account a filter leaves out is free.

How do I find Instagram accounts in a specific city?

Put the place in the keyword ("wedding photographer miami") and add the city to Place words: the Actor keeps accounts that name it in their bio, their business address (with profile info) or their Facebook Page country. Every keyword word in the account keeps only accounts holding every word of the keyword.

Can you search Instagram without an account?

This Actor does. It reads Meta's public searches and each account's public profile data without an account, cookies or login, so your own Instagram account is never involved.

Is there an Instagram search API?

Instagram's user search endpoint for developers was retired, and Meta's official API offers hashtag search only to Business or Creator accounts. This Actor works as an account search API through the Apify API, schedules, Make, n8n or Zapier.

How is the language of an account estimated?

Instagram serves no language for an account, so the Actor estimates it from the bio and each recent caption with the franc library (a text of 40 letters or more with a clear result) and takes the language most of them agree on; a tie or nothing clear gives no language, and the language filter leaves such accounts out.

Why does this Actor run with limited permissions?

It needs no more: it reads Meta's public pages and writes only to its own run's dataset and key-value store, so it cannot touch anything else in your Apify account. Filtering an earlier run again reads that run's dataset, in your own account, by its id.

More data tools by Automation Craft

Changelog

See the Changelog tab: 0.1 (2026-10-28) is the first release.