~ / guides / How to Scrape Emails From Facebook Pages (2026)

How to Scrape Emails From Facebook Pages (2026)

NB
Noah Berg
Facebook data engineer · about the author
the short version
  • The only Facebook emails you can scrape cleanly are the ones a Business Page publishes itself, the contact address in the Page's About / Contact info panel. Personal profile emails and group-member emails are gated behind a login and off-limits.
  • A logged-out requests.get to a public Page returns markup, but Facebook renders the contact block in JavaScript and buries it in a __bbox JSON blob, so a plain regex catches noise or nothing. That is why the DIY route is fragile.
  • The clean route is a scraper API that takes a Page URL and returns the parsed contact fields (email, phone, website) as JSON, with the login wall and proxies handled server-side.
  • An email address is personal data under the GDPR. A public Page does not by itself grant a lawful basis to collect and cold-email at scale, and the Irish DPC fined Meta EUR 265 million over scraped contact data.

I get asked how to scrape emails from Facebook more than almost any other extraction question, and the honest answer starts with a narrowing. The only address you can pull cleanly is the one a Business Page chose to publish in its Contact info. I spent July 2026 testing every route against live Pages: the public Page markup, a Python regex pass, the official Graph API, and a scraper API.

Below is what actually returns an email, what returns nothing, the code I ran for each, and the GDPR line that decides whether you should keep what you collected.

What emails can you actually scrape from Facebook?

The emails you can actually scrape from Facebook are the public contact addresses that Business Pages publish in their About section, and effectively nothing else. Everything tied to a personal profile, a group’s members, or a commenter sits behind the login and privacy settings, so a scraper never reaches it. This is the single most important expectation to set before you write any code.

TargetEmail scrapable?Why
Business Page contact emailYes, if the Page displays itPublic About / Contact info field
Personal profile emailNoGated behind login and privacy settings
Group member emailsNoGroups API removed April 2024, login-gated
Event host emailRarelyOnly if surfaced on a public Page
Commenter or liker emailNoNever exposed to a logged-out visitor

The pattern is that a Facebook email is only collectable where a business volunteered it. A local shop, an agency, or a creator running a Page often lists a booking or support address so customers can reach them, and that field is public. A private person’s address is not, and neither is a group roster. So a “Facebook email scraper” is really a Business Page contact scraper, and the legality of running one turns on that same distinction.

Scraping emails from Facebook is legally lighter when the address is a published business contact and heavier the moment it identifies a private individual, because an email is personal data under privacy law. There is no blanket yes or no, so treat this as an engineer’s map and get a lawyer for anything commercial.

The contract layer comes first. Meta’s Automated Data Collection Terms prohibit collecting data by automated means without prior written permission, and as of January 1, 2025 that prohibition reaches automated collection whether you are logged in or logged out. A US court read Meta’s older terms to permit logged-off scraping of public pages in the 2024 Bright Data case, and Meta rewrote the terms to close that gap, so the contract position is stricter now than most older guides assume. I break the full timeline down in is scraping Facebook legal.

The privacy layer is the one email work lives or dies on. An email address identifies a person, so it is personal data, and publishing it on a Page does not by itself hand you a lawful basis to collect, store, and mail it at scale. Meta learned the enforcement side directly: Ireland’s Data Protection Commission fined Meta EUR 265 million in November 2022 after scraped contact and profile data on more than 500 million users surfaced online. The workable rule I follow: collect only addresses a business published as its own contact point, and treat anything attached to a private person as regulated. With scope and legality settled, the mechanics start with where the address actually sits.

Where does a Facebook Page show its email?

A Facebook Page shows its email in the About section, under Contact info, when the Page owner has chosen to make it public. This is the manual baseline, and it is worth doing once by hand before you automate, so you know what a populated field looks like versus an empty one.

To find it on any public Page:

  1. Open the Page and click About, or the Intro panel on the left of the Page.
  2. Look under Contact info for an Email line, alongside website, phone, and location.
  3. If an email is listed, it is public and scrapable. If only a website or Messenger link shows, there is no email to collect.

Many Pages deliberately list a website contact form or a Messenger link instead of an address, to keep the inbox off public view. That is why an email scrape returns a hit rate, not a full column: you get the businesses that opted to publish, which in my runs is a minority of Pages in most categories. The next question is how to read that field programmatically.

How do you scrape emails from Facebook Pages with Python?

You scrape emails from Facebook Pages with Python by requesting the public Page while logged out and searching the returned markup for an address, and the catch is that Facebook makes that markup hard to parse. A plain request reaches the page, but the Contact info you want is rendered late by JavaScript and stored in an embedded JSON blob, so a naive regex is a best-effort pass, not a reliable one.

Start with the fetch, and mind the header quirk I keep hitting. In my July 2026 tests a desktop Chrome User-Agent returned HTTP 400 on facebook.com, while sending no User-Agent returned HTTP 200 and the full public shell:

import requests, re

# Logged out, and no User-Agent on purpose: a desktop Chrome UA returned
# HTTP 400 in my tests, while sending no UA returned HTTP 200 with the shell.
r = requests.get("https://www.facebook.com/nasa/about_contact_and_basic_info", timeout=20)
print(r.status_code)  # -> 200

# Addresses a Page displays sit in the markup as plain text or a mailto link.
EMAIL_RE = re.compile(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}")
emails = sorted(set(EMAIL_RE.findall(r.text)))
print(emails)

This works when a Page prints its address into the served HTML, and it fails quietly otherwise. Facebook assembles the Contact info panel client-side and buries the underlying fields in a __bbox JSON structure whose keys rotate, so the regex often returns an empty list on a Page that clearly shows an email in the browser. When it does match, it also picks up noise: schema.org example addresses, image-CDN strings that look like emails, and tracking domains. You end up writing a filter for that noise, then rewriting it every time the markup shifts.

The heavier build is a logged-in headless browser (Selenium or Playwright) that renders the panel and reads the field, but a logged-in session against Pages is exactly what Meta’s terms restrict, and a single browser does not rotate IPs. I walk through the full Python toolkit, including the browser route, in how to scrape Facebook with Python. For steady collection, the more reliable move is to stop parsing the shell yourself.

How do you scrape Facebook emails at scale without getting blocked?

A scraper API removes the blocking and parsing work by taking a Facebook Page URL and returning the parsed contact fields as JSON, with the headless browser, proxy rotation, and retries handled on its own servers. You send one request and read an email field instead of reverse-engineering a __bbox blob or debugging the 400-versus-200 header quirk. This is how I run anything past a handful of Pages.

I point mine at ChocoData, which exposes Facebook endpoints under one base. The request is a target Page URL plus your key:

curl "https://chocodata.com/api/v1/facebook/page?url=https://www.facebook.com/nasa&api_key=$CHOCO_API_KEY"

The same call from Python, pulling the contact fields a Page has published:

import os, requests

resp = requests.get(
    "https://chocodata.com/api/v1/facebook/page",
    params={
        "url": "https://www.facebook.com/nasa",
        "api_key": os.environ["CHOCO_API_KEY"],
    },
    timeout=60,
)
page = resp.json()

# Contact fields come back parsed. Use .get() because a Page may not
# publish every field, and email specifically is often absent.
print(page.get("name"))
print(page.get("email"))     # the published contact address, or None
print(page.get("phone"))
print(page.get("website"))

The server runs a real browser against the logged-out public Page, so the JavaScript rendering that defeated the regex above happens before you see the response, and the email arrives as a field rather than a string you have to hunt for. Where a Page publishes no address, email comes back empty, which is the honest result, not a parser bug. The free tier covers 1,000 requests and the median response in my runs is about 2.6 seconds end to end, so you can test a category of Pages before committing. To feed a URL list into this at volume, resolve your target Pages first, which I cover alongside the tooling in the best Facebook scrapers of 2026. One route sits outside scraping entirely: your own Pages.

How do you get Page emails through the official Graph API?

Use the Graph API when the Page belongs to you, because it returns your Page’s own contact email as clean JSON without any scraping. The hard limit is ownership: the Page node only returns the emails field for a Page you manage, with a Page access token and the right permissions, so it is useless for a competitor’s or a prospect’s Page.

import requests

# Page access token for a Page you administer, with pages_show_list /
# pages_read_engagement granted after App Review.
PAGE_ID = "your_page_id"
TOKEN = "your_page_access_token"

r = requests.get(
    f"https://graph.facebook.com/v23.0/{PAGE_ID}",
    params={"fields": "name,emails,phone,website", "access_token": TOKEN},
    timeout=20,
)
print(r.json())   # -> {"name": ..., "emails": [...], ...}

That is the sanctioned path for auditing the contact details on Pages you control, or for pulling them into a CRM you already own the data for. It will not hand you arbitrary public Pages, which is the exact gap the logged-out routes above fill. Whichever route returns the address, what you do next decides whether the project stays defensible.

How do you keep a Facebook email scrape compliant and useful?

Keeping a Facebook email scrape compliant comes down to collecting only published business contacts and documenting why you are allowed to use them, because the email is personal data from the moment you store it. The technical part is easy once the legal part is settled, so settle it first.

Handled this way, a Facebook email scrape is a narrow, honest tool: it turns the contact addresses businesses already chose to publish into a structured column, and it stops at the line where public data becomes private. The methods above return that column from any public Page. The discipline around it, the lawful basis, the business-only scope, and the anti-spam rules on the send, is what keeps the column worth having.

FAQ

Can you scrape emails from a Facebook personal profile?

No, not reliably or safely. A personal profile's email is gated behind the login and the person's privacy settings, so a logged-out request never returns it, and reaching it through a logged-in session runs into Meta's Automated Data Collection Terms. The only Facebook email you can collect cleanly is one a Business Page has chosen to display publicly in its Contact info. A personal address is also personal data under the GDPR, so collecting it at scale carries the highest privacy risk covered here.

How do I find the email on a Facebook Page manually?

Open the Page, click About (or the Intro panel on the left), and look under Contact info for an Email line. Many Pages list only a website, a phone number, or a Messenger link there instead, because the email field is optional and the owner decides whether to publish it. If no email is shown, there is nothing to scrape, because a scraper can only read what the Page already displays to a logged-out visitor.

Can I scrape emails from a Facebook group?

There is no route to a group's member email list. Meta deprecated the Groups API in April 2024, so no official API returns group content, and member emails sit behind the login and privacy settings regardless. You can only collect an address a group admin published on the group's linked Business Page. Member email lists are exactly the kind of personal contact data that draws GDPR and CCPA duties.

Is it legal to scrape emails from Facebook for cold outreach?

It depends on the data and how you use it, and there are three layers. Meta's terms prohibit automated collection without written permission, an email is personal data under the GDPR so you need a lawful basis to process it, and the actual sending is governed by anti-spam law such as the US CAN-SPAM Act. Published business contact addresses are the defensible scope. Public visibility does not make an email free to harvest and mail at volume, and this is general information, not legal advice.

Why does my Facebook email scraper return nothing?

Two common reasons. First, Facebook renders the Contact info block with JavaScript and stores it inside a __bbox JSON blob in the logged-out shell, so a naive HTML regex misses it or returns unrelated strings. Second, the Page may simply not publish an email at all. A header quirk adds to it: in my tests a desktop Chrome User-Agent returned HTTP 400 on facebook.com while sending no User-Agent returned HTTP 200, so the request shape changes what you get back.

NB
Noah Berg
I've built Facebook data pipelines for years. On facebookscraperapi.com I run Facebook scraping methods against live pages and publish what actually holds up.