Instagram Reels Scraper By Hashtag & Keyword Search avatar

Instagram Reels Scraper By Hashtag & Keyword Search

Pricing

Pay per usage

Go to Apify Store
Instagram Reels Scraper By Hashtag & Keyword Search

Instagram Reels Scraper By Hashtag & Keyword Search

Instagram Reels Scraper extracts Reels from any public Instagram profile or hashtag. Get video URLs, captions, audio info, views, likes, comments, and metadata. Ideal for research, trend tracking, content analysis, and automation workflows needing structured Reels data.

Pricing

Pay per usage

Rating

3.0

(1)

Developer

API Empire

API Empire

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

0

Monthly active users

5 days ago

Last modified

Share

Instagram Reels Scraper — Extract Reels, Profiles & Comments as JSON

Instagram Reels Scraper By Hashtag & Keyword Search pulls Instagram Reels — with creator profile fields and comment threads — from four entry points: hashtag search, keyword search, direct Reel URLs/shortcodes, and creator usernames. Every mode feeds the same transform pipeline, so a Reel found via #travel looks identical to one found via a profile scan, complete with captions, engagement counts, audio metadata, and nested comments. Every response returns typed, normalized JSON — no HTML, no selectors, no parsing — ready to filter, dedupe, and load straight into a pipeline.

Instagram Reels Scraper By Hashtag & Keyword Search is an Apify Actor that discovers and extracts Instagram Reels through four independent entry points — hashtag search, keyword search, direct Reel URLs/shortcodes, and creator usernames — and normalizes every result into one consistent JSON row. Hashtag and keyword discovery run against Instagram's own top_serp search endpoint and need a lightweight Instagram session (a pasted sessionid cookie value); direct Reel URLs and username scraping need no Instagram account at all. Every returned Reel carries its creator's profile fields and a sample of recent comments alongside it, so profile and engagement data don't require a second scraper.

  • Discover Reels by hashtag or plain keyword search
  • Scrape a creator's full Reels feed by username
  • Fetch specific Reels directly by URL or shortcode
  • Collect embedded creator profile fields and comment threads with every Reel
  • Export results as JSON or CSV from the Apify dataset

What data does Instagram Reels Scraper By Hashtag & Keyword Search collect?

Every run can return Reel identity/discovery data, creator profile fields, engagement metrics, comment threads, and media/audio details — all embedded in the same row.

Data TypeKey FieldsJSON Field Names
Reel identity & discoveryshortcode, canonical URL, how/where it was foundshortCode, url, discoveryMode, sourceQuery
Creator profile datausername, full name, profile IDownerUsername, ownerFullName, ownerId
Engagement metricslikes, comments, views, plays, shareslikesCount, commentsCount, videoViewCount, videoPlayCount, sharesCount
Comment threadscomment text, commenter username, likes, replieslatestComments[].text, latestComments[].ownerUsername, latestComments[].likesCount
Media & audiovideo URL, thumbnail, duration, track namevideoUrl, displayUrl, videoDuration, musicInfo.song_name
Caption & textcaption body, hashtags, mentions, transcriptcaption, hashtags, mentions, transcript

Need more Instagram data?

If you need ranked, section-by-section hashtag results with engagement scoring instead of a flat Reels feed, Instagram Hashtag Scraper: Top Post Data groups Reels by hashtag and ranks them by play count with structured audio metadata. If you're focused on one Reel at a time and want caption-language detection, keyword extraction, or a real self-hosted speech-to-text transcript, Instagram Single Reels Scraper: Transcript Extraction is built for that deeper single-Reel analysis.

Why not build this yourself?

Instagram doesn't offer a public API that covers arbitrary hashtag search, keyword discovery, or reading another creator's Reels feed — its official Graph API is scoped to a business/creator account managing its own content, behind app review and business-account requirements, not to sampling public content across the platform. Building this yourself also means absorbing ongoing breakage: the classic hashtag-feed endpoint (/api/v1/tags/{tag}/sections/) this Actor originally used is now dead — it redirects to a login wall on every session — so hashtag and keyword discovery had to be rebuilt against Instagram's own top_serp search endpoint instead. Direct Reel URL fetching hit the same problem: the JSON key xdt_api__v1__media__shortcode__web_info that used to embed a Reel's data on its detail page stopped appearing, and had to be replaced with the clips_on_logged_out_connection_v2 key Instagram serves today. On top of tracking those moving targets, a DIY scraper still needs session/cookie handling for search, Chrome-TLS impersonation for logged-out page fetches, and a proxy escalation ladder for blocked requests — all of which this Actor already handles.

Why do developers and teams scrape Instagram?

For AI engineers and agent builders

An agent asked to "find trending travel Reels under 30 seconds" needs typed fields, not a page to render — discoveryMode, sourceQuery, caption, hashtags, and transcript map directly onto filterable tool parameters or a retrieval index. Because the Actor is reachable as a plain HTTP endpoint (and through Apify's MCP server), an agent framework can call it, get back normalized JSON, and reason over the result — or index caption/transcript text into a RAG store — without a parsing step anywhere in the loop.

For marketers and brand teams

Brand and social teams track how a hashtag or campaign phrase is performing by running searchTerms against a tag or keyword on a schedule and watching likesCount, videoViewCount, and musicInfo shift over time. Because sourceQuery records exactly which hashtag or keyword produced each row, results from several campaign terms can be compared side by side in one dataset instead of stitching together separate manual searches.

For researchers and analysts

Researchers studying how a topic spreads on Instagram use the hashtag/keyword modes to pull a public sample of Reels for a term, then analyze caption, hashtags, and timestamp across the set — restricted, by design, to whatever a public search or profile already surfaces. Setting postedAfter to a relative window like 30 days keeps a study's sample bounded to a specific, reproducible time period rather than an open-ended crawl.

For developers building data products

Dashboards and monitoring tools built on top of this Actor schedule recurring runs against a fixed list of hashtags, keywords, or creator usernames and load the resulting rows straight into a warehouse — discoveryMode and sourceQuery make it trivial to join rows back to whichever campaign or creator they came from. Because the output schema is identical across all four discovery modes, a pipeline built against one mode keeps working unchanged if a later run adds another.

How to scrape Instagram (step by step)

  1. Open Instagram Reels Scraper By Hashtag & Keyword Search on its Apify Store page (or call it through the Apify API).
  2. Provide input for at least one discovery mode: hashtags/keywords in searchTerms (plus an igSessionId), one or more reelUrls, or one or more profilesToScan — a run with all three left empty collects nothing.
  3. Set maxReelsPerSource to cap how many Reels each source contributes, and optionally postedAfter and excludePinnedPosts to filter what's kept.
  4. Start the run from the Console or via the API.
  5. Open the Dataset tab to browse Reels as they stream in page-by-page, then export as JSON or CSV.

What to do when Instagram changes its structure

The Actor is actively maintained and its output schema stays stable, so integrations keep working even after an Instagram-side change. This isn't theoretical here: the classic hashtag-feed endpoint and the original direct-Reel-URL JSON key have already died once each during this Actor's life and were both replaced with their live equivalents. No specific fix turnaround time is guaranteed.

⬇️ Input

None of the 11 parameters are required — a run needs at least one of searchTerms, reelUrls, or profilesToScan filled in, or it exits with no results.

ParameterRequiredTypeDescriptionExample Value
searchTermsNoArray of stringsOne or more hashtags (with #) or plain keywords to discover trending/top Reels for. Requires igSessionId.["#travel", "street food"]
igSessionIdNoStringRequired only when searchTerms is used — Instagram's search endpoint needs a lightweight logged-in session. Paste just the sessionid cookie value; never logged or stored beyond the run."your-instagram-sessionid-value"
reelUrlsNoArray of stringsFull Reel URLs or bare shortcodes to fetch specific Reels directly — bypasses discovery entirely and needs no session ID.["https://www.instagram.com/reel/DO8cvGViIPu/"]
profilesToScanNoArray of stringsUsernames, @handles, or profile URLs whose Reels feed should be scraped.["natgeo"]
maxReelsPerSourceNoInteger (1–10000)Maximum Reels to collect per username, per hashtag, or per keyword.10
postedAfterNoString (date or relative duration)Only keep Reels newer than this date/duration. Absolute YYYY-MM-DD or relative (7 days, 2 weeks, 1 month). Leave empty to keep everything. Applies to every mode."7 days"
excludePinnedPostsNoBooleanSkip a profile's pinned Reels, keeping only regular timeline content. Applies to every mode.false
addSharesCountNoBooleanInclude the share count for each Reel when Instagram makes it available.true
addTranscriptNoBooleanExtract and include the auto-generated transcript/caption text for each Reel's video.false
saveVideoToStorageNoBooleanDownload each Reel's video into the Apify Key-Value Store and include a downloadable link in the output.false
proxyConfigurationNoObjectThe Actor always uses Apify's residential proxy for reliability. Supplying custom proxy URLs here makes the Actor try those first, then fall back to residential on failure.{ "useApifyProxy": true }

Example JSON input

{
"searchTerms": ["#travel", "street food"],
"igSessionId": "your-instagram-sessionid-value",
"reelUrls": ["https://www.instagram.com/reel/DO8cvGViIPu/"],
"profilesToScan": ["natgeo"],
"maxReelsPerSource": 10,
"postedAfter": "7 days",
"excludePinnedPosts": false,
"addSharesCount": true,
"addTranscript": false,
"saveVideoToStorage": false,
"proxyConfiguration": { "useApifyProxy": true }
}

The most common mistake is filling in searchTerms but leaving igSessionId empty — hashtag/keyword discovery silently skips with a warning instead of failing the run, so the other modes still produce results while that one mode returns nothing.

⬆️ Output

Results are written as typed, normalized JSON to the default dataset, one row per Reel, identical in shape regardless of which discovery mode found it. Export as JSON or CSV from the Apify Console.

Scraped Reels

{
"id": "3727980973477364718",
"type": "Video",
"shortCode": "DO8cvGViIPu",
"caption": "On the 95th Saudi National Day... #travel #ksa",
"hashtags": ["travel", "ksa"],
"mentions": [],
"url": "https://www.instagram.com/p/DO8cvGViIPu/",
"commentsCount": 12381,
"dimensionsHeight": 1920,
"dimensionsWidth": 1080,
"images": ["https://scontent.cdninstagram.com/...thumb1.jpg"],
"videoUrl": "https://scontent.cdninstagram.com/...video.mp4",
"likesCount": 1258268,
"timestamp": "2025-09-23T13:07:17.000Z",
"ownerFullName": "نادي النصر السعودي",
"ownerUsername": "alnassr",
"ownerId": "1513490980",
"isPinned": false,
"productType": "clips",
"videoDuration": 47.5,
"inputUrl": "https://www.instagram.com/alnassr",
"firstComment": "Amazing!",
"latestComments": [
{
"id": "17912345678901234",
"text": "Amazing!",
"ownerUsername": "travel_fan22",
"ownerProfilePicUrl": "https://scontent.cdninstagram.com/...pic.jpg",
"timestamp": "2025-09-23T14:10:02.000Z",
"repliesCount": 0,
"replies": [],
"likesCount": 4,
"owner": {
"id": "9988776655",
"is_verified": false,
"profile_pic_url": "https://scontent.cdninstagram.com/...pic.jpg",
"username": "travel_fan22"
}
}
],
"displayUrl": "https://scontent.cdninstagram.com/...cover.jpg",
"audioUrl": "https://video.xx.fbcdn.net/...audio.mp4",
"alt": "Photo shared by alnassr",
"videoViewCount": 37796913,
"videoPlayCount": 37796913,
"childPosts": [],
"musicInfo": {
"artist_name": "alnassr",
"song_name": "Original audio",
"uses_original_audio": true,
"should_mute_audio": false,
"should_mute_audio_reason": "",
"audio_id": "1029384756"
},
"isCommentsDisabled": false,
"transcript": "",
"downloadedVideo": "",
"discoveryMode": "hashtag",
"sourceQuery": "#travel",
"sharesCount": 542
}

Comment objects (nested inside latestComments)

Each entry in a Reel's latestComments array is its own structured object, not raw HTML:

{
"id": "17912345678901234",
"text": "Amazing!",
"ownerUsername": "travel_fan22",
"ownerProfilePicUrl": "https://scontent.cdninstagram.com/...pic.jpg",
"timestamp": "2025-09-23T14:10:02.000Z",
"repliesCount": 0,
"replies": [],
"likesCount": 4,
"owner": {
"id": "9988776655",
"is_verified": false,
"profile_pic_url": "https://scontent.cdninstagram.com/...pic.jpg",
"username": "travel_fan22"
}
}

maxReelsPerSource caps how many Reels are collected per hashtag, per keyword, or per username, from 1 up to 10,000 — there's no separate run-wide ceiling, so a run with several search terms or profiles returns up to that cap multiplied by however many sources you supply. A direct Reel URL or shortcode in reelUrls always returns exactly one row per entry, regardless of maxReelsPerSource. If the Actor is called with no input for this field at all (a bare API call), it falls back to a built-in default of 27 Reels per source; the Apify Console's input form pre-fills a lower value of 10. postedAfter narrows the result set by date but never raises the cap.

Integrate Instagram Reels Scraper By Hashtag & Keyword Search and automate your workflow

Instagram Reels Scraper By Hashtag & Keyword Search works with any language or tool that can send an HTTP request.

REST API integration

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("instagram-reels-scraper-by-hashtag-keyword-search").call(run_input={
"searchTerms": ["#travel"],
"igSessionId": "your-instagram-sessionid-value",
"maxReelsPerSource": 10,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["shortCode"], item["ownerUsername"], item["likesCount"])

Works in Python, Node.js, Go, Ruby, cURL — any client that can call the Apify API with your token.

MCP for AI agents

Apify's MCP server (mcp.apify.com) exposes Apify Actors — including this one — as callable tools for MCP-compatible clients such as Claude Desktop, Cursor, and Windsurf. Add the Actor's name (instagram-reels-scraper-by-hashtag-keyword-search, as shown on its Apify Store page) to the server's actor list to make it callable as an agent tool without writing custom integration code.

Automation platforms (n8n, Make, LangChain)

In n8n, the community Apify node's "Run Actor" operation can call this Actor by Actor ID and pass searchTerms, reelUrls, or profilesToScan as JSON, then feed the returned Reel rows into downstream nodes. In Make, the Apify app's "Run an Actor or Task" module runs the same Actor and lets you map each Reel's caption, engagement counts, or comment sample into another scenario step, such as a spreadsheet row or a Slack alert. Any LangChain agent that can call an HTTP tool can invoke the Actor through the Apify API and consume its dataset items directly as typed JSON, without a parsing step.

Scraping publicly accessible Instagram content is generally lawful, and Instagram Reels Scraper By Hashtag & Keyword Search only returns Reels, captions, and comment samples that are visible without logging into a private account — hashtag/keyword search uses only a lightweight session tied to your own Instagram account, not a way to bypass another account's privacy. Because the output includes personal data — creator usernames, full names, and commenters' usernames and profile pictures — GDPR/CCPA-style rules on lawful basis for storing and using that data can apply, especially at scale. Consult legal counsel for commercial use cases involving bulk personal data.

Frequently asked questions

Does Instagram Reels Scraper By Hashtag & Keyword Search work without an Instagram account?

Depends on the mode. Direct Reel URLs/shortcodes and username-based scraping need no Instagram account or login at all. Hashtag and keyword search is the one mode that needs a lightweight session — paste your own account's sessionid cookie value into igSessionId; it's used only for that run and never logged or stored.

How often is the scraped data updated?

Every run fetches live from Instagram at run time — nothing is served from a cache, so results reflect whatever captions, counts, and comments are publicly visible at the moment the run executes.

What happens if a Reel is deleted, private, or a search returns nothing?

A direct Reel URL that's deleted, private, or blocked produces no row for that entry — the Actor logs the reason and moves on to the next URL rather than failing the run. A hashtag or keyword search with zero Reel-type results on the first page logs that outcome and simply produces no rows for that term, while any other terms, profiles, or URLs in the same run still complete normally.

Can I scrape private Instagram accounts or restricted content?

No. Only Reels, profiles, and hashtag/keyword search results that are publicly visible are returned — there's no way to access a private account's Reels or content gated behind something beyond the lightweight search session.

Does Instagram Reels Scraper By Hashtag & Keyword Search work for AI agent workflows and LLM pipelines?

Yes. It's callable as an HTTP endpoint through the Apify API from any agent framework, and it's reachable through Apify's MCP server as a callable tool — every response is typed JSON with stable field names, so no parsing step is needed before passing results to an LLM.

How does Instagram Reels Scraper By Hashtag & Keyword Search handle Instagram's anti-bot system?

Every request runs through Apify's residential proxy by default, with up to three attempts before a request is given up on; if you supply custom proxy URLs, the Actor tries those first and escalates to residential automatically on failure. Direct Reel URL fetches use Chrome-TLS browser impersonation to avoid basic fingerprint blocks, and hashtag/keyword search authenticates against Instagram's own top_serp endpoint with a lightweight session rather than relying on the classic hashtag-feed endpoint, which now redirects to a login wall.

Does Instagram Reels Scraper By Hashtag & Keyword Search return data in a format LLMs can use directly?

Yes. Output is typed, normalized JSON with stable field names, so it can be passed directly into an LLM context window, indexed into a vector store, or routed through an agent tool without extra parsing.

Can I use Instagram Reels Scraper By Hashtag & Keyword Search without managing proxies?

Yes. The Actor always runs through Apify's residential proxy by default; supplying your own proxyConfiguration is optional and only used as a first-attempt tier before falling back to residential.

Which Reels count toward usage?

Only Reels that were actually fetched and written to the dataset are charged, each as one row_result event. Reels that fail to load — deleted, private, blocked, or an empty search — are never written to the dataset and are never charged.

What happens when Instagram changes its structure or blocks the scraper?

The Actor is actively maintained, and its output schema stays stable — field names and types don't change on your end because of an Instagram-side update. This Actor has already absorbed two such changes (a dead hashtag-feed endpoint and a dead direct-Reel-URL data key) without breaking its output shape. No specific turnaround time is guaranteed for fixes.

Your feedback

Found a bug, or a field that's missing from your results? We want to know. Report it through the Issues tab on this Actor's Apify Store page, or reach out to API-Empire through Apify Console — active reports directly shape what gets fixed and maintained next.