Facebook Posts Scraper - Public Page Posts, No Login
Pricing
from $1.99 / 1,000 posts
Facebook Posts Scraper - Public Page Posts, No Login
Pricing
from $1.99 / 1,000 posts
Rating
0.0
(0)
Developer
Lantern Lab
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Security
Limited permissionsShare
Give it Facebook Page URLs or names and get each Page's public posts back: text, publish time, reaction, comment and share counts, photo and video links, and the Page's name and IDs. No Facebook login, no cookies, no account of your own. $1.99 per 1,000 posts plus $0.005 per run. See Pricing.
What makes it different
- Your limit is a hard limit.
maxPostsis never exceeded, and you are never charged for more posts than you asked for. - No duplicates. Posts are deduplicated across the whole run by Facebook's own post ID; a Page given twice is read once.
- Blocked, missing and failed is free - and labelled. Every input gets a free
input_statusrow. A Page Facebook hides behind its login page, one that does not exist, or one cut short by a limit is markedpartial: true(andblocked: truewhen Facebook refused us) with a reason - never reported as "zero posts". - The date filter works.
newerThankeeps only posts published since that date; older posts are skipped and not charged. - Real timestamps.
publishedAtis Facebook's own publish time;collectedAtis when this run read the post.
Input
{"startUrls": [{ "url": "https://www.facebook.com/nike" }],"pages": ["bbcnews"],"maxPosts": 20,"newerThan": "30 days"}
| Field | What it does |
|---|---|
startUrls | Page URLs: https://www.facebook.com/nike, https://www.facebook.com/profile.php?id=<number>. |
pages | Page names instead of URLs: nike, @bbcnews, or a numeric Page ID. |
maxPosts | Posts per Page, newest first. Default 20, up to 1,000. |
newerThan | 2026-10-01, an ISO time, or 7 days / 2 weeks / 3 months. |
maxUpstreamRequests | Optional hard ceiling on requests. By default the Actor works one out from your input, so a run is never unbounded. |
proxyConfiguration | Proxy for each Page's first request (Apify datacenter by default). Timeline requests always use Apify residential proxy, the only IPs Facebook answers them on. |
Output
Every row has a recordType. Dataset views: Posts, Input status.
post
{"recordType": "post","postId": "1096426988518676","url": "https://www.facebook.com/nike/posts/pfbid02crEqAFcDiSVrDXAevm1sMzJwiCv2ajpCaWWotsSk7btboXoFe1kReAzJqBFrNvB3l","text": "Nice finishes first. @janniksin takes home his second Grand Slam title of the year. ...","publishedAt": "2024-09-08T20:38:04.000Z","publishedAtEpoch": 1725827884,"reactionCount": 9480,"commentCount": 4094,"shareCount": 1569,"viewCount": null,"media": [{ "type": "photo", "id": "1096426958518679", "imageUrl": "https://scontent-....fbcdn.net/...", "videoUrl": null }],"imageUrls": ["https://scontent-....fbcdn.net/..."],"videoUrls": [],"sharedPostId": null,"pageName": "Nike","pageProfileId": "100044541544829","pageId": "15087023444","pageUrl": "https://www.facebook.com/nike","inputValue": "https://www.facebook.com/nike","rank": 7,"partial": false,"partialReason": null,"collectedAt": "2026-10-31T14:40:12.511Z"}
reactionCountis all reactions together (Like, Love, Haha, ...), as Facebook shows it.commentCountandshareCountare Facebook's own totals; comment text is not collected.medialists each photo and video with its Facebook media ID:imageUrlis the photo (or the video's thumbnail),videoUrlthe playable video file where Facebook gives one to logged-out visitors. Links only - nothing is downloaded. Facebook's media links expire after some days.viewCountis filled only where Facebook shows it logged-out, otherwisenull. No field is ever estimated: what Facebook does not show isnull.pageProfileIdis the ID Facebook's timeline is keyed on;pageIdis the classic numeric Page ID where Facebook gives one.
input_status (free) - one per input: pageName, pageId, postsReturned, rowsCharged, duplicatesSkipped, olderSkipped, partial, blocked, partialReason and a plain-English statusText.
RUN_SUMMARY (free) - the last row, and the same object in the key-value store: totals, incomplete inputs by reason, requests sent, and why the run stopped if it stopped early.
Partial reasons
partialReason | blocked | Meaning |
|---|---|---|
login_wall | yes | Facebook sent us to its login page: the Page does not exist under that name, is a personal profile, or is age- or region-restricted. |
blocked | yes | Facebook rate-limited or refused the requests, also on fresh IPs. Not an empty result. |
not_available | no | Facebook says "This content isn't available right now": the Page was deleted, never existed, or is shown only to some people. |
invalid_input | no | Not a Facebook Page name or URL (for example a different website, a group or an event). Nothing was requested. |
upstream_error / unexpected_shape | no | A request failed, or the answer was not in a shape the Actor knows. Not an empty result. |
upstream_request_cap | no | The run reached maxUpstreamRequests. |
charge_limit_reached | no | The maximum charge you set for the run was reached. |
not_collected | no | The run stopped before reaching this input. |
Limits, stated up front
- Public Pages only, no login. Personal profiles, groups, events, Marketplace, Stories and anything that needs a Facebook account are out of scope.
- Comments are counted, not collected. This Actor returns each post's comment count, not the comments themselves.
- Order. Posts come in the order Facebook's timeline lists them to a logged-out visitor: newest first, with now and then an older post in between. Pinned posts are left out by Facebook in this view.
- End of the list. When Facebook stops listing a Page's posts to logged-out visitors before
maxPosts, the Page'sstatusTextsays so. - Speed. Facebook gives 3 posts per request, so 100 posts take about 34 requests.
Pricing
Pay per result: $1.99 per 1,000 posts, plus $0.005 per run (start fee). A result is one post row. input_status rows, the run summary, duplicates, posts older than newerThan, and anything a Page could not return are free, so a blocked, missing or empty Page costs nothing beyond the start fee. Example: 10 Pages x 50 posts = 500 posts = $0.995 + $0.005.
How it works
Plain HTTP requests to the same public endpoints Facebook's own logged-out Page view uses: the Page itself (name, IDs and newest post), then the Page timeline's next pages, 3 posts at a time, through Apify residential proxy. A rate-limited request is retried on a new IP. No browser, no login, no cookies of your own.