Facebook Profile Viewer: What an API Returns, and What It Will Not
The scraper whose docs say it refuses personal profiles returned one anyway. Its two follower counts for that person differed by one.

Copy this line to your agent to read a public Facebook page.
set up https://monid.ai/SKILL.md and use apify /apify/facebook-pages-scraper for a public page
On 2026-09-18 we ran a scraper whose own documentation says it does not work on personal profiles, against a personal profile. It returned a record. Inside that record were two different follower counts for the same person, one field apart, differing by exactly one. This guide is about what a Facebook profile lookup actually gives you, what it never will, and the field-level surprises in between. It runs through Monid, the OpenRouter for agent tools.
Can an API view a Facebook profile?
It can return what a logged-out visitor would see on a public page or a public-figure profile. That is the whole boundary, and most of what is marketed under this phrase sits outside it.
What "viewer" usually means in search results
Two things that do not exist. Tools claiming to open private profiles, and tools claiming to tell you who looked at yours. Facebook has never exposed profile visitors to anyone, including the profile owner, and no third party can read a private profile without credentials it should not have. Anything offering either is selling a screenshot, a survey wall, or worse.
What actually exists
Endpoints that fetch public surfaces and parse them into JSON. A brand page. A public-figure profile. Public posts. If a logged-out browser can see it, an endpoint can return it, and if it cannot, no endpoint can either.
Why that is still worth having
Because parsing it yourself is the expensive part. A page carries follower counts, categories, contact details, rating summaries and advertising status, and turning that into reliable fields at volume is the work. The measurement below is what you get for one call.
📖 See also What Is the Best Instagram API in 2026?
What does a public profile lookup actually return?
Twenty-nine fields on a brand page, and a different, smaller set on a personal profile.
The brand page
apify/apify/facebook-pages-scraper on a public clothing brand's page, 10.8 seconds, one record billed:
followers 1,979,108
likes 0
categories ["Page", "Clothing (Brand)"]
phone "(800) 638-6464"
website "http://www.patagonia.com/"
rating "52% recommend (4,289 reviews)"
Plus pageId, pageName, intro, creation_date, ratingOverall, ratingCount, profilePictureUrl, coverPhotoUrl, messenger, ad_status, confirmed_owner and pageAdLibrary, for twenty-nine keys in total.
Two things to notice before you build on it. rating is a sentence, not a number, so parse it or read ratingOverall and ratingCount instead. And likes is zero on a page with nearly two million followers, because Facebook separated likes from follows years ago and the field survives as a zero rather than being removed.
The advertising fields are the underrated ones. ad_status and pageAdLibrary tell you whether a page is currently running ads, which is a competitive signal you would otherwise go looking for separately, as in the Google Ads guide.
The personal profile
The same endpoint's schema states plainly that it only works on pages, "not personal profiles (not even public ones)". We pointed it at a public figure's profile anyway. It returned a record in 11.2 seconds:
categories ["Profile", "Public figure"]
title "Mark Zuckerberg"
pageName "zuck"
pageId "4"
followers 121,349,928
likes 0
website undefined
rating undefined
The documented limitation did not hold for a public-figure profile. The fields that are page-specific came back undefined rather than erroring, and categories correctly identified what it was looking at.
The lesson is not that the docs are bad. It is that a schema describes what a provider intends to support, and only a run describes what it does. Test the shape you actually need rather than ruling it out on a sentence.
How do you pull public Facebook data on one key?
Two actors, and choosing between them is most of the work.
For agents
Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:
set up https://monid.ai/SKILL.md
It learns the whole discover, inspect, run workflow itself. More in the agent quickstart.
For humans
npm install -g @monid-ai/cli
monid keys add -k <your-api-key> -l main
Step 1. Pages, with everything attached
The endpoints. apify/apify/facebook-pages-scraper, per result, takes startUrls as an array of objects.
monid run -p apify -e /apify/facebook-pages-scraper \
-i '{"startUrls": [{"url": "https://www.facebook.com/patagonia/"}]}'
What comes back. The twenty-nine field record above. One result per input URL, so cost scales with the list, and about ten seconds per call.
Step 2. Profiles, with a mode to choose
The endpoints. apify/cleansyntax/facebook-profile-posts-scraper, per result, takes an endpoint mode and targets one per line.
The mode enum has six values and they are not interchangeable:
| Mode | What it returns |
|---|---|
details_by_url | Profile details from a profile URL |
details_by_id | The same from a numeric id |
profile_id_by_url | Just the id, for resolving |
profile_posts_by_url | Posts from a profile URL |
profile_posts | Posts from an id |
search_posts_by_keyword | Posts matching a keyword |
monid run -p apify -e /cleansyntax/facebook-profile-posts-scraper \
-i '{"endpoint": "details_by_url", "urls_text": "https://www.facebook.com/zuck"}'
What comes back. On our run, four fields: name, profile_id, url and image. Considerably less than the page actor returned for the same subject, which is the opposite of what the naming suggests.
Watch the billing shape. This actor is billed per returned record and the post cap applies to each target line, so total results are roughly the number of targets multiplied by the cap. A hundred profiles at fifty posts each is five thousand records, not a hundred.
Step 3. Pick by output, not by name
The page actor gave twenty-nine fields on a profile it claims not to support. The profile actor gave four. Run both once against your real target type and choose on what came back.
Give this to your agent![]()
Set up https://monid.ai/SKILL.md, and then use Monid to for each of these public Facebook pages, return follower count, categories, whether it is currently running ads, and the rating count, and flag any page where the followers field and the info text disagree.📖 See also Brand Name to Competitor Ad Archive
Why did one response report two follower counts?
Because one is a parsed integer and the other is display text, and they were read at different moments from different parts of the page.
The two numbers
followers 121349928 <- a field
info[0] "Mark Zuckerberg. 121,349,927 followers" <- a string
One apart. Both from the same response, the same call, the same second.
What is actually happening
A scraper reads a rendered page. The follower figure appears in more than one place on that page, and Facebook's counters are served from a cache that updates continuously. One region of the page was rendered a moment before the other. For an account gaining followers constantly, a moment is one follower.
Why this is a design problem and not a curiosity
Pick one field and never mix them. If some rows in your store came from followers and others were parsed out of info, your history has a systematic wobble that looks like real movement.
Never diff across sources. A one-follower change is meaningless here, but the same mechanism produces larger gaps on faster-moving accounts, and an alert on "follower count changed" will fire on rendering noise.
Treat the integer as authoritative. It is the parsed field the actor is designed to populate. The info array is the page's own prose, useful for the things that have no field of their own, such as "1,209,270 talking about this", and unreliable as a number.
This is the same pattern as the two follower counts in one TikTok response, one rounded and one exact, measured in the TikTok profile guide. Social platforms routinely serve more than one version of the same counter, and an API that faithfully returns the page faithfully returns the disagreement.
Which endpoint should I use for which job?
| Endpoint | What it does | Input | Output | Best for | Billing |
|---|---|---|---|---|---|
apify/apify/facebook-pages-scraper | Public page details | startUrls array | 29 fields including ads status | Brand pages, and public figures too | Per result |
apify/cleansyntax/facebook-profile-posts-scraper | Profile details or posts | endpoint mode, targets | 4 fields, or post lists | Posts, and id resolution | Per result |
ploid/socials | Resolve a public profile from a handle | Handle or URL | Resolved profile | Cross-platform identity | Per result |
apify/apify/facebook-posts-scraper | Posts from a page | Page URLs | Post records | Content monitoring | Per result |
hunterio/companies/find | The company behind the page | domain | Firmographics | Turning a page into a company | Per call |
Every row was verified with monid inspect on 2026-09-18. The table gives billing shape rather than figures, because shape drives design and current numbers live on monid.ai/tools.
The last row is the useful pivot: a page carries a website, and that website is a better key for everything downstream than the page is.
When is there no API answer at all?
Four cases, and the first two are most of the search traffic for this phrase.
A private profile. There is no endpoint, at any price, from any vendor, that returns a private Facebook profile. Privacy settings are enforced server side. Anything advertising otherwise is either lying or asking you to hand over credentials, and both end badly.
Who viewed your profile. Facebook does not collect this in a form anyone can query, including you. Every tool claiming it is fabricating a list, usually from your own friends.
Personal contact details of individuals. A business page publishes a phone number because the business chose to. An individual's contact information is not on this surface and should not be assembled from it. The legitimate route to business contacts is a consented B2B dataset, which is what the prospecting guide measures, and it deals in work addresses at companies rather than personal profiles.
Anything needing an account. Friends lists, group membership, private posts and anything behind a login are out of reach, and if a tool returns them it is using someone's session, which puts that account at risk and you along with it.
And the disclosure: this is Monid's blog and we resell the endpoints in the table. We are also telling you that the most-searched version of this request cannot be fulfilled by us or anyone, which is the honest answer rather than the commercial one.
Conclusion
A Facebook profile viewer, in the sense the phrase is usually meant, does not exist. What exists is a pair of endpoints that return the public surface as structured fields, and on 2026-09-18 they returned twenty-nine fields for a brand page and, contrary to the documentation, a working record for a public-figure profile as well. The page actor was the better profile reader than the profile actor, which you would only discover by running both.
What matters more than which actor is which field you trust. One response carried the same follower count twice, as a parsed integer and as display text, off by one, because a live page serves its counters from more than one place. Pick the integer, never mix sources within a series, and remember that likes reading zero next to two million followers is a field Facebook retired rather than a page with no support.
Free next step: run monid inspect -p apify -e /apify/facebook-pages-scraper and read the schema line about personal profiles, then run it against one and see what comes back. The gap between those two is the most useful thing you will learn today. Start at monid.ai.
FAQ
Can any API show me a private Facebook profile?
No. Privacy settings are enforced on Facebook's servers, so a profile set to private returns nothing to a logged-out request regardless of which vendor makes it. Every product advertising private profile access is doing one of three things: showing you the small amount that is public anyway, running you through a survey or download that never delivers, or asking for login credentials so it can use your session, which violates the platform terms and puts your account at risk. The honest boundary is simple. If you cannot see it in a logged-out browser, no endpoint can return it.
Can I find out who viewed my profile?
No, and this one is not a limitation of third-party tools but of the data itself. Facebook does not expose profile-visitor information to anyone, the profile owner included, and has said so consistently for years. Tools promising it generate a plausible list, usually from people you interact with most, which feels accurate and is invented. There is no endpoint in our catalog for this because there is nothing to call.
Should I use the Graph API instead of a scraper?
Use the Graph API when you own or manage the page, because then you get authoritative numbers, historical insights and engagement breakdowns that no public surface exposes, and you get them under a supported agreement. Use a scraper when the subject is a page you do not control, which is every competitive and research use, since the Graph API will not hand you another business's page data. The two are not alternatives so much as different sides of a permission boundary, and the fields differ accordingly: your own insights are far richer than anything visible from outside.
Why was likes zero when followers was nearly two million?
Because Facebook separated the two concepts. Liking a page and following it used to be one action and are now distinct, with follows being what drives the feed, so most pages carry a large follower count and a likes value that is no longer maintained. The field still appears in the response, which is faithful to the page, and it came back as zero on both a brand page and a personal profile in our run. Read followers. If you have historical data with a populated likes field, do not compare it to anything collected recently, because the underlying meaning changed rather than the number.
Last updated September 2026.


