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.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
startUrls,resultsLimit,viewOption(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export 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 for | When | Price |
|---|---|---|
| Post scraped | One 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
| Field | What it does | Type |
|---|---|---|
startUrls | Public Facebook group URLs, e.g. https://www.facebook.com/groups/dogspotting/. Numeric group URLs work too. Up to 20 groups per run. | array |
resultsLimit | How many posts to return in total across all groups. Maximum 1000. Only real posts are charged. | integer |
viewOption | Which feed ordering Facebook should return: new posts, newest activity, or most relevant. | string |
onlyPostsNewerThan | Keep 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 |
onlyPostsOlderThan | Keep only posts created before this point. Same formats as above. | string |
proxyUrls | Leave 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 |
sessionCookies | Leave 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:
groupTitleusertexttimelikesCountcommentsCountsharesCountattachmentsCounturlfacebookUrlidExport 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
Scrape public Facebook Page Reels: views, reactions, comments, shares, captions, hashtags, duration and MP4 links. No login needed. $0.35/1k.
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.
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.
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.
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.
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.
Where this tool sits
- Categories
- 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.
| 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
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
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.