One URL in. Clean JSON out.
Give this endpoint the URL of a public Facebook post and it returns the engagement counts, the post text, the timestamp and the page that published it, as JSON. Nothing to register, nothing to get approved, and no admin rights on the page you are asking about. 5 credits per post.
The difference
On the left, what a headless browser hands you. On the right, what the endpoint hands you.
<div class="x1yztbdb x1n2onr6 xh8yej3" data-visualcompletion="ignore"><div class="x78zum5 xdt5ytf"><div dir="auto" class="xdj266r x11i5rnm x1mh8g0r">Weekend build: three settings we changed after your feedback</div></div><div class="x9f619 x1ja2u2z x78zum5"><span class="xt0b8zv x1jx94hy" aria-label="5.2K reactions"><i data-visualcompletion="css-img"></i></span><span class="x193iq5w">331 comments</span><span class="x1s688f">128 shares</span></div><abbr data-utime="1751630400" class="x1i10hfl">3d</abbr><script>requireLazy(["CometResourceScheduler"],function(f){f().schedule({"__bbox":{"require":[["adp_Comet... {"data": {"platform": "facebook","entity_id": "1093831344793765","url": "https://www.facebook.com/watch/?v=1093831344793765","author": {"handle": "facebook","name": "Example Creator"},"posted_at": "2026-06-30T14:05:00Z","metrics": {"views": 1204593,"likes": 88410,"comments": 2314,"shares": 10092}},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
One object per post. You get the reaction, comment and share counts, the video view count when the post carries video, the post body text, an ISO publish timestamp, the publishing page's id and name, and a thumbnail URL when Facebook attaches media to the post.
The counters are the public figures Facebook renders on the post itself. That is a meaningful distinction on this platform: Facebook's own Insights, which only the page owner can see, reports reach, impressions and paid versus organic breakdowns. None of that is public and none of it appears here. What you get is what a logged-out visitor sees.
One more Facebook-specific quirk worth stating up front. The `likes` field carries the total reaction count, not strictly the thumbs-up count. Facebook has folded love, care, haha, wow, sad and angry into one visible tally in most surfaces, and that combined number is what lands in `likes`. There is no per-reaction breakdown in this response.
Total reactions on the post, all reaction types combined. Not broken out by type.
Pricing
One post is 5 credits — about 2.5¢ on the monthly plan. $5 covers roughly 200 posts, and calls that fail on a private or deleted post are never charged.
Estimate only, on a full-year basis. 5 credits per returned post. Monthly: $5 per 1,000 credits with $4/1,000 top-ups. Annual: $54 per 12,000 credits with $3/1,000 top-ups. We show whichever plan is cheaper for your annual volume, divided by 12. Failed calls are never charged; cache hits cost the same as fresh calls.
Entry price, side by side
Credits are not equivalent units across vendors — each meters differently. Price your own workload on both before deciding on entry price alone. At high volume, several of these are cheaper per credit than we are.
Engineering notes
We document exactly how every endpoint behaves — nulls, caching, billing — so what you ship on day one is still running in month six. No surprises, no support tickets.
Facebook exposes the same post under several shapes: /permalink.php?story_fbid=…, /{page}/posts/{id}, /photo.php?fbid=…, /watch/?v=… and the /share/p/… links the mobile app copies. Pass the URL as you got it. If a call fails on a share link, open it once in a browser and pass the permalink it lands on.
Group and event posts are inconsistent. Public groups sometimes resolve, closed groups never do. Do not build a pipeline that assumes group URLs will work.
Facebook renders different counters depending on post type and page settings. A photo post has no `views`. A page can suppress its share count. A link post may have no `thumbnail`. Treat every field except `id` as optional and your code will survive.
The one hard failure mode is visibility: a post that requires a login, a friends-only profile post, or a deleted post returns an error rather than a half-filled object. Failed calls are not charged.
If your analysis depends on distinguishing an angry reaction from a love reaction — sentiment work, crisis monitoring — this endpoint will not give you that. It returns the combined total. Comment text is usually the better sentiment signal on Facebook anyway, and that lives on the Facebook Comments API.
This endpoint uses the fast cache class. Ask for the same post twice inside that window and the second response arrives in milliseconds carrying x-cache: hit — at the full 5 credits, because the cache is there for speed and not as a discount. fresh=true forces a live fetch; it earns its keep on the first read of a polling cycle and rarely anywhere else.
We read Facebook logged out, the same way any visitor does. No credentials, no session, no private data. If a human without an account cannot see the post in a browser, this endpoint cannot see it either. That is a design constraint, not a bug to route around.
Questions
Send a GET to /v1/facebook/stats with the post URL and your API key. The Graph API requires a Facebook app, a page access token and App Review for most permissions, and even then it only reads pages you administer. This endpoint reads the public post page instead, so it works on any post you can open in a logged-out browser, including competitors' pages.
Because Facebook displays them as one figure. The `likes` field carries the total reaction count across all six reaction types plus thumbs-up. There is no public per-reaction breakdown on a post page, so we do not invent one. If you need reaction sentiment specifically, the comment text from the Facebook Comments API is a more honest source.
No. Reach and impressions are Insights metrics, visible only to the page owner inside Meta Business Suite or through the Graph API with an admin token. They are not rendered on the public post, so no public-data endpoint can return them. This endpoint returns reactions, comments, shares and video views — the counters anyone can see.
5 credits per post. At $0.005 per credit on the monthly plan that is 2.5 cents a call, or $0.0225 on annual. Cached responses cost the same as fresh ones. Calls that fail — private post, deleted post, unreachable URL — are not charged at all.
It works on any post that is publicly visible, which in practice means most page posts and the subset of profile posts set to Public. Friends-only and private posts return an error. Group posts are unreliable: some public groups resolve, closed groups never do. If you are working with pages specifically, the Facebook Page Posts API is the better starting point.
Because the post has no video. Facebook only shows a view counter on video and Reel posts, so photo, link, status and album posts return null there. That is the platform's behaviour, not a gap in the data. Check for null rather than defaulting to zero, or your averages will be wrong.
One URL per call. Run them in parallel — the calls are independent and the API is built for concurrent traffic. If you are starting from a page rather than a list of URLs, the Facebook Page Posts API returns up to `limit` recent posts in one call, which is cheaper per post than fetching each one here.
Next
100 trial credits on signup — no card, key on screen immediately.