Facebook Search Scraper
Pricing
from $2.00 / 1,000 results
Facebook Search Scraper
Search Facebook for pages and people by keyword. Extract structured data including page/profile details, engagement metrics, and contact information.
Pricing
from $2.00 / 1,000 results
Rating
0.0
(0)
Developer
Crawler Bros
Maintained by CommunityActor stats
1
Bookmarked
109
Total users
10
Monthly active users
9 days ago
Last modified
Categories
Share
Find and extract data from Facebook Pages without the Facebook Graph API, an API key, or logging in. Search by keyword to discover matching Pages, or scrape a list of Facebook page URLs directly — either way, get structured business data: name, category, contact info, address, ratings, follower/like counts, reviews, recent posts, and more.
What does Facebook Search Scraper do?
Facebook Search Scraper discovers Facebook Pages by keyword (via DuckDuckGo, no Facebook login required) and extracts structured page data from each result. It also accepts a direct list of Facebook page URLs, skipping discovery entirely — useful when you already know which pages you want. Supports two search types: Pages and People.
This is a Facebook Pages scraper, not a Facebook Groups, personal-timeline, or Ads Library scraper — it extracts public business/organization/public-figure Page data only.
Why use Facebook Search Scraper?
- Lead generation — find businesses and pages matching your target keywords, with phone number, email, address, and website already extracted
- Market research and competitor analysis — discover every competing business/brand Page in your niche on Facebook
- People search — find public profiles matching specific criteria
- Location-based discovery — search for businesses in specific areas by including the location in your query (e.g., "coffee shop New York")
- Bulk data extraction — already have a list of Facebook page URLs? Skip discovery and scrape them directly, reliably at scale (1,000+ pages proven in a single run)
- No Facebook Developer account, API key, or app review required — works out of the box; optional session cookies only unlock a few login-gated pages
Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| startUrls | Array of {url} | No | [] | Direct list of Facebook page URLs to scrape. Either this or searchQueries is required |
| searchQueries | Array of strings | No | [] | Search keywords (e.g., "coffee shop", "dentist near me"). Either this or startUrls is required |
| searchType | String | No | "pages" | Type of results: "pages" or "people" |
| maxResults | Integer | No | 50 | Maximum results per query (and separately for startUrls), 1-5000. For keyword search, real yield per query is ultimately bounded by how many matching pages DuckDuckGo itself has indexed — for thousands of results, supply thousands of startUrls directly, or many diverse searchQueries |
| includeReviews | Boolean | No | true | Fetch real reviews per page (reviewer name, recommend verdict, text, date) — adds one extra request per page |
| addDetail | Boolean | No | false | Fetch each page's public Page Transparency info: creation date, whether it's currently running ads, and its Page Transparency ID. Adds one extra browser page load per result (slower) |
| includePosts | Boolean | No | false | Fetch recent posts from each page's own timeline: text, timestamp, permalink, attached photo/video URLs, and reaction/comment/share counts. Adds one extra browser page load per result (slower). Anonymous access to a page typically only renders its single most recent post — Facebook gates the rest of the feed behind login, the same way it gates other page detail |
| maxPosts | Integer | No | 5 | Maximum posts to extract per page when includePosts is on, 1-20. In practice, anonymous access rarely yields more than 1 real post regardless of this setting (see above) |
| cookies | String | No | "" | Optional Facebook session cookies (JSON array or raw name=value;... header). Unlocks retrying login-walled pages with cookies applied |
Input example — keyword search
{"searchQueries": ["coffee shop", "restaurant"],"searchType": "pages","maxResults": 20}
Input example — direct URLs
{"startUrls": [{ "url": "https://www.facebook.com/McDonalds" },{ "url": "https://www.facebook.com/Starbucks" }]}
startUrls and searchQueries can be combined in the same run — results from both are merged into the same output dataset.
Output
Each result is a structured page record:
| Field | Type | Description |
|---|---|---|
| facebookUrl / pageUrl | String | Normalized Facebook page URL |
| pageName | String | Name of the page |
| pageId / facebookId | String | Facebook page identifier |
| title | String | Full page title |
| category / categories | String / Array | Page category |
| intro | String | Page introduction/description |
| likes | Number | Like count |
| followers / followings | Number | Follower / following count |
| checkins | Number | Check-in count ("were here") |
| talkingAboutCount | Number | Talking-about count |
| phone / email / messenger | String | Contact info, when public |
| address / addressUrl | String | Address and a Google Maps link |
| website / websites | String / Array | Linked website(s) |
| priceRange | String | Price range (e.g. "££") |
| business_hours | String | Business hours info |
| ratingOverall / ratingCount / ratingText | Number / Number / String | Rating info |
| recommendPercentage | Number | Raw recommend % (0-100), the authentic Facebook Pages rating metric |
| ownerOrganization | String | Confirmed owning organization ("X is responsible for this Page"), when disclosed |
| profilePictureUrl / coverPhotoUrl | String | Media URLs |
| pageAdLibrary | Object | Ad library metadata/link |
| reviews | Array | Real reviews ({reviewerName, recommends, reviewText, reviewDate}), when includeReviews is on and available |
| pageCreatedDate | String | When the page was created, when addDetail is on and Facebook discloses it |
| isRunningAds | Boolean | Whether the page is currently running ads, when addDetail is on |
| pageTransparencyId | String | Facebook's Page Transparency ID, when addDetail is on |
| posts | Array | Recent posts ({post_text, post_timestamp, post_url, media_urls, reaction_count, comment_count, share_count}), when includePosts is on and available |
| searchQuery | String | The search query that found this page (absent for startUrls entries) |
| scrapedAt | String | When the data was collected |
Only fields with real data are included per row — fields Facebook doesn't expose for a given page are omitted, not null.
How many results can I get?
maxResults is an upper bound, not a guarantee. For a single searchQueries term, the real yield is capped by how many facebook.com pages DuckDuckGo has indexed for that exact query — live-tested at consistently ~8-15 results per query, even for globally recognized brand names (e.g. "starbucks") with maxResults set to 5000. Setting it higher doesn't produce more matches than DuckDuckGo actually has.
For hundreds or thousands of results in one run:
- Add many diverse
searchQueries— each contributes its own ~10-15 results - Or supply that many URLs directly via
startUrls— no discovery-engine ceiling; proven reliable at scale (322 real Facebook pages extracted from a 393-URL batch in a single 8-minute run)
Data source
All data comes from publicly viewable Facebook Page HTML — the same information anyone can see without logging in. Page discovery uses DuckDuckGo's public search index (no Facebook API, no API key, no app review). No paid or residential proxy is required for typical use; the actor runs on Apify's free-tier-eligible proxy setup.
Is it legal to search Facebook?
This scraper only accesses publicly available page data that anyone can view without logging in. Always review Facebook's Terms of Service for your use case.
Frequently Asked Questions
Do I need a Facebook account, API key, or Facebook Developer app?
No. The scraper works without any login credentials, API key, or app review and only accesses public data by default. Supplying cookies is optional and only helps unlock pages that would otherwise show a login-wall stub.
Can I scrape Facebook business pages without the Graph API?
Yes — this is exactly what this actor does. It reads a Page's public HTML instead of calling Facebook's Graph API, so there's no API key, no app review process, and no Graph API rate limits to work around.
Can I extract phone numbers, emails, and addresses from Facebook business pages?
Yes, whenever the Page owner has made that information public — phone, email, address, and website are all included in the output when Facebook exposes them for a given page.
Can I search for specific locations?
Include the location in your search query (e.g., "coffee shop New York" or "dentist Berlin").
Does this scrape Facebook Groups or personal profiles?
No. This actor scrapes public Facebook Pages (businesses, brands, organizations, public figures) via searchType: "pages", and public profiles via searchType: "people". It does not scrape Facebook Groups, private personal timelines, or Marketplace listings.
Why are some fields missing from a result?
A missing field means Facebook did not expose that information in the page's public HTML, or the page owner didn't fill it in. This is normal — we never fabricate placeholder values.
Does the output include a "verified" badge or page creation date?
Page creation date is available via the optional addDetail input, along with whether the page is currently running ads and its Page Transparency ID. It's off by default because Facebook serves this from a separate page (/about_profile_transparency), requiring one extra page load per result. There's no public "verified" badge signal anywhere on a Facebook Page for anonymous viewers (checked directly), so that specific field isn't available regardless of this setting.
How long does it take?
Typically well under a minute per query/URL for the default result counts, scaling with maxResults. Live-tested at scale: 322 real pages extracted from a 393-URL batch in 8 minutes.
Can I export the data?
Yes. Export in JSON, CSV, Excel, XML, HTML and other formats from the Apify platform.