Facebook Posts Search Scraper: Top Engagement Posts
Pricing
from $4.99 / 1,000 results
Facebook Posts Search Scraper: Top Engagement Posts
Find public Facebook posts from search results using keywords, hashtags, or topics. This Apify actor extracts post text, authors, timestamps, links, and engagement signals. Great for trend monitoring, audience research, brand tracking, and competitor analysis in structured data.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
Scraper Engine
Maintained by CommunityActor stats
0
Bookmarked
25
Total users
6
Monthly active users
5 days ago
Last modified
Categories
Share
Facebook Posts Search Scraper — Engagement, Reactions and Sentiment
Facebook Posts Search Scraper: Top Engagement Posts searches Facebook by keyword and returns every matching public post as structured JSON — page name, post text, likes, comments, shares, and an optional per-post reaction-type breakdown (like, love, haha, wow, sad, angry) with a lexicon-based sentiment tag. No Facebook login or manual searching required. Every field is typed and consistently named across runs. Start a run on Apify to pull keyword-matched engagement data in minutes.
What is Facebook Posts Search Scraper: Top Engagement Posts?
Facebook Posts Search Scraper: Top Engagement Posts is an Apify Actor that runs a keyword search across Facebook and pulls every publicly visible post that matches, returning page details, engagement counts, and post text as structured JSON. No Facebook account or login is required for the core search and scrape — Facebook session cookies are only needed for the optional reaction-type breakdown, which returns null without them rather than a guessed value. It's built for social listening teams, market researchers, and developers who need keyword-matched Facebook post data without maintaining their own scraper or Facebook API access.
What Facebook post search data is publicly available to scrape?
Facebook exposes post text, page names, and engagement counts to anyone browsing logged out — this Actor collects exactly that. Only accurate per-type reaction counts sit behind a session, not a paid tier.
| Data Category | Publicly available (no login) | Requires a Facebook session cookie |
|---|---|---|
| Post text, page name, URLs | Yes | – |
| Aggregate engagement (likes, comments, shares) | Yes | – |
| Reaction-type breakdown | Returns null without a session | Yes, real counts |
| Top-level comments | Yes | – |
| Page contact info | Yes, when listed | – |
| Private groups, DMs | No | Not supported at all |
This Actor only returns publicly visible data — what any visitor sees, nothing behind a login wall except the optional reaction breakdown.
What data can I extract with Facebook Posts Search Scraper: Top Engagement Posts?
Each row covers post and page identity, engagement and sentiment metrics, and media/timestamp/enrichment data — every key below is written by the Actor's row-builder, not just the fields shown in the default dataset view.
Post and page identity fields
| Field Name | Description |
|---|---|
facebookUrl | Public Facebook URL of the page that published the post |
pageId | Numeric Facebook ID of the page, parsed from the post's embedded JSON or URL |
facebookId | Same numeric page ID as pageId, kept for compatibility with the base actor's field name |
pageName | Page's display name, taken from the post's og:title/<title> tag or URL handle |
postId | Numeric Facebook post (or video/reel) ID |
postFacebookId | Same value as postId, kept for compatibility |
url | Canonical permalink URL of the post, resolved from embedded JSON when available |
topLevelUrl | The original URL that was fetched (may differ from the resolved permalink) |
link | Same value as url, duplicated for compatibility with the base actor's field name |
searchQuery | The topic/keyword that produced this row |
text | Full post message text (up to 5,000 characters) |
Engagement and sentiment metrics
| Field Name | Description |
|---|---|
likes | Aggregate reaction count parsed from the post page |
comments | Aggregate top-level comment count |
shares | Aggregate share count (0 when Facebook doesn't expose one) |
reactions | Per-type object {like, love, haha, wow, sad, angry, sampledTotal} sampled from real reactors via GraphQL; null when includeReactionBreakdown is off or the session couldn't be resolved |
sentiment | Lexicon-based label: positive / negative / neutral / mixed; null when includeSentiment is off or there's no text |
sentimentScore | Numeric sentiment score from -1 to 1; null under the same conditions as sentiment |
Media, timestamps and enrichment
| Field Name | Description |
|---|---|
time | Human-readable UTC post-creation timestamp (YYYY-MM-DD HH:MM:SS) |
timestamp | Unix epoch seconds for the same post-creation time |
thumb | URL of the post's first extracted image (fbcdn/scontent), when present |
contact | {email, phone, website, address} scraped from the page's own contact card; each field null when not publicly listed, populated only when enableContactLookup is on |
commentsFetched | Count of comments written to the separate comments-<runId> dataset for this post (0 when maxCommentsPerPost is 0) |
scrapedAt | ISO-8601 UTC timestamp of when this row was scraped |
🤖 Add-on: Need additional Facebook data?
Pair this Actor with facebook-page-posts-scraper-with-engagement-analytics if you need posts from specific pages ranked by a real computed engagement score, virality, and best posting hour rather than raw keyword-discovery order. For deeper comment-level analysis on posts you already have URLs for, facebook-comments-scraper-reaction-breakdown decodes per-comment reaction breakdowns and engagement metrics. If your keyword research points to group communities instead of pages, facebook-groups-scraper-with-lead-contact-finder mines public Facebook groups for leads and contact details.
How does Facebook Posts Search Scraper: Top Engagement Posts differ from the official Facebook API?
Meta's Graph API lets an approved app read posts from Facebook pages it owns or manages (or has been granted the Page Public Content Access feature for) — it does not offer a keyword search across arbitrary public posts the way this Actor does; Facebook's public post-search endpoint was removed from the Graph API years ago.
| Feature | Facebook Graph API | Facebook Posts Search Scraper: Top Engagement Posts |
|---|---|---|
| Keyword search across arbitrary public posts | Not available | Yes, any keyword via topics |
| Access requirement | App review plus pages_read_engagement/pages_read_user_content, or Page Public Content Access | None — public post pages are fetched directly |
| Scope of accessible pages | Only pages you own/manage, or pages granting the feature | Any public page/post surfaced by the search |
| Reaction-type breakdown | Not exposed per type via standard endpoints | Optional, using your own session cookies |
| Output format | Raw Graph API JSON, requires your own pagination/parsing | Normalized JSON dataset, one row per post |
| Setup time | Developer app registration plus review process | Provide keywords and run |
Use the Graph API when you manage the pages yourself and need an officially supported, long-term integration. Use this Actor when you need to discover posts across pages you don't control, by keyword, without an app-review process.
How to use Facebook Posts Search Scraper: Top Engagement Posts
Facebook Posts Search Scraper: Top Engagement Posts runs directly on the Apify platform — there's no separate signup or API key needed beyond an Apify account.
- Open the Actor's page in Apify Console (or from the Apify Store).
- Add one or more search keywords in
topics(e.g.["football", "cricket"]) — this is the input that actually drives results, though the schema marks nothing as required. - Optionally set
postLimit,recencyWindow, or turn onincludeReactionBreakdown/includeSentimentfor richer rows. - Click Start and watch results populate the dataset in real time as each post is discovered and scraped.
- Export the dataset as JSON, CSV, Excel, or another supported format from Apify Console, or pull it via the API.
How to scale to bulk Facebook post search extraction
topics accepts an array, so a single run already searches multiple keywords concurrently — each topic runs as its own async task, and postLimit applies per topic (up to 5,000), not per run. To scale further, add more keywords to the same array or schedule repeated runs with different keyword batches via the Apify API or Scheduler. There's no separate bulk-URL-list input since discovery is keyword-driven, not URL-driven.
What can you do with Facebook post search data?
- A social listening analyst tracking a brand keyword uses
text,likes, andsentimentto flag spikes in negative sentiment before they escalate. - A market researcher comparing topics uses
searchQueryandpageNameto see which pages are actually publishing about a given keyword across public Facebook. - A lead-gen specialist running keyword searches for local businesses turns on
enableContactLookupand filters rows wherecontact.emailorcontact.phoneisn't null. - A content strategist studying reaction mix uses
reactions(like/love/haha/wow/sad/angry) to see whether posts on a topic skew toward "love" or "angry" reactions. - An AI engineer builds a RAG pipeline over the
textandsentimentfields, feeding keyword-matched post excerpts as grounding context to an LLM-based trend-summary agent.
Because the dataset returns typed JSON, these use cases also work directly inside agent frameworks via the Apify MCP server (see Integrations below).
How does Facebook Posts Search Scraper: Top Engagement Posts handle rate limits and blocking?
The Actor routes Google search discovery through Apify's GOOGLE_SERP proxy group and post-page fetches through Apify Proxy, using a separate residential proxy group for the optional reaction/comment GraphQL calls, so requests don't all come from one IP. HTML and SERP fetches retry up to 3 times with a short backoff, and the SERP loop pauses 1-2 seconds between pages and stops after 3 consecutive empty pages rather than hammering Google indefinitely. Each keyword topic runs as an independent concurrent task; if one topic's search fails outright, the run logs the failure and keeps the data already collected for the other topics instead of aborting. If a single post can't be fetched, it's skipped and logged, not retried indefinitely. The reaction-type breakdown and contact lookup are opt-in secondary fetches — if Facebook requires a login the Actor doesn't have, they return null instead of guessing or crashing. The Actor does not solve CAPTCHAs; if Facebook or Google blocks a request outright, that item is skipped and logged rather than the run failing entirely.
⬇️ Input
All 13 parameters are optional — the Actor falls back to a default keyword (football) if topics is left empty.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
topics | No | array | Keywords to search for on Facebook; each topic runs as a separate search | ["football", "cricket"] |
postLimit | No | integer | Posts to collect per topic (1–5000) | 50 |
recencyWindow | No | string | Keep only posts published within this window: "" (all time), 24h, 7d, 30d, 90d; out-of-range posts are excluded from the dataset, not just the log | "7d" |
includeReactionBreakdown | No | boolean | Fetch a per-post reaction-type breakdown (like/love/haha/wow/sad/angry) via Facebook's reactions GraphQL endpoint (default false) | true |
reactionSampleSize | No | integer | Reactions sampled per post to build the breakdown (10–500, default 50) | 50 |
fbSessionCUser | No | string (secret) | Facebook c_user session cookie, used only for the reaction-breakdown request | "10000xxxxxxxxx" |
fbSessionXs | No | string (secret) | Facebook xs session cookie, used only for the reaction-breakdown request | "1%3Aabc123xyz" |
includeSentiment | No | boolean | Tag each post's text with a lexicon-based sentiment label + score (default false) | true |
targetCountry | No | string | Bias the underlying search toward a country's results (SERP gl param); blank = no bias | "us" |
targetLanguage | No | string | Language for the search UI/results (SERP hl param); blank = English default | "en" |
enableContactLookup | No | boolean | Fetch each post's Facebook Page and extract public email/phone/website/address (default false) | false |
maxCommentsPerPost | No | integer | Top-level comments to fetch per post into a separate uncharged comments-<runId> dataset (0–500, default 0) | 0 |
proxySettings | No | object | Apify Proxy configuration | {"useApifyProxy": true} |
Example input
{"topics": ["football", "cricket", "tech news"],"postLimit": 50,"recencyWindow": "7d","includeReactionBreakdown": true,"reactionSampleSize": 50,"fbSessionCUser": "","fbSessionXs": "","includeSentiment": true,"targetCountry": "us","targetLanguage": "en","enableContactLookup": false,"maxCommentsPerPost": 0,"proxySettings": { "useApifyProxy": true }}
⬆️ Output
Every run writes typed, normalized JSON rows to an Apify dataset — the same field names and shape on every run, regardless of which posts were found. Export as JSON, CSV, Excel, HTML table, or XML directly from Apify Console, or read it via the API.
Example output
{"facebookUrl": "https://www.facebook.com/PremierLeague","pageId": "144368918939860","facebookId": "144368918939860","pageName": "Premier League","postId": "1122334455667788","postFacebookId": "1122334455667788","url": "https://www.facebook.com/PremierLeague/posts/1122334455667788","topLevelUrl": "https://www.facebook.com/PremierLeague/posts/1122334455667788","link": "https://www.facebook.com/PremierLeague/posts/1122334455667788","searchQuery": "football","text": "What a finish! That stoppage-time winner has the whole stadium on its feet.","likes": 18420,"comments": 963,"shares": 512,"reactions": {"like": 31,"love": 12,"haha": 2,"wow": 4,"sad": 0,"angry": 1,"sampledTotal": 50},"sentiment": "positive","sentimentScore": 0.62,"time": "2026-07-24 19:42:10","timestamp": 1785014530,"thumb": "https://scontent.xx.fbcdn.net/v/t39.30808-6/sample_thumb.jpg","contact": {"email": null,"phone": null,"website": null,"address": null},"commentsFetched": 0,"scrapedAt": "2026-07-25T08:15:32.104211+00:00"}
How does it work?
Facebook Posts Search Scraper: Top Engagement Posts turns a keyword into Facebook posts in three steps. First, it queries Google (through Apify's SERP proxy) for <keyword> site:facebook.com and collects the resulting Facebook URLs page by page. Second, it fetches each discovered post's own public HTML page through Apify Proxy and parses page and post details — name, ID, text, likes, comments, shares, and timestamp — directly out of Facebook's embedded page data, not from screen-scraped visual text. Third, if enabled, it separately queries Facebook's reaction and comment GraphQL endpoints to add a per-type reaction breakdown, top-level comments, or page contact details. Because every field is parsed from named JSON keys rather than CSS selectors, the same row shape comes back even when Facebook changes its visual layout — only genuinely publicly visible information is ever returned.
Integrations
Facebook Posts Search Scraper: Top Engagement Posts is a standard Apify Actor, so it works with anything that can call the Apify API — your own scripts, no-code automation tools, or AI agents.
Calling Facebook Posts Search Scraper: Top Engagement Posts programmatically
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("Scraper-Engine/facebook-posts-search-scraper-top-engagement-posts").call(run_input={"topics": ["football"], "postLimit": 50})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["pageName"], item["likes"], item["text"][:80])
Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.
MCP integration for AI agents
This Actor is reachable through Apify's own MCP server, which exposes any Apify Actor as a callable tool to MCP-compatible clients. Register it with npx @apify/actors-mcp-server --actors Scraper-Engine/facebook-posts-search-scraper-top-engagement-posts (with APIFY_TOKEN set in the environment). Compatible with Claude Desktop, Claude Code, and other MCP clients.
No-code tools (n8n, Make, LangChain)
In n8n, use the HTTP Request node (or the community Apify node) pointed at this Actor's run endpoint to trigger a search and read back the dataset. In Make, the Apify app's "Run Actor and get dataset items" module does the same without code. In LangChain, the ApifyWrapper/Apify Actor tool lets an agent call this Actor and load the resulting dataset directly as Documents.
Is it legal to scrape Facebook post search results?
Scraping publicly visible Facebook posts is generally lawful in most jurisdictions — courts have repeatedly held that data a platform makes visible to any logged-out visitor is treated differently from private or authenticated data. Facebook Posts Search Scraper: Top Engagement Posts only returns what a logged-out visitor can already see: public post text, page names, and public engagement counts. Because posts are authored by identifiable people and pages, post text, page names, and any contact details collected via enableContactLookup count as personal data under GDPR and CCPA — you need a lawful basis to store and process them, particularly at scale or for profiling. Facebook's own Terms of Service also restrict automated collection, which is a contractual matter separate from data-protection law. Consult legal counsel if your use case involves bulk storage or processing of personal data.
Frequently asked questions
What Facebook post fields does Facebook Posts Search Scraper: Top Engagement Posts return?
The core fields are text, likes, comments, shares, and pageName, plus optional reactions and sentiment/sentimentScore when those features are enabled. See the full fields table above for every key the Actor writes.
Does Facebook Posts Search Scraper: Top Engagement Posts require a Facebook account or login?
No. Keyword search, post discovery, and the core fields (text, likes, comments, shares, page info) are scraped without any Facebook account. Only the optional reaction-type breakdown uses fbSessionCUser/fbSessionXs cookies from your own account — without them it returns null instead of a guessed value.
How many Facebook posts can I extract in one run?
postLimit accepts 1 to 5,000 posts per topic, and you can search multiple topics in one run — so total output scales with how many topics you list, each capped independently at up to 5,000.
What happens if a keyword search returns zero results?
If Google's SERP returns no facebook.com URLs for a topic (or the request is blocked), the Actor logs a warning for that topic and moves on — no rows are pushed for that keyword, but other topics in the same run are unaffected and the run still completes.
Can I search multiple Facebook keywords at once?
Yes. topics is an array — list multiple keywords and each one runs as its own concurrent search within the same run, with postLimit applied per topic.
How is "top engagement" actually determined?
It isn't a computed ranking — rows are returned in the order Google's search results surface matching posts, not sorted by likes, comments, shares, or reactions. Every engagement field (likes, comments, shares, reactions) is included on every row precisely so you can sort or filter for the highest-engagement posts yourself downstream; the Actor does not pre-rank them.
Does Facebook Posts Search Scraper: Top Engagement Posts work with Claude, ChatGPT, and other AI agent tools?
Yes. It's reachable through Apify's MCP server (see Integrations above) for MCP-compatible clients like Claude Desktop and Claude Code, and it's callable as a plain HTTP/API endpoint by any other agent framework.
Does Facebook Posts Search Scraper: Top Engagement Posts return data in a format LLMs can use directly?
Yes. Output is typed, normalized JSON with consistent field names across runs — no HTML parsing or CSS selectors needed. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when Facebook changes its layout or anti-bot system?
The Actor is maintained and the output schema is designed to stay stable across Facebook layout changes, since fields are parsed from named JSON keys rather than visual position. No specific update turnaround time is promised.
Can I use Facebook Posts Search Scraper: Top Engagement Posts without managing proxies or browser infrastructure?
Yes. Apify Proxy (including a residential pool for the reaction/comment GraphQL calls) is built in and used automatically — you don't need to supply or rotate your own proxies to run it.
Which Facebook post fields work best for AI training data and RAG indexing?
For RAG, index text alongside pageName and sentiment for retrievable, labeled context. For training data, likes, comments, shares, and reactions are the most consistently structured numeric fields across records, since they're typed integers/objects rather than free text.
Related scrapers
| Scraper | What it extracts |
|---|---|
| Facebook Page Posts Scraper With Engagement Analytics | Posts from specific pages with a real computed engagement score, virality, rank, and best posting hour |
| Facebook Comments Scraper: Reaction Breakdown | Per-comment reaction breakdown and engagement metrics for posts you already have URLs for |
| Facebook Groups Scraper With Lead & Contact Finder | Posts from public Facebook groups with extracted leads (emails, phones, socials) |
| Facebook Posts Scraper | General-purpose public Facebook post scraper |
| Facebook User Search Scraper: Photos & AI Bio Analysis | Facebook user search results with photos and AI-generated bio analysis |
| Facebook Ads Library Scraper & Creative Media | Public ad creatives and media from Facebook's Ads Library |
Your feedback
Found a bug or a missing field? Let the Scraper-Engine team know through this Actor's Issues tab on Apify Console, or via the support link on its Apify Store listing — reports are what keep the field list and extraction logic in sync with Facebook's current markup.
