Facebook

How to Pull Facebook Group Posts with an API (2026)

List posts from a public Facebook group as paginated JSON — sorted feeds, cursors, comments, and cron-friendly workflows.

Social FetchUpdated

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:

SourceWhat you getCaveat
Facebook group searchName, member count, public/closed badgeConfirm the group is Public before adding to cron
Competitor or partner listsGroups your sales team already watchesURLs 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:

Request
json

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:

Request
bash

Check data.lookupStatus:

  • found — safe to schedule. posts may 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.

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:

Request
typescript

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:

Request
typescript

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.

ValueFeed behaviorTypical monitoring job
chronologicalListingsMarketplace-style listing orderBuy/sell, ISO, furniture, vehicles
chronologicalNewest-first timelineService requests, same-day alerts
recentActivityThreads with fresh commentsVendor recommendations, complaint threads
topHigh-engagement posts in the windowWeekly digest, "what dominated this group"

Change only the sortBy value for different jobs — same endpoint, same url parameter:

Request
bash

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.

Request
typescript

Stop when:

  • data.page.hasMore is false
  • nextCursor is null
  • You hit maxPagesPerRun from 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:

Request
bash

Paginate comment pages the same way as the feed:

Request
typescript

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:

  • commentCount above 5 for local service requests
  • commentCount above 15 for buy/sell (price negotiation lives in replies)
  • Post text under 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

  1. Poll each buy/sell group with sortBy=chronologicalListings, maxPages=2.
  2. Filter text for ISO, price patterns ($, obo, firm), and category keywords.
  3. Dedupe on post.id, compare against yesterday's IDs.
  4. Slack or email new rows with url, text, publishedAt, and author.name.

Daily service-request digest

  1. Poll homeowner or city groups with sortBy=chronological, one page per group.
  2. Match recommend, looking for, anyone know, plus trade terms (plumber, HVAC, roofer).
  3. Pull comments on matches with commentCount >= 5.
  4. Aggregate vendor names from comment text into a frequency table by metro.

Weekly brand mention scan

  1. Poll brand-adjacent or franchise groups with sortBy=recentActivity, three pages.
  2. Client-side match on brand strings and common misspellings.
  3. Pull full comment threads on negative-sentiment keywords (scam, refund, never again).
  4. Archive rows with requestId for support escalation.

Multi-group batch worker

Loop your catalog JSON and respect per-group sortBy and maxPages:

Request
typescript

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:

Request
json

Suggested columns:

ColumnSourceWhy
Intentyour taxonomy"ISO", "recommend", "complaint" — manual or rule-tagged
EvidenceurlLink back for quotes in ops decks
WeightcommentCount, reactionCountRank threads with replies over lone posts
FreshnesspublishedAtDeprioritize stale listings unless buy/sell
Metrocatalog tagGroups 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.com and www.facebook.com variants 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 sortBytop on a quiet group can look empty while chronological returns rows.
  • New groups with low activity are common; empty is not a billing bug.

Duplicate posts across runs

  • Dedupe on post.id before 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 capturedAt next to commentCount.

lookup_failed or HTTP 503

  • Not charged. Retry with backoff; include meta.requestId from 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 503 with Retry-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:

StepCallsCredits (approx.)
12 groups × 2 pages, chronologicalListings2424
8 groups × 1 page, chronological88
20 comment pulls on high-signal posts2020
Total5252

Public data only — you remain responsible for lawful use under Terms. See Credits.

What you can build

  • Territory inventory feeds — hourly chronologicalListings pull with price parsing on post text.
  • Service lead digests — daily chronological scan with comment enrichment on recommendation threads.
  • Franchise complaint routingrecentActivity pass with brand keywords and comment pulls for escalation.
  • Vendor scorecards — count how often supplier names appear in comment text across 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