Instagram Reels Search - Reels by Keyword and Hashtag avatar

Instagram Reels Search - Reels by Keyword and Hashtag

Pricing

from $0.38 / 1,000 results

Go to Apify Store
Instagram Reels Search - Reels by Keyword and Hashtag

Instagram Reels Search - Reels by Keyword and Hashtag

Search Instagram Reels by keyword or hashtag. "home workout" and #homeworkout return different reels, and both are searched here. Each row has the caption, plays, likes, comments, shares, video link, creator, audio and publish time. Up to 100 per run. $0.40 per 1,000 reels.

Pricing

from $0.38 / 1,000 results

Rating

5.0

(1)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

2

Bookmarked

730

Total users

72

Monthly active users

a day ago

Last modified

Share

Search Instagram Reels by keyword or hashtag and get the reels Instagram ranks for it, as rows: caption, plays, likes, comments, shares, duration, thumbnail and video links, the creator, the song or sound, the location and the publish time, one row per reel.

A keyword and the same words as a hashtag are two different searches and come back with different reels. The limit to know about before you plan around it: you get the ranked feed Instagram serves for a term, in its order, and a run tops out at 100 reels. The likes, comments and date filters can only check reels after they arrive, so each reel they leave out is billed. On the free Apify plan a run returns one page, up to 12 reels.

InputUp to 20 keywords and 20 hashtags
OutputOne row per reel: caption, plays, likes, comments, shares, duration, thumbnail and video links, creator, song or sound, location, publish time
Ceiling100 reels per run
Account neededNone
Price$0.40 per 1,000 reels on the free plan, down to $0.385 on Business. The free plan's $5 a month covers about 12,500

🔍 What Instagram Reels Search does

Each term is searched on Instagram's Reels search: a keyword as you wrote it, a hashtag as #tag. So home workout returns what Instagram ranks for that phrase, not whatever sits in a tag that loosely matches it.

Only reels come back, deduplicated by id across the run, so a reel two of your terms found arrives once. sourceQuery and sourceHashtag on every row say which term found it.

📋 What data you get from each Instagram reel

What you getField
Media id, shortcode and reel linkid, shortcode, reelUrl
Caption, and the hashtags and handles in itcaption, hashtags, mentions
Plays, likes, comments and sharesplayCount, likeCount, commentCount, shareCount
Plays split between Instagram and FacebookigPlayCount, fbPlayCount
Length and video sizedurationSeconds, videoWidth, videoHeight
Cover image and video filethumbnailUrl, videoUrl
The creatorauthorUsername, authorFullName, authorId, authorIsVerified, authorIsPrivate
The song or soundaudioTitle, audioArtist, audioId, isOriginalAudio, audioUrl
Location taglocationName, locationId
Paid partnership and sponsorsisPaidPartnership, sponsors
Tagged accounts and co-authorstaggedUsers, coauthors
Comments turned offcommentsDisabled
Instagram's own subtitles, as texttranscript
Publish timetimestamp
Which of your terms found itsourceQuery, sourceHashtag

▶️ How to scrape Instagram Reels by keyword

  1. Open Instagram Reels Search and click Try for free.
  2. Type your phrases into Keyword searches, one per line. Add tags under Hashtags if you want both.
  3. Set Maximum Reels. Start at 30 while you look at the output shape.
  4. Click Start.
  5. Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.

Run it with the input empty and you get one labelled sample row, which is not charged, so you can look at the shape first.

💰 How much does it cost to scrape Instagram Reels?

$0.40 per 1,000 reels. That is the free plan's price; paid plans pay a little less: $0.395 on Starter, $0.39 on Scale and $0.385 on Business. On the free plan, the $5 Apify gives you each month covers about 12,500 reels. On the free plan a run stops after one page and says so in a free row; a paid plan gets the full run.

You pay per reel delivered. A reel that two of your terms both found is billed once. The sample row, every diagnostic row, and a term that returns nothing cost you nothing. Without filters, maxReels caps both the rows and the spend.

The filters are the exception. The search can't filter by likes, comments or date, so each reel is checked after it arrives, and every reel a filter leaves out is billed as "Reel checked and left out", at the same price as a delivered reel. Your maximum cost per run still holds. Transcripts and audio links cost nothing extra.

📥 What you give it

{
"searchQueries": ["travel", "home workout"],
"hashtags": ["homeworkout"],
"maxReels": 30,
"maxReelsPerTerm": 10
}
FieldDefaultWhat it is
searchQueriesnoneUp to 20 keywords, each searched as written.
hashtagsnoneUp to 20 hashtags, each searched as #tag on the same surface.
maxReels30Reels for the whole run, 1 to 100. Without filters, this is also your spend cap.
maxReelsPerTermnoneOptional, 10 to 100; the lowest value is 10. Each term stops at this many reels, so later terms get searched. Empty lets the first terms fill the run.
minLikes, minCommentsnoneOptional. Only reels with at least this many likes or comments. Each reel left out is billed as a reel checked and left out.
newerThannoneOptional. A day (2026-10-01, counted in UTC) or a window (7 days, 2 weeks). Older reels, and reels with no publish time, are left out and billed as checked.
maxRunSeconds120Wall-clock ceiling for the run, 20 to 180 seconds.
requestTimeoutSeconds15How long one search request is allowed to take, 5 to 30 seconds.
maxAttempts8How many times a request that comes back empty is retried, 1 to 12.
sessionCookiesnoneOptional, and normally not needed. Your own Instagram cookie, so the run uses your own account.
proxyConfigurationnoneLeave it alone unless you have your own servers to use.

Keep every term short and non-empty. One blank entry, or one longer than 100 characters, stops the whole run before it searches anything and you get the sample row back instead of results. The valid terms in the same list are discarded with it. A filter value that can't be read, such as last week for a date, also stops the run before it searches, with a free BAD_INPUT row.

📤 What you get back

A real row from a run on the keyword travel. The caption, the transcript and the links are cut short so the block stays readable:

{
"ok": true,
"recordType": "instagram_reel",
"id": "3986247637637563552",
"shortcode": "DdR_xs8IISg",
"reelUrl": "https://www.instagram.com/reel/DdR_xs8IISg/",
"caption": "Wish that I could stay forever this youn...",
"hashtags": ["travel", "traveltheworld", "explore", "travelgram", "worldtraveler"],
"mentions": [],
"likeCount": 35107,
"commentCount": 85,
"playCount": 363238,
"igPlayCount": 363238,
"fbPlayCount": null,
"shareCount": 4392,
"durationSeconds": 12.189000129699707,
"videoWidth": 1080,
"videoHeight": 1920,
"thumbnailUrl": "https://scontent-xxc1-1.cdninstagram.com/v/t51.82787-15/811236201_1809...",
"videoUrl": "https://scontent-xxc1-1.cdninstagram.com/o1/v/t16/f2/m84/AQNuOGMYqaeCx...",
"authorId": 50350871833,
"authorUsername": "travelgazette",
"authorFullName": "TravelGazette ✿",
"authorIsVerified": false,
"authorIsPrivate": false,
"audioTitle": "Wake Me Up",
"audioArtist": "Avicii",
"audioId": "1910166583068970",
"isOriginalAudio": false,
"audioUrl": "https://scontent-xxc1-1.cdninstagram.com/o1/v/t2/f2/m69/AQO_ljuUapRcqN...",
"timestamp": "2026-09-16T12:55:50.000Z",
"locationName": null,
"locationId": null,
"isPaidPartnership": false,
"sponsors": [],
"taggedUsers": [],
"coauthors": [],
"commentsDisabled": null,
"transcript": "Hope I get the chance to travel the world...",
"sourceQuery": "travel",
"sourceHashtag": null
}
FieldHow to read it
shortcodeThe key to join runs on. reelUrl is the canonical link.
playCount, likeCount, commentCount, shareCountThe counters as Instagram reports them at read time.
durationSecondsReel length, unrounded.
thumbnailUrl, videoUrlDirect links to the cover image and the video file. Signed and time limited.
audioTitle, audioArtistThe song and artist for licensed music. For a creator's own sound, its name and the account that made it.
isOriginalAudio, audioUrltrue for a creator's own sound, false for licensed music. audioUrl is the link Instagram serves for the sound, signed and short-lived.
playCount, igPlayCount, fbPlayCountplayCount is the total. The other two split it between Instagram and Facebook, null when Instagram doesn't say.
isPaidPartnership, sponsorsisPaidPartnership is Instagram's own flag. sponsors lists the brand accounts Instagram names on a paid partnership reel. It stays [] on every other reel, and on a paid one that names no brand.
taggedUsersTagged accounts. [] when the reel has none. null when the reel has tags that the search answer doesn't name. In our checks it never named one, so expect null on a tagged reel.
commentsDisabledtrue or false when Instagram says, null when it doesn't. The search answer almost never does, so expect null.
transcriptThe text of Instagram's own subtitles for the reel. null when Instagram publishes none, or the file couldn't be read in time.
sourceQueryYour term as searched: the keyword, or #tag for a hashtag.
sourceHashtagThe tag for a hashtag search, and null for a keyword.

🧾 Reading the output

Three kinds of row can land in your dataset.

RowHow to spot itBilled
A real reelok: true and recordType: "instagram_reel"yes
The sample row_sample: trueno
A diagnosticok: false and an errorCodeno

A reel a filter leaves out never reaches the dataset. Filter on ok == true and drop the _sample row if you have one, and you have your reels.

CodeWhat it means
NO_RESULTSThat term came back with nothing. It may be new, misspelled or too narrow. With a filter set, it can also mean none of its reels passed; reelsCheckedOut says how many were checked.
PARTIALThe run delivered fewer reels than you asked for: it stopped early, or your searches ran out of new reels. What arrived is complete and correct, and reelsDelivered says how many. searchesNotRead lists any term it never reached.
CONFIGURATION_ERRORSomething in the input stopped the run before it searched. Usually a blank or over-long term.
BAD_INPUTA filter or limit value couldn't be read. Nothing was searched.
OPTION_NOT_LIVEThe filters weren't available on that run, so nothing was searched. Run it again without them.
FREE_PLAN_LIMITYou are on the free Apify plan, so the run read only part of your input. searchesNotRead lists what it skipped. A paid plan gets the full run.
PROVIDER_ERRORThat search could not be answered this time. Re-running usually clears it.
PROXY_GROUP_ADJUSTEDThe run adjusted a network setting you supplied so it could carry on.
TIME_LIMITThe run got close to its time limit and stopped on its own. The reels delivered before that are complete and charged, and searchesNotRead lists the terms it never reached. Give the run more time, or ask for fewer reels, to get the rest.

A diagnostic row is never billed and never fails the run, except a TIME_LIMIT stop before any reel came back. A term whose reels an earlier term already delivered gets no row at all.

💡 What people use it for

  • Asking what actually ranks for a phrase this week, then re-running it next week to see the churn.
  • Finding creators working a topic. Every row carries the creator, so a keyword search doubles as a shortlist.
  • Comparing a keyword against its hashtag, since the two return different sets and the gap is often the interesting part.

From a phrase to the scripts behind the top reels, in three steps:

  1. Run this on your phrase.
  2. Sort on playCount and copy the reelUrl of the top ten.
  3. Watch them and note what the top reels open with.

🚧 What it does not do

  • No sorting, and the filters work after the search. Likes, comments and date are checked on reels already fetched, so a strict filter bills many checked reels for each kept one. No minimum play count, no country.
  • 100 reels per run, and twenty keywords plus twenty hashtags. Without maxReelsPerTerm the first terms can fill the run.
  • Fewer reels than you asked for is normal on some terms. Duplicates and non-reels are dropped, and once a page brings nothing new the run stops that term and a free PARTIAL row says how many arrived. You pay only for what arrives.
  • A hashtag search is ranked, not a strict filter. Most rows carry the tag, not every one.
  • A transcript only where Instagram publishes subtitles, and most reels have none. Nothing is transcribed from the sound.
  • The audio is never downloaded. audioUrl is only a link.
  • No comment text. The caption and the counters only.
  • Media links expire. They are signed, short-lived links.
  • It is not an official Instagram tool. Dami's Studio is independent and is not affiliated with or endorsed by Instagram or Meta, or by any other company named on this page.

🧭 Which Instagram scraper do you need?

If you wantUse
Reels ranked for a keyword or a tagThis one
Posts and reels under a hashtagInstagram Hashtag Scraper
Every reel on one profile's reels tabInstagram Reel Scraper
One post or reel you already have the link forInstagram Post Scraper
A profile plus the posts on its gridInstagram Scraper
TikTok videos for a keywordTikTok Scraper
YouTube Shorts for a keywordYouTube Shorts Scraper

❓ Questions people ask

Do I need an Instagram account to search reels?

No, you don't need one. The cookie field is optional and exists so you can run on your own account.

Is maxReels per term or per run?

Per run: 30 across three terms is 30 reels in total, not 90. Set maxReelsPerTerm to 10 as well and each term gets its share.

Why don't the results match the app?

A ranked feed moves, so two runs an hour apart will not match exactly, and neither will the app. Counts are a snapshot at read time.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/instagram-reels-search-scraper. Either way the run happens on your Apify account at the same price.

This reads public reels only, never private accounts or messages. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Include the search terms you used and the run ID, and the log is enough for us to see what happened.