Facebook Page scraper API: likes, followers and bio as JSON
A Facebook Page scraper API that returns a public Page's name, bio, image, likes, followers and talking-about count as JSON for 1 credit. No posts.
By Scrape Everything team · · 11 min read
Last updated: October 21, 2026
TL;DR: The Scrape Everything Facebook Page scraper API takes a Page username, numeric ID or facebook.com URL and returns the Page's name, bio, profile image, like count, follower count and talking-about count as JSON, for 1 credit per lookup. It reads public Page metadata only. It does not return posts, comments or anything behind a Facebook login.
That's the whole Facebook product, and we'd rather tell you now than after you sign up. Need Page sizes for a lead list or a competitor sheet? One HTTP call per Page. Need a Page's posts? You want Meta's Graph API; there's a section below on when to switch.
What does the Facebook Page scraper API return?
A Facebook Page scraper API returns the public metadata of Facebook Pages and profiles (name, bio, image and Page counts) as JSON from a Page username.
Ours is a synchronous REST endpoint: you POST a username and get the JSON back in the same response, with no job to start and no dataset to poll. It reads the Open Graph tags (og:title, og:image, og:url, og:description) on the public Page preview, the same tags apps read to build a link preview. Every uncached call fetches the Page live. If you pass cache_days, a repeat lookup inside that window (up to 14 days) is served from cache for free.
You get eight fields:
| Field | Type | Can be null? | What it is |
|---|---|---|---|
username | string | No | Echo of the vanity name or ID you sent |
name | string | No | Page or profile name (og:title) |
like_count | integer | Yes | Page likes |
follower_count | integer | Yes | Page followers |
talking_about_count | integer | Yes | "People talking about this" |
bio | string | No | Description text, empty string if there is none |
profile_url | string | No | Canonical URL (og:url) or a constructed one |
profile_image_url | string | Yes | Profile image (og:image) |
The counts are nullable for a reason: they exist for public Pages only. Personal profiles usually sit behind Facebook's login wall, and when one is visible to logged-out visitors you get the name, bio and image with null counts.
What it doesn't return:
- Posts, reels, photos or videos
- Comments or reactions
- Page admin data, ad data or Insights
- Anything from Groups, Events or Marketplace
- Pages that require a login to view
How do I get a Facebook Page's likes and followers from a username?
One POST request, 1 credit. The username parameter accepts a vanity name (example_brand), a numeric Page ID, or a full https://www.facebook.com/... URL, so you can paste whatever your spreadsheet already has.
- Create an account at /login with Google or GitHub. New accounts get 100 free credits, no payment details needed.
- Copy your API key (it starts with
ssk_live_) and export it asSCRAPEEVERYTHING_API_KEY. - Send a POST to
https://api.scrapeeverything.com/v1/facebook/profilewith a JSON body containingusername. - Read
data.like_count,data.follower_countanddata.talking_about_count, and checkmeta.credits_chargedif you track spend.
cURL
curl -X POST https://api.scrapeeverything.com/v1/facebook/profile \
-H "Authorization: Bearer $SCRAPEEVERYTHING_API_KEY" \
-H "Content-Type: application/json" \
-d '{"username": "example_brand"}'Response (trimmed)
{
"success": true,
"data": {
"username": "example_brand",
"name": "Example Brand",
"like_count": 18450,
"follower_count": 21300,
"talking_about_count": 312,
"bio": "Handmade ceramics from a small studio. Shipping worldwide.",
"profile_url": "https://www.facebook.com/example_brand",
"profile_image_url": "https://scontent.xx.fbcdn.net/v/t39.30808-1/placeholder.jpg"
},
"meta": {
"request_id": "req_placeholder123",
"scraper": "facebook.profile",
"cached": false,
"cached_at": null,
"credits_charged": 1,
"credits_remaining": 99
}
}The values are placeholders; the shape is real. Full field docs are on the Facebook endpoint reference.
Are the follower counts exact or rounded?
Exact. Facebook writes the counts into the preview's description as full numbers with thousands separators, not as "21K", and we convert that text to an integer. If a count isn't there in that form, the field comes back null. We'd rather hand you a null than a guess.
What's the difference between likes and followers?
A like is the older "fan" relationship; a follow puts the Page in someone's feed. Meta has been folding them together: its Graph API Page reference says that for Pages on the New Pages Experience, fan_count returns followers_count. So don't be surprised when the two numbers match. If you only store one, store follower_count.
How do I enrich a list of brand Pages with follower counts?
This is the job we built it for. You have a CSV of companies (a trade show list, a CRM export) with a Facebook URL column, and you want to know which ones have an audience worth talking to.
This script reads pages.csv, calls the API for each row and writes pages_enriched.csv. It needs requests and nothing else.
import csv
import os
import time
import requests
API_URL = "https://api.scrapeeverything.com/v1/facebook/profile"
HEADERS = {
"Authorization": f"Bearer {os.environ['SCRAPEEVERYTHING_API_KEY']}",
"Content-Type": "application/json",
}
FIELDS = ["name", "like_count", "follower_count", "talking_about_count", "bio", "profile_url"]
def lookup(page: str, attempts: int = 3) -> dict:
for attempt in range(attempts):
# cache_days=7: re-running the script within a week costs 0 credits per cached Page
resp = requests.post(
API_URL,
headers=HEADERS,
json={"username": page, "cache_days": 7},
timeout=90, # we retry through other proxies server side, so give it time
)
if resp.status_code == 429:
# RateLimit-Reset is the number of seconds until the window resets
time.sleep(int(resp.headers.get("RateLimit-Reset", 10)))
continue
try:
body = resp.json()
except ValueError:
body = {}
if body.get("success"):
return {k: body["data"].get(k) for k in FIELDS}
if resp.status_code in (502, 503, 504) and attempt < attempts - 1:
time.sleep(2 ** attempt) # one short backoff, then accept the answer
continue
return {"error": body.get("code", str(resp.status_code))}
return {"error": "RATE_LIMITED"}
with open("pages.csv", newline="", encoding="utf-8") as src, \
open("pages_enriched.csv", "w", newline="", encoding="utf-8") as dst:
reader = csv.DictReader(src) # expects a column named facebook_url
writer = csv.DictWriter(dst, fieldnames=reader.fieldnames + FIELDS + ["error"])
writer.writeheader()
for row in reader:
row.update(lookup(row["facebook_url"]))
writer.writerow(row)Before you run it:
- Don't parse the URL yourself. The endpoint accepts the full facebook.com URL, so pass the column straight through.
- Keep the
errorcolumn. A row that came backTARGET_BLOCKEDtells you something: the Page doesn't exist or isn't visible without a login. For lead scoring, that's a signal in itself. - Read
talking_about_countnext to followers. Our rule of thumb: 40,000 followers and a talking-about count near zero means an audience with nobody posting to it. - The script runs one request at a time on purpose. Limits apply to your whole account, and every key shares them. The defaults at the time of writing are 60 requests per minute and 5 concurrent until your purchases total $39 (a Builder pack or larger does it at once), then 300 per minute and 20 concurrent. The rate limits page always has the live numbers.
Got Instagram handles in the same sheet? Same key, same request style: see the analytics and CRM enrichment use case and our guide to scraping Instagram profiles with an API.
How do I compare competitor Facebook Page sizes over time?
The second common job: track 10 to 50 competitor Pages every week and chart follower growth. The API returns a snapshot, so the history is yours to keep. Run a job on a schedule, append one row per Page per run with a date, and the trend falls out of the data.
Here's the Node version (Node 18+, built-in fetch, no dependencies):
const pages = ["example_brand", "rival_brand", "another_rival"];
async function snapshot(page) {
const res = await fetch("https://api.scrapeeverything.com/v1/facebook/profile", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SCRAPEEVERYTHING_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ username: page }),
signal: AbortSignal.timeout(90_000),
});
const { success, data, code } = await res.json().catch(() => ({}));
if (!success) return { page, error: code ?? `HTTP ${res.status}` };
return {
page,
date: new Date().toISOString().slice(0, 10),
followers: data.follower_count,
likes: data.like_count,
talking_about: data.talking_about_count,
};
}
// one at a time, so a longer list stays inside your account's concurrency limit
const rows = [];
for (const page of pages) rows.push(await snapshot(page));
console.table(rows);Save it as snapshot.mjs so top-level await works, then run node snapshot.mjs. Rather not babysit a cron job? Build it as an n8n workflow with the n8n-nodes-scrapeeverything node. Agencies running this for clients will find more in the agencies use case.
No cache_days here, on purpose: trend tracking wants live numbers. For enrichment a week-old count is fine, so caching saves credits. See the caching docs.
Can I still get fan_count from the Graph API without a token?
No. Every Graph API call needs an access token. For a published Page you don't manage, Meta's Page reference lists an app or user access token combined with the Page Public Content Access or Page Public Metadata Access feature, and it says reads of fan_count can use either one. The pages_read_engagement permission doesn't get you there, because it only covers data owned by Pages you manage. Meta's Page Public Content Access documentation adds that the feature needs App Review and business verification before your app can read live data.
If your old tokenless fan_count request stopped working, this is why. Our endpoint needs only a Scrape Everything key.
When should I use Meta's Graph API instead?
For a lot of jobs, Meta's API is the right tool. For Pages you manage, it has data we can't see.
| You need | Use |
|---|---|
| Name, bio, image, likes, followers of any public Page | Scrape Everything facebook.profile (1 credit) |
| A quick enrichment pass over Pages you don't own | Scrape Everything |
| Posts, comments or reactions from a Page | Graph API |
| Insights, reach or ad data for your own Page | Graph API (only Meta has this) |
| Publishing posts or replying to messages | Graph API |
| No Meta app, no App Review, no token refresh | Scrape Everything |
So is this a Graph API alternative? For Page metadata lookups, yes. For anything else, no. We made the same argument for Instagram in Instagram Graph API vs a scraper API, and the reasoning carries over.
How does Scrape Everything compare with Apify and Bright Data for Facebook Pages?
These are the two other names you'll meet in this search, and both cover far more websites than we do. Figures are from their pricing pages, checked October 22, 2026. Prices change, so confirm on their sites.
| Scrape Everything | Apify | Bright Data | |
|---|---|---|---|
| Pricing model | One-time credit packs, credits never expire | Monthly platform plan with prepaid usage, plus per-Actor pricing | Pay as you go per record, or monthly plans |
| Entry price (list price; credits, usage and records aren't the same unit) | $39 for 25,000 credits | Free plan with $5 of usage per month; Starter $19 per month | $1.50 per 1,000 records pay as you go (Web Scraper API) |
| Free tier | 100 credits on signup, no payment details | $5 of platform usage per month | 5,000 records per month |
| How you get data | One synchronous call, JSON in the response | Run an Actor, then read its dataset | See their docs |
| Pick it when | You want Page metadata from one call at a flat 1 credit | You need sites beyond social media, or scheduling and storage built in | You need enterprise contracts, datasets or proxy infrastructure |
Product names are trademarks of their owners; we are not affiliated with them. Figures from each vendor's public pricing page, verified October 22, 2026. Spot an error? Email [email protected] and we correct it.
On Apify, scrapers are Actors, many built by third parties, each with its own price and output. Need fields we don't return? Check that Actor's listing. Our full write-ups are at Scrape Everything vs Apify and Scrape Everything vs Bright Data.
What can't a Facebook Page scraper API get?
| Limit | What happens |
|---|---|
| Metadata only | No posts, comments, reactions, photos or videos. The data comes from the public Page preview. |
| Eight fields | No category, contact details or creation date. What's in the table above is all there is. |
| Counts for public Pages only | Personal profiles and some Page types return null for the three counts. |
| No login-gated Pages | If Facebook shows a Page only to signed-in users, we can't read it. |
| Missing and gated Pages return 502, not 404 | Both come back as 502 TARGET_BLOCKED, and you're not charged. |
| Snapshot, not history | Each call returns current numbers. Keep your own time series. |
| Unofficial | Scrape Everything is not affiliated with or endorsed by Meta. Public data only, as a logged-out visitor sees it. |
The 502 is the one that trips people up. A logged-out visitor can't reliably tell a deleted Page from one behind a login, and neither can we, so we don't guess. Before you see that error we've already retried through other proxies. Here's the response:
{
"success": false,
"message": "Facebook public data unavailable (login wall or private/non-existent profile)",
"code": "TARGET_BLOCKED",
"request_id": "req_placeholder456",
"meta": { "credits_charged": 0, "credits_remaining": 99 }
}Retry once with backoff (the Python script does), then treat the Page as gone or gated. Failed requests aren't charged, so a list full of dead Pages costs nothing. The full table of status codes is on the errors page.
Is it legal to scrape Facebook Page info?
We read only what a Page owner chose to show logged-out visitors. That doesn't settle every question. Personal profiles are personal data under laws like the GDPR, so if you store them you need a lawful basis. For most lead-gen work, stick to Pages. Meta's Terms of Service also restrict automated data collection, which is a contract question separate from access law. We're not your lawyer. Our post on whether scraping public social media data is legal walks through what to think about.
How much does it cost to look up Facebook Pages?
Every Facebook Page lookup is 1 credit. Credits come in one-time packs that never expire.
| Pack | Price | Credits | Cost per 1,000 Page lookups |
|---|---|---|---|
| Builder | $39 | 25,000 | $1.56 |
| Growth | $119 | 100,000 | $1.19 |
| Scale | $449 | 500,000 | $0.90 |
Two worked examples from those prices:
| Job | Credits | Pack that covers it |
|---|---|---|
| Enrich 10,000 trade-show leads once | 10,000 | Builder ($39) covers it and leaves 15,000 for re-runs. Re-running within 7 days with cache_days: 7 costs 0. |
| Track 50 competitor Pages weekly for a year | About 2,600 | Builder ($39) covers it about nine times over |
Cache hits are free, and failures on our side (blocks, timeouts, 5xx) are refunded automatically. Payment is crypto only. The pricing calculator works out a pack from a monthly volume, and pricing has the full breakdown, including Enterprise for 1M+ credits.
One key covers all nine platforms: Facebook, Instagram, TikTok, X, YouTube, Telegram, Spotify, Pinterest and Twitch. Prefer asking Claude "how many followers does this Page have?" to writing a script? Use the MCP server (@scrapeeverything/mcp). Endpoints are listed in the OpenAPI spec and on the Facebook scraper page.
FAQ
Can I get Facebook posts or comments with this API?
No. The Facebook endpoint returns Page and profile metadata only: name, bio, image and, for Pages, like, follower and talking-about counts. For posts and comments, use Meta's Graph API.
Do I need a Facebook developer app or access token?
No. You only need a Scrape Everything API key, sent as Authorization: Bearer ssk_live_.... There's no Meta app, App Review or token refresh involved.
What's the difference between like_count and follower_count?
like_count is the number of people who liked the Page, and follower_count is the number who follow it. Meta's Graph API now returns followers for fan_count on New Pages Experience Pages, so the two often match. If you store one, store follower_count.
Why did a Page return 502 TARGET_BLOCKED instead of 404?
From the logged-out side, a Page that doesn't exist and a Page that requires a login look the same, so the API doesn't guess. Both return 502 TARGET_BLOCKED, and you're not charged for either.
Does it work for personal Facebook profiles?
Partly. Most personal profiles sit behind Facebook's login wall and return TARGET_BLOCKED. When one is visible to logged-out visitors, you get its name, bio and image, but the count fields are null. Counts are available for public Pages only.
Run the cURL example on your own list of Pages: Get 100 free credits.