Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Facebook Groups Scraper icon

Facebook Groups Scraper

Scrape public Facebook group posts: author, text, time, permalink, photos, videos and engagement counts. No login needed. $0.70 per 1,000 posts.

5 from 1 review on Apify 10,372 runs on Apify $0.0007 per post ($0.7 / 1,000)
Run this in the cloudRun on Apify →

Social Media Scrapers

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust startUrls, resultsLimit, viewOption (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.0007 per post = $0.7 per 1,000

You are charged forWhenPrice
Post scrapedOne public Facebook group post written to the dataset, with its author, text, time, permalink, media and reaction, comment and share counts. Free sample rows and free diagnostic rows are never charged.$0.0007

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-15, and they are what you are actually charged.

Inputs

FieldWhat it doesType
startUrlsPublic Facebook group URLs, e.g. https://www.facebook.com/groups/dogspotting/. Numeric group URLs work too. Up to 20 groups per run.array
resultsLimitHow many posts to return in total across all groups. Maximum 1000. Only real posts are charged.integer
viewOptionWhich feed ordering Facebook should return: new posts, newest activity, or most relevant.string
onlyPostsNewerThanKeep only posts created after this point. YYYY-MM-DD, a full ISO timestamp, or a relative value like "7 days". Filtered-out posts are never charged.string
onlyPostsOlderThanKeep only posts created before this point. Same formats as above.string
proxyUrlsLeave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port.array
sessionCookiesLeave this empty unless you need it. Runs are logged out by default and that is enough for public Facebook content. Facebook shows some things only to a signed-in account, and it limits how fast any one account may read; supplying your own cookie uses your account and your own rate limit, shared with nobody. In Chrome: open facebook.com while signed in, press F12, then Application > Cookies > https://www.facebook.com, and paste the values as "c_user=…; xs=…". One line per account. Treat these like a password: anyone with them can act as that account, and Facebook may sign the session out or restrict the account for automated use.array

What you get

A structured dataset — each result includes fields like:

groupTitleusertexttimelikesCountcommentsCountsharesCountattachmentsCounturlfacebookUrlid

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Social Media Scrapers

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Facebook Reels Scraper iconSocial Media Scrapers

Facebook Reels Scraper

Scrape public Facebook Page Reels: views, reactions, comments, shares, captions, hashtags, duration and MP4 links. No login needed. $0.35/1k.

1 use cases

Instagram Post Scraper iconSocial Media Scrapers

Instagram Post Scraper

Scrape Instagram posts and reels by link or shortcode. Rows carry caption, likes, comments, publish time, carousel media, hashtags. No login. $0.18 per 1,000.

1 use cases

Instagram Profile Scraper iconSocial Media Scrapers

Instagram Profile Scraper

Scrape Instagram profiles from handles or URLs. Get the bio, exact follower and post counts, verified flag, category and bio links. $0.70 per 1,000.

1 use cases

Instagram Reel Scraper iconSocial Media Scrapers

Instagram Reel Scraper

Scrape reels from any public Instagram profile. Play counts, likes, comments, captions, duration, MP4 and cover links, audio. $0.35 per 1,000 reels.

Ready to run — no setup

LinkedIn Post Search Scraper iconSocial Media Scrapers

LinkedIn Post Search Scraper

Scrape public LinkedIn posts by keyword: author, text, exact date, reactions, comments and post URL. No login or cookies. $0.90 per 1,000 posts.

1 use cases

LinkedIn Profile Search Scraper iconSocial Media Scrapers

LinkedIn Profile Search Scraper

Find public LinkedIn profiles by keyword, title, company, school or location: name, headline, role, profile URL. No login. $0.50 per 1,000.

2 use cases

See all Social Media Scrapers →

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.