Instagram Search Scraper: Reels, Users, Hashtags
Pricing
from $0.37 / 1,000 reels
Instagram Search Scraper: Reels, Users, Hashtags
Instagram search by keyword, no login: reels, user accounts and hashtags in one run. Reels carry plays, likes, comments and music; accounts carry followers, bio, links and engagement; hashtags carry exact post counts and related tags. Filters, JSON, CSV or API; pay per result.
Pricing
from $0.37 / 1,000 reels
Rating
0.0
(0)
Developer
Automation Craft
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Instagram Search Scraper: Reels, Users, Hashtags
Search Instagram by keyword for public reels, user accounts and hashtags in one Actor, without an Instagram account, cookies or login. Give your words ("coffee roaster", "wedding photographer miami", "nail art") and pick what to look for: reels with their plays, likes and comments, accounts with their followers, bio and engagement, hashtags with their exact post counts, or all three in one run. Every result is a row of your dataset, with a free row per keyword that says what was searched, found and left out.
- Three search types, one run. Reels (Instagram's own reels search for your words), profiles (Threads' user search, Meta's
Ad Library and the creators of matching reels, each account then read on Instagram) and hashtags (Instagram's own hashtag
search, up to 55 hashtags a keyword). Ask for one, two or all three: they run in the order you list them, and every row says
which search made it (
searchType). - Deep rows. Reels with plays, likes, comments, date, length, music, location, collaborators and the video and audio links; accounts with exact followers, following, posts, bio, links, category, account type, the 6 newest posts and engagement; hashtags with Instagram's tag id, the exact post count and a popularity band.
- Filters that cost nothing. Dates, plays, likes and caption language for reels; 24 account filters for profiles (followers, account type, words in the bio, category, place words, a contact shown, engagement and more); post count bounds, keyword match and the exact hashtag for hashtags. Results a filter leaves out are never charged.
- Add-ons when you need them. Creator details and comments on reels; reel figures, profile info and the linked Facebook Page's public contact on accounts; related hashtags (the hashtags used most with each one in its top reels) with their post counts where Instagram lists them, and those top reels on hashtags.
- Fair billing. Each reel, account and hashtag is charged once per run, even when several keywords find it. Searches that find nothing, failed calls, repeats and refused entries are free rows.
Quick start
- Open the Actor's Input tab and pick the Search types: Reels (default), Profiles, Hashtags, or several.
- Type your keywords, one per line (
coffee roaster,wedding photographer miami,nail art). For profiles you can also paste usernames or post links. - Set Max results per keyword (counted per search type: reels, profiles and hashtags each get that many per keyword).
- Optional: open the section of each search type for its filters and add-ons.
- Click Start. Results arrive as rows of the dataset, followed by one free row per keyword and a summary per search type.
- Download the dataset as JSON, CSV or Excel (the Output tab has a view per search type), or read it through the Apify API, a schedule, Make, n8n or Zapier.
What you get
Every row a search makes carries searchType (reels, profiles or hashtags; the run's own rows below carry null) and type (reel, profile, hashtag, or a free row:
keyword, subject, status, summary). The fill rates below were measured on the platform on 2026-10-28, on the distinct rows
of the 26 checking runs of this Actor's final build that delivered rows (247 reels, 23 accounts, 172 hashtags).
Reels (searchTypes holds reels)
One reel row per reel found by your keyword on Instagram's own reels search (24 reels on its first page, about 96 a search when
every page is read).
| Field | What it holds | Filled |
|---|---|---|
keyword, searchedAs, foundVia, rank, searchPage | your keyword, the text sent to Instagram, how the reel was found (search, related, variant, creator), its place in Instagram's list | 100% |
code, id, url | the reel's code, id and link | 100% |
caption, hashtags | the caption as Instagram serves it, and its hashtags | 98.4%, 82.2% |
playCount | plays | 99.2% |
likeCount, likesHidden, commentCount | likes (null, never 0, when the creator hides them), comments | 86.2%, 89.5% |
postedAt, durationSeconds | when the reel was posted, and its length | 90.3%, 89.9% |
videoUrl, videoUrlExpiresAt, audioUrl, coverUrl | the MP4 link and when Instagram's signed link expires, the audio only track, the cover | 100%, audio 86.6%, cover 100% |
audio | type (music or original), title, artist, audioId | 84.2% |
location | id, name, lat, lng, url of the tagged place | 35.2% |
coauthors, isPaidPartnership, aiLabel | collaborators, the paid partnership label, Instagram's AI content label | 8.5%, 89.5% read |
owner | the creator's username, id, fullName, isVerified, isPrivate, profilePicUrl, url | 100% |
keywordMatch, matchedTerms | how the caption, hashtags and username hold your keyword's words: all, some or none | 100% (all 58.7%) |
viewCount, creator, comments | the reel's view counter (opt in), creator details and comments (add-ons) | when asked |
mentions, taggedUsers | the @usernames in the caption and the accounts tagged in the reel: empty unless you turn on Include personal data | when asked |
Rows read without details (includeDetails off) hold what the search listed: code, caption, plays, creator, video and cover. A
reel whose details could not be read is delivered free (detailsStatus failed); the fill rates above count those rows too.
Profiles (searchTypes holds profiles)
One profile row per account. Each keyword runs Threads' user search (about 100 accounts a search), Meta's Ad Library search
(up to 15 businesses with a Facebook Page) and Instagram's reels search (the creators of matching reels), merged, and every
account is read on Instagram.
| Field | What it holds | Filled |
|---|---|---|
keyword, searchedAs, foundVia, rank | your 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 list | 100% |
username, id, url, fullName, biography | the account's username, Instagram id, link, name and bio as Instagram serves it | 100% |
followerCount, followingCount, postsCount | exact followers, following and posts | 100%, posts 95.7% |
accountType, category, isVerified, isPrivate | personal, business or creator, the category the account shows, the badges | 100%, category 60.9% |
externalUrl, bioLinks, threadsUsername, facebookPage | the website, the bio links, the Threads profile, the linked Facebook Page | 87.0%, 91.3%, 39.1%, 39.1% |
recentPosts, avgLikes, avgComments, engagementRate, engagementGrade, postsPerWeek, lastPostAt | the 6 newest posts and the engagement and posting pace computed from them | 95.7%, engagement 91.3% |
biographyLanguage, keywordMatch | the language of the bio and captions (our own estimate), how the username, name and bio hold your keyword | 87.0%, 87.0%: every account a keyword found, none for a username list (all 65.2%) |
hasEmail, hasPhone; emails, phones | whether the bio, bio links or captions show an e-mail or phone; the addresses and numbers only with Include personal data | flags always |
reelStats, profile info fields, facebookPageContact, relatedProfiles | add-ons: reel figures, the business address and more, the Facebook Page's public contact, suggested accounts (needs Include personal data) | when asked |
Hashtags (searchTypes holds hashtags)
One hashtag row per hashtag Instagram's hashtag search lists for your keyword (up to 55 a keyword, in Instagram's order).
| Field | What it holds | Filled |
|---|---|---|
name, hashtag, id | the hashtag as Instagram stores it (styled letters, accents and emoji kept), with its #, and Instagram's tag id | 100% |
postsCount, postsCountText | the exact number of posts using it, and Instagram's own rounded text ("2.1M posts") | 100% |
popularity | very_high (10 million posts or more), high (1 million), medium (100,000), low (10,000), very_low: our own bands | 100% |
url, popularReelsUrl | the tag's page and its public popular reels page | 100% |
keyword, keywordPosition, searchedAs, rank | your keyword, the text searched and the hashtag's place in Instagram's list | 100% |
keywordMatch, matchedTerms, isExactKeyword | whether the name holds every word of your keyword (all, some, none), and whether it IS your keyword's words run together | 100% (all 98.8%) |
relatedHashtags, topReels, topReelsMedianPlays, relatedReelsRead, relatedHashtagsStatus | add-on: the hashtags used most often with this one in its top public reels (up to 10, each with how many of those reels use it, its exact post count and band when Instagram lists it), those reels (link and plays) and their median plays | when asked |
Example row (from a run on coffee roaster, related hashtags on):
{"type": "hashtag","searchType": "hashtags","name": "coffeeroaster","hashtag": "#coffeeroaster","id": "17842356424066679","postsCount": 2161276,"postsCountText": "2.1M posts","popularity": "high","url": "https://www.instagram.com/explore/tags/coffeeroaster/","keyword": "coffee roaster","rank": 1,"keywordMatch": "all","isExactKeyword": true,"relatedHashtags": [{ "name": "coffee", "hashtag": "#coffee", "reels": 9, "postsCount": 185545143, "popularity": "very_high" },{ "name": "specialtycoffee", "hashtag": "#specialtycoffee", "reels": 8, "postsCount": 9313995, "popularity": "high" }],"topReelsMedianPlays": 18808,"relatedHashtagsStatus": "read"}
The free rows
One keyword row per keyword of the reels and hashtags searches, and one subject row per keyword, account list or post link
of the profile search: its status (ok, nothing found, nothing matching, failed, stopped), finished, stopReason, what
each search listed, delivered and left out and why. The hashtag search's keyword row also lists every hashtag Instagram listed for
the keyword with its post count and band (listedHashtags), before your filters. Every search type ends with a free summary
row of its counts and charges; when the run stops before a search type you asked for, a free search_types_skipped row names it.
When the input is refused, nothing is searched: the run writes one free entries_refused row per list and reason (the positions
of the entries, never their text), the invalid row naming each problem and a summary, all with searchType null.
How much does it cost to scrape Instagram search results?
You pay per result (pay per event). Prices per 1,000 events:
| Event | Free | Bronze | Silver | Gold |
|---|---|---|---|---|
| Reel (one reel delivered as a row, with its details) | $0.51 | $0.46 | $0.42 | $0.365 |
| Reel search (one reels search that delivered at least one charged reel) | $0.42 | $0.38 | $0.34 | $0.30 |
| Creator profile (reels add-on, once per creator per run) | $1.33 | $1.21 | $1.10 | $0.95 |
| Comment (reels add-on, per comment delivered) | $0.27 | $0.24 | $0.22 | $0.19 |
| 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 (profiles 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 |
| Hashtag (one hashtag delivered as a row, with its post count) | $1.65 | $1.51 | $1.36 | $1.18 |
| Related hashtag list (hashtags add-on, a hashtag where related hashtags were found) | $1.40 | $1.28 | $1.16 | $1.00 |
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: "$0.365 / 1,000" on the Reel row means one reel costs about four hundredths of a cent, and "$1.18 / 1,000" on the Hashtag row means one hashtag costs about a tenth of a cent.
Examples at the Gold price: 50 reels of one keyword cost $0.0075 + 50 x $0.000365 + $0.0003 = $0.026; 30 hashtags of one keyword cost $0.0075 + 30 x $0.00118 = $0.043; one keyword searched for 20 reels, 20 profiles and 20 hashtags costs $0.0075 + 20 x $0.000365 + $0.0003 + 20 x $0.00133 + 20 x $0.00118 = $0.065.
Free: keyword, subject and status rows, the summaries, results another keyword of the run already delivered, results a filter leaves out, searches that list nothing, failed calls, refused entries and invalid input; reels whose details and accounts whose recent posts could not be read are delivered free; a related hashtags read that finds no public reels is free. An invalid input charges only the run's start fee.
Input
Shared settings
| Setting | What it does | Default |
|---|---|---|
searchTypes | one to three of reels, profiles, hashtags, run in the order given | reels |
keywords | words or phrases, up to 500 (see below) | none |
maxResultsPerKeyword | the most results one keyword delivers in EACH search type (1 to 1,000; Instagram lists about 96 reels a search and up to 55 hashtags a keyword) | 50 |
maxResults | stop a search type once it delivered this many results across all keywords (counted per search type) | none |
requireKeywordMatch | keep only results that hold every keyword word (a reel's caption, hashtags or username; an account's username, name or bio; a hashtag's name) | off |
includeDetails | read each reel's details and each account on Instagram (reels and profiles; off is faster and leaner) | on |
includePersonalData | fill the fields that name or reach a person: a reel's mentions and taggedUsers, an account's emails, phones and relatedProfiles, and links to Instagram, Facebook, Messenger, Threads or WhatsApp and contact links in websites and bio links | off |
maxRunSeconds, requestTimeoutSecs, maxRetries | a time limit, the request timeout (5 to 60 s) and retries per request (0 to 5) | none, 30, 2 |
proxyConfiguration | Apify Proxy setting (see below) | Apify Proxy |
A setting of a search type you did not pick is ignored when it holds nothing or its default, and refuses the run otherwise (it would ask for work this run does not do); the refusal names the setting and charges only the run's start fee.
Reels search settings
| Setting | What it does | Default |
|---|---|---|
sortBy | relevance (Instagram's order), newest or mostPlayed | relevance |
searchRelatedKeywords | also search this many of Instagram's related keywords per keyword (0 to 10) | 0 |
tryVariantsWhenEmpty | for a keyword without reels, also try " | off |
includeCreatorReels, maxReelsPerCreator | add the newest reels of the creators found that match your keyword (1 to 12 per creator) | off, 2 |
postedSince, postedUntil | a posting window: a day as 2026-10-01 or 30 days (from the run's start), and an end day | none |
minPlays, minLikes, minComments | minimum counts (reels with hidden likes fail a likes minimum) | none |
captionLanguages | keep only captions estimated in these languages (44 two letter codes) | any |
includeViewCount | add the reel's view counter from its embed page (one more read per reel, included in the Reel price) | off |
includeCreatorDetails | the Creator profile add-on | off |
maxCommentsPerReel | the Comment add-on: up to this many comments per reel (0 to 50) | 0 |
Profile search settings
| Setting | What it does | Default |
|---|---|---|
usernames | accounts to read directly: usernames, @handles, profile links or numeric ids, up to 5,000 | none |
postUrls | post or reel links: the authors of their public comments are read, up to 100 links | none |
maxCommentersPerPost | the most distinct comment authors collected from one post | 50 |
searchThreads, searchAdLibrary, searchReelCreators | which searches a keyword runs | all on |
reelSearchPages | pages of the reels search read for its creators (1 to 8) | 1 |
adLibraryCountry | the country the Ad Library search favours (ALL or a two letter code in capitals) | ALL |
searchVariants | also search Threads for the keyword's joined, underscored and dotted forms | off |
expandWithRelatedProfiles, expansionDepth | also deliver the accounts Instagram suggests next to each profile delivered, one level or two | off, 1 |
includeRecentPosts | put the 6 newest posts on the row (engagement is computed either way) | on |
includeReelStats, includeProfileInfo | the reel figures and the profile info (one more read per account each, included in the Profile price) | off |
includeFacebookPageContact | the Facebook Page contact add-on | off |
includeRelatedProfiles | the suggested accounts on the row (needs Include personal data) | off |
minFollowers, maxFollowers, minPosts, maxPosts | follower and post count bands | none |
verified, accountTypes, influencersOnly, includePrivate | verified only or not verified, account types (professional = business or creator), creators and influencer categories only, private accounts in or out | any, any, off, in |
mustContain, mustContainIn, excludeWords | words that must appear and where (username, name or bio by default; bio; name; recent captions; anywhere), words that leave an account out | none |
categories, combineCategoryAndWords | Instagram categories to keep, and whether categories and mustContain must both pass or either | none, both |
languages, locationMustContain | bio and caption languages (44 codes), place words in the bio, business address or Facebook Page country | any, none |
contactFilter, requireWebsite | a contact shown (an e-mail or a phone, an e-mail, a phone, both) and a website | any, off |
minEngagementRate, activeWithinDays, minRecentPosts, recentPostsDays | engagement rate floor (percent), newest post within days, at least N of the 6 newest posts within days | none, none, none, 30 |
minMedianReelPlays, reelPostedWithinDays, minPlaysToFollowersPercent, maxPlaysToFollowersPercent | reel filters (need the reel figures) | none |
excludeUsernames | accounts never to deliver, up to 10,000 | none |
minMatchRatePercent | stop once 100 accounts were judged and fewer than this percent passed your filters | none |
includeLeftOutAccounts | a free row for every account read and left out, with the reason | off |
refilterDatasetId | check an earlier run's profiles again with this run's filters, without reading Instagram (Re-filtered profile) | none |
Hashtag search settings
| Setting | What it does | Default |
|---|---|---|
minHashtagPosts, maxHashtagPosts | keep hashtags used on at least, or at most, this many posts | none |
exactHashtagOnly | keep only the hashtag that is your keyword's words run together ("coffee roaster" keeps #coffeeroaster): the stats of hashtags you name | off |
includeRelatedHashtags | the related hashtags add-on (one more read per hashtag, and one hashtag search per related hashtag the run does not know yet); when the run's work allowance for add-on reads is spent, the remaining hashtags come without the list (relatedHashtagsStatus allowance, not charged for it, counted in the keyword row and the status message) | off |
Keywords. A word or phrase in any language; a leading # is dropped and keywords are searched lower cased. The reels search
also takes a link to an instagram.com/popular/<words>/ or instagram.com/explore/tags/<tag>/ page, and Boolean keywords
(AND, OR, NOT in capitals, parentheses, "quoted phrases", -word): each OR branch is searched and a reel must match the
whole expression. The hashtag search takes a tag page link too but no Boolean keyword (a free row says so; a run whose keywords the
hashtag search can use none of is refused). The hashtag search matches your words run together: "fat loss" lists #fatloss, and
hashtags hold no spaces or punctuation (letters, marks, digits, underscores and emoji), so a word with a hyphen lists nothing. Specific phrases find more reels than
single broad words: Instagram shows no public reels for some broad words ("coffee") and such a keyword gets a free no_reels
row, while the hashtag search answers broad words in full. An entry that is empty, a link of another kind, holds an @, 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 list nothing, filters nothing 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 result, 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 keywords not searched (a
test list of 200 made up hashtag keywords that all found nothing stopped after 44 of them, for $0.0075, the start fee). The search types after it do not run (a
search_types_skipped row names them), and so it is for the caller's charge limit and a time limit. Add-on reads (creator
details, comments, a Facebook Page's contact, related hashtags) draw on an allowance of their own that grows with the add-ons
delivered: when it is spent, the next rows come without the add-on and are not charged for it (for related hashtags:
relatedHashtagsStatus allowance, counted in the keyword row's relatedHashtagsLeftOut and named in the status message). Three hashtag searches in a
row that Instagram answers badly stop the hashtag search as source_failing; the run's status message names the failing side.
API examples
curl -X POST "https://api.apify.com/v2/acts/automation_craft~instagram-search-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchTypes": ["reels", "hashtags"], "keywords": ["nail art", "latte art"], "maxResultsPerKeyword": 30}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('automation_craft/instagram-search-scraper').call({ searchTypes: ['profiles'], keywords: ['wedding photographer miami'], requireKeywordMatch: true, minFollowers: 1000 });const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.filter((row) => row.type === 'profile').map((row) => row.username));
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("automation_craft/instagram-search-scraper").call(run_input={"searchTypes": ["hashtags"], "keywords": ["sourdough"], "includeRelatedHashtags": True})for row in client.dataset(run["defaultDatasetId"]).iterate_items():if row["type"] == "hashtag":print(row["hashtag"], row["postsCount"], [r["name"] for r in row["relatedHashtags"] or []])
What this Actor does NOT do
- No place search. Instagram answers its place search only to logged in viewers; this Actor reads logged out only. Put the place in your keyword and use the place filter of the profile search instead.
- No latest posts of a hashtag, no posts per day. Instagram's hashtag feed needs a login; the top public reels of a hashtag are read (related hashtags add-on).
- No Instagram search box results. Instagram's own account and top search need a login; accounts come from Threads' user search, Meta's Ad Library and the creators of matching reels.
- No posts or carousels by keyword, no audio search. Reels only, and no reels of a sound.
- No share counts, subtitles or transcripts of reels, no stories. A logged out reader does not get them.
- No follower or following lists, no likers, no business e-mail or phone of Instagram's contact button, no account country. Instagram shows them only to logged in viewers; the bio, bio links, recent captions and the linked Facebook Page's contact are read instead.
- 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 pages outside Meta. The website a bio links to is not opened, and no e-mail address is verified against its mail server.
- No monitoring across runs. There is no memory of earlier runs, no "new results only" mode and no follower tracking; 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 (Apify's integrations, webhooks and the API deliver it anywhere), and it runs no mapping function you send.
- No logins, cookies or accounts of yours.
- No more than Instagram lists. About 96 reels per reels search (related searches and variants widen a keyword), about 100 accounts per Threads search and 15 per Ad Library search, 55 hashtags per hashtag search.
FAQ
Can you search Instagram without an account?
This Actor does. It reads Instagram's public reels search and hashtag search, Threads' user search and Meta's Ad Library, 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 search endpoints for developers were retired, and Meta's official API offers hashtag search only to Business or Creator accounts, 30 hashtags a week. This Actor works as an Instagram search API through the Apify API, schedules, Make, n8n or Zapier, for reels, accounts and hashtags.
Can I search Instagram reels by keyword?
Yes: pick Reels, type your words, and get the reels Instagram's own search shows for them, with plays, likes, comments, date and music, sorted by relevance, newest or most played, with date and plays filters.
How do I find Instagram accounts by keywords in their bio?
Pick Profiles and give the keywords: the Actor finds accounts on Threads' user search, Meta's Ad Library and the creators of matching reels, then reads every account's bio. Must contain any of keeps the accounts whose bio (or name, or recent posts) holds your words.
How many posts does an Instagram hashtag have?
Pick Hashtags and type the hashtag's words: every hashtag Instagram lists for them comes with its exact post count, and Only the exact hashtag keeps just the one you named. Turn on related hashtags to see the hashtags used most with it and, where Instagram lists them, their post counts.
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's profiles again reads that run's dataset, in your own account, by its id.
More data tools by Automation Craft
- Instagram Reels Search Scraper: Reels by Keyword
- Instagram User Search Scraper: Profiles by Keyword
- Instagram Posts Scraper: Profiles, Reels, No Login
- Threads Profile Scraper: Followers, Bio, Posts
- Facebook Search Scraper: Keyword Posts, No Login
- Facebook Page ID Finder: Names to Page IDs
- TikTok Hashtag Scraper: Posts, Free Date Filter
Changelog
See the Changelog tab: 0.1 (2026-10-28) is the first release.