Facebook Pages Scraper & Facebook Page Search, No Login
Pricing
from $5.40 / 1,000 pages
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
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
likescolumn: 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
restrictedrow with what the Ad Library still names: its username, page id, exact followers and verification. A page that is gone is a freenot_availablerow, 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):
| field | meaning |
|---|---|
record_type | page (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). |
status | ok 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_reason | Why a free row is free, in one sentence. Empty on a charged row. |
input | The value as you gave it: the URL, username, id or name, or the search words. |
input_type | url, username, id, name (from pageNames, or a startUrls value with spaces) or search (a search result or a search row). |
search_query | The search words a search result or a search row came from. |
search_rank | The result's place in Facebook's search list, 1 = first. |
matched_by | How 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_candidates | How many pages Facebook's page name search returned for the name. |
profile_id | The page's profile id: the number in profile.php?id=. |
page_id | The page's page id: the id of the Ad Library and of the page transparency dialog. |
name | The page's name. |
username | The page's username (facebook.com/<username>); null for a page that has none. |
url | The page's own URL: its username URL, or the /people/<Name>/<id>/ URL of a page with no username. |
category | The page's first category. |
categories | Every category the page shows (one to three). |
followers | The 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_text | The follower count as the page header shows it (3.3K followers). |
following | How many profiles the page follows, when the header shows the exact number (up to 999); null when it is rounded (see following_text). |
following_text | The following count as the header shows it (434 following, 2.1K following). |
talking_about | Facebook's "talking about this" figure. It moves between two reads of the same page. |
were_here | Facebook's "were here" check-in count, on places. |
intro | The 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). |
address | The address the page shows. |
latitude | The address's latitude, from the address tile's own map link. Null when the tile has no map. |
longitude | The address's longitude, from the address tile's own map link. |
phone | The phone number the page shows, with its country code. |
email | The e-mail address the page shows. |
website | The first website the page links, with Facebook's link wrapper removed. |
websites | Every website the page links. |
whatsapp | The WhatsApp number the page shows. |
social_links | The other accounts the page lists, each {platform, url, handle}: instagram, x, youtube, tiktok, linkedin, pinterest, threads and others. |
instagram | The Instagram account the page lists (the handle). |
instagram_followers | The 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_status | The opening-hours state when the page was read (Open now, Closed now, Always open). Facebook does not show the weekly table logged out. |
price_range | The price range as shown ($, $$). Facebook draws the symbol in the reader's currency; this Actor reads from the United States. |
price_level | The price range as a number from 1 to 4 (the count of symbols). |
rating_percent | The share of reviewers who recommend the page (94 for "94% recommend"); null when the page is not yet rated. |
rating_count | The number of reviews behind the rating. |
rating_text | The rating line as shown (94% recommend (201 reviews), Not yet rated (1 review)). |
services | The services the page lists (Outdoor seating, Delivery, Online booking). |
service_area | The places a service business says it serves. |
verified | Whether the page shows the verified badge to a visitor. |
verification_status | The 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_url | The page's profile picture: a signed Facebook link that stops working at media_urls_expire_at. |
cover_photo_url | The page's cover photo: a signed link, see media_urls_expire_at. |
media_urls_expire_at | When the picture and cover links stop working (about 4 days after the read): download what you keep. |
latest_post | The 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_created | The day the page was created, as a UTC date (the page transparency dialog), like the next eight. |
page_name_changes | Every rename of the page, newest first: {name, date}, the name it took on that day. Empty when it never changed. |
page_admin_countries | Where the people who manage the page are: {country, admins}, most admins first. |
page_owner | The confirmed owner Meta names for the page, e.g. Shopify Inc.. |
page_owner_location | The confirmed owner's location as Meta states it. |
page_owner_type | How the owner was confirmed, e.g. verified_business_manager. |
page_partners | Confirmed partner organisations that help manage the page. |
page_ran_political_ads | Whether the page has ever run ads about social issues, elections or politics. |
page_state_media_label | The country whose state controls the page, when Meta labels it state media. |
has_active_ads | Whether the page runs ads now (the page transparency dialog). |
ad_library_url | The page's ads in Facebook's Ad Library. |
transparency_status | served (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). |
snippet | The search result's description line, on a card row. |
results_listed | On a search row: the results Facebook listed and the walk looked at. |
results_delivered | On a search row: the charged rows its results gave (pages, or cards with searchDetails off). |
pages_read | On a search row: the search pages read (about 10–16 results a page). |
repeats_skipped | On a search row: results skipped because the run already took that page. |
verdict | On 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_detail | On a search row: what the walk listed, took and delivered, and why it stopped. |
scraped_at | When 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.
| event | unit | Free | Starter | Scale | Business |
|---|---|---|---|---|---|
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 —
startUrlstakes any form of a page, one a line: a URL (with or withoutwww., from the mobile site, with/aboutor a post path after the username), a username, a page id or profile id,profile.php?id=…,/people/<Name>/<id>/or/p/<Name>-<id>/.pageNamestakes 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_bysays which).searchQueriestakes 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.statusokis the charged row with every field; any other status is a free row with its reason instatus_reason(see the FAQ).record_type=card: a search result as Facebook lists it (searchDetailsoff).record_type=search: one free row per search withresults_listed,results_delivered,pages_read,repeats_skippedand theverdict. Every row carries the value it answers (input,input_type, andsearch_querywithsearch_rankfor 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 freenot_readrow). One page is one charged row a run, whatever form or search named it: a later value of the same page gets a freeduplicaterow. The picture and cover links are signed by Facebook and stop working atmedia_urls_expire_at(about 4 days): download the images you keep.
Input configuration
| field | type | default | what it does |
|---|---|---|---|
startUrls | array | One 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. | |
pageNames | array | Page 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. | |
searchQueries | array | Search 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. | |
maxResultsPerQuery | integer | 20 | Stop 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. |
searchDetails | boolean | true | On: 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. |
maxItems | integer | 0 | Stop 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
ERRORholds 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 ApifyClientclient = 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.