๐Ÿ“˜ Facebook Groups Posts Scraper Plus avatar

๐Ÿ“˜ Facebook Groups Posts Scraper Plus

Pricing

$14.99/month + usage

Go to Apify Store
๐Ÿ“˜ Facebook Groups Posts Scraper Plus

๐Ÿ“˜ Facebook Groups Posts Scraper Plus

Scrapes posts from multiple public Facebook groups, collecting text, images, authors, timestamps, reactions, comments, and post URLs. Ideal for community research, content analysis, trend tracking, and large-scale automated data extraction across many groups

Pricing

$14.99/month + usage

Rating

0.0

(0)

Developer

Scrapio

Scrapio

Maintained by Community

Actor stats

1

Bookmarked

62

Total users

3

Monthly active users

8 days ago

Last modified

Share

Facebook Group Scraper โ€” Extract Posts, Reactions and Group Data

Facebook Groups Posts Scraper Plus turns any public Facebook group into a structured JSON dataset โ€” one row per post, with a full reaction breakdown, share and comment counts, the real numeric author ID, and group metadata attached to every row. Unlike scraping frameworks that hand you raw HTML to parse, this Actor returns typed JSON ready for a database, a spreadsheet, or an LLM context window with no cleanup step. It ships with five local filters (date window, include/exclude keywords, minimum engagement) and persistent cross-run deduplication, so a scheduled job only ever returns posts you haven't seen yet. The rest of this guide covers every input and output field byte-for-byte, and how teams actually wire the Actor into a pipeline.


๐Ÿงญ What Does Facebook Groups Posts Scraper Plus Do?

Facebook Groups Posts Scraper Plus collects posts published inside public Facebook groups โ€” text posts, photos, videos, links, shared posts, and Reels โ€” and returns each one as a structured record. It works without a Facebook account or login: the Actor fetches the group's public page anonymously through a proxy, extracts the tokens Facebook's own web client needs, and queries the same GraphQL endpoint the Groups feed uses in a browser.

  • Accepts group URLs, usernames, or numeric group IDs as input, singly or in bulk
  • Returns full post text, post type (text / photo / video / link / shared / reel), and parsed hashtags
  • Breaks reactions down into like / love / care / haha / wow / sad / angry counts, plus total reactions, share count, and comment count
  • Resolves and attaches the real numeric Facebook group ID and group title to every post
  • Emits the author's real numeric Facebook user ID, name, profile URL, and profile picture
  • Filters posts locally by date window, include/exclude keywords, and minimum engagement before anything is charged
  • Remembers post IDs across runs (in a named key-value store) so scheduled runs return only new posts

โšก Features & Capabilities

The Actor's feature set splits into what it extracts, how it holds up against comparable Facebook scrapers, and where it fits inside a broader Scrapio pipeline.

Core features

  • Full reaction breakdown โ€” reactions.like, reactions.love, reactions.care, reactions.haha, reactions.wow, reactions.sad, reactions.angry, plus likesCount (total reactions) and topReactionsCount (how many distinct reaction types appear on the post)
  • Real numeric author IDs โ€” user.id is Facebook's genuine numeric user ID (or a real pfbid when that's what Facebook's payload returns), never a re-hashed or synthetic value
  • Group metadata on every row โ€” groupId (resolved numeric group ID) and groupTitle travel with each post, not just the group-level input
  • Engagement fields โ€” sharesCount and commentsCount per post (comment counts only โ€” see Limitations below)
  • Hashtag parsing โ€” hashtags is extracted from text with a regex, deduplicated case-insensitively while preserving the original casing and first-seen order
  • Post-type and Reel detection โ€” postType and isReel are derived from the GraphQL payload's __typename fields and attachment shapes, not guessed from the URL alone
  • Structured attachments โ€” attachments normalizes Photo, Video, and Link media into a consistent per-type shape (photo_image/video/title+description)
  • Local filters before charging โ€” onlyPostsNewerThan, onlyPostsOlderThan, keywords, excludeKeywords, and minEngagement are applied before a post is ever pushed to the dataset
  • Persistent cross-run dedup โ€” dedupAcrossRuns stores seen post IDs in a named key-value store (fb-groups-posts-seen, capped at the most recent 50,000 IDs) so repeated scheduled runs only return new posts

How Facebook Groups Posts Scraper Plus compares to other Facebook group scrapers

FeatureFacebook Groups Posts Scraper Plusdanek/facebook-groups-posts-scraperapi-empire/facebook-groups-posts-scraper
Output formatTyped JSONTyped JSONTyped JSON
Reaction breakdown by typeโœ… 7 types + totalโŒ single reactions_count total (as observed on the Apify Store on 2026-07-26)โŒ not present in the published example output (as observed on the Apify Store on 2026-07-26)
Group ID + group title on every rowโœ…โŒ not in the published output schema (as observed on the Apify Store on 2026-07-26)โŒ facebookUrl only, no numeric group ID (as observed on the Apify Store on 2026-07-26)
Author ID formatReal numeric IDEmpty id field in the published example (as observed on the Apify Store on 2026-07-26)Hashed pfbid... string in the published example (as observed on the Apify Store on 2026-07-26)
Hashtag extractionโœ…โŒ not documentedโŒ not documented
Date / keyword / engagement filtersโœ… 5 input parametersโŒ not documentedListed as a feature bullet ("Filter by date or number of posts") without parameter names shown (as observed on the Apify Store on 2026-07-26)
Cross-run deduplicationโœ… persistent key-value storeโŒ not documentedโŒ not documented

If your use case is feeding structured data to an LLM or a pipeline, the output-format row rarely differs between these three โ€” the field-depth and author-ID-accuracy rows are the ones worth checking against your own sample run, since a hashed or empty author ID breaks any workflow that needs to identify or de-duplicate posters.

When another tool might suit you better

danek's Facebook Groups Scraper Lite is explicitly built to run on the Apify platform's lowest memory tier and is priced at a flat low monthly fee, which is a legitimate fit if all you need is post text, a total reaction count, and a comment count, and you don't need reaction-type breakdowns, group metadata, or built-in filters. If your workload is that minimal, its lighter schema may run cheaper for high-volume, low-detail monitoring.

Facebook Groups Posts Scraper Plus within the Scrapio data stack

Facebook Groups Posts Scraper Plus covers group post content and engagement. For a Facebook Page's own posts and comments, use Facebook Page Posts & Comments Scraper. For keyword-driven public post discovery across Facebook, use Facebook Posts Search Scraper Plus. For short-form video content, use Facebook Reels Scraper Plus. To resolve a Facebook URL into its numeric ID directly, use Facebook URL โ†’ ID Plus.


Why do developers and data teams scrape Facebook groups?

๐Ÿข Marketing and community teams

Community and brand teams feed group URLs into startUrls, set keywords to their brand or product names, and use minEngagement to surface only posts that are actually getting traction. The resulting text, reactions, sharesCount, and commentsCount fields go straight into a report or a Slack alert โ€” no manual scrolling through group feeds to catch when a product gets mentioned or complained about inside a niche community.

๐Ÿ“Š AI training data and RAG indexing

The text field is the highest-information field for both use cases: it's the raw, unstructured discussion content that group members actually wrote. For RAG enrichment, indexing text alongside groupTitle and date lets an agent answer "what is this community saying about X, and when" with source-grounded context. For training data, postType, hashtags, and the reactions breakdown give consistent, typed structure across every record โ€” no HTML parsing or field-name drift between runs, since the schema is fixed by this Actor rather than by Facebook's front end.

๐Ÿ“ฑ Competitive and market intelligence

Point the Actor at a competitor-run or industry group and track sharesCount and the reactions breakdown over successive scheduled runs to see which posts and topics are actually spreading, rather than just getting posted. Because dedupAcrossRuns skips posts you've already collected, a weekly schedule naturally builds a time series of new activity per group without re-processing old posts.

๐Ÿ”ฌ Research and academic use

Public Facebook group discussions are a recognized source for social and market research datasets โ€” discourse analysis, misinformation studies, community-dynamics research. This Actor returns only what is already publicly visible in a group's feed; it does not access private groups, and it does not attempt to bypass a login or consent wall if one is presented.

๐ŸŽฅ Product and SaaS development

Teams building monitoring dashboards, lead-enrichment tools, or community-analytics products can run this Actor on a schedule and treat its dataset as an ingestion source: groupId and postUrl provide stable keys for deduplication and joins, while user.id gives a consistent identifier for building an author-level rollup across posts.


Input Parameters

Every parameter below is read directly from .actor/actor.json. Only startUrls is required.

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarrayFacebook group URLs, usernames, or numeric group IDs. Accepts single or bulk input.["https://www.facebook.com/groups/cheapmealideas/"]
maxPostsNointegerMaximum posts to collect per group. Minimum 10, maximum 10000, default 10.50
sortByNostringPost ordering. Enum: ALL (combines all three sort orders for maximum coverage โ€” default), TOP_POSTS (most-engaged first), CHRONOLOGICAL (newest first), RECENT_ACTIVITY (latest comments/reactions first)."ALL"
onlyPostsNewerThanNostringKeep only posts published after this date. Absolute (2026-01-01) or relative ("7 days", "2 weeks", "1 month"). Empty disables the filter."7 days"
onlyPostsOlderThanNostringKeep only posts published before this date. Same absolute/relative format as above. Combine with onlyPostsNewerThan for a window."2026-06-01"
keywordsNoarrayKeep only posts whose text contains at least one of these strings (case-insensitive substring match). Empty disables the filter.["recipe", "dinner"]
excludeKeywordsNoarrayDrop posts whose text contains any of these strings (case-insensitive substring match). Empty disables the filter.["spam", "giveaway"]
minEngagementNointegerKeep only posts where likesCount + commentsCount + sharesCount is at least this value. Minimum 0, default 0 (disabled).10
dedupAcrossRunsNobooleanRemember post IDs from previous runs (in a named key-value store) and skip them, so repeated runs return only new posts. Default true.true
proxyConfigurationNoobjectApify proxy settings.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}
{
"startUrls": ["https://www.facebook.com/groups/cheapmealideas/"],
"maxPosts": 50,
"sortBy": "ALL",
"onlyPostsNewerThan": "7 days",
"keywords": ["recipe"],
"excludeKeywords": ["giveaway"],
"minEngagement": 10,
"dedupAcrossRuns": true,
"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}

Supported URL types and input formats

startUrls normalizes three input shapes before scraping:

  • Full group URL โ€” https://www.facebook.com/groups/cheapmealideas/ is used as-is.
  • Bare username or slug โ€” mrbeast is expanded to https://www.facebook.com/groups/mrbeast.
  • Numeric group ID โ€” a bare numeric string is expanded the same way (https://www.facebook.com/groups/<id>), and the Actor's node-ID resolver reads the numeric ID straight out of that URL pattern with zero extra requests.

โš ๏ธ proxyConfiguration note: the Actor only reads proxyConfiguration.proxyUrls. If you supply your own proxy URLs there, the Actor tries them first and falls back to Apify Residential proxy (3 retries) if a custom proxy request fails. In every other case โ€” including the default proxyConfiguration and any other apifyProxyGroups selection โ€” the Actor always uses Apify Residential proxy with 3 retries per request. The useApifyProxy toggle and non-custom apifyProxyGroups values are accepted by the schema but do not change which proxy tier is used.


๐Ÿ“ฆ Output Format

Every collected post is pushed to the Apify dataset as one JSON row. The dataset's default view surfaces 20 of the row's fields (listed in .actor/actor.json's storages.dataset.views.default); the full row carries 22 keys, including two โ€” feedbackId and url โ€” that exist on every row but are not shown in the default table view.

Output for posts

{
"type": "post",
"id": "UzpfSTEwMDAwMzI2Mzk5MTI5OTpWSzoyNzkzNzc0OTMzMjUyNDIwMw==",
"feedbackId": "ZmVlZGJhY2s6Mjc5Mzc3NDkzMzI1MjQyMDM=",
"groupId": "126966114029232",
"groupTitle": "Cheap Meal Ideas",
"groupUrl": "https://www.facebook.com/groups/cheapmealideas/",
"inputUrl": "https://www.facebook.com/groups/cheapmealideas/",
"postUrl": "https://www.facebook.com/groups/cheapmealideas/posts/27937749332524203/",
"url": "https://www.facebook.com/groups/cheapmealideas/posts/27937749332524203/?__cft__[0]=abc",
"user": {
"id": "100003263991299",
"name": "Mark Gandman",
"profileUrl": "https://www.facebook.com/profile.php?id=100003263991299",
"profilePic": "https://scontent.xx.fbcdn.net/v/t39.30808-1/example.jpg"
},
"date": "2026-06-30T22:38:24.000Z",
"text": "If you only had $20 to buy groceries for the week, what's on your list?",
"postType": "text",
"isReel": false,
"hashtags": [],
"attachments": [],
"likesCount": 59,
"reactions": { "like": 57, "love": 2, "care": 0, "haha": 0, "wow": 0, "sad": 0, "angry": 0 },
"topReactionsCount": 2,
"sharesCount": 9,
"commentsCount": 386,
"scrapedAt": "2026-07-01T18:37:20.000Z"
}

A post with a photo attachment carries a populated attachments array instead:

"attachments": [
{
"__typename": "Photo",
"photo_image": { "uri": "https://scontent.xx.fbcdn.net/photo.jpg", "height": 960, "width": 720 },
"__isMedia": "Photo",
"url": "https://www.facebook.com/photo/?fbid=123456",
"id": "123456",
"ocrText": ""
}
]

Video attachments use {"__typename": "Video", "video": {"uri", "height", "width"}, ...}; link attachments use {"__typename": "Link", "url", "title", "description", "id"}.

Output for the embedded author and group objects

user is a nested object on every post row, not a separate dataset โ€” {id, name, profileUrl, profilePic}, with id as Facebook's real numeric user ID (or a genuine pfbid string, whichever the GraphQL payload actually carries โ€” this Actor never re-hashes or synthesizes the value). Group data is likewise embedded per row rather than fetched once: groupId is the resolved numeric group ID and groupTitle is the group's display name, both attached to every post from that group.

Note: the Actor returns commentsCount per post โ€” a count, not the individual comment thread. It does not extract comment text, comment authors, or nested replies.

Schema stability and export options

Field names are fixed by this Actor's row-building code, not by Facebook's front end โ€” if Facebook changes its internal GraphQL response shape, the extraction functions that walk the payload are updated, but the output keys (likesCount, reactions, groupId, etc.) stay the same across runs. Results live in a standard Apify dataset: export to JSON, CSV, Excel, or XML directly from the Apify Console, or read programmatically via the Apify API or the apify-client SDK.


๐Ÿ’ก Facebook Groups Posts Scraper Plus Strategy Guide

๐ŸŽฏ Strategy 1: Real-time enrichment pipeline

Trigger a run whenever a new group needs monitoring (webhook, cron, or manual start), pass its URL in startUrls, and set minEngagement to filter noise before it ever reaches your system. Read groupId, text, reactions, sharesCount, and user.id off each pushed row and write them into your CRM, alerting tool, or analytics warehouse โ€” because filtering happens before Actor.push_data is called, you're only ever charged for rows you actually keep.

๐ŸŽฏ Strategy 2: Scheduled monitoring and alerting

Set up an Apify Schedule to re-run the Actor against the same startUrls on a recurring cadence, and leave dedupAcrossRuns at its default true. Because seen post IDs persist in the named key-value store fb-groups-posts-seen across runs, each scheduled execution's dataset contains only posts that appeared since the previous run โ€” diff the new rows' reactions and sharesCount against your last snapshot to alert on posts crossing an engagement threshold you define.

๐ŸŽฏ Strategy 3: Bulk dataset build

Pass a full list of group URLs, usernames, or numeric IDs in a single startUrls array and set maxPosts to the depth you need per group (up to the schema maximum of 10000). Each group is processed sequentially within one run, with a short pause between groups. Aggregate the resulting dataset to CSV or a database for research or model-training use โ€” the Actor does not document a concurrency or parallel-groups-per-run limit, so plan capacity around your own run duration rather than a published ceiling.

Strategy comparison at a glance

StrategyBest forRun patternOutput format
Real-time enrichmentAlerting on individual group activityOn-demand trigger per groupStreamed dataset rows, read as they land
Scheduled monitoringTracking new posts over timeApify Schedule + dedupAcrossRunsIncremental dataset per run
Bulk dataset buildResearch or training datasetsOne run, many startUrlsFull dataset exported to CSV/JSON

ScraperWhat it extracts
Facebook Page Posts & Comments ScraperPosts and comments from a public Facebook Page
Facebook Posts Search Scraper PlusPublic Facebook posts matching a search keyword
Facebook Reels Scraper PlusFacebook Reels and their engagement metrics
Facebook URL โ†’ ID PlusResolves any Facebook URL to its numeric ID
Instagram Hashtag Stats Scraper PlusInstagram posts, likes, and comments for a hashtag
Reddit Comment Scraper PlusComments and replies from a Reddit thread
TikTok Trending Videos Scraper PlusTrending TikTok videos and engagement data

How to integrate Facebook Groups Posts Scraper Plus with your stack

Facebook Groups Posts Scraper Plus works with any language or tool that can make an HTTP request, via the Apify API or its official client SDKs.

Python

from apify_client import ApifyClient
import csv
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"startUrls": ["https://www.facebook.com/groups/cheapmealideas/"],
"maxPosts": 100,
"sortBy": "ALL",
"minEngagement": 5,
"dedupAcrossRuns": True,
}
run = client.actor("scrapio/facebook-groups-posts-scraper-plus").call(run_input=run_input)
rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())
with open("facebook_group_posts.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=[
"id", "groupId", "groupTitle", "postUrl", "text",
"postType", "likesCount", "sharesCount", "commentsCount", "date",
])
writer.writeheader()
for row in rows:
writer.writerow({k: row.get(k) for k in writer.fieldnames})
print(f"Saved {len(rows)} posts to facebook_group_posts.csv")

Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('scrapio/facebook-groups-posts-scraper-plus').call({
startUrls: ['https://www.facebook.com/groups/cheapmealideas/'],
maxPosts: 100,
sortBy: 'ALL',
minEngagement: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const post of items) {
console.log(`${post.date} โ€” ${post.groupTitle}: ${post.text.slice(0, 80)}`);
}

Async and scheduled pipelines

For large jobs, start the run with client.actor(...).start() instead of .call() and poll client.run(runId).get() for status, or configure an Apify Schedule in the Console to re-run automatically. The Actor does not offer webhook payload delivery of its own, but Apify's platform-level webhooks can fire on run completion so your pipeline is notified without polling.


๐ŸŽฏ Who Needs Facebook Groups Posts Scraper Plus? (Use Cases & Industries)

๐Ÿข Marketing and community teams

Track when a brand, product, or campaign name is mentioned inside relevant Facebook groups by setting keywords, then route posts above a minEngagement threshold to a Slack channel or ticketing system using the text, postUrl, and reactions fields.

๐Ÿ“Š AI/ML and data teams

Build a RAG index or fine-tuning dataset from group text content, keyed by groupId and timestamped by date, with postType and hashtags as structured metadata that requires no additional parsing.

๐Ÿ“ฑ Competitive intelligence analysts

Monitor an industry or competitor-adjacent group on a schedule, and use sharesCount and the reactions breakdown to identify which topics are actually gaining traction rather than just being posted.

๐Ÿ”ฌ Researchers

Collect public discourse from Facebook groups relevant to a social-science or market-research question. The Actor accesses only public group data and does not attempt to bypass a login or consent wall.

๐ŸŽฅ Product and lead-gen tool builders

Use user.id, user.name, and user.profileUrl as stable identifiers to build author-level rollups or enrichment records across the posts a scheduled run collects.


Scraping publicly accessible Facebook group data is generally lawful in the United States; the main legal exposure is contractual (Facebook's Terms of Service), not criminal. In hiQ Labs, Inc. v. LinkedIn Corp., 938 F.3d 985 (9th Cir. 2019), the Ninth Circuit held that scraping data a website makes publicly accessible does not violate the Computer Fraud and Abuse Act. In Meta Platforms, Inc. v. Bright Data Ltd. (N.D. Cal., 2024), the court rejected several of Meta's claims over the scraping of Meta's own publicly accessible, logged-out pages, finding that a scraper not bound by an accepted account agreement is not automatically in breach of Facebook's Terms of Service.

Separately, violating a platform's Terms of Service is a civil contract matter between the user and the platform, not a criminal one โ€” but it can still carry consequences such as IP blocking or account termination for logged-in access.

Because this Actor returns posts that include author names, numeric user IDs, profile URLs, and profile pictures โ€” all personal data under GDPR and CCPA โ€” anyone storing or processing that output for commercial purposes should have a documented lawful basis for doing so in their jurisdiction.

Facebook Groups Posts Scraper Plus returns only publicly accessible data. What you do with that data is your responsibility โ€” consult legal counsel for commercial applications involving personal data.


โ“ Frequently asked questions

Does Facebook Groups Posts Scraper Plus work without a Facebook account?

Yes. The Actor never asks for Facebook login credentials or a session cookie. It fetches the group's public page anonymously through a proxy and queries Facebook's own GraphQL endpoint the same way an unauthenticated browser visit would.

How does Facebook Groups Posts Scraper Plus handle Facebook's anti-scraping measures?

It rotates proxy sessions on failure, retries with exponential backoff, and specifically detects Facebook's HTTP-200 "soft block" โ€” a response that returns status 200 but contains a GraphQL {"errors":[{"message":"Rate limit exceeded","code":1675004}]} payload instead of data. That soft block is treated as retryable and triggers a proxy rotation plus an extended backoff (up to 30 seconds) before the next attempt.

Can I run Facebook Groups Posts Scraper Plus at scale without getting blocked?

The Actor defaults every request (other than a user-supplied custom proxy) to Apify Residential proxy, retried up to 3 times per request, with proxy rotation between pages. No uptime or block-rate figure is published for this behavior โ€” treat proxy rotation and retry as mitigations, not a guarantee.

How fresh is the data Facebook Groups Posts Scraper Plus returns?

Posts are fetched live from Facebook's GraphQL API on every run โ€” the Actor does not cache post content. It does persist a small technical cache (doc_id, node_id, end_cursor per group) in a key-value store purely to speed up recovery on a future run if extraction fails; that cache holds no post data.

Which fields work best for AI training and RAG indexing?

For RAG, index text (the raw post content) alongside groupTitle and date for source grounding. For training data, postType, hashtags, and the reactions breakdown give consistent, typed structure across records โ€” every field returns as a typed primitive, array, or nested object with a fixed shape, requiring no normalization before use.

What happens if a group is private or its posts are removed?

If a group requires a login or presents a consent wall to the proxy session, the Actor cannot resolve the group's numeric ID and logs an error for that group rather than returning partial or fabricated data โ€” it returns zero posts for that startUrls entry. Posts that are deleted between the Actor's page fetches simply stop appearing on subsequent pages; the Actor does not retroactively detect or flag removed posts.

What happens to my personal data if I appear in the results?

Facebook Groups Posts Scraper Plus extracts only data a group already makes visible to the public โ€” author name, numeric ID, profile URL and picture, and post content. Storage, use, and any further processing of that personal data is the responsibility of whoever runs the Actor, under GDPR, CCPA, or the applicable law in their jurisdiction.

Does Facebook Groups Posts Scraper Plus work with Claude, ChatGPT, and other AI agent tools?

There is no dedicated MCP server for this Actor. It is callable as a standard HTTP endpoint by any agent framework via the Apify API โ€” every response is typed JSON, so no HTML parsing step is needed before passing results into an LLM context window.

How does Facebook Groups Posts Scraper Plus compare to other Facebook group scrapers?

As observed on the Apify Store on 2026-07-26, danek's Facebook Groups Scraper Lite is lighter-weight and cheaper for bare-minimum post/comment-count extraction, but its published schema doesn't include a reaction-type breakdown, group metadata, or built-in filters. api-empire's listing markets comment and engagement collection but its own published example output shows author IDs in the hashed pfbid format and no numeric group ID field. Facebook Groups Posts Scraper Plus trades some of that minimalism for a deeper, filterable, deduplicated schema.


Disclaimer

Facebook Groups Posts Scraper Plus extracts only publicly available data from Facebook. This tool is intended for lawful use cases only. Users are responsible for complying with Facebook's Terms of Service and applicable data protection laws in their jurisdiction.