Instagram Reels Search - Reel Finder by Keyword or Hashtag
Pricing
from $0.38 / 1,000 results
Instagram Reels Search - Reel Finder by Keyword or Hashtag
Instagram Reels search: 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
Maintained by CommunityActor stats
2
Bookmarked
788
Total users
90
Monthly active users
12 hours ago
Last modified
Categories
Security
Limited permissionsShare
Instagram Reels search by keyword or hashtag, returning 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. Each reel the likes, comments and date filters leave out is billed. On the free Apify plan a run returns one page, up to 12 reels.
| Input | Up to 20 keywords and 20 hashtags |
| Output | One row per reel: caption, plays, likes, comments, shares, duration, thumbnail and video links, creator, song or sound, location, publish time |
| Ceiling | 100 reels per run |
| Account needed | None |
| 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 |
| Using an AI agent? | |
|---|---|
| Actor | dami_studio/instagram-reels-search-scraper |
| Set one field | searchQueries, labelled "Keyword searches" in the Console |
| Cap the bill | maxTotalChargeUsd on the run, for example 0.10: it never charges past that |
| MCP, one link | https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/instagram-reels-search-scraper |
| How often | Daily, to catch new reels for your words |
🔍 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 get | Field |
|---|---|
| Media id, shortcode and reel link | id, shortcode, reelUrl |
| Caption, and the hashtags and handles in it | caption, hashtags, mentions |
| Plays, likes, comments and shares | playCount, likeCount, commentCount, shareCount |
| Plays split between Instagram and Facebook | igPlayCount, fbPlayCount |
| Length and video size | durationSeconds, videoWidth, videoHeight |
| Cover image and video file | thumbnailUrl, videoUrl |
| The creator | authorUsername, authorFullName, authorId, authorIsVerified, authorIsPrivate |
| The song or sound | audioTitle, audioArtist, audioId, isOriginalAudio, audioUrl |
| Location tag | locationName, locationId |
| Paid partnership and sponsors | isPaidPartnership, sponsors |
| Tagged accounts and co-authors | taggedUsers, coauthors |
| Comments turned off | commentsDisabled |
| Instagram's own subtitles, as text | transcript |
| Publish time | timestamp |
| Which of your terms found it | sourceQuery, sourceHashtag |
▶️ How to scrape Instagram Reels by keyword
- Open Instagram Reels Search and click Try for free.
- Type your phrases into Keyword searches, one per line. Add tags under Hashtags if you want both.
- Set Maximum Reels. Start at 30 while you look at the output shape.
- Click Start.
- 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}
| Field | Default | What it is |
|---|---|---|
searchQueries | none | Up to 20 keywords, each searched as written. |
hashtags | none | Up to 20 hashtags, each searched as #tag on the same surface. |
maxReels | 30 | Reels for the whole run, 1 to 100. Without filters, this is also your spend cap. |
maxReelsPerTerm | none | Optional, 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, minComments | none | Optional. Only reels with at least this many likes or comments. Each reel left out is billed as a reel checked and left out. |
newerThan | none | Optional. 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. |
maxRunSeconds | 120 | Wall-clock ceiling for the run, 20 to 180 seconds. |
requestTimeoutSeconds | 15 | How long one search request is allowed to take, 5 to 30 seconds. |
maxAttempts | 8 | How many times a request can be retried, 1 to 12. |
sessionCookies | none | Optional, and normally not needed. Your own Instagram cookie, so the run uses your own account. |
proxyConfiguration | none | Leave it alone unless you have your own servers to use. |
Keep every term short and non-empty: a blank term, or one over 100 characters, is skipped with a
free BAD_INPUT row and the rest are searched. A filter value that can't be read, such as last week
for a date, 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}
| Field | How to read it |
|---|---|
shortcode | The key to join runs on. reelUrl is the canonical link. |
playCount, likeCount, commentCount, shareCount | The counters as Instagram reports them at read time. |
durationSeconds | Reel length, unrounded. |
thumbnailUrl, videoUrl | Direct links to the cover image and the video file. Signed and time limited. |
audioTitle, audioArtist | The song and artist for licensed music. For a creator's own sound, its name and the account that made it. |
isOriginalAudio, audioUrl | true 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, fbPlayCount | playCount is the total. The other two split it between Instagram and Facebook, null when not reported. |
isPaidPartnership, sponsors | isPaidPartnership 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. |
taggedUsers | Tagged 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. |
commentsDisabled | true or false when Instagram says, null when it doesn't. The search answer almost never does, so expect null. |
transcript | The text of Instagram's own subtitles for the reel. null when Instagram publishes none, or the file couldn't be read in time. |
sourceQuery | Your term as searched: the keyword, or #tag for a hashtag. |
sourceHashtag | The tag for a hashtag search, and null for a keyword. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| A real reel | ok: true and recordType: "instagram_reel" | yes |
| The sample row | _sample: true | no |
| A diagnostic | ok: false and an errorCode | no |
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.
| Code | What it means |
|---|---|
NO_RESULTS | That 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. |
PARTIAL | The 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_ERROR | Something in the input stopped the run before it searched. |
BAD_INPUT | A filter or limit value couldn't be read. Nothing was searched. |
OPTION_NOT_LIVE | The filters weren't available on that run, so nothing was searched. Run it again. |
FREE_PLAN_LIMIT | You 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_ERROR | That search could not be answered this time. Re-running usually clears it. |
PROXY_GROUP_ADJUSTED | The run adjusted a setting you supplied and carried on. |
TIME_LIMIT | The 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. |
UNEXPECTED_ERROR | The run stopped early on an unexpected error. The results before this row are kept. |
A diagnostic row is never billed and never fails the run, TIME_LIMIT included: that run still ends as succeeded,
with an amber status message. 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 putting it on a weekly schedule to see the churn, with the rows sent to Slack, Make, Zapier or n8n.
- 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:
- Run this on your phrase.
- Sort on
playCountand copy thereelUrlof the top ten. - Watch them and note what the top reels open with.
🚧 What it does not do
- No sorting. A strict likes, comments or date 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
maxReelsPerTermthe 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
PARTIALrow 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. Nothing is transcribed from the sound.
- The audio is never downloaded.
audioUrlis 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 want | Use |
|---|---|
| Reels ranked for a keyword or a tag | This one |
| Posts and reels under a hashtag | Instagram Hashtag Scraper |
| Every reel on one profile's reels tab | Instagram Reel Scraper |
| One post or reel you already have the link for | Instagram Post Scraper |
| A profile plus the posts on its grid | Instagram Scraper |
| TikTok videos for a keyword | TikTok Scraper |
| YouTube Shorts for a keyword | YouTube 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?
The API tab has code for Python, JavaScript
and the CLI. MCP clients like Claude and ChatGPT use
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/instagram-reels-search-scraper; coding assistants can
load our skill file.
All three bill your Apify account at the same price.
# pip install apify-clientfrom apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("dami_studio/instagram-reels-search-scraper").call(run_input={"searchQueries": ["travel"],"maxReels": 20,},max_total_charge_usd=0.10, # the most this run may spend)for row in client.dataset(run["defaultDatasetId"]).iterate_items():if row.get("ok") is False: # free note rows, not resultscontinueprint(row.get("playCount"), row.get("reelUrl"))
Is scraping Instagram legal?
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.