Facebook Reels Scraper: by Keyword Search avatar

Facebook Reels Scraper: by Keyword Search

Pricing

Pay per usage

Go to Apify Store
Facebook Reels Scraper: by Keyword Search

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

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

20

Total users

0

Monthly active users

3 days ago

Last modified

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.

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

Every row mixes identifying and playback fields with the discovery metadata that explains where the Reel came from.

FieldExample ValueUse 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
playCountRounded820000Parsed 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_facebooktrueWhether the audio is original to this Reel
video_owner_type"user"Owner account type reported by Facebook
is_passive_contentfalseFacebook'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_boostnullRaw 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.

ParameterRequiredTypeDescriptionExample Value
hashtagsNoArray of stringsOne hashtag per line, with or without #.["cooking", "#travel"]
keywordsNoArray of stringsFree-text search terms run against Facebook video search.["home workout", "latte art"]
profileHandlesNoArray of stringsOne handle or link per line — a Page link, a /people/… link, or a bare username.["https://www.facebook.com/mrbeast/"]
reelsPerSourceCapNoInteger (1–10,000)Harvest at most this many Reels from each hashtag, keyword, or profile.10
reelsPublishedAfterNoString (absolute or relative date)Absolute date or a relative window like "7 days", "2 weeks". Leave blank for no cutoff."30 days"
proxyConfigurationNoObjectApify 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 (#Traveltravel) 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 NameWhat it extracts
Facebook Posts Search ScraperDiscovers public Facebook posts by keyword, with likes, comments, shares, and text
Facebook Groups Search Scraper With Group Profile DetailsFinds Facebook groups by keyword or link and pulls member counts, post frequency, and description
Facebook Page Posts & Comments ScraperPulls a Page's posts plus each post's full comment thread
Facebook Comments Scraper: Sentiment & Toxicity AnalysisScrapes comments on any public post/reel link and enriches them with language, moderation, and sentiment fields
Instagram Reels Scraper With Engagement AnalyticsScrapes Instagram Reels by creator with derived engagement-rate and velocity metrics
Instagram Single Reels ScraperScrapes 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 ApifyClient
client = 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.

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.