Facebook Groups Scraper - Public Group Posts, No Login avatar

Facebook Groups Scraper - Public Group Posts, No Login

Pricing

from $0.70 / 1,000 post scrapeds

Go to Apify Store
Facebook Groups Scraper - Public Group Posts, No Login

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

85

Total users

41

Monthly active users

18 hours ago

Last modified

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.

InputPublic Facebook group URLs
OutputOne row per post
Ceiling1,000 posts and 20 groups per run
Account neededNone
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"
}
FieldStarts asWhat it is
startUrlsprefilled with an exampleUp to 20 public group URLs. Anything past the twentieth is dropped without a row, so keep the list inside that.
resultsLimit20Posts across the whole run, up to 1,000. Five groups at resultsLimit: 100 is a hundred posts in total, not five hundred.
viewOptionCHRONOLOGICALCHRONOLOGICAL for new posts, RECENT_ACTIVITY for recently commented threads, TOP_POSTS for Facebook's ranking.
onlyPostsNewerThanempty2026-01-01, a full ISO timestamp, or 7 days. Older posts are skipped and never charged.
onlyPostsOlderThanemptyThe same formats, the other way round. Use both for a window.
proxyUrlsemptyLeave 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.
sessionCookiesemptyLeave 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"
}
FieldWhat it is
id, urlThe post id and its permalink. id is your dedupe key across runs.
time, timestampThe real posting time, as ISO and as a unix number. Not "2 hours ago".
likesCountEvery reaction added together, not only thumbs-up. In the row above, 147 is the 86, 60 and 1 in topReactionsCount summed.
topReactionsCountThe counts behind the top reaction types on the post. Numbers with no labels, so you cannot tell which reaction is which.
userName and picture. profileUrl is often null and the id is the long pfbid form, which is what Facebook hands out for group authors now.
attachmentsOne entry per photo or video, with a thumbnail and, on videos, the video link.
linkThe preview of an external link shared in the post, null when there is none.
legacyIdFacebook'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.

RowHow to spot itCharged
A postrecordType: "post"yes
The sample row_sample: true, on a run with no usable inputno
A diagnostic_uncharged: true, and it carries a codeno

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:

CodeWhat it means
BAD_INPUTNot a Facebook group URL.
NO_PUBLIC_POSTSThe group keeps its posts for members. A private or closed group always lands here, and so does a handle that no longer exists.
NO_RESULTSThe feed answered and had nothing matching your date window.
NOT_FOUNDThat group is gone.
RATE_LIMITEDFacebook throttled the reads. Any groups still queued are skipped. Try a smaller run later.
BLOCKEDFacebook answered with a wall instead of the feed.
STOPPED_EARLYThe feed stopped giving out posts before your limit was reached. You keep everything collected up to that point.
SCHEMA_DRIFTThe feed came back in a shape this could not read. Worth sending in, it usually means Facebook changed something.
TARGET_ERROR, NETWORKFacebook errored, or the request did not complete. Re-run it.

โ–ถ๏ธ How to run it

  1. Open Facebook Groups Scraper and click Try for free.
  2. Paste group URLs into Facebook group URLs.
  3. Set Number of posts and pick a Sorting order.
  4. Add Posts newer than if you only want recent ones, then click Start.
  5. 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 commentsCount on 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.
  • resultsLimit is 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 wantUse
Posts from public groupsThis one
Posts from a Facebook PageFacebook Posts Scraper
Comments under a post or reelFacebook Comments Scraper
Reels from a PageFacebook Reels Scraper
A Page's website, email, phone and addressFacebook 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.