Instagram Reels Search - Reels by Keyword and Hashtag
Pricing
from $0.38 / 1,000 results
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
Maintained by CommunityActor stats
2
Bookmarked
730
Total users
72
Monthly active users
a day ago
Last modified
Categories
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.
| 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 |
🔍 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 that comes back empty is 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. 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}
| 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 Instagram doesn't say. |
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. Usually a blank or over-long term. |
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 without them. |
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 network setting you supplied so it could carry 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. |
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:
- 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, 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
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, and most reels have none. 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?
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.
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.