# Facebook Groups API Alternative in 2 Calls (https://www.socialcrawl.dev/blog/facebook-groups-api-alternative)
> 4 public groups for 1 credit. Facebook Groups API alternative after the 22 April 2024 removal. Pass include=details for member counts on the same path.
The Facebook Groups API cannot do this job. Meta deprecated it in Graph API v19 on [23 January 2024](https://developers.facebook.com/blog/post/2024/01/23/introducing-facebook-graph-and-marketing-api-v19/) and removed it from all versions on [22 April 2024](https://developers.facebook.com/docs/graph-api/changelog/version19.0/), so public groups for a keyword come from `GET /v1/facebook/search/groups`. That call, plus one Bluesky post search, is the facebook groups api alternative. The job is those two endpoints on SocialCrawl.
`include=details` is a parameter on that same groups path. A second page is optional. On 2026-10-17, for `query=sourdough`, the plain call returned 4 hits for 1 credit, with `has_more` true. The documented page ceiling is up to 10 groups, and this page held 4. The details parameter filled 4 groups and charged 5 credits. One later page repeated two group ids under different post titles. One Bluesky search returned 100 posts for 1 credit. A slash date on `since` came back HTTP 400 and charged 0 credits.
Send the samples with curl. The header is `x-api-key: $SOCIALCRAWL_API_KEY`.
## What do you need before the first call?
- [One API key](/auth/register) for the SocialCrawl API. The same key is sent on both endpoints.
- curl, or any client that can set a request header.
- A search of public groups. These calls do not post into a group, export a member list, or administer a group.
- The worked query is `sourdough`, captured on 2026-10-17. A rerun on another day should follow the same method, not these group ids.
## What happened to the Facebook Groups API?
Meta shipped Graph API v19.0 on 23 January 2024. The [v19 changelog](https://developers.facebook.com/docs/graph-api/changelog/version19.0/) says the facebook groups api change applies to v19.0 and to all versions on 22 April 2024. The [same-day announcement](https://developers.facebook.com/blog/post/2024/01/23/introducing-facebook-graph-and-marketing-api-v19/) says: "The Facebook Groups API is deprecated in v19 and in 90 days will be removed from all versions." That window ends on 22 April 2024.
The changelog page also prints "Available until May 21, 2026." That line is the support window for version 19. The Groups permissions were already scheduled for removal on 22 April 2024.
What that changelog retires is the permissioned facebook graph api groups feature, publishing and member info for a group the caller administers. The v19 changelog and the v19 post do not describe a keyword search over public groups the caller does not run.
## Why was the Facebook Groups API deprecated?
The changelog names what left. It does not state a reason. Removed on 22 April 2024, across all versions, are the permissions `publish_to_groups` and `groups_access_member_info`, the reviewable Groups API feature, and the ability for group admins to install apps on a group even when they hold an admin or developer role on the app. The [v19 post](https://developers.facebook.com/blog/post/2024/01/23/introducing-facebook-graph-and-marketing-api-v19/) names the same permissions and the Groups API feature.
Private replies stayed off that list. The post says most Private Replies developers have no change to make in v19. Developers who called Groups Post endpoints after a Private Replies webhook need a Page access token. That path is for a group you are already connected to.
Fetched on 2026-10-17, the v26.0 [root index](https://developers.facebook.com/docs/graph-api/reference/) describes itself as a full list of Graph API root nodes. There is no `Group` root between `Group Doc` and `Group Message`. The search-shaped roots on that index are Ads Archive and Branded Content Search. No group-search edge is listed. The [Group reference](https://developers.facebook.com/docs/graph-api/reference/group/) and the [group feed reference](https://developers.facebook.com/docs/graph-api/reference/group/feed/) both landed on that index. The [Groups API reference](https://developers.facebook.com/docs/groups-api/reference) landed on the docs home. The [Groups API feature page](https://developers.facebook.com/docs/features-reference/groups-api) landed on the v19 changelog. Each response was HTTP 200. None of those pages was a Group reference.
The Page line on the same index says "Get groups a Page is a member of." That wording is about membership. Edges past that line were not opened, and they are not described here.
## How do you search Facebook groups by keyword?
`GET /v1/facebook/search/groups` takes `query` and returns public group hits. On 2026-10-17, `query=sourdough` returned HTTP 200, `cached` false, and `credits_used` 1. `data.total` was null. `data.dropped` was 0. The body had 4 rows. `pagination.page_size` was 4, `has_more` was true, and a `next_cursor` was present.
```bash
curl -sS "https://www.socialcrawl.dev/v1/facebook/search/groups?query=sourdough" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
```
The match is `group_page` or `post_in_group`. On this plain page, `display_name` was null on the three `post_in_group` rows and set on the one `group_page` row, and `author.followers`, `author.bio`, `author.private`, and `author.joined_at` were null on all 4 rows. `author.ext.group` was absent, so `privacy_label` was not in the response.
`computed.relevance` was set on all 4 rows. Relevance mode was `score`, threshold 0.5, kept 4, dropped 0, `extra_credits` 0, origin `default`. This run did not pass `relevance=filter`.
- `sourdoughgeeks`, `post_in_group`, display name null. "Simple sourdough bread recipe with step-by-step instructions". Relevance 0.98.
- `1006060197306320`, `group_page`, display name "Sourdough for Beginners", same string as the hit title. Relevance 0.98.
- `330526660347434`, `post_in_group`, display name null. "Homemade sourdough bread from a friend who bakes". Relevance 0.9.
- `205841196231440`, `post_in_group`, display name null. "History and basics of sourdough bread making | Gallatin, TN". Relevance 0.98.
On the `include=details` response, the `post_in_group` rows had `display_name` set. Results that rank for this topic are general Facebook API roundups, posts about scheduling into groups, and community-plugin lists. Those pages do not show a keyword search that returns group rows.
## Is there a Facebook API for groups that returns member counts?
The same path with `include=details` filled members and privacy on 4 of 4 rows and charged 5 credits. `data.hydration` reported `rows` 4, `looked_up` 4, `filled` 4, `cached` 0, `unfilled` 0, and `extra_credits` 4. Envelope `credits_used` was 5, the 4 extra credits plus 1 for the page. The balance around that call dropped by 5. `credits_held` was 10 and was not the charge. The strings `details_partial` and `details_unavailable` do not appear.
```bash
curl -sS "https://www.socialcrawl.dev/v1/facebook/search/groups?query=sourdough&include=details" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
```
This call matches a page price of 1 credit plus 1 credit for each group whose details were filled. Four fills, so 5. The groups search note from 23 September 2026 caps fresh detail lookups at 10 groups. The same note skips the charge for a group already in cache, and for a group it could not fill. This pull had `cached` 0 and `unfilled` 0.
`data.hydration.ms` on that response was 2805. Curl's timer for the same HTTP call was 5429 ms. The 5429 ms figure is the client timer, not an envelope field. The 2805 is this response only.
The details call was a new search, not a lookup of the previous ids. Three ids were shared. The plain page alone had `205841196231440`. The details page alone had `homebakeryforbeginners`. The details `next_cursor` string still matched the plain call's cursor. Two searches about two minutes apart did not return the same fourth group.
On this path, the facebook groups api alternative returns member counts as `author.followers`. That field is a count, not a member list.
| Group | author.id | group.id | followers | match | relevance |
| --- | --- | --- | ---: | --- | ---: |
| Sourdough Geeks | sourdoughgeeks | 2841604162602509 | 1,069,480 | post_in_group | 0.97 |
| Sourdough for Beginners | 1006060197306320 | 1006060197306320 | 2,302,654 | group_page | 0.97 |
| Foodie | 330526660347434 | 330526660347434 | 268,466 | post_in_group | 0.78 |
| Home Bakery for Beginners | homebakeryforbeginners | 683303171221113 | 398,248 | post_in_group | 0.96 |
`author.id` and `author.ext.group.id` differ for Sourdough Geeks and Home Bakery for Beginners. They match for the other two. After details, dedupe on `author.ext.group.id` when the slug and the numeric id differ. This pull did not show one group twice on the same page under both forms.
All 4 rows had `privacy_label` Public and `visibility_label` Visible. Privacy is `author.ext.group.privacy_label`. `author.private` stayed null. This pull returned no private group.
`posts_last_month` returned 10000 on Sourdough for Beginners and on Foodie. Sourdough Geeks returned 2261. Home Bakery for Beginners returned 6097. In that same row order, `posts_last_day` was 106, 312, 2503, and 247, and `joined_at` was 2020-04-09, 2023-08-28, 2012-04-17, and 2025-05-28. These are four search hits for one keyword. They are not an average group size.
Foodie, at relevance 0.78, stayed above the 0.5 threshold because a post inside a general food group matched. It is a food group, not a sourdough group. `author.ext.group.activity.new_members_text` was the string "No new members in the last week" on all 4 rows. That string is not a counted zero.
## What does the next page of a group search repeat?
Pass the plain call's `pagination.next_cursor` as `cursor`. This run stopped after that page. The response was HTTP 200, `credits_used` 1, and 4 rows, all `post_in_group`. `display_name`, `followers`, and `bio` were null on all 4. `page_size` was 4, `has_more` was still true, and another cursor was present and not followed. No `author.id` repeated inside the page.
Two ids from the plain page came back under different titles. `sourdoughgeeks` returned "What is a sourdough starter and how to make it?" at relevance 0.98. `1006060197306320` had been `group_page` with the display name "Sourdough for Beginners". On page 2 it was `post_in_group`, display name null, title "Understanding Sourdough Bread Texture and Consistency for ...", relevance 0.97. The ellipsis is part of the returned string.
The other two rows were new. `2292507957440825` returned "Learn to make sourdough bread at home | Colorado Springs, CO" at 0.98. `sourdoughbreadbakingcommunity` returned "Sourdough bread recipe from family tradition" at 0.98.
Across the plain page, the details page, and page 2 there were 7 distinct `author.id` values. Page 2 still had `has_more` true, so 7 is not the size of the result set. Dedupe on `author.id` before you count groups. On page 2, `1006060197306320` kept its id and lost `display_name` on a `post_in_group` hit.
## How do you search Bluesky posts for the same keyword?
The second endpoint is one Bluesky post search. This run sent `sort=latest` and did not send `until`. The product note from 23 September 2026 also accepts `sort=top`. This run did not call it.
```bash
curl -sS "https://www.socialcrawl.dev/v1/bluesky/search?query=sourdough&sort=latest" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
```
The response was HTTP 200, `cached` false, and `credits_used` 1. It held 100 posts. `data.total` was null. `data.dropped` was 0. There were zero duplicate `post.id` values, and `published_at` was non-increasing. `pagination.next_cursor` was null, `has_more` was false, and `page_size` was 100. On this envelope, `has_more: false` means there was no next cursor. The 100 posts are this page, not a count of every post that exists.
The newest `published_at` was `2026-10-17T01:59:12.109Z`. The oldest on this page was `2026-10-16T09:29:47.736Z`. That older timestamp is the oldest row on this page, not the oldest post that exists. The same note says a later window is another call with `until` set to that oldest `published_at`. This run did not send `until`.
`post.content.text` was null on 1 of the 100 posts and empty on none. On the unified schema, `post.engagement.views` was null on all 100, and `computed.engagement_rate` was null on all 100, so no rate was computed. `computed.language` was present on 91 posts: `en` 87, null 9, `de` 2, `fr` 1, `it` 1.
Likes on this page were 40 zeros, maximum 42, sum 376. Comments were 76 zeros, maximum 7, sum 45. Shares were 90 zeros, maximum 3, sum 19. Those counts are this page only.
This run saw no HTTP 503. The source can still throttle, so this post describes a single search.
## What fails on a bad since, or if you skip the privacy label?
A US-style date is refused before the search, and the refusal does not charge. This request sent `since=09/23/2026` with the slash encoded as `%2F`.
```bash
curl -sS "https://www.socialcrawl.dev/v1/bluesky/search?query=sourdough&sort=latest&since=09%2F23%2F2026" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
```
HTTP 400, `error.type` `INVALID_REQUEST`, `credits_used` 0. The `error.message` was:
```text
Invalid `since`: '09/23/2026' is not a date. Use YYYY-MM-DD or an ISO 8601 datetime with a timezone, for example 2026-09-01 or 2026-09-01T00:00:00Z.
```
Send `YYYY-MM-DD`, or an ISO 8601 datetime with a timezone, as in `2026-09-01` or `2026-09-01T00:00:00Z`. The envelopes on this run sum to 8 credits: 1 for the plain group page, 5 for `include=details`, 1 for the group cursor page, 1 for the Bluesky search, and 0 for this 400.
A group can be public in search and still private to read. Check `author.ext.group.privacy_label` before you treat `GET /v1/facebook/group/posts` as available. All 4 detail rows in this pull were Public. A public-in-search but private-to-read group was not observed. `author.private` stayed null after details, even with `privacy_label` filled. This pull did not call `GET /v1/facebook/group` or `GET /v1/facebook/group/posts`. The groups search note says a row URL is already in the form those endpoints accept. This pull has no posts payload to show for that.
Also from this run:
- About two minutes later, the fourth id was `homebakeryforbeginners` instead of `205841196231440`.
- The same `author.id` came back on page 2 as a different hit. `1006060197306320` lost `display_name` on that `post_in_group` row.
- `posts_last_month` of 10000 is the value the field returned on two groups. Foodie at relevance 0.78 is a general food group.
## Where do Facebook pages, posts, and the Ad Library belong?
Group keyword search stops at public groups. Page metadata, page posts, and the Ad Library are a separate walkthrough: [pages, posts, and the Ad Library](/blog/facebook-data-api-2026). The request shapes for [pulling Facebook page and post data](/blog/how-to-scrape-facebook-2026) live on that post. A comparison of sources for pages and ads is [comparing Facebook data APIs for pages and ads](/blog/best-facebook-data-apis-2026).
## Frequently asked questions
### Is the Facebook Groups API deprecated?
Yes. Meta deprecated the Facebook Groups API in Graph API v19 on 23 January 2024 and removed it from all versions on 22 April 2024. Both the [v19 changelog](https://developers.facebook.com/docs/graph-api/changelog/version19.0/) and the [same-day Graph and Marketing API post](https://developers.facebook.com/blog/post/2024/01/23/introducing-facebook-graph-and-marketing-api-v19/) state that schedule. The permissions removed with it are `publish_to_groups`, `groups_access_member_info`, and the Groups API feature.
### Is there a Facebook Groups API alternative for public groups?
For public groups, the facebook groups api alternative is `GET /v1/facebook/search/groups`, plus one `GET /v1/bluesky/search` when you also want posts. On 2026-10-17, `query=sourdough` returned 4 group hits for 1 credit, with `has_more` true. Pages, posts, and the Ad Library are other calls.
### How do you search public Facebook groups by keyword?
Call `GET https://www.socialcrawl.dev/v1/facebook/search/groups?query=sourdough` with the header `x-api-key: $SOCIALCRAWL_API_KEY`. On 2026-10-17 that query returned 4 hits for 1 credit. The documented page ceiling is up to 10 groups. This page held 4, and `has_more` was true. Pass `include=details` on the same path when you need member counts and `privacy_label`.
### Can the Facebook API still get group members?
This pull did not return a member list. `include=details` returned `author.followers` for four groups: Sourdough Geeks 1,069,480, Sourdough for Beginners 2,302,654, Foodie 268,466, and Home Bakery for Beginners 398,248. Those are follower counts on search hits, not an export. `author.private` stayed null.
### Can the Facebook API get group posts?
This pull did not call `GET /v1/facebook/group/posts`. On the plain page, the `post_in_group` hits had a post title and a null `display_name`, and the `group_page` hit carried the group name. On the `include=details` response, `post_in_group` rows had `display_name` set. Check `author.ext.group.privacy_label` before calling `group/posts`. All 4 detail rows here were Public. A group that is public in search and private to read was not in this pull. Page posts are covered on the other Facebook posts linked above.
### Does a Facebook Groups API alternative cover private groups?
Not in this pull. All 4 detail rows were Public and Visible. `author.private` stayed null, and no private group was returned. This run does not show coverage of private groups.