Facebook Pages Scraper & Facebook Page Search, No Login avatar

Facebook Pages Scraper & Facebook Page Search, No Login

Pricing

from $5.40 / 1,000 pages

Go to Apify Store
Facebook Pages Scraper & Facebook Page Search, No Login

Facebook Pages Scraper & Facebook Page Search, No Login

Facebook page scraper and page search, no login: give page URLs, usernames, page IDs, names or keywords. Per page the exact Facebook followers, category, address, coordinates, phone, email, website, WhatsApp, hours, rating and page transparency: creation date, name changes, admin countries, ads.

Pricing

from $5.40 / 1,000 pages

Rating

0.0

(0)

Developer

Hyperbach

Hyperbach

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Facebook pages as data, logged out. Give page URLs in any form, usernames, page or profile ids, page names or search words, and get one row per page: both ids, the name, username and URL, the categories, the exact follower count (not the rounded "3.3K"), following, talking about and were here, the intro's public part, the address with its map coordinates, the phone, e-mail, websites, WhatsApp and social links, the hours state, the price range, the rating, the services and the service area, the verified badge, the picture and the cover, the first post, and the page transparency facts: when the page was created, every name change, the countries of its admins, the confirmed owner, whether it runs ads now and its Ad Library link. A value that gives no page gets a free row that says why. No login, no cookies, no browser, proxies handled for you.

Why this Facebook pages scraper

  • Every way you hold a page. A page URL from your browser or the mobile site, a post or photo link under the page, a username with or without @, a page id or a profile id, profile.php?id=…, the /people/<Name>/<id>/ and /p/<Name>-<id>/ URLs of pages with no username, a page name, or search words. Two forms of one page are one row and one charge.
  • Exact counts. The follower count comes from the page's own description, exact to the follower (3,317), never the header's rounded "3.3K"; the header's text rides beside it. No likes column: Facebook does not show likes to logged-out visitors, and a scraper that writes 0 there is wrong, not empty.
  • Contacts read by their type. Facebook's about tiles carry a type each (address, phone, e-mail, website, WhatsApp, the page's other accounts, hours, price, rating, services, service area); this Actor reads every tile by that type, so a phone is never taken from the intro and a website is never a map link. The address comes with its latitude and longitude, from the address's own map link.
  • The page transparency facts. For every page: the day it was created, every rename with its date, how many admins sit in which country, the confirmed owner, whether it ran political ads, whether it runs ads now, and the link to its ads in the Ad Library. The same columns as our Meta Ad Library scraper, so the two join on page_id.
  • Free rows that say why. A page Facebook shows only to logged-in visitors (age-gated brands) is a free restricted row with what the Ad Library still names: its username, page id, exact followers and verification. A page that is gone is a free not_available row, after a second connection agrees. A person's profile, a group or an event: free rows, and nothing of a person is read.
  • Search by words, to the end. Facebook's own page search, in its order, page after page to its own end or your cap, each result read as a full page (or listed as a lighter card row). Each search gets a free row with what it listed and its verdict.
  • Plain HTTP, no browser, no account. Two requests a page (the page and its transparency facts), residential exits handled for you; a login wall on one exit moves the read to a fresh exit at once. On our laptop test 14 values of every kind gave their rows in 12 seconds, the first at 1.6 seconds.

Who it's for

  • Lead generation and sales teams — the contact lines of local businesses (phone, e-mail, website, WhatsApp, address with coordinates) from their Facebook pages, found by name or by search words such as plumber leeds.
  • Marketing and social media analysts — followers, talking about and the latest post of competitors' and clients' pages, read again every week; which pages run ads now and where their admins are.
  • Trust, safety and brand-protection teams — a page's history: when it was created, every rename, the confirmed owner, the admins' countries, political ads; the badge against the verification Meta states.

Quick start

Two pages by URL

{
"startUrls": [
"https://www.facebook.com/NASA/",
"https://www.facebook.com/copperkettleyqr/"
]
}

Pages by name, id and profile.php link

{
"startUrls": [
"54971236771",
"https://www.facebook.com/profile.php?id=100064027242849"
],
"pageNames": [
"Peterman Brothers"
]
}

Search: plumbers in Leeds, the first 30 as full pages

{
"searchQueries": [
"plumber leeds"
],
"maxResultsPerQuery": 30
}

Output

One row per page (and one free row for every value that gave none):

fieldmeaning
record_typepage (a Facebook page; charged when status is ok), card (a search result as Facebook lists it, searchDetails off; charged) or search (one free row per search: what it listed and its verdict).
statusok on a charged row. A free page row says why the value gave no page: restricted (Facebook shows the page to logged-in visitors only; its identity fields are filled), not_available (no page there, on two connections), not_a_page (a person's profile: nothing of the person is read), duplicate, no_match (no page has the name), invalid_input, failed, not_read. A search row: ok, no_results, failed or not_read.
status_reasonWhy a free row is free, in one sentence. Empty on a charged row.
inputThe value as you gave it: the URL, username, id or name, or the search words.
input_typeurl, username, id, name (from pageNames, or a startUrls value with spaces) or search (a search result or a search row).
search_queryThe search words a search result or a search row came from.
search_rankThe result's place in Facebook's search list, 1 = first.
matched_byHow a page name found its page: name (the page's name equals yours, case and spaces aside), name_shared (several pages have that name: Facebook's first of them was read), username, or first_result (Facebook's first match).
name_candidatesHow many pages Facebook's page name search returned for the name.
profile_idThe page's profile id: the number in profile.php?id=.
page_idThe page's page id: the id of the Ad Library and of the page transparency dialog.
nameThe page's name.
usernameThe page's username (facebook.com/<username>); null for a page that has none.
urlThe page's own URL: its username URL, or the /people/<Name>/<id>/ URL of a page with no username.
categoryThe page's first category.
categoriesEvery category the page shows (one to three).
followersThe exact follower count, from the page's own description (3,317 where the page header shows 3.3K). Null when the page shows none.
followers_textThe follower count as the page header shows it (3.3K followers).
followingHow many profiles the page follows, when the header shows the exact number (up to 999); null when it is rounded (see following_text).
following_textThe following count as the header shows it (434 following, 2.1K following).
talking_aboutFacebook's "talking about this" figure. It moves between two reads of the same page.
were_hereFacebook's "were here" check-in count, on places.
introThe intro as Facebook shows it to logged-out visitors: its public part (4 to 253 characters on 142 of the 196 pages of our 200-page run; a longer text is cut on every logged-out view).
addressThe address the page shows.
latitudeThe address's latitude, from the address tile's own map link. Null when the tile has no map.
longitudeThe address's longitude, from the address tile's own map link.
phoneThe phone number the page shows, with its country code.
emailThe e-mail address the page shows.
websiteThe first website the page links, with Facebook's link wrapper removed.
websitesEvery website the page links.
whatsappThe WhatsApp number the page shows.
social_linksThe other accounts the page lists, each {platform, url, handle}: instagram, x, youtube, tiktok, linkedin, pinterest, threads and others.
instagramThe Instagram account the page lists (the handle).
instagram_followersThe exact follower count of the Instagram account linked to the page, on a row found by its page name (pageNames: Facebook's page name search names the account). Null on other rows.
hours_statusThe opening-hours state when the page was read (Open now, Closed now, Always open). Facebook does not show the weekly table logged out.
price_rangeThe price range as shown ($, $$). Facebook draws the symbol in the reader's currency; this Actor reads from the United States.
price_levelThe price range as a number from 1 to 4 (the count of symbols).
rating_percentThe share of reviewers who recommend the page (94 for "94% recommend"); null when the page is not yet rated.
rating_countThe number of reviews behind the rating.
rating_textThe rating line as shown (94% recommend (201 reviews), Not yet rated (1 review)).
servicesThe services the page lists (Outdoor seating, Delivery, Online booking).
service_areaThe places a service business says it serves.
verifiedWhether the page shows the verified badge to a visitor.
verification_statusThe verification the page transparency dialog states (BLUE_VERIFIED, NOT_VERIFIED). It can differ from the badge: some pages show the badge while the dialog says NOT_VERIFIED.
profile_picture_urlThe page's profile picture: a signed Facebook link that stops working at media_urls_expire_at.
cover_photo_urlThe page's cover photo: a signed link, see media_urls_expire_at.
media_urls_expire_atWhen the picture and cover links stop working (about 4 days after the read): download what you keep.
latest_postThe first post the page shows (it may be a pinned one): {id, url, created_at, text, reactions, comments, shares}. More posts are a posts scraper's job.
page_createdThe day the page was created, as a UTC date (the page transparency dialog), like the next eight.
page_name_changesEvery rename of the page, newest first: {name, date}, the name it took on that day. Empty when it never changed.
page_admin_countriesWhere the people who manage the page are: {country, admins}, most admins first.
page_ownerThe confirmed owner Meta names for the page, e.g. Shopify Inc..
page_owner_locationThe confirmed owner's location as Meta states it.
page_owner_typeHow the owner was confirmed, e.g. verified_business_manager.
page_partnersConfirmed partner organisations that help manage the page.
page_ran_political_adsWhether the page has ever run ads about social issues, elections or politics.
page_state_media_labelThe country whose state controls the page, when Meta labels it state media.
has_active_adsWhether the page runs ads now (the page transparency dialog).
ad_library_urlThe page's ads in Facebook's Ad Library.
transparency_statusserved (the page transparency columns are read), not_served (Facebook's dialog names no page for it) or failed (not read on this run; the page row is still delivered).
snippetThe search result's description line, on a card row.
results_listedOn a search row: the results Facebook listed and the walk looked at.
results_deliveredOn a search row: the charged rows its results gave (pages, or cards with searchDetails off).
pages_readOn a search row: the search pages read (about 10–16 results a page).
repeats_skippedOn a search row: results skipped because the run already took that page.
verdictOn a search row: COMPLETE (Facebook's own end of the list), CAPPED (Max results per search), RUN_CAP (Max charged rows or your charge limit) or PARTIAL (a refusal or the time limit stopped it; the detail says which).
verdict_detailOn a search row: what the walk listed, took and delivered, and why it stopped.
scraped_atWhen the row was read (UTC).

Example record:

{
"record_type": "page",
"status": "ok",
"status_reason": null,
"input": "851606664870954",
"input_type": "id",
"search_query": null,
"search_rank": null,
"matched_by": null,
"name_candidates": null,
"profile_id": "100064027242849",
"page_id": "851606664870954",
"name": "The Copper Kettle Restaurant",
"username": "copperkettleyqr",
"url": "https://www.facebook.com/copperkettleyqr/",
"category": "Pizza place",
"categories": [
"Pizza place"
],
"followers": 3317,
"followers_text": "3.3K followers",
"following": 434,
"following_text": "434 following",
"talking_about": 36,
"were_here": 1164,
"intro": "Longstanding local restaurant. Mediterranean specialties, signature gourmet pizzas (Best of YQR for",
"address": "1953 Scarth Street, Regina, SK, Canada, Saskatchewan",
"latitude": 50.4477795,
"longitude": -104.61026997,
"phone": "+1 306-525-3545",
"email": "copperkettle.events@gmail.com",
"website": "http://www.thecopperkettle.online/",
"websites": [
"http://www.thecopperkettle.online/"
],
"whatsapp": null,
"social_links": [
{
"platform": "instagram",
"url": "https://www.instagram.com/copperkettleyqr",
"handle": "copperkettleyqr"
}
],
"instagram": "copperkettleyqr",
"instagram_followers": null,
"hours_status": "Open now",
"price_range": "$$",
"price_level": 2,
"rating_percent": 94,
"rating_count": 201,
"rating_text": "94% recommend (201 reviews)",
"services": [
"Outdoor seating"
],
"service_area": null,
"verified": false,
"verification_status": "NOT_VERIFIED",
"profile_picture_url": "https://scontent-lga3-2.xx.fbcdn.net/v/t39.30808-1/298528699_436705561807015_4191178501684731329_n.jpg?stp=dst-jpg_tt6&cstp=mx320x320&ctp=s320x320&_nc_cat=101&ccb=1-7&_nc_sid=2d3e12&_nc_ohc=REDACTED&_nc_oc=Adp8jnUK1gja86yXnj3HkkaYqrgV2AMlkjeakwLadMc-VApEU8NBAFpa1Ve1yziqrJg&_nc_zt=24&_nc_ht=scontent-lga3-2.xx&_nc_gid=REDACTED&_nc_ss=7b289&oh=REDACTED&oe=6AE4A3DC",
"cover_photo_url": "https://scontent-lga3-2.xx.fbcdn.net/v/t39.30808-6/474477436_1020105193467046_5394070544420517909_n.jpg?stp=dst-jpg_tt6&cstp=mx960x641&ctp=s960x641&_nc_cat=105&ccb=1-7&_nc_sid=cc71e4&_nc_ohc=REDACTED&_nc_oc=AdrQfDUyjLcvvZo32oyn1ZfEqWxURC0sNeU4rIfSRl59X9LcFRkBoK9Yoh6gnKN6yyA&_nc_zt=23&_nc_ht=scontent-lga3-2.xx&_nc_gid=REDACTED&_nc_ss=7b289&oh=REDACTED&oe=6AE48840",
"media_urls_expire_at": "2026-10-30T12:06:24Z",
"latest_post": {
"id": "1539961084814785",
"url": "https://www.facebook.com/copperkettleyqr/posts/pfbid02z1kwGpzRYv832BvTqjDRhaCEcnN4wu5uAatHNxErQ4fyrtX1SD16aUAYbgkgYrh4l",
"created_at": "2026-10-10T16:14:46Z",
"text": null,
"reactions": 2,
"comments": 0,
"shares": 1
},
"page_created": "2014-10-30",
"page_name_changes": [],
"page_admin_countries": [
{
"country": "Canada",
"admins": 10
}
],
"page_owner": null,
"page_owner_location": null,
"page_owner_type": null,
"page_partners": [],
"page_ran_political_ads": false,
"page_state_media_label": null,
"has_active_ads": true,
"ad_library_url": "https://www.facebook.com/ads/library/?active_status=all&ad_type=all&country=ALL&view_all_page_id=851606664870954",
"transparency_status": "served",
"snippet": null,
"results_listed": null,
"results_delivered": null,
"pages_read": null,
"repeats_skipped": null,
"verdict": null,
"verdict_detail": null,
"scraped_at": "2026-10-26T02:43:13Z"
}

Pricing

Pay per page delivered, plus one run start; no platform usage and no proxy traffic is billed to you. The price falls with your Apify plan.

eventunitFreeStarterScaleBusiness
Page (page)per 1,000$12.00$8.20$6.50$5.40
Search result (as listed) (card)per 1,000$6.00$5.00$4.00$3.00
Run start (start)per run$0.0027$0.0027$0.0027$0.0027

A page is $12.00 per 1,000 on the Free plan ($0.012 a page) and $8.20 on Starter, with everything it carries: the about tiles, the contacts, the first post and the page transparency facts are inside the page's price. A search result read as a full page (Read each search result as a full page, on by default) is a page. With that switch off, each result comes as Facebook lists it, a lighter row at $6.00 per 1,000 on the Free plan and $5.00 on Starter. Each run that delivers a charged row also pays the run start, $0.0027 once; a run that delivers none pays nothing at all. So one page costs $0.0147 on the Free plan and $0.0109 on Starter; 50 pages $0.6027 and $0.4127; 1,000 pages $12.0027 and $8.2027; a search's first 20 results as pages $0.2427 and $0.1667, as listed $0.1227 and $0.1027. Free: a page Facebook does not show, a restricted page, a person's profile, a repeat (a page two of your values name is charged once), a value that is not a page, a name with no match, each search's own row, and a value left unread at maxItems or the time limit. A run that stops early (a timeout, an abort) is charged for the rows it delivered. maxItems counts the charged rows. Before the first request the log names the price of a page at your plan, the run start and the most the run can cost: every page value and, per search, Max results per search (20 unless you set it, at most 1,000), under maxItems and your charge limit. A search's list can end sooner: on our runs Facebook listed 120 results for "plumber denver" and 586 for "bakery austin", each to its own end. Enterprise plans have their own rates — the Actor's Pricing tab shows the price for your plan.

Usage patterns

  • Pages, names and searches — startUrls takes any form of a page, one a line: a URL (with or without www., from the mobile site, with /about or a post path after the username), a username, a page id or profile id, profile.php?id=…, /people/<Name>/<id>/ or /p/<Name>-<id>/. pageNames takes page names, found with Facebook's own page name search: the page whose name equals yours, else whose username equals it, else Facebook's first match (matched_by says which). searchQueries takes search words; Facebook's logged-out search has no filters, so put the place or the kind of business in the words.
  • What a row is — record_type = page: one page. status ok is the charged row with every field; any other status is a free row with its reason in status_reason (see the FAQ). record_type = card: a search result as Facebook lists it (searchDetails off). record_type = search: one free row per search with results_listed, results_delivered, pages_read, repeats_skipped and the verdict. Every row carries the value it answers (input, input_type, and search_query with search_rank for a search result).
  • Caps, repeats and the picture links — maxResultsPerQuery (default 20) stops each search; maxItems (0 = no limit) stops the run after that many charged rows, and no page is read past it (a value left unread gets a free not_read row). One page is one charged row a run, whatever form or search named it: a later value of the same page gets a free duplicate row. The picture and cover links are signed by Facebook and stop working at media_urls_expire_at (about 4 days): download the images you keep.

Input configuration

fieldtypedefaultwhat it does
startUrlsarrayOne page a line, in any form: a page URL (https://www.facebook.com/NASA/, m.facebook.com/NASA/about, a post or photo link under the page), a username (NASA or @NASA), a page id or profile id (54971236771, 100044561550831), https://www.facebook.com/profile.php?id=…, or the /people/<Name>/<id>/ and /p/<Name>-<id>/ URLs of pages with no username. A value with spaces is searched as a page name (see Page names). A group, an event, a share link or another site gets a free invalid_input row; a person's profile a free not_a_page row (no person's data is read); a page given twice, in two forms, is read once and charged once.
pageNamesarrayPage names, one a line (The Copper Kettle Restaurant, Nike), found with Facebook's own page name search (the Ad Library's): the page whose name equals yours (case and spaces aside), else whose username equals it, else Facebook's first result; the row says which (matched_by) and how many pages matched (name_candidates). A name no page has gets a free no_match row. A full name finds its page best; a short or common one gives Facebook's first match.
searchQueriesarraySearch Facebook's page search with these words, one search a line (pizza regina, plumber leeds), in Facebook's own order, to Facebook's own end of the list or Max results per search. Facebook's logged-out search has no filters: put a place or a kind of business in the words. Each search gets one free search row with what it listed and its verdict (COMPLETE, CAPPED, RUN_CAP or PARTIAL); a page two searches list is delivered once.
maxResultsPerQueryinteger20Stop each search after this many pages (1 to 1,000). Facebook lists about 10–16 pages a search page; a short list ends sooner. A page another search or value of the run already delivered is skipped and not counted.
searchDetailsbooleantrueOn: each search result is read as a page, with every field (followers, contacts, transparency, ads). Off: the results as Facebook lists them (the profile id, name, URL, username, the verified badge and the snippet), a lighter row at its own lower price.
maxItemsinteger0Stop the run after this many charged rows (pages and search results) across every value and search (0 = no limit). No page is read past the limit: a value left unread gets a free not_read row. Free rows (not available, restricted, duplicates, the search rows) are not counted.

Errors

A run does not fail because of your input. When an input cannot be used — a date that is not a date, an id in the wrong form, two settings that contradict each other — the run ends Succeeded, charges nothing, and says what to change:

  • the status message starts with INPUT REJECTED;
  • the dataset holds one row, {"error": true, "code": "…", "message": "…"}, and no results;
  • the key-value store record ERROR holds the same object.

From code, check error on the first row before reading results.

A value that is not a Facebook page (a group, an event, a person's profile, a page that is gone) is not an error: it gets one free row with its status and the reason, and the run goes on with the others. A run that ends Failed is a fault on our side, never your input; it charges nothing, and we are alerted.

FAQ

Which status is which?

ok: the page, charged. Free: restricted (Facebook shows the page to logged-in visitors only, usually an age or country restriction; the Ad Library still names it, so the row carries its username, page id, exact followers, category and verification), not_available (Facebook answers "This content isn't available right now" on two connections: deleted, renamed or never there), not_a_page (a person's profile; nothing of the person is read), duplicate (a page this run already delivered), no_match (no page has the name), invalid_input (a group, an event, a share link, another site), failed (Facebook refused every connection tried, or showed the page only in another country's view; read it again later), not_read (Max charged rows, your charge limit or the time limit came first). A search row: ok, no_results, failed or not_read.

Why is there no likes count, and why is the intro short?

Facebook does not show a page's likes to logged-out visitors, on any page we read; the follower count is the page's audience figure, exact. Facebook also cuts a long intro on every logged-out view, so intro is the part it shows (4 to 253 characters on our 200-page run).

Does it give the weekly opening hours, the reviews or more posts?

No. Logged out, Facebook shows the hours state at the moment of the read (Open now, Closed now, Always open), not the weekly table; the rating line, not the review texts; and the first post the page shows, not the feed. Reviews and posts are other Actors' jobs.

Why do verified and verification_status differ on some pages?

verified is the badge a visitor sees on the page; verification_status is what Meta's page transparency dialog states. On a few pages the badge shows while the dialog says NOT_VERIFIED (a paid badge is the likely cause). Both are given; pick the one your use needs.

Does it need a Facebook account, cookies or an API key?

No. Everything is read from Facebook's public, logged-out pages: no login, no cookie, no token of yours. Residential connections are included in the price.

Integration

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('hyperbach/facebook-pages-scraper').call({"startUrls": ["https://www.facebook.com/NASA/", "https://www.facebook.com/copperkettleyqr/"]});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('hyperbach/facebook-pages-scraper').call(run_input={'startUrls': ['https://www.facebook.com/NASA/', 'https://www.facebook.com/copperkettleyqr/']})
items = client.dataset(run['defaultDatasetId']).list_items().items

CLI

$apify call hyperbach/facebook-pages-scraper --input '{"startUrls": ["https://www.facebook.com/NASA/", "https://www.facebook.com/copperkettleyqr/"]}'

REST

curl -X POST "https://api.apify.com/v2/acts/hyperbach~facebook-pages-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H 'Content-Type: application/json' -d '{"startUrls": ["https://www.facebook.com/NASA/", "https://www.facebook.com/copperkettleyqr/"]}'

Support

Disagree with a charge? Write to apify@hyperbach.com with the run ID. We will ask Apify to compensate you, and the charge comes back to your Apify account as platform credit.

This page is generated from the Actor's schemas and a live sample — it cannot describe a field the Actor does not have.