Facebook Search Scraper avatar

Facebook Search Scraper

Pricing

from $5.99 / 1,000 results

Go to Apify Store
Facebook Search Scraper

Facebook Search Scraper

Extract public Facebook search results quickly with Facebook Search Scraper. Collect pages, profiles, groups, posts, events, and related metadata using keywords for lead generation, competitor research, market analysis, and social media intelligence.

Pricing

from $5.99 / 1,000 results

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

10

Total users

5

Monthly active users

6 days ago

Last modified

Share

Facebook Search Scraper — Business Pages, Hours & Price Band

Facebook Search Scraper finds Facebook business pages by category and locationPub + NYC, Restaurant + Chicago — and scrapes each one it discovers into a structured business record: name, category, address, phone, email, website, rating, opening hours, services and price band. Every response is typed JSON, ready to pass directly to an LLM, index into a vector store, or feed a lead-generation pipeline. No Facebook account, login or cookie is required — every field is read from the public, logged-out page.

What is Facebook Search Scraper?

Facebook Search Scraper is an Apify Actor that turns a category and a location into a list of Facebook business pages, then opens each page and reads its public business profile. It returns contact details, ratings, opening hours, services, price band and audience data as one JSON row per page.

No Facebook account, login or cookie is required or accepted — the Actor's source notes every surface it reads was verified logged-out. Discovery runs through a Google search (<category> <location> site:facebook.com), so you never need to know a page's URL in advance; the query controls are the business type and the place, not a page handle.

  • 🔎 Discovers pages you don't already have URLs for — from a category and a city, not a known page link
  • 📇 Returns the full business profile — address, phone, email, website, category, intro text
  • Extracts opening hours, services and price band — data the closest competing listing does not document
  • Returns rating, review count and approximate followers for quick screening
  • 🏷️ Runs a cartesian product of categories and locations in a single job — ["Pub","Bar"] × ["NYC","London"] becomes four searches
  • 🌐 No login required — every field comes from the logged-out public page

What data can you get with Facebook Search Scraper?

Facebook Search Scraper returns five groups of data per page: identity and discovery, contact details, ratings and commerce, audience and imagery, and social/ad diagnostics.

Result TypeExtracted FieldsPrimary Use Case
Identity & discoveryfacebookUrl, pageUrl, pageId, facebookId, pageName, title, category, categories, intro, about_me, info, likesConfirming you found the right page and reading how it describes itself
Contact detailsaddress, addressUrl, phone, email, websites, websiteBuilding a contactable local-business lead list
Ratings & commercerating, ratings, ratingOverall, ratingCount, business_hours, priceRange, business_price, services, business_servicesScreening businesses by quality, hours and price tier
Audience & imageryfollowers, followings, profilePictureUrl, coverPhotoUrl, profilePhotoSizing an audience and pulling brand assets
Social & ad diagnosticsalternativeSocialMedia, instagram, messenger, ad_status, pageAdLibrary, creation_dateCross-platform lookups and ad-activity signal

Opening hours, services and price band

Checked on the Apify Store 2026-07-25: the leading competing Facebook search listing documents page name, categories, website, email, address, phone, followers, likes, social links, rating, Facebook ID, messenger link, creation date and ad status — but neither its feature table nor its output example includes opening hours, services, or a price band. Facebook Search Scraper reads all three off the page's intro card:

{
"business_hours": "Opens at 11:00 AM",
"services": "Delivery, Outdoor seating, Takeout",
"business_services": "Delivery, Outdoor seating, Takeout",
"priceRange": "$$",
"business_price": "Price Range · $$"
}

business_hours and services/business_services are the intro-card text as Facebook renders it — not parsed into a structured weekly schedule or a service enum. priceRange/business_price carry the price band exactly as served: read the number of symbols (one to four) as the band, since the symbol itself is locale-dependent (see Output, below). These three fields are what separate a directory listing from a business-intelligence row — hours and price band are what a reader actually needs to qualify a lead or compare two businesses in the same category.

Every page carries rating as Facebook's own display string ("90% recommend (2,699 Reviews)"), split into ratingOverall and ratingCount as separate numbers so you can sort or threshold on them without parsing text. phone, email, address and websites are read from the same intro card, entity-scoped rather than pulled from a whole-document regex. instagram returns a structured [{username, url}] list when the page links an Instagram account; alternativeSocialMedia carries the first other linked account found.

Why not build this yourself?

Meta does not publish a general keyword-and-location search API for Facebook Pages open to third-party developers — as the leading competing listing's own FAQ states, checked on the Apify Store 2026-07-25. A DIY scraper is the practical alternative, and three things make it harder than it looks.

Discovery isn't direct. There is no Facebook search endpoint to call, so pages have to be found through Google (site:facebook.com), which means handling Google's own pagination (10 organic results per request, not the 50-result stride a naive implementation assumes) and filtering out the URLs that aren't business pages — post permalinks, photos, videos, events, groups, reels and personal profiles all show up in the same result set and have to be excluded before you scrape and pay for them.

The data isn't in the visible HTML. Facebook renders a business page from nested Relay/GraphQL JSON blobs embedded in <script type="application/json"> tags — delegate_page for identity fields, a ProfileCometTileContextListViewItem card list for contact and commerce fields. Reaching a value means locating the right script block, then walking an unstable path through a require/__bbox wrapper structure that shifts between page builds.

Blocking doesn't look like blocking. Facebook's login wall answers with HTTP 200, not an error status, so a status-code check alone never catches it — you have to check whether the resolved URL landed on /login or /checkpoint, or whether the expected data markers are simply absent from the response. The wall is also tied to the exit IP rather than the page: the same URL can read cleanly and then wall six minutes later from the same proxy, which is why a single retry isn't enough and an escalation ladder is needed instead.

What's the difference between a Facebook search scraper and a Facebook page scraper?

A Facebook search scraper takes a category and a location and returns a result set — pages you did not already have URLs for. A Facebook page scraper takes a known Facebook page URL or handle and returns one record for that specific page.

The distinction matters because the input you have determines which tool actually works. If you have a list of business names or a market you want to survey ("pubs in NYC"), you have no URLs yet — a page scraper has nothing to open. If you already hold a list of Facebook page URLs and want the same 38-key business record refreshed or expanded per page, a page scraper is the more direct and typically cheaper route, since it skips the Google-discovery phase entirely.

Facebook Search Scraper is the first kind: it builds queries from categories × locations, discovers business page URLs through Google, and hands each one to the same page-reading logic a URL-based scraper would use — so the row shape is comparable either way, only the entry point differs.

How to scrape Facebook business pages with Facebook Search Scraper?

  1. Open Facebook Search Scraper on the Apify Store and click Try for free
  2. Enter what you're searching for — categories (business types, e.g. ["Restaurant", "Coffee Shop"]) and locations (places, e.g. ["Chicago"])
  3. Set resultsLimit to the total number of business pages you want across all category-location combinations (1–500, default 10)
  4. Leave proxyConfiguration off for a normal run, or turn on Apify Proxy if you expect a lot of walled exits on a large run
  5. Click Start, then download the dataset as JSON, CSV, Excel, XML or HTML — or read it through the Apify API
{
"categories": ["Restaurant", "Coffee Shop"],
"locations": ["Chicago"],
"resultsLimit": 50
}

How to run multiple categories and locations in one job

categories and locations are both arrays, and the Actor searches every combination: ["Pub", "Bar"] × ["NYC", "London"] becomes four queries — "Pub NYC", "Bar NYC", "Pub London", "Bar London". resultsLimit is a total across every combination, not a per-query figure — the Actor divides it across however many queries your categories and locations produce, so five categories times five locations sharing a resultsLimit of 10 leaves almost nothing per query. Raise resultsLimit as you widen the grid.

⚠️ How Facebook Search Scraper handles blocking and rate limits

Facebook's login wall is exit-IP driven, not page-specific — the same URL can serve a full page from one exit and redirect to /login from another exit minutes later. Because of that, the Actor treats an unreadable page as a retry-with-a-different-exit problem rather than a dead end.

The ladder. A page is first requested with no proxy at all. If the response is walled or unusable, the Actor escalates one rung at a time: Apify datacenter proxy, then Apify residential proxy, retrying up to 4 attempts total before giving up and pushing an uncharged error row. If you supply your own proxyConfiguration, that proxy is used as the starting point instead of the no-proxy default.

Block detection. A response counts as blocked when the HTTP status is 403, 429, 500, 502 or 503; when the resolved landing URL contains /login, /checkpoint or /authentication; or when the page body is short and missing the SSR data markers the parser needs. Detection intentionally does not key on substrings like "checkpoint" or "blocked" appearing anywhere in the page — those words show up in the JavaScript bundle of essentially every legitimate Facebook business page, which is why a naive keyword check would misclassify normal pages as blocked. Detection requires the resolved URL or the actual absence of the expected data container.

Concurrency. Pages are fetched with up to 5 concurrent workers, a fixed internal limit rather than a configurable input, over a connection pool capped at 10 total connections and 3 per host, with a short pause staggered before each request.

Discovery proxy. The Google SERP discovery phase runs through the Apify GOOGLE_SERP proxy group over plain HTTP — that group rejects HTTPS CONNECT requests, so search calls go out over HTTP by design.

⬇️ Input

Every field is optional and has a working default, so a run with no input at all still starts (searching Pub in NYC, up to 10 pages).

ParameterRequiredTypeDescriptionExample Value
categoriesNoarrayBusiness types to search (Pub, Bar, Restaurant...). Combined with locations, e.g. "Pub NYC", "Bar London". Default ["Pub"].["Restaurant", "Coffee Shop"]
locationsNoarrayWhere to search (NYC, London...) — paired with each category. Default ["NYC"].["Chicago", "Austin"]
resultsLimitNointegerMax pages to scrape across all queries. Higher = more data, longer run. Minimum 1, maximum 500, default 10.50
proxyConfigurationNoobjectOptional. No proxy by default. Auto fallback to datacenter → residential if a page is walled. Default {"useApifyProxy": false}.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}

Example input

{
"categories": ["Pub", "Bar"],
"locations": ["NYC", "London"],
"resultsLimit": 40,
"proxyConfiguration": { "useApifyProxy": false }
}

Common pitfall: resultsLimit is split across every category-location combination, not applied per combination — widen it before you widen the grid, or you'll get one or two pages per query instead of the count you expected. Separately, if your run reduces to a single query (one category, one location) and resultsLimit is above 100 and that location is NYC or NY, the Actor silently adds one extra query spelling it out as "New York" to catch pages indexed under the full name — a one-off expansion, not a general locale-alias feature.

⬆️ Output

Every business page is one dataset row with the same 38 keys, whether or not Facebook published a value for each one — a field with nothing to report is null (or []/{} for structured fields), never a missing key. Rows are pushed live as pages are scraped, so results appear in the dataset while the run is still going. Export as JSON, CSV, Excel, XML, HTML table, or read the dataset through the Apify API.

Pages that can't be read produce a separate, smaller shape — {facebookUrl, error, errorReason} — and are not billed: the Actor pushes them without a charged_event_name, while every real business row is pushed with charged_event_name: "row_result". Filter uncharged rows out of a dataset export with 'error' not in row, or keep only them with the presence of the errorReason key. errorReason is one of login_wall, blocked, facebook_unavailable, http_<code>, unsupported_page, empty_result or fetch_error.

Scraped results

[
{
"facebookUrl": "https://www.facebook.com/riverstonecoffeechi",
"pageUrl": "https://www.facebook.com/riverstonecoffeechi",
"title": "Riverstone Coffee Co.",
"pageName": "riverstonecoffeechi",
"pageId": "100064823019214",
"facebookId": "100064823019214",
"categories": ["Coffee Shop"],
"category": "Coffee Shop",
"info": ["Riverstone Coffee Co., Chicago, Illinois. 6,204 likes", "312 were here. Small-batch roaster and neighborhood coffee bar..."],
"likes": 6204,
"intro": "Small-batch roaster and neighborhood coffee bar on the near west side.",
"about_me": { "text": "Small-batch roaster and neighborhood coffee bar on the near west side." },
"address": "1140 W Fulton Market, Chicago, IL, United States, Illinois",
"addressUrl": "https://www.bing.com/maps/default.aspx?v=2&pc=FACEBK&mid=8100&where1=1140+W+Fulton+Market%2C+Chicago%2C+IL...",
"phone": "(312) 555-0148",
"email": "hello@riverstonecoffee.com",
"websites": ["https://riverstonecoffee.com"],
"website": "riverstonecoffee.com",
"alternativeSocialMedia": "https://www.instagram.com/riverstonecoffeechi",
"instagram": [{ "username": "riverstonecoffeechi", "url": "https://www.instagram.com/riverstonecoffeechi" }],
"rating": "96% recommend (188 Reviews)",
"ratings": "96% recommend (188 Reviews)",
"ratingOverall": 96,
"ratingCount": 188,
"business_hours": "Opens at 6:30 AM",
"services": "Delivery, Outdoor seating, Takeout",
"business_services": "Delivery, Outdoor seating, Takeout",
"priceRange": "$$",
"business_price": "Price Range · $$",
"followers": 6100,
"followings": 214,
"profilePictureUrl": "https://scontent-ord5-1.xx.fbcdn.net/v/t39.30808-1/riverstone_profile.jpg",
"coverPhotoUrl": "https://scontent-ord5-1.xx.fbcdn.net/v/t39.30808-6/riverstone_cover.jpg",
"profilePhoto": "https://www.facebook.com/photo/?fbid=1129384756201847",
"pageAdLibrary": { "is_business_page_active": false, "id": "739201548822901" },
"messenger": null,
"creation_date": null,
"ad_status": null
},
{
"facebookUrl": "https://www.facebook.com/thecopperkettlechi",
"pageUrl": "https://www.facebook.com/thecopperkettlechi",
"title": "The Copper Kettle",
"pageName": "thecopperkettlechi",
"pageId": "100064119482073",
"facebookId": "100064119482073",
"categories": ["Restaurant"],
"category": "Restaurant",
"info": ["The Copper Kettle, Chicago, Illinois. 2,847 likes"],
"likes": 2847,
"intro": null,
"about_me": { "text": null },
"address": "3312 N Halsted St, Chicago, IL, United States, Illinois",
"addressUrl": "https://www.bing.com/maps/default.aspx?v=2&pc=FACEBK&mid=8100&where1=3312+N+Halsted+St%2C+Chicago%2C+IL...",
"phone": "(773) 555-0192",
"email": null,
"websites": [],
"website": null,
"alternativeSocialMedia": null,
"instagram": [],
"rating": "Not yet rated (2 Reviews)",
"ratings": "Not yet rated (2 Reviews)",
"ratingOverall": null,
"ratingCount": 2,
"business_hours": null,
"services": null,
"business_services": null,
"priceRange": "$",
"business_price": "Price Range · $",
"followers": 2900,
"followings": 58,
"profilePictureUrl": "https://scontent-ord5-1.xx.fbcdn.net/v/t39.30808-1/copperkettle_profile.jpg",
"coverPhotoUrl": null,
"profilePhoto": "https://www.facebook.com/photo/?fbid=1120938475620194",
"pageAdLibrary": { "is_business_page_active": false, "id": "681904772013845" },
"messenger": null,
"creation_date": null,
"ad_status": null
},
{
"facebookUrl": "https://www.facebook.com/lakesideathleticscw",
"pageUrl": "https://www.facebook.com/lakesideathleticscw",
"title": "Lakeside Athletics",
"pageName": "lakesideathleticscw",
"pageId": "100064287719045",
"facebookId": "100064287719045",
"categories": ["Sporting Goods Store"],
"category": "Sporting Goods Store",
"info": ["Lakeside Athletics, Chicago, Illinois. 1,102 likes", "44 were here."],
"likes": 1102,
"intro": "Running shoes, team gear and fitting services since 2011.",
"about_me": { "text": "Running shoes, team gear and fitting services since 2011." },
"address": null,
"addressUrl": null,
"phone": "(312) 555-0117",
"email": "info@lakesideathletics.com",
"websites": ["https://lakesideathletics.com"],
"website": "lakesideathletics.com",
"alternativeSocialMedia": null,
"instagram": [],
"rating": null,
"ratings": null,
"ratingOverall": null,
"ratingCount": null,
"business_hours": "Closed now",
"services": "In-store shoe fitting",
"business_services": "In-store shoe fitting",
"priceRange": null,
"business_price": null,
"followers": 1050,
"followings": 12,
"profilePictureUrl": "https://scontent-ord5-1.xx.fbcdn.net/v/t39.30808-1/lakeside_profile.jpg",
"coverPhotoUrl": "https://scontent-ord5-1.xx.fbcdn.net/v/t39.30808-6/lakeside_cover.jpg",
"profilePhoto": "https://www.facebook.com/photo/?fbid=1103827465192038",
"pageAdLibrary": { "is_business_page_active": true, "id": "552019483720194" },
"messenger": null,
"creation_date": null,
"ad_status": null
}
]

An unusable page produces this shape instead, and is not charged:

{ "facebookUrl": "https://www.facebook.com/example", "error": "login_wall (HTTP 200)", "errorReason": "login_wall" }

Read before you trust a field:

  • ⚠️ followers is approximate. Facebook publishes no exact follower count on this surface — only the rounded UI string is available (82M, 2.3K). followers: 82000000 means "82M as displayed," not an exact count. Values under 1,000 are shown unrounded and are exact.
  • priceRange/business_price carry a locale-rendered symbol, not a currency. The same business can return £ from one exit and $ from another — Facebook chooses the glyph based on the responding IP, not the business's actual currency. Read the symbol count (1–4) as the price band and ignore which symbol it is; the value is emitted exactly as served, never converted.
  • addressUrl is constructed, not scraped. It is a Bing Maps search link built from the address text — Facebook never serves this URL, and it is not a verified coordinate. Latitude/longitude are out of scope for this Actor.
  • messenger, creation_date and ad_status are honest nulls on this surface, not scraping failures. Facebook's delegate_page object carries no page-creation timestamp or ad-status flag through the logged-out path this Actor reads (the code path that would populate ad_status with "This Page is currently running ads." exists for when a page does publish that flag, but has not been observed on this surface). The keys stay present so the output shape never changes.
  • rating/ratingCount handle comma-formatted review counts — pages with 1,000+ reviews (e.g. "37,835 reviews") are parsed correctly, not silently nulled by a digits-only pattern that would otherwise drop the field on exactly the popular businesses you most want rated.
  • instagram/alternativeSocialMedia are conditional, not guaranteed. An Instagram-linked account only appears on the intro card for some pages; when the page never linked one, instagram returns [] and alternativeSocialMedia is null — that is the true state of the page, not a missed extraction.
  • followings is a genuinely populated field on most pages, decoded from the profile header's "X following" text rather than left as a placeholder — it is one of the more reliably present secondary fields alongside likes and followers.

How can I use the data extracted with Facebook Search Scraper?

  • 📞 Local lead generation teams filter the output on phone, email or websites to build a contactable prospect list for a category and city, skipping pages that never published contact info.
  • 🏪 Local SEO and directory builders sweep a category across many cities and use address, business_hours and priceRange to populate a structured local-business directory without manual data entry.
  • 🤖 AI engineers and LLM developers issue a category + location query, receive typed JSON rows, and pass them directly into an agent's context or a RAG index — no HTML parsing between the Actor and the model.
  • 📊 Market researchers compare rating, ratingCount, priceRange and followers across every business in a category and city to map competitive density and price positioning.
  • 🧾 CRM and data-enrichment teams match title, address and phone from scraped rows against existing records to fill gaps in a business database.

How do you monitor Facebook business listings over time?

Monitoring here means re-running the same category-and-location set on a schedule and diffing the results against the previous run, keyed on facebookUrl (stable across runs for the same page).

The fields worth diffing are the ones that change and matter: business_hours and priceRange/business_price for operational changes, rating/ratingOverall/ratingCount for reputation drift, followers for audience growth, and ad_status for a page starting or stopping ad activity. A rating that drops or a price band that shifts between two runs of the same query is a signal worth surfacing; a page that no longer appears in the results at all may have closed, been merged, or simply fallen out of Google's index for that query.

A practical loop: save your category/location set as a fixed input, schedule a weekly run, export each run's dataset keyed by facebookUrl, and diff the fields above against the prior week's export — alerting only on the deltas that matter to you (a rating drop past a threshold, hours changing on a page you track for a specific reason). Facebook Search Scraper has no scheduling of its own; use Apify Schedules to run it on a cron interval, and either poll the dataset through the Apify API or attach a webhook to fire when a run finishes so the diff step can run automatically.

Integrate Facebook Search Scraper and automate your workflow

Facebook Search Scraper works with any language or tool that can send an HTTP request, because it runs as a standard Apify Actor behind the Apify API.

REST API with Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<YOUR_USERNAME>/facebook-search-scraper").call(run_input={
"categories": ["Restaurant", "Coffee Shop"],
"locations": ["Chicago"],
"resultsLimit": 50,
})
for page in client.dataset(run["defaultDatasetId"]).iterate_items():
if "error" not in page:
print(page["title"], page["phone"], page["email"], page["rating"])

Works the same way in Node.js, Go, Ruby, or plain curl against the Apify API — call the Actor, poll or await the run, then read the dataset.

Scheduled monitoring and delivery

Set up a recurring run with Apify Schedules to sweep the same categories and locations on a cron interval — daily, weekly, or any custom cadence. Combine it with an Apify webhook to trigger a notification, a Zapier/Make/n8n workflow, or your own endpoint automatically whenever a run finishes, instead of polling for new data.

Scraping publicly accessible web data is broadly permitted in US law — hiQ Labs v. LinkedIn (9th Cir. 2019, on remand 2022) held that scraping data not protected by a login does not violate the Computer Fraud and Abuse Act. Facebook Search Scraper reads only what any logged-out visitor already sees on a public business page; it does not bypass a login, does not use a Facebook account, and does not access private or friends-only content.

Facebook business pages carry commercial contact data — address, phone, email of a business, not a private individual's profile — so this output is closer to a business or directory record than personal data, though the same legal caution applies as with any bulk-collected dataset: review Facebook's Terms of Service, and be aware that some published contact details may belong to a sole proprietor rather than a corporate entity. Scraping for internal monitoring or lead generation carries a different risk profile than scraping to train or resell a dataset. Consult your legal team for commercial use cases involving bulk data storage.

❓ Frequently asked questions

No. Facebook Search Scraper does not accept a cookie or login credential in its input schema, and every field it returns comes from the page Facebook serves to a logged-out, anonymous visitor.

How does Facebook Search Scraper find business pages?

It searches Google for <category> <location> site:facebook.com and keeps only URLs that resolve to a real business page — post permalinks, photos, videos, events, groups, reels and personal-profile URLs are filtered out before anything is scraped or charged.

How many results does it return per query?

Up to resultsLimit (maximum 500, default 10), split across every category-location combination in your run. The practical ceiling per individual query is what Google's own index returns for site:facebook.com plus your category and location terms — a very narrow category in a small town simply has fewer indexed pages to find.

Does Facebook Search Scraper extract opening hours, services and price band?

Yes — business_hours, services/business_services and priceRange/business_price are read from the page's intro card on every successful row. They are null when the business itself never published that detail on its Facebook page; the Actor reports the absence rather than guessing.

What happens if a page is login-walled or blocked?

It is pushed as a small {facebookUrl, error, errorReason} row and not charged — the Actor pushes it without a charged_event_name, unlike a real business row which is charged under row_result.

How does Facebook Search Scraper handle Facebook's anti-bot measures?

Because Facebook's login wall answers with HTTP 200 rather than an error status, blocking is detected from the resolved URL landing on /login or /checkpoint, or from the absence of the data markers the parser needs — not from keyword matching inside the page, which would flag legitimate pages as blocked. Since the wall is tied to the exit IP rather than the page, an unreadable page automatically retries through the Apify datacenter proxy, then residential, before it is given up on as an uncharged error row.

Can I run multiple categories and locations in one job?

Yes. categories and locations are both arrays, and the Actor runs every combination as a separate search query in the same run.

How do I monitor a set of business listings over time?

Save your category/location set, schedule the Actor with Apify Schedules, and diff business_hours, priceRange, rating, ratingCount and followers against the previous run's export, keyed on facebookUrl.

Does Facebook Search Scraper work with Claude, ChatGPT and other AI agent frameworks?

Yes. It is callable as a standard HTTP endpoint through the Apify API, so any agent framework that can make a request — LangChain, CrewAI, n8n, or a hand-written tool definition — can invoke it and receive typed JSON rows directly.

How does Facebook Search Scraper compare to other Facebook search scrapers?

Checked on the Apify Store 2026-07-25: the top-ranked competing listing (10,000+ users at the time checked) documents page name, categories, website, email, address, phone, followers, likes, social links, rating, Facebook ID, messenger and ad status, but neither its feature list nor its output example documents opening hours, services or price band. A second competitor prices per-1,000-results and restricts free users to 5 results; its own listing gives no output field documentation. A third is a Facebook posts scraper (groups, pages, profiles) rather than a business-page search tool, and requires cookies for search specifically. Facebook Search Scraper's difference is returning opening hours, services and price band alongside the standard contact and rating fields, with no login required for any of it.

Can I use Facebook Search Scraper without managing proxies or Facebook credentials?

Yes. No Facebook account, cookie or login is accepted or needed. Proxy handling is automatic too: the Actor runs with no proxy by default and only escalates to the Apify datacenter proxy, then residential, if an exit gets login-walled. The one credential you supply is your own Apify account.

Facebook Search Scraper is deliberately scoped to business-page discovery and the core business record. Related data lives in dedicated companion Actors:

ScraperWhat it adds
Facebook Search Scraper — Public EventsPublic event listings, dates, venues and ticket info surfaced by the same category/location search
Facebook Search Scraper — Video & Reel SearchReels and videos with view/play counts
Facebook Search Scraper — by HashtagHashtag feeds and post matching
Facebook Search Scraper — WhatsApp & Contact LeadsWhatsApp numbers, additional linked social accounts, external links and venue coordinates

💬 Your feedback

Found a bug, or need a field that Facebook's business page publishes but this Actor doesn't return yet? Open an issue on the Actor's Issues tab in Apify Console. Reports that include the category, location and a sample page URL are the fastest to reproduce and fix.