Facebook Page Contacts Scraper - Emails, Phones, Followers avatar

Facebook Page Contacts Scraper - Emails, Phones, Followers

Pricing

$2.99 / 1,000 result rows

Go to Apify Store
Facebook Page Contacts Scraper - Emails, Phones, Followers

Facebook Page Contacts Scraper - Emails, Phones, Followers

Facebook page followers, contacts and reviews: 53 columns per page, measured on 22 live pages - website 22/22, phone 12/22, email 10/22, plus ratings, address and ad transparency. A login wall is a cooldown, not a verdict: 9 of 9 pages delivered through 34 walls.

Pricing

$2.99 / 1,000 result rows

Rating

0.0

(0)

Developer

Snow Leo Data

Snow Leo Data

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a day ago

Last modified

Share

Facebook Pages Scraper

Scrape public Facebook pages without a login, without cookies, without a proxy and without a browser. Give it a page name, a page URL, a profile.php?id= link or a numeric page id and get back the page's contacts, location, rating, transparency record and recent posts as one flat row.

Python standard library only. Nothing is written to Facebook, nothing is logged in to, no account is used.

What one row carries

53 columns. Measured on 2026-09-17 across 22 live pages: 22 of the 24 addresses passed in resolved to a real page, and the other two did not exist - they were detected and not charged for.

groupcolumnsfilled on the 22 live pages
identitypage_name, page_id, profile_id, username, page_url, is_verified, categories, introname 22/22, page id 22/22, categories 22/22, intro 21/22
audiencefollowers, following, talking_about, checkins, likesfollowers 22/22, talking about 20/22, check-ins 11/22
contactsemail, emails, phone, phones, website, websites, messenger_url, social_linksemail 10/22, phone 12/22, website 22/22, other socials 5/22
locationaddress, address_street, address_city, address_region, address_country, address_postal_code, latitude, longitude, service_areaaddress 8/22, coordinates 7/22
businessprice_range, services, hours_status, rating_recommend_percent, rating_stars, review_count, foundedprice 5/22, hours 7/22, rating 9/22, reviews 10/22, founded 3/22
transparencypage_created_date, confirmed_owner, is_running_adscreated 21/22, owner 18/22, ad status 21/22
mediaprofile_picture_url, cover_photo_url22/22 each
postslatest_posts, latest_post_url, latest_post_time, post_count_returned189 posts across the 22 pages, 183 of them with text
runinput, source_urls, scraped_at, page_exists, change_type, changed_fields, about_fieldsalways

about_fields carries every About-tab field that has no column of its own, so a field Facebook adds tomorrow still reaches you.

The post ceiling, stated plainly

Facebook embeds a limited number of posts in a logged-out page and there is no way past it without a session token. Measured on 2026-09-17:

  • a page that publishes reels returns 10 posts - measured on 18 of the 22 live pages;
  • a page that posts only to its timeline returns 1 post - NASA, Tesla;
  • /api/graphql/ answers HTTP 200 with zero bytes without a session token, so the end_cursor embedded in the page cannot be spent. Tested from a laptop and from an Apify cloud run - same answer;
  • the Facebook Ad Library answers HTTP 403 from both, so ad creatives are not available here either;
  • mbasic.facebook.com redirects to the login page.

Reaction and comment counts come with the newest post only. Measured: 21 of the 22 pages carried them, and in every case on the first post in the list. Older posts arrive with text, time, permalink and type, and with reactions, comments and shares as null. That is what the source publishes, not a shortcut.

If you need every post of a page rather than the most recent ones, this is not the Actor for that.

Other honest limits

  • Like counts no longer exist. Facebook stopped printing a Like count on logged-out pages. Measured across 22 live pages: zero carried one. The likes column is kept so pipelines do not break, and it is null.
  • Opening hours come as a status, not a weekly table. A logged-out page publishes Open now, Closing Soon, Temporarily Closed - never the Monday-to-Sunday rows. hours_status is that word, unchanged.
  • Ratings come as "% recommend", not stars. That is how Facebook shows them today; across 22 live pages none carried a star rating. Both columns exist, and rating_stars fills in if a page still has one.
  • Admin countries are not published on the transparency tab of a logged-out page. What is published - and what this Actor returns - is the page creation date, the confirmed legal owner and the ad status.
  • Facebook answers HTTP 200 for a page that does not exist. Such a row is detected, not written to the dataset and counted in the REPORT record, so you are not charged for it.

Four ways to name a page

All four were tested live, from a laptop and from an Apify cloud run:

written asexample
page namekatzsdeli
page URLhttps://www.facebook.com/katzsdeli/
profile.php linkhttps://www.facebook.com/profile.php?id=100064806517961
numeric page id100064806517961

A bare numeric id is rewritten into the profile.php?id= form before the request, because the bare form answers from a home address and is sent to the login wall from Apify's - measured in cloud run 8jRZ5YqcNeUBX9xAx.

Addresses of Facebook's own surfaces - /groups/, /events/, /watch/, /marketplace/, /reel/ - are not pages. They are rejected, listed back in the REPORT record and never silently scraped as something else.

Monitor mode

Turn on Only new or changed pages and the Actor remembers what it has already delivered. Every row is then labelled NEW, UPDATED or UNCHANGED, and an UPDATED row carries changed_fields with the value before and after.

Watched: name, categories, intro, verified badge, website, email, phone, address, price range, hours status, services, rating, review count, ad status, confirmed owner, page creation date, newest post, and the follower count in 1% buckets - a page gaining a handful of followers overnight is not a change, or a daily run would charge you for every page every morning.

Two things are deliberately NOT treated as changes, because Facebook varies them by itself: the exact follower count, compared in 1% buckets, and the spelling of a phone number - the same page published +1 212-254-2246 and (212) 254-2246 in two cloud runs an hour apart, and comparing the strings would have charged for a change that never happened.

Memory lives in a named key-value store and survives between runs. Verified on the platform under the Limited permission level: after a monitor run the store facebook-pages-state held three page fingerprints and the next run read them back.

Empty results always say why

A run that returns nothing names the reason in the REPORT record (empty_reason) and in the log, with one phrase per cause. Fifteen of them exist; nine are decided from your input before a single byte is downloaded, so a self-contradicting input costs you nothing:

no-target-given, input-dataset-unreadable, all-targets-invalid, posts-filter-with-posts-turned-off, creation-date-filter-with-transparency-turned-off, ads-filter-with-transparency-turned-off, category-filter-is-empty, follower-range-is-empty, charge-limit-reached, filtered-out, nothing-changed, pages-not-found, source-asked-for-login, source-rate-limited, all-targets-unreachable.

Max pages in the result limits delivered rows, not fetched ones - a narrow filter plus a small limit still returns rows instead of an empty dataset.

Speed and traffic

A page with autoplaying reels ships megabytes of video manifests after the data that matters. Measured: KFC's About tab is 21 157 880 bytes, and the last field this Actor reads sits at byte 576 576. The Actor reads the first 900 000 bytes and hangs up - 4% of the bytes for the same data. With posts turned on the About tab is read to 1 700 000 bytes, because the tenth reel post completes at byte 1 400 000 at the worst measured.

Turning Include latest posts off drops one request per page and reads 47% fewer bytes of the About tab.

Facebook rations what one anonymous address may look at

It does not say so with HTTP 429 - it redirects to the login page. Four cloud runs on 2026-09-17 measured the shape of it:

  • run acOmd7YZmASDlaMKT: 15 pages through, then a wall on every request;
  • run KM9AVgJkSdOZbheCg: the same 15, and hammering the wall every 2 seconds kept it shut through 60, 120 and 180 seconds of waiting;
  • run Zqpa3PjCTZ1bTYbfa: 18 pages through with no wall at all, and one minute of silence was enough afterwards;
  • the Actor itself, run ZluwxVKMzuIGdOswF: all 9 pages delivered - 54 requests, 34 walls, 26 retries, 345 seconds.

The ration belongs to the outbound address, which a cloud container does not choose: one run lands on a fresh address and never sees a wall, the next lands on a spent one. From a home address the same code made 68 requests four at a time without a single redirect.

So the Actor treats a login redirect as a cooldown, never a verdict: it waits a minute and tries again, and it does not hammer, because hammering is what kept the wall shut for six minutes while one minute of silence cleared it. Defaults are two pages at a time, 1.5 seconds apart. If the report says source-asked-for-login, lower Pages at a time or raise Seconds between requests - and expect a large list of pages to take minutes rather than seconds.

Input

fieldwhat it does
Facebook pagesone page per line, in any of the four spellings
Include latest postsfetch the main tab too and return recent posts
Include page transparencyfetch creation date, confirmed owner, ad status
Max posts per pagekeep at most this many posts per row
Max pages in the resultstop after this many delivered rows
Only pages with an email / phone / website / addresscontact filters
Only verified pageskeep pages with the badge
Only pages currently running adsneeds transparency on
Only pages with at least one postneeds posts on
Category containskeep a page whose category contains any of these words
Minimum / Maximum followersfollower range; a page with no count is kept
Page created on or after / beforeYYYY-MM-DD; needs transparency on
Monitor mode / Emit unchangedonly new or changed, or everything with labels
Compact outputdrop empty fields - smaller payload for AI agents
Pages at a time, Seconds between requestspace
Read pages from a datasetchain this Actor after another one

Output

{
"page_name": "Joe's Stone Crab",
"page_url": "https://www.facebook.com/JoesStoneCrab/",
"page_id": "404077308008",
"profile_id": "100064737608769",
"is_verified": false,
"categories": ["Seafood Restaurant"],
"intro": "For more than 100 years, no visit to Miami has been complete without stopping here.",
"followers": 44529,
"talking_about": 433,
"checkins": 170687,
"email": "marketing@joesstonecrab.com",
"phone": "+1 305-673-0365",
"website": "http://joesstonecrab.com/",
"social_links": [
{"platform": "instagram", "url": "https://www.instagram.com/joesstonecrab",
"handle": "joesstonecrab", "label": "Instagram"}
],
"address": "11 Washington Ave, Miami Beach, FL, United States, 33139",
"address_street": "11 Washington Ave",
"address_city": "Miami Beach",
"address_region": "FL",
"address_country": "United States",
"address_postal_code": "33139",
"latitude": 25.76885,
"longitude": -80.13503,
"price_range": "$$",
"services": ["Dine-in", "Outdoor seating", "Online booking"],
"hours_status": "Temporarily Closed",
"rating_recommend_percent": 94,
"review_count": 14553,
"page_created_date": "March 8, 2010",
"confirmed_owner": "JOES STONE CRABS INC",
"is_running_ads": false,
"founded": "October 15, 1913",
"messenger_url": "https://m.me/JoesStoneCrab",
"post_count_returned": 10,
"latest_posts": [
{"post_id": "1518368763664363",
"url": "https://www.facebook.com/JoesStoneCrab/posts/pfbid03618inXBNsvUPevcWyGNHmFLQLnHEW6qeM1agoYpofNwmx3ij3mYEWM3NCvgRoSTzl",
"created_at": "2026-09-15T15:18:27Z",
"text": "Joe's Stone Crab and Joe's Take Away will be closed beginning...",
"reactions": 290, "comments": 12, "shares": 17, "type": "post"}
]
}

FAQ

No. Every request is what an anonymous visitor's browser sends, and the only thing that matters is the header set: with a plain Accept: */* Facebook answers HTTP 400, with a full browser header set it answers 200 and the data. Measured from a laptop and from an Apify cloud run - same result both times.

How many posts do I get per page?

Ten on a page that publishes reels, one on a page that only posts to its timeline. That is the whole of what Facebook embeds in a logged-out page, and /api/graphql/ answers 200 with an empty body without a session token, so there is no honest way past it. See "The post ceiling, stated plainly".

Can it scrape a personal profile?

Yes, when the profile is public - a public profile uses the same page shell and the same About tab. Fields a profile does not have simply arrive empty.

Why is the likes column always empty?

Because Facebook no longer prints a Like count on a logged-out page. Measured across 22 live pages on 2026-09-17: none of them carried one. The column is kept so a pipeline built on it does not break.

Can I get the weekly opening hours?

No. A logged-out page publishes the status word only - Open now, Closing Soon, Temporarily Closed - not the Monday-to-Sunday table.

Can I get the ads a page is running?

You get whether it is running ads at all, from the Page transparency tab. The creatives live in the Facebook Ad Library, which answers HTTP 403 to a logged-out request from a laptop and from Apify alike.

What happens if I pass a page that does not exist?

Facebook answers HTTP 200 with a stub. The Actor detects it, does not write the row and counts it in the REPORT record, so it is not charged for. Only the About tab is spent on such an address, never all three.

How do I run this on a schedule without paying for the same page twice?

Turn on Only new or changed pages. Every page already delivered comes back only when a watched field moved, and follower counts are compared in 1% buckets so ordinary growth is not a change.

Can I feed it the output of another Actor?

Yes. Put that run's dataset id in Read pages from a dataset and name the field holding the page address.

Only public pages are read, exactly as an anonymous visitor sees them. No login, no cookies, no account, nothing behind a permission wall. You are responsible for using the data in line with Facebook's terms and with the privacy law that applies to you.