Facebook groups hold conversations brand pages miss — ISO requests in a city buy/sell group, franchise operators comparing vendors, parents trading daycare waitlist tips. Meta does not ship a clean export, and the Graph API was never built for polling arbitrary public groups on a schedule.
GET /v1/facebook/groups/posts?url={groupUrl} returns a page of posts. Pass sortBy for feed ordering, cursor for pagination, and GET /v1/facebook/posts/comments when replies carry more signal than the post body. This guide uses Austin-area buy/sell and local services groups as the running example.
You'll need an API key. Test with a public group URL in the Playground.
Why groups
Brand pages show what a business publishes. Groups show what people ask each other — ISO posts, suburb-scoped membership, price talk in comments. Franchise ops, home services, and resale teams use group feeds for territory scans.
Only collect public data and respect group rules and Terms. Private groups are out of scope.
Find and catalog public groups
Social Fetch does not expose a "search all Facebook groups" endpoint. Discovery is manual.
Practical sources:
| Source | What you get | Caveat |
|---|---|---|
| Facebook group search | Name, member count, public/closed badge | Confirm the group is Public before adding to cron |
| Competitor or partner lists | Groups your sales team already watches | URLs go stale when groups rename slugs |
| City + category queries | "Austin buy sell trade", "Round Rock moms" | Duplicate metro groups — dedupe by URL, not name |
| Customer interviews | "Where do you post when you move?" | High-signal but slow to collect |
Store one row per group with the monitoring settings your cron job needs:
Tag each group with sort order (chronologicalListings for marketplaces, recentActivity for debate threads), poll cadence (hourly for buy/sell, daily for slow vertical groups), page depth per run, and a comment policy (pull comments when commentCount exceeds a threshold or when post text is under 80 characters).
Validate a URL before scheduling it. A single probe call costs one credit:
Check data.lookupStatus:
found— safe to schedule.postsmay still be empty if the group has no recent public activity.not_found— wrong URL, private group, or deleted community. Fix the row before burning credits on cron.
Reference: Facebook group posts.
Poll a group feed
Once the catalog is validated, hit the feed on your cadence. One group, one sort order, one page per request.
curl -sS \
-H "x-api-key: $SOCIALFETCH_API_KEY" \
-G "https://api.socialfetch.dev/v1/facebook/groups/posts" \
--data-urlencode "url=https://www.facebook.com/groups/examplepublicgroup" \
--data-urlencode "sortBy=recentActivity"The preset uses sortBy=recentActivity — good for threads with fresh comments. Buy/sell groups often need chronologicalListings instead (see below).
TypeScript with the SDK:
Each post includes id, url, text, publishedAt, reactionCount, commentCount, and author (name, url when available). Video posts may include video with thumbnail and duration fields.
There is no server-side keyword parameter. Match in your worker:
Pick the right sortBy
The sortBy query parameter maps to Facebook's feed tabs. Wrong sort wastes credits — you page through posts your job does not care about.
| Value | Feed behavior | Typical monitoring job |
|---|---|---|
chronologicalListings | Marketplace-style listing order | Buy/sell, ISO, furniture, vehicles |
chronological | Newest-first timeline | Service requests, same-day alerts |
recentActivity | Threads with fresh comments | Vendor recommendations, complaint threads |
top | High-engagement posts in the window | Weekly digest, "what dominated this group" |
Change only the sortBy value for different jobs — same endpoint, same url parameter:
Examples by use case: chronologicalListings for buy/sell inventory order; chronological for same-day service requests ("need a plumber today"); recentActivity for vendor intel where the answer arrived yesterday.
If you are unsure, run two probe calls with different sortBy values on the same group and compare the first five post.id values.
Paginate without blowing the budget
Responses include data.page.nextCursor and data.page.hasMore. Pass nextCursor verbatim on the next request — do not parse or construct cursors yourself.
Stop when:
data.page.hasMoreis falsenextCursoris null- You hit
maxPagesPerRunfrom your catalog
For incremental monitoring, store the newest post.id or publishedAt from each run. On the next poll, stop paging when you reach a post you already ingested — even if hasMore is still true. That pattern cuts credits on busy groups.
Dedupe across groups and runs on post.id before writing to your warehouse or firing webhooks. The same listing sometimes gets cross-posted; url is the better dedupe key if you want one row per discussion.
Pull comment threads
Group post text is often thin. "Anyone know a good electrician?" might be twelve words; the thread names three businesses, two price ranges, and a warning about one of them.
Pass the post permalink to the comments endpoint:
Paginate comment pages the same way as the feed:
Reference: Facebook post comments. For scoring comment text at scale, see the sentiment guide.
Pull comments selectively — not every feed row deserves another credit. Heuristics that work in production:
commentCountabove 5 for local service requestscommentCountabove 15 for buy/sell (price negotiation lives in replies)- Post
textunder 80 characters (headline-only posts) - Keyword hit on the post body for your brand or competitor list
Optional: pass feedbackId when you have it from a prior response — can speed up repeat lookups on the same thread.
Local intel workflows
Hourly buy/sell watch
- Poll each buy/sell group with
sortBy=chronologicalListings,maxPages=2. - Filter
textfor ISO, price patterns ($,obo,firm), and category keywords. - Dedupe on
post.id, compare against yesterday's IDs. - Slack or email new rows with
url,text,publishedAt, andauthor.name.
Daily service-request digest
- Poll homeowner or city groups with
sortBy=chronological, one page per group. - Match
recommend,looking for,anyone know, plus trade terms (plumber,HVAC,roofer). - Pull comments on matches with
commentCount >= 5. - Aggregate vendor names from comment
textinto a frequency table by metro.
Weekly brand mention scan
- Poll brand-adjacent or franchise groups with
sortBy=recentActivity, three pages. - Client-side match on brand strings and common misspellings.
- Pull full comment threads on negative-sentiment keywords (
scam,refund,never again). - Archive rows with
requestIdfor support escalation.
Multi-group batch worker
Loop your catalog JSON and respect per-group sortBy and maxPages:
Schedule the batch with cron or a queue worker — same pattern as the social listening guide, but scoped to a group URL list instead of platform-wide search.
To link post authors to a business page, follow up with GET /v1/facebook/profiles when author.url is present. Reference: Facebook profiles.
Store rows your ops team can filter
Normalize API responses into flat rows — Airtable, Postgres, Google Sheets:
Suggested columns:
| Column | Source | Why |
|---|---|---|
| Intent | your taxonomy | "ISO", "recommend", "complaint" — manual or rule-tagged |
| Evidence | url | Link back for quotes in ops decks |
| Weight | commentCount, reactionCount | Rank threads with replies over lone posts |
| Freshness | publishedAt | Deprioritize stale listings unless buy/sell |
| Metro | catalog tag | Groups already encode geography |
Keep requestId on every row for support tracing.
Troubleshooting
not_found on a group that opens in your browser
- Confirm the group is Public, not closed or private. Closed groups often fail for logged-out-style lookups.
- Copy the URL from the address bar — slug renames break bookmarked links.
m.facebook.comandwww.facebook.comvariants usually work; avoid share links that redirect through login walls.
found but empty posts array
- The group resolved; there may simply be no recent public posts in the feed window.
- Try a different
sortBy—topon a quiet group can look empty whilechronologicalreturns rows. - New groups with low activity are common; empty is not a billing bug.
Duplicate posts across runs
- Dedupe on
post.idbefore alerting. - Incremental polling should stop paging when you hit a known ID, not only when the cursor ends.
Comments return not_found
- Pass the full group post permalink (
.../groups/{slug}/posts/{id}/), not just the group URL. - Very new posts may not have comment threads indexed yet — retry on the next poll.
Reaction and comment counts look stale
- Each response is a point-in-time snapshot. Re-fetch before quoting counts in a report.
- Store
capturedAtnext tocommentCount.
lookup_failed or HTTP 503
- Not charged. Retry with backoff; include
meta.requestIdfrom the failed attempt if you contact support.
Rate limits
- No request quotas on metered routes — credits are the only limit. Under extreme concurrency you may get
503withRetry-After(not charged). Staying under ~500 concurrent requests is a courtesy, not a ceiling.
Billing and boundaries
Each group feed page and each comment page is one credit (typically 1 per successful request). A completed lookup with zero posts still ran upstream and is billed. You are not charged for pre-send validation errors, lookup_failed, or 503 temporarily_unavailable.
Rough weekly math:
| Step | Calls | Credits (approx.) |
|---|---|---|
12 groups × 2 pages, chronologicalListings | 24 | 24 |
8 groups × 1 page, chronological | 8 | 8 |
| 20 comment pulls on high-signal posts | 20 | 20 |
| Total | 52 | 52 |
Public data only — you remain responsible for lawful use under Terms. See Credits.
What you can build
- Territory inventory feeds — hourly
chronologicalListingspull with price parsing on posttext. - Service lead digests — daily chronological scan with comment enrichment on recommendation threads.
- Franchise complaint routing —
recentActivitypass with brand keywords and comment pulls for escalation. - Vendor scorecards — count how often supplier names appear in comment
textacross trade groups. - Moderation pre-filter — flag new posts against policy rules before a human opens Facebook.
Next steps: Playground · Facebook API reference · Facebook group data API use case · Pricing