Facebook Group API. Send a group link or ID.
Member count, rules, admins and activity. We handle the proxies, blocks and platform changes.
Facebook Group API at a glance
Returns a Facebook group's about page from its link or ID: exact member count, description, privacy, rules, posting activity and who runs it. It also has the name and vanity name, cover photo and picture, whether the group shows in search, its topics and location, when it was created and its name changes, each admin's and moderator's name, picture and profile link, and the Page it belongs to. Private groups answer too, with what their page shows logged out.
GET /v1/facebook/group
- 1 credit per request, $0.75–$1.97 per 1,000 requests
- 17 typed fields null when unknown
urlis all it needs, e.g.https://www.facebook.com/groups/366190054572553/- 100 credits free when you sign up, no card, so you can build before you spend
Send one request. Get 17 fields back.
Copy the request in your language, or hand it to your agent. Sign up for an API key and your first 100 credits are free.
$ npm install socialtapurl = https://www.facebook.com/groups/366190054572553/const params = new URLSearchParams({
url: "https://www.facebook.com/groups/366190054572553/",
});
const res = await fetch(`https://socialtap.dev/v1/facebook/group?${params}`, {
headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, meta } = body;
console.log(data, meta.credits_charged);import os
import requests
res = requests.get(
"https://socialtap.dev/v1/facebook/group",
params={"url": "https://www.facebook.com/groups/366190054572553/"},
headers={"x-api-key": os.environ["SOCIALTAP_API_KEY"]},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
data, meta = body["data"], body["meta"]
print(data, meta["credits_charged"])require "json"
require "net/http"
uri = URI("https://socialtap.dev/v1/facebook/group")
uri.query = URI.encode_www_form('url' => 'https://www.facebook.com/groups/366190054572553/')
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = ENV.fetch("SOCIALTAP_API_KEY")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(req) }
body = JSON.parse(res.body)
raise "#{body["error"]["code"]}: #{body["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
pp body["data"]
puts body["meta"]["credits_charged"]<?php
$query = http_build_query([
'url' => 'https://www.facebook.com/groups/366190054572553/',
]);
$ch = curl_init('https://socialtap.dev/v1/facebook/group?' . $query);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['x-api-key: ' . getenv('SOCIALTAP_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) >= 400) {
throw new RuntimeException($body['error']['code'] . ': ' . $body['error']['message']);
}
print_r($body['data']);
echo $body['meta']['credits_charged'], PHP_EOL;package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
"os"
)
func main() {
q := url.Values{}
q.Set("url", "https://www.facebook.com/groups/366190054572553/")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/facebook/group?"+q.Encode(), nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("x-api-key", os.Getenv("SOCIALTAP_API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
var body struct {
Data json.RawMessage `json:"data"`
Meta map[string]any `json:"meta"`
Error *struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"error"`
}
if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
log.Fatal(err)
}
if body.Error != nil {
log.Fatalf("%s: %s", body.Error.Code, body.Error.Message)
}
fmt.Println(string(body.Data), body.Meta["credits_charged"])
}curl -G 'https://socialtap.dev/v1/facebook/group' \
--data-urlencode 'url=https://www.facebook.com/groups/366190054572553/' \
-H "x-api-key: $SOCIALTAP_API_KEY"{
"data": {
"approximate_fields": [],
"avatar_url": "https://scontent-atl3-1.xx.fbcdn.net/v/t1.6435-9/121615771_3201454343306997_2348901429098757975_n.jpg?stp=c120.0.400.400a_cp0_dst-jpg_tt6&cstp=mx400x400&ctp=s110x80&_nc_cat=106&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-1.xx&_nc_…",
"banner_url": "https://scontent-atl3-1.xx.fbcdn.net/v/t1.6435-9/121615771_3201454343306997_2348901429098757975_n.jpg?stp=dst-jpg_tt6&cstp=mx640x400&ctp=s640x400&_nc_cat=106&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-1.xx&_nc_gid=SCRUBBED&_nc_ss…",
"categories": [
"Software & tech",
"Engineering"
],
"created_at": "2020-10-14T11:05:03Z",
"description": "Let's share our knowledge on Python Programming",
"id": "366190054572553",
"is_nsfw": null,
"metrics": {
"member_count": 763182
},
"moderators": [
{
"avatar_url": "https://scontent-atl3-1.xx.fbcdn.net/v/t39.30808-1/297738489_149183324449711_6655284279259187616_n.jpg?stp=cp0_dst-jpg_tt6&cstp=mx720x730&ctp=p64x64&_nc_cat=106&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-1.xx&_nc_gid=SCRUBBED&_nc…",
"display_name": "Nusrat Jahan",
"id": "pfbid06GnASXZiYzDf35bsZJ3QLiKd5swrdR2gbc9txBtTEAZvJz1oW5bg7n1zMF1wzFJul",
"is_verified": null,
"url": "https://www.facebook.com/people/Nusrat-Jahan/pfbid06GnASXZiYzDf35bsZJ3QLiKd5swrdR2gbc9txBtTEAZvJz1oW5bg7n1zMF1wzFJul/",
"username": null
},
{
"avatar_url": "https://scontent-atl3-1.xx.fbcdn.net/v/t39.30808-1/242977119_109642788145497_5023972278328162431_n.jpg?stp=cp0_dst-jpg_tt6&cstp=mx1200x1200&ctp=s64x64&_nc_cat=110&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-1.xx&_nc_gid=SCRUBBED&_…",
"display_name": "Thesoftwarelion",
"id": "100079525026696",
"is_verified": null,
"url": "https://www.facebook.com/profile.php?id=100079525026696",
"username": null
},
{
"avatar_url": "https://scontent-atl3-1.xx.fbcdn.net/v/t39.30808-1/795255518_27959759933716428_4332290339331851799_n.jpg?stp=cp0_dst-jpg_tt6&cstp=mx1568x1556&ctp=s64x64&_nc_cat=110&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-1.xx&_nc_gid=SCRUBBED…",
"display_name": "Jamil Ahmed",
"id": "pfbid02tVzjeEoXMnLspija9MeZZfBPwsH4T5796pNLJhq8jhk2QZ8EThUdgbsDi7uPqFMXl",
"is_verified": null,
"url": "https://www.facebook.com/people/Jamil-Ahmed/pfbid02tVzjeEoXMnLspija9MeZZfBPwsH4T5796pNLJhq8jhk2QZ8EThUdgbsDi7uPqFMXl/",
"username": null
}
],
"name": null,
"platform": "facebook",
"platform_specific": {
"facebook": {
"admin_count": 3,
"admin_ids": [
"pfbid06GnASXZiYzDf35bsZJ3QLiKd5swrdR2gbc9txBtTEAZvJz1oW5bg7n1zMF1wzFJul",
"100079525026696",
"pfbid02tVzjeEoXMnLspija9MeZZfBPwsH4T5796pNLJhq8jhk2QZ8EThUdgbsDi7uPqFMXl"
],
"daily_post_count": 21,
"history_summary": "Group created on October 14, 2020. Name last changed on October 16, 2020.",
"is_visible": true,
"locations": [],
"moderator_count": 0,
"monthly_post_count": 1641,
"owner": null,
"weekly_new_member_count": null
}
},
"privacy": "public",
"rules": [
{
"description": "We're all in this together to create a welcoming environment. Let's treat everyone with respect. Healthy debates are natural, but kindness is required.",
"title": "Be Kind and Courteous"
},
{
"description": "Make sure everyone feels safe. Bullying of any kind isn't allowed, and degrading comments about things like race, religion, culture, sexual orientation, gender or identity will not be tolerated.",
"title": "No Hate Speech or Bullying"
},
{
"description": "Give more than you take to this group. Self-promotion, spam and irrelevant links aren't allowed.",
"title": "No Promotions or Spam"
}
],
"title": "Python Programming",
"unknown_fields": [],
"url": "https://www.facebook.com/groups/366190054572553/"
},
"meta": {
"request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
"platform": "facebook",
"source": "page",
"is_cached": false,
"credits_charged": 1,
"latency_ms": 1564,
"fetched_at": "2026-10-25T12:00:00Z",
"input": {
"kind": "community",
"id": "366190054572553",
"url": "https://www.facebook.com/groups/366190054572553/"
},
"credits_remaining": 9999,
"client_request_id": null,
"warnings": []
}
}import { SocialTap } from "socialtap";
const client = new SocialTap(); // apiKey defaults to process.env.SOCIALTAP_API_KEY
const res = await client.facebook.group.get({ url: "https://www.facebook.com/groups/366190054572553/" });
console.log(res.data);
console.log(res.credits.charged, res.meta.request_id);import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) throws Exception {
String query = "url=" + encode("https://www.facebook.com/groups/366190054572553/");
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://socialtap.dev/v1/facebook/group?" + query))
.header("x-api-key", System.getenv("SOCIALTAP_API_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
// An error is {"error": {"code", "message", ...}}; success is {data, meta}, meta.credits_charged its price.
if (response.statusCode() >= 400) throw new RuntimeException(response.body());
System.out.println(response.body());
}
static String encode(String value) {
return URLEncoder.encode(value, StandardCharsets.UTF_8);
}
}using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("SOCIALTAP_API_KEY"));
var query = string.Join("&",
"url=" + Uri.EscapeDataString("https://www.facebook.com/groups/366190054572553/"));
var res = await http.GetAsync("https://socialtap.dev/v1/facebook/group?" + query);
using var body = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
if (!res.IsSuccessStatusCode)
{
var error = body.RootElement.GetProperty("error");
throw new Exception($"{error.GetProperty("code")}: {error.GetProperty("message")}");
}
Console.WriteLine(body.RootElement.GetProperty("data"));
Console.WriteLine(body.RootElement.GetProperty("meta").GetProperty("credits_charged"));// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }, serde_json = "1"
use std::env;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let res = reqwest::blocking::Client::new()
.get("https://socialtap.dev/v1/facebook/group")
.query(&[("url", "https://www.facebook.com/groups/366190054572553/")])
.header("x-api-key", env::var("SOCIALTAP_API_KEY")?)
.send()?;
let ok = res.status().is_success();
let body: serde_json::Value = res.json()?;
if !ok {
return Err(format!("{}: {}", body["error"]["code"], body["error"]["message"]).into());
}
println!("{} {}", body["data"], body["meta"]["credits_charged"]);
Ok(())
}200 OK · GET https://socialtap.dev/v1/facebook/groupLong arrays and strings are shortened here. Real responses are complete.Docs One schema on 3 platforms.
The response reference lists every field, its type and when it is null. See the full schema.
Null means unknown
A field Facebook doesn't show is null, never zero or an empty string, so a real zero always means zero.
What it accepts
The group: its link (facebook.com/groups/<ID or name>, any tab of it, on any facebook.com host; the legacy group.php?gid=<ID>), its share link (facebook.com/share/g/<code>) or its bare numeric ID.
Write one parser
Facebook, Reddit and X answer in these fields, so the code that reads one reads them all.
platformstring- Platform ID (reddit, facebook, …).
idstring- Platform-native community ID (string): Reddit's subreddit ID with its t5_ prefix, Facebook's numeric group ID.
namestring- The name its links use, without a prefix (golang for r/golang; a Facebook group's vanity name); null when it has none (a Facebook group known only by its number).
titlestring- The community's title as its page shows it ("The Go Programming Language"; what Facebook calls a group's name); null when it has none.
descriptionstring- Its short description as plain text; null when it has none.
urlstring- Canonical community URL (https://www.reddit.com/r/golang/, https://www.facebook.com/groups/<id>/).
avatar_urlstring- The community's icon or picture; null when it has none. Platform CDN URLs can expire.
banner_urlstring- Header or cover image URL; null when it has none.
Live data from 33 platforms.
What teams build with the Facebook Group API.
Vet a group before joining or advertising
Track a group's members and activity
Find who runs a group
Enrich groups found by search or in posts
Good to know before you build.
- A private group returns what its page shows logged out: description, rules and activity, but not who runs it (moderators is empty and listed in unknown_fields, admin_count and moderator_count null). Its posts are for members only.
- moderators lists the admins first, then the moderators, as many of each as Facebook shows. platform_specific.facebook.admin_ids names the admins among them, and admin_count and moderator_count count them all.
- A link Facebook shows nothing for (an unknown name, a hidden or removed group) returns private_or_unavailable, without saying which.
- weekly_new_member_count is null when Facebook's page says no one joined, which it says of every group logged out, growing ones too.
- Facebook groups have no adult label, so is_nsfw is always null.
1 credit per request. Failed requests are free.
Buy credits once and spend them on any endpoint, on any platform.
| Source | Price per successful request | Per 1,000 requests |
|---|---|---|
| Any source | 1 credit | $0.75–$1.97 |
- Cache hits are free.
- Credits from packs and top-ups never expire.
- A monthly plan's credits are spent first, and what is left of them ends at each renewal.
- Prices exclude tax: sales tax is added at checkout where it applies.
- Outside the US, plans and packs are sold to businesses: checkout asks for your VAT, GST or other business tax ID.
Questions about the Facebook Group API.
More in the API reference.
Can I get a group's member list?
How much does the Facebook Group API cost?
Try it on a link you already have.
Paste it in the playground, or copy the request into your code.
- No credit card
- Failed requests are free
- Works on all 218 endpoints