Facebook Groups Scraper - Public Group Posts, No Login
Pricing
from $0.70 / 1,000 post scrapeds
Facebook Groups Scraper - Public Group Posts, No Login
Scrape posts from public Facebook groups. Each post gives the author, text, time, permalink, photos and videos. You also get reaction, comment and share counts. You do not need a Facebook login, and no browser is used. Private groups return a note instead of posts. $0.70 per 1,000 posts.
Pricing
from $0.70 / 1,000 post scrapeds
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
85
Total users
41
Monthly active users
18 hours ago
Last modified
Categories
Share
Facebook Groups Scraper: posts from public groups, no login from you
Paste the URLs of public Facebook groups and get their posts as rows: the text, the author, the exact posting time, the permalink, the photos and videos, and the reaction, comment and share counts. No login from you, and no browser to wait on.
Public groups only, and that is the whole story on access. A private or closed group hides its posts from everyone who has not joined, so it comes back as a free note in your dataset rather than a charge.
| Input | Public Facebook group URLs |
| Output | One row per post |
| Ceiling | 1,000 posts and 20 groups per run |
| Account needed | None |
| Price | $0.70 per 1,000 posts, flat on every plan |
๐ฅ What Facebook Groups Scraper does
Give it group URLs, pick how the feed should be ordered, say how many posts you want, and press Start. Each post becomes one row with everything the group page publishes about it.
Three orderings, and they are Facebook's own, not a sort applied afterwards: New posts walks the feed by posting time, Newest activity brings up threads that were commented on recently, and Most relevant is Facebook's own ranking. For monitoring, use New posts.
There is a date window too. Give onlyPostsNewerThan a date or something like 7 days and older
posts are dropped before they are written, so you are not charged for them.
Both numeric group URLs and the handle form work.
๐ฅ What you give it
{"startUrls": [{ "url": "https://www.facebook.com/groups/dogspotting/" }],"resultsLimit": 50,"viewOption": "CHRONOLOGICAL","onlyPostsNewerThan": "7 days"}
| Field | Starts as | What it is |
|---|---|---|
startUrls | prefilled with an example | Up to 20 public group URLs. Anything past the twentieth is dropped without a row, so keep the list inside that. |
resultsLimit | 20 | Posts across the whole run, up to 1,000. Five groups at resultsLimit: 100 is a hundred posts in total, not five hundred. |
viewOption | CHRONOLOGICAL | CHRONOLOGICAL for new posts, RECENT_ACTIVITY for recently commented threads, TOP_POSTS for Facebook's ranking. |
onlyPostsNewerThan | empty | 2026-01-01, a full ISO timestamp, or 7 days. Older posts are skipped and never charged. |
onlyPostsOlderThan | empty | The same formats, the other way round. Use both for a window. |
proxyUrls | empty | Leave it empty. It is here for callers who want the traffic to leave through servers they already pay for, as http://user:pass@host:port. There is no bandwidth surcharge on this actor either way. |
sessionCookies | empty | Leave it empty too. Runs work signed out. Fill it in only if you want reads to go through your own account, with your own rate limit: c_user=<value>; xs=<value>, one line per account. Treat those values like a password, because anyone holding them can act as that account. |
๐ค What you get back
A real row from a recent run. The image links are signed and very long, so they are cut short here:
{"ok": true,"recordType": "post","charged": true,"facebookUrl": "https://www.facebook.com/groups/dogspotting/","url": "https://www.facebook.com/groups/dogspotting/permalink/10166203291439467/","id": "10166203291439467","legacyId": null,"time": "2026-09-20T23:30:52.000Z","timestamp": 1789947052,"text": "His name is Invader and he invaded my heart","user": {"id": "pfbid02UQC3terETmAmd24Hgg4ev1Pxye5Bh6SQ9HCYF58dVPrULg7E3tumNTv4Hs2Aoz4tl","name": "Eleanor Valentine","profileUrl": null,"profilePic": "https://scontent-lga3-3.xx.fbcdn.net/v/t39.30808-1/560561781_10164128278012578_..."},"likesCount": 147,"commentsCount": 0,"sharesCount": 0,"topReactionsCount": [86, 60, 1],"attachments": [{"type": "photo","thumbnail": "https://scontent-lga3-3.xx.fbcdn.net/v/t39.30808-6/791453646_10165826125182578_...","url": "https://www.facebook.com/photo/?fbid=10165826125842578&set=gm.10166203291439467&idorvanity=10487409466","id": "10165826125842578"}],"attachmentsCount": 1,"isVideo": false,"link": null,"groupId": "10487409466","groupTitle": "Dogspotting","inputUrl": "https://www.facebook.com/groups/dogspotting/","scrapedAt": "2026-09-21T01:45:39.314Z"}
| Field | What it is |
|---|---|
id, url | The post id and its permalink. id is your dedupe key across runs. |
time, timestamp | The real posting time, as ISO and as a unix number. Not "2 hours ago". |
likesCount | Every reaction added together, not only thumbs-up. In the row above, 147 is the 86, 60 and 1 in topReactionsCount summed. |
topReactionsCount | The counts behind the top reaction types on the post. Numbers with no labels, so you cannot tell which reaction is which. |
user | Name and picture. profileUrl is often null and the id is the long pfbid form, which is what Facebook hands out for group authors now. |
attachments | One entry per photo or video, with a thumbnail and, on videos, the video link. |
link | The preview of an external link shared in the post, null when there is none. |
legacyId | Facebook's older numeric id when the page still carries one. Usually null. |
Media links expire. Every scontent and fbcdn URL is signed by Facebook and stops working
after a while. If you want to keep a photo or a video, download it in the same session, do not
store the link and come back next month.
๐งพ Reading the output
Three kinds of row, and only posts cost anything.
| Row | How to spot it | Charged |
|---|---|---|
| A post | recordType: "post" | yes |
| The sample row | _sample: true, on a run with no usable input | no |
| A diagnostic | _uncharged: true, and it carries a code | no |
The charged field is a row marker, not a receipt. It is what separates a real post from a sample
or a diagnostic, and it is stamped as the row is built rather than after the money moves. Your
Apify run detail is the authority on what you were actually billed.
Diagnostic rows carry code, not errorCode:
| Code | What it means |
|---|---|
BAD_INPUT | Not a Facebook group URL. |
NO_PUBLIC_POSTS | The group keeps its posts for members. A private or closed group always lands here, and so does a handle that no longer exists. |
NO_RESULTS | The feed answered and had nothing matching your date window. |
NOT_FOUND | That group is gone. |
RATE_LIMITED | Facebook throttled the reads. Any groups still queued are skipped. Try a smaller run later. |
BLOCKED | Facebook answered with a wall instead of the feed. |
STOPPED_EARLY | The feed stopped giving out posts before your limit was reached. You keep everything collected up to that point. |
SCHEMA_DRIFT | The feed came back in a shape this could not read. Worth sending in, it usually means Facebook changed something. |
TARGET_ERROR, NETWORK | Facebook errored, or the request did not complete. Re-run it. |
โถ๏ธ How to run it
- Open Facebook Groups Scraper and click Try for free.
- Paste group URLs into Facebook group URLs.
- Set Number of posts and pick a Sorting order.
- Add Posts newer than if you only want recent ones, then click Start.
- Download the dataset as JSON, CSV or Excel, or read it from the Apify API.
๐ฐ How much does it cost?
$0.70 per 1,000 posts. Flat on every Apify plan, no volume tiers.
One charge per post row. Posts your date window filters out are never charged, and neither are sample or diagnostic rows. A private group, an empty group or a run that finds nothing costs you nothing for results.
๐ก What people use it for
- Watching buy-and-sell and local groups for a keyword, and acting on new posts the same day.
- Collecting questions people ask in a niche group, to write content that answers them.
- Tracking how a community reacts to an announcement, by post text and reaction counts.
- Keeping an archive of a group you run, outside Facebook, with permalinks that still work.
๐ง What it does not do
- No private or closed groups. Not a setting, not a workaround. If you cannot read it signed out, neither can this.
- No comment text. You get
commentsCounton the post. The comments actor below reads the comments themselves. - No member lists, no admin lists, no group rules.
- No keyword search inside a group. You pull the feed and filter it yourself.
- No photo or video files, only links, and those links expire.
- No reaction breakdown by type. Numbers, without which reaction each belongs to.
- More than 20 group URLs in one run are dropped, and the dropped ones get no row.
resultsLimitis the whole run, not per group. Sharing 50 posts across 10 groups is five each if the feeds cooperate.
๐งญ Which Facebook scraper do you need?
| If you want | Use |
|---|---|
| Posts from public groups | This one |
| Posts from a Facebook Page | Facebook Posts Scraper |
| Comments under a post or reel | Facebook Comments Scraper |
| Reels from a Page | Facebook Reels Scraper |
| A Page's website, email, phone and address | Facebook Page Contact Info Scraper |
โ Questions people ask
Do I need a Facebook account? No. The sessionCookies field exists for people who want their
own account used, and it is optional.
Will this get my account banned? Nothing of yours is used unless you put cookies in yourself, and Facebook does restrict accounts it thinks are automated, so think twice before you do.
Can it read a private group I am a member of? No. That stays out of reach on purpose.
Why did I get fewer posts than I asked for? Either the group has fewer public posts, your date
window excluded the rest, or the feed stopped early. A STOPPED_EARLY or NO_RESULTS row tells
you which.
Why is profileUrl empty on the author? Facebook now publishes group authors under an opaque
pfbid id, and often no profile link at all. The name and picture are what there is.
Is scraping public Facebook groups legal? These are pages anyone can read without an account. Posts contain personal data, which GDPR and similar laws cover, so have a lawful reason for collecting them. Apify's write-up on scraping and the law is a reasonable starting point, and we are not lawyers.
๐ If something breaks
Open the Issues tab on the actor page. Send the run ID and the group URL. The code on the
diagnostic row usually says what happened on its own.