Facebook Reels Scraper: by Keyword Search
Pricing
Pay per usage
Facebook Reels Scraper: by Keyword Search
Facebook Reels Scraper extracts Reels from public Facebook profiles and pages, capturing captions, audio, media URLs, views, likes, comments, shares, and timestamps. Ideal for trend tracking, content research, competitor analysis, and automating structured Facebook Reels data collection at scale.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
SimpleAPI
Maintained by CommunityActor stats
0
Bookmarked
20
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Facebook Reels Scraper — Keyword Search, Captions and Owner Data
This Actor discovers public Facebook Reels by hashtag or free-text keyword and returns each one as a structured JSON record — caption (text), publish time (time), play count (playCountRounded, play_count_reduced), the reel's permalink (shareable_url), and owner data (facebookUrl, video_owner). It also still supports classic profile-based collection. Content researchers, brand-monitoring agencies, and trend analysts use it to turn a search term into a dataset of real, parsed Reels instead of scrolling Facebook by hand. Point it at a term, a profile, or both, and rows land as each Reel resolves.
What is Facebook Reels Scraper: by Keyword Search?
It's an Apify Actor that finds public Facebook Reels three ways — by hashtag, by free-text keyword, or from a list of profile handles — and runs every discovered Reel through the same detail parser so hashtag, keyword, and profile rows all share one schema. No Facebook login, cookie, or API key is required or accepted anywhere in the input: discovery runs through Google search, and every reel page is fetched logged-out.
- Discovers Reels by hashtag, keyword, or specific profile — combine all three in a single run
- Parses caption, publish time, and play count straight from each Reel's own public page
- Also captures the owner's profile link, video/playback metadata, and (when Facebook exposes it) the attached soundtrack
- Lets you cap how many Reels to keep per source and drop anything older than an absolute date or a relative window like "7 days"
- Every row is written the moment its Reel is parsed, so the dataset fills incrementally rather than waiting for the whole run
- Runs behind Apify Proxy (residential recommended) with no Facebook account required
What data can I extract with Facebook Reels Scraper: by Keyword Search?
Every row mixes identifying and playback fields with the discovery metadata that explains where the Reel came from.
| Field | Example Value | Use Case |
|---|---|---|
text | "5-minute pasta 🍝" | Reel caption for content or trend analysis |
time | "2026-06-01T12:00:00.000Z" | Publish timestamp for recency filtering and timelines |
shareable_url | "https://www.facebook.com/reel/1234567890123456/" | Canonical Reel permalink to open, embed, or dedupe on |
facebookUrl | "https://www.facebook.com/somecreator" | Owner's Facebook profile/Page URL |
video_owner | {"name": "Some Creator", "url": "https://www.facebook.com/somecreator"} | Creator identity for outreach or attribution |
playCountRounded | 820000 | Parsed numeric play count for ranking by reach |
play_count_reduced | "820K" | Facebook's own rounded display string behind playCountRounded |
video | {"id": "…", "playable_duration_in_ms": 34000, "embeddable": true} | Raw video object — duration, embeddability, thumbnail |
playback_video | {"image": {"uri": "…"}, "length_in_second": 34, "audio_user_preferred_language": "en"} | Playback metadata incl. thumbnail and audio language |
attachments | [{ "media": {...} }] | Raw attachment/media node as returned by Facebook |
track_title | "Some Creator · Original audio" | Soundtrack/audio label attached to the Reel |
soundtrack_info | {"type": "CUSTOM_AUDIO"} | Structured audio-track metadata when present |
music_album_art_uri | "https://scontent.xx.fbcdn.net/…jpg" | Cover art for the attached soundtrack |
is_original_audio_on_facebook | true | Whether the audio is original to this Reel |
video_owner_type | "user" | Owner account type reported by Facebook |
is_passive_content | false | Facebook's own passive/organic content flag |
fb_shorts_reshare_context | {} | Reshare context, populated when the Reel is a reshare |
remix_info | {} | Remix/duet lineage when Facebook reports one |
self_view_boost | null | Raw self-view-boost flag from the source page |
tracking | {...} | Raw Facebook analytics/tracking payload for the node |
inputUrl | "https://www.facebook.com/reel/1234567890123456" | Exact URL requested to produce this row |
topLevelReelUrl | "https://www.facebook.com/reel/1234567890123456/" | Normalized reel URL with trailing slash |
topLevelUrl | "https://facebook.com/1234567890123456/posts/undefined/" | Constructed post-style URL, present only when a post_id is available |
if_should_change_url_for_reels | {"shareable_url": "…"} | Facebook's own URL-migration hint for this Reel |
discoverySource | "hashtag" | Which source produced this row: hashtag, keyword, or profile |
discoveryType | "hashtag" | Same value as discoverySource, kept for clarity |
discoveryValue | "cooking" | Exact hashtag, keyword, or profile handle that found this Reel |
startUrl | "https://www.facebook.com/mrbeast/" | Profile mode only: the normalized profile URL that was crawled |
A Reel that fails to parse never reaches this shape — it instead pushes request_error (network failure) or parse_error plus http_status (page loaded but no short_form_video_context was found), and error placeholders (type: "hashtag_error", "keyword_error", or "profile_error") are pushed without the row_result charged event, so they don't count against usage.
Engagement data
playCountRounded and play_count_reduced are the only reach signal Facebook exposes to a logged-out request — a rounded string like "820K" and its parsed integer. Around it sits the media context: video and playback_video carry duration, thumbnail, and embeddability; track_title, soundtrack_info, music_album_art_uri, and is_original_audio_on_facebook describe the audio track, which is useful for spotting a trending sound across many Reels; remix_info and fb_shorts_reshare_context flag remixes and reshares when Facebook reports them. Together these fields let you rank a batch of discovered Reels by reach and identify which ones ride the same audio trend, without opening a single page by hand.
Targeting data
discoverySource, discoveryType, and discoveryValue record exactly which hashtag, keyword, or profile handle produced each row, so a single dataset covering several search terms can still be grouped or filtered back to its source term. Combined with time and the reelsPublishedAfter input cutoff, these fields let you segment results by topic and by recency — for example, comparing how "latte art" Reels trend against "home workout" Reels within the same run.
Why not build this yourself?
Meta's Graph API has no endpoint for arbitrary keyword- or hashtag-based Reels search — video/reel access is scoped to Pages and assets you already manage, not the public catalogue of Reels matching a search term. Reproducing what this Actor does yourself means building a discovery layer (Google SERP paging, redirect-unwrapping, id extraction), a resilient logged-out reel parser that walks nested application/json script blocks across repeated Relay trees, GraphQL doc_id resolution for profile-reels pagination (scanning JS bundles when it isn't inline), and retry/backoff handling for Facebook's rate limiting and soft-block interstitials — plus a residential proxy budget to keep it all running. This Actor already does that work: pass in terms or profiles and get parsed rows back.
Build it yourself if you need a fully custom crawl strategy or want to avoid any third-party dependency. Use this Actor when you want structured Reel data now, without maintaining scraping infrastructure.
How to use data extracted from Facebook?
Content trend research
Feed a batch of hashtags or keywords in one run, then sort the resulting dataset by playCountRounded to see which captions, formats, or track_title audio are pulling the most reach for a topic right now. Because discoveryValue tags every row with its source term, you can compare "cooking" against "streetfood" side by side in the same export and decide which angle to brief creators on next.
Brand monitoring agencies
Point hashtags or keywords at a client's brand terms or campaign tags on a recurring schedule, and use video_owner, facebookUrl, and time to build a running log of who is posting Reels about the brand and when. discoverySource/discoveryValue let you split a single run's output back out per client or per tracked term, so one dataset can cover several accounts at once. Repeat the run weekly to benchmark share-of-voice against a competitor's own branded hashtag, all without manually searching Facebook for each client by hand.
Market and trend research
Run a wider list of niche terms — categories, product types, competitor names — through keywords in one call, then compare playCountRounded totals across discoveryValue groups to see which topics are producing the most Reels volume and reach right now. Because every source gets its own reelsPerSourceCap, you can scan dozens of candidate terms cheaply before scaling up the ones that show real traction. This turns a term list into a rough demand map for content or ad-targeting decisions, without needing a Facebook ad account or business login for the query.
AI agents and automated pipelines
An agent can call this Actor as a discovery tool — "find trending cooking Reels this week" — then pipe shareable_url and text into a downstream captioning, sentiment, or RAG pipeline, using discoveryValue to keep provenance on which query surfaced each Reel. Because output is typed JSON keyed by real field names rather than raw HTML, an agent can consume and re-query it without writing any parsing logic of its own.
🔼 Input sample
All six input fields are optional — but at least one of hashtags, keywords, or profileHandles must be filled in, or the run does nothing.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
hashtags | No | Array of strings | One hashtag per line, with or without #. | ["cooking", "#travel"] |
keywords | No | Array of strings | Free-text search terms run against Facebook video search. | ["home workout", "latte art"] |
profileHandles | No | Array of strings | One handle or link per line — a Page link, a /people/… link, or a bare username. | ["https://www.facebook.com/mrbeast/"] |
reelsPerSourceCap | No | Integer (1–10,000) | Harvest at most this many Reels from each hashtag, keyword, or profile. | 10 |
reelsPublishedAfter | No | String (absolute or relative date) | Absolute date or a relative window like "7 days", "2 weeks". Leave blank for no cutoff. | "30 days" |
proxyConfiguration | No | Object | Apify Proxy settings; residential is recommended for discovery. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
{"hashtags": ["cooking", "#travel"],"keywords": ["latte art"],"profileHandles": ["https://www.facebook.com/mrbeast/"],"reelsPerSourceCap": 15,"reelsPublishedAfter": "30 days","proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Common pitfall: reelsPerSourceCap applies per source, not per run — 3 hashtags at a cap of 10 can return up to 30 rows, not 10. And leaving hashtags, keywords, and profileHandles all empty produces zero rows; the run logs "Nothing to do" and exits instead of erroring, so check the run log if a run finishes with an empty dataset.
🔽 Output sample
Output is typed, normalized JSON — one row per Reel, pushed to the dataset as soon as that Reel is parsed. Export directly to JSON, CSV, Excel, or XML from the run's Storage tab, or pull it through the Apify API.
{"facebookUrl": "https://www.facebook.com/somecreator","inputUrl": "https://www.facebook.com/reel/1234567890123456","topLevelUrl": "","topLevelReelUrl": "https://www.facebook.com/reel/1234567890123456/","text": "5-minute pasta 🍝","time": "2026-06-01T12:00:00.000Z","playCountRounded": 820000,"play_count_reduced": "820K","attachments": [{"media": {"playable_duration_in_ms": 34000,"owner": { "id": "100064000000001" }}}],"tracking": { "top_level_post_id": "1234567890123456" },"self_view_boost": null,"video": {"id": "1234567890123456","__typename": "Video","playable_duration_in_ms": 34000,"embeddable": true,"first_frame_thumbnail": "https://scontent.xx.fbcdn.net/thumb.jpg"},"if_should_change_url_for_reels": {"shareable_url": "https://www.facebook.com/reel/1234567890123456/"},"shareable_url": "https://www.facebook.com/reel/1234567890123456/","playback_video": {"image": { "uri": "https://scontent.xx.fbcdn.net/thumb.jpg" },"length_in_second": 34,"audio_user_preferred_language": "en"},"video_owner": {"name": "Some Creator","url": "https://www.facebook.com/somecreator"},"is_passive_content": false,"fb_shorts_reshare_context": {},"remix_info": {},"video_owner_type": "user","soundtrack_info": { "type": "CUSTOM_AUDIO" },"track_title": "Some Creator · Original audio","music_album_art_uri": "https://scontent.xx.fbcdn.net/art.jpg","is_original_audio_on_facebook": true,"discoverySource": "hashtag","discoveryType": "hashtag","discoveryValue": "cooking"}
How do you filter and target specific Reels?
Targeting on this Actor runs through three independent axes: which discovery mode, which sources, and how much volume per source. Use keywords for a natural-language search phrase — Facebook video search matches on wording, so it's better for intent-style terms like "home workout." Use hashtags when you're after the specific tag community instead: the term is normalized (#Travel → travel) and searched as a tag, not a phrase, which surfaces a narrower, different set of Reels than the equivalent keyword search. Both can run in the same call, and profileHandles layers classic per-profile collection on top — combine a hashtag sweep with a known creator's own Reels in a single run. reelsPerSourceCap (1–10,000) is the volume control, applied independently to every hashtag, keyword, and profile you list, so raising it scales cost roughly linearly with source count, not run count. reelsPublishedAfter is the only scope-narrowing filter beyond source selection — an absolute date or a relative window like "14 days" — applied wherever a Reel's publish time is available. There is no minimum-view or quality-score filter on this Actor; every Reel that successfully parses is kept, so precision comes from tighter sources and a shorter time window, not a post-hoc threshold. Discovery coverage also depends on what Google has indexed for a term, worth remembering when a niche hashtag returns fewer rows than its cap.
{ "keywords": ["home workout", "latte art"], "reelsPerSourceCap": 25 }
{ "hashtags": ["travel", "streetfood"], "reelsPublishedAfter": "14 days", "reelsPerSourceCap": 15 }
{"hashtags": ["cooking"],"profileHandles": ["https://www.facebook.com/mrbeast/"],"reelsPerSourceCap": 10,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
▶️ Want to try other Facebook scrapers?
| Scraper Name | What it extracts |
|---|---|
| Facebook Posts Search Scraper | Discovers public Facebook posts by keyword, with likes, comments, shares, and text |
| Facebook Groups Search Scraper With Group Profile Details | Finds Facebook groups by keyword or link and pulls member counts, post frequency, and description |
| Facebook Page Posts & Comments Scraper | Pulls a Page's posts plus each post's full comment thread |
| Facebook Comments Scraper: Sentiment & Toxicity Analysis | Scrapes comments on any public post/reel link and enriches them with language, moderation, and sentiment fields |
| Instagram Reels Scraper With Engagement Analytics | Scrapes Instagram Reels by creator with derived engagement-rate and velocity metrics |
| Instagram Single Reels Scraper | Scrapes one Instagram Reel URL at a time — caption, counts, video and music metadata |
How to extract Facebook data programmatically
The Actor runs as a standard Apify Actor: one authenticated API call with a JSON input body, and a structured JSON dataset back — no Facebook-specific authentication involved.
Python example
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("simpleapi/facebook-reels-scraper-by-keyword-search").call(run_input={"keywords": ["home workout"],"hashtags": ["cooking"],"reelsPerSourceCap": 20,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["text"], item["shareable_url"], item["playCountRounded"])
MCP for AI agents
This Actor is callable through Apify's official Actors MCP Server — the hosted endpoint at mcp.apify.com (OAuth, auto-updating), or self-hosted via npx -y @apify/actors-mcp-server --actors simpleapi/facebook-reels-scraper-by-keyword-search with an APIFY_TOKEN environment variable. An agent can call it as a discovery tool — "find trending cooking Reels" — and pass the returned shareable_url values into a downstream summarization or moderation tool. Compatible with Claude Desktop, VS Code, and other MCP-aware clients.
Export to spreadsheets or CRM
Every Apify dataset exports directly to CSV or Excel from the run's Storage tab, or via the API in either format. Map shareable_url to your CRM's content-record ID column, text to a notes/caption field, video_owner/facebookUrl to a creator/owner column, playCountRounded to a reach or priority-score column, and discoveryValue to a campaign or search-term tag so imported rows stay grouped by the term that found them.
Is it legal to scrape Facebook Reels?
Scraping publicly visible Facebook Reels — content anyone can view without logging in — is generally permissible, since this Actor only reads pages already exposed to the public. However, fields like video_owner, facebookUrl, and text can identify a real person, which makes them personal data under GDPR and CCPA once collected and stored. That means you need a lawful basis for holding and using this data, particularly for bulk collection or profiling of individual creators. Facebook's own Terms of Service also govern automated access separately from data-protection law. Consult legal counsel for commercial applications involving bulk storage of personal data.
❓ FAQ
What happens to Reels that are removed or fail to load?
They never reach your dataset as a normal row. The Actor over-fetches candidate Reel ids per source, fetches each one on a fresh residential IP, and keeps only the ones that actually parse into short_form_video_context; stale, deleted, or soft-blocked candidates are discarded or retried once on another IP rather than padding your results with broken rows.
Can I get play-count and engagement data along with the caption?
Yes. playCountRounded and play_count_reduced are populated directly from the Reel's own public page whenever Facebook exposes them there; in profile mode, a Reel that shows no count on its own page is backfilled from the rounded count shown on the profile's Reels tab. No count is fabricated — a Reel with nothing to report simply has playCountRounded: 0.
How accurate is the caption, owner, and play-count data?
It reflects exactly what the public Reel page or profile shows at request time. Play counts are Facebook's own rounded strings (e.g. "820K"), not exact counts, since that's all a logged-out request is shown. Recommend re-running periodically if you need to track how a figure changes over time.
How many Reels can I get per run?
reelsPerSourceCap (1–10,000, defaults to 10 if left blank) caps Reels kept per hashtag, per keyword, and per profile — list five sources at a cap of 200 and you can get up to 1,000 rows in one run. There's no separate run-wide ceiling beyond the sum of your sources' caps.
How do I combine hashtag, keyword, and profile targeting in one run?
Fill in any combination of hashtags, keywords, and profileHandles — the Actor processes all three in the same run and tags every row's source in discoverySource/discoveryValue, so you can tell a hashtag hit from a profile hit in the same dataset.
Does Facebook Reels Scraper: by Keyword Search work with Claude, ChatGPT, and AI agent frameworks?
Yes. It's reachable through Apify's Actors MCP Server (hosted or self-hosted via npx @apify/actors-mcp-server) for MCP-aware clients, and as a plain HTTP endpoint via the Apify API for any other agent framework that can make an authenticated REST call.
How does this compare to other Facebook Reels scrapers?
Most Facebook Reels scrapers on Apify, including the profile-only base version this Actor extends, require a known profile URL as the starting point. This variant adds hashtag and keyword discovery through Google search on top of that same profile mode, so you can start from a topic instead of a known account and still get the identical row schema either way.
Can I use this Actor without a Facebook account or API key?
Yes. You need only an Apify account to run it — no Facebook login, cookie, or API key is used or required anywhere in the process, since discovery runs through Google search and every Reel page is fetched logged-out.
Conclusion
Facebook Reels Scraper: by Keyword Search turns a hashtag, a keyword, or a profile list into a structured dataset of parsed public Reels — caption, timing, owner, and play count — without a Facebook login. It's built for content researchers, brand-monitoring agencies, and anyone piping social data into an automated pipeline who needs schema-stable rows rather than raw HTML. Combine discovery modes freely, cap volume per source, and export straight to JSON or CSV. Run it on Apify to get your first batch of Reels started now.