Facebook Page API: page details with email, phone and address as JSON
The Graph API returns a page's public fields only for pages you manage or after app review for public metadata. This endpoint returns the public details of any page or profile, contact details included, the way a signed-out visitor sees the page. One call per list of pages, JSON back, no Facebook account.
What the Graph API gives you today
Fields such as about, emails, phone, website, location, fan_count and followers_count exist on the Page object, but reading them for pages you do not administer requires the Page Public Metadata Access feature, granted after app review with a use-case description. Rate limits apply per app. For lead lists, directories or research across many pages, most developers never get through the review.
The endpoint
One HTTP call. The synchronous form waits for the run and returns the records in the same response (fine for up to a few minutes of work); the asynchronous form returns a run id at once and you read the dataset when it has finished, with webhooks if you want a callback.
Synchronous
curl -X POST "https://api.apify.com/v2/acts/alfalfa~facebook-pages-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN&format=json" \
-H 'Content-Type: application/json' \
-d '{"startUrls": [{"url": "https://www.facebook.com/shakeshack"}, {"url": "https://www.facebook.com/tacobell"}], "scrapeAbout": true}'
Asynchronous
# start the run (returns immediately with the run id and dataset id)
curl -X POST "https://api.apify.com/v2/acts/alfalfa~facebook-pages-scraper/runs?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' -d '{"startUrls": [{"url": "https://www.facebook.com/shakeshack"}, {"url": "https://www.facebook.com/tacobell"}], "scrapeAbout": true}'
# read the results when the run has finished (JSON, CSV or XLSX; paginate with offset and limit)
curl "https://api.apify.com/v2/datasets/<defaultDatasetId>/items?token=$APIFY_TOKEN&format=json&offset=0&limit=1000"
Python
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("alfalfa/facebook-pages-scraper").call(run_input={
"startUrls": [
{
"url": "https://www.facebook.com/shakeshack"
},
{
"url": "https://www.facebook.com/tacobell"
}
],
"scrapeAbout": true
})
items = list(client.dataset(run.default_dataset_id).iterate_items())
print(len(items), items[0])
JavaScript
import { ApifyClient } from 'apify-client'; // npm install apify-client
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('alfalfa/facebook-pages-scraper').call({"startUrls": [{"url": "https://www.facebook.com/shakeshack"}, {"url": "https://www.facebook.com/tacobell"}], "scrapeAbout": true});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);
Request fields
| Field | Type | Meaning |
|---|---|---|
startUrls | array | Page or profile URLs; sub-pages like /about are resolved to the page. The official pages field is accepted too. |
scrapeAbout | boolean | Read the full About text into about_me ($2 per 1,000 pages that have one). On by default to match the official output. |
scrapeTransparency | boolean | Page transparency block: creation date, ad status, confirmed owner. |
includeFailedPages | boolean | Return a record with error for pages that could not be read instead of skipping them. |
Response fields
One JSON object per record. Field names are the ones the official Apify Actor uses, so code written for it works unchanged.
| Field | Meaning |
|---|---|
title, pageName, pageId, pageUrl, facebookUrl | Name, handle, ID and URL. |
email, phone, website, websites, address, messenger | Contact details as the page publishes them. |
categories, info, intro, about_me, services, hours, priceRange | What the page is and when it is open. |
likes, followers, rating, ratingCount, isVerified | Size and reputation. |
profilePictureUrl, coverPhotoUrl, alternativeSocialMedia, pageAdLibrary, pageTransparency | Images, other social profiles, Ad Library and transparency info. |
Limits, pagination, scheduling
- The synchronous endpoint cuts off after about five minutes; for large jobs use the asynchronous one and read the dataset in pages (
offsetandlimit, up to 1,000 per page, orformat=csvfor a file). - Runs can be scheduled on the platform (cron), triggered by webhook, and called from n8n, Make, Zapier or an AI agent through MCP.
- Set a maximum budget per run in the Actor settings; the run stops at the limit and never overshoots.
- Public data only: what a visitor without a Facebook account can see. Groups, Marketplace and private profiles are out of scope.
Pricing
$3.50 per 1,000 pages with contact details included, no start fee; the full About text is an optional $2 per 1,000 pages that have one. Platform usage and residential proxies are included; you pay only for records written to the dataset. The Apify free plan includes $5 of usage a month, enough to try it properly.
Questions people ask
Can I get a page's email through the Graph API?
Only for pages you administer, or after app review for the Page Public Metadata Access feature. This endpoint reads the public page and returns the email, phone, website and address the page itself publishes.
How many pages publish an email?
Roughly a third of business pages show one publicly; phone and website are more common. The response has null where the page publishes nothing.
Does it work for personal profiles?
Yes, for the public part of a profile: name, intro, follower count, links. Private fields are not visible to a signed-out visitor and are not returned.
What does it cost?
$3.50 per 1,000 pages including contact details, no start fee. Apify sells the page data and the contact data as two separate Actors at $12 and $13 per 1,000.