Facebook Groups API and MCP — Posts from Public Groups
Send the URL or ID of a public Facebook group and this source returns its posts as data: text, author, time, reactions, comment and share counts, attachments and top comments. In BuySell groups it also returns the listing's price and location.
- You send
- A public Facebook group URL or ID
- You get back
- Group posts with text, author, engagement, attachments and top comments
- Coverage
- Public Facebook groups.
- Price
- 10 points per returned post, up to 1,000 per request — $10 per 1,000
- Billed per post actually returned, capped by max_items. A group that isn't public or has no posts in your window costs nothing.
Ways to get this data
Three approaches teams use today, and where each one runs into trouble.
| Approach | What it takes | Cost | Trade-off |
|---|---|---|---|
| Joining and reading | Join the group and scroll | Free, and slow | Doesn't scale across many groups or months of posts |
| Meta's Graph API | Group admin permissions | Free, gated | Only covers groups you administer |
| NeuralVerge | One request per group | $10 per 1,000, misses not billed | Public groups only — private groups cannot be read |
What you get back
Every field in the example response below.
| Field | Type | Description |
|---|---|---|
sort | string | The order used: CHRONOLOGICAL, RECENT_ACTIVITY, TOP_POSTS or CHRONOLOGICAL_LISTINGS. |
total_items | number | How many posts came back. |
items[].id | string | Facebook's post ID. |
items[].url | string | Direct link to the post. |
items[].time | string | When the post was published (ISO 8601). |
items[].text | string | Post text. |
items[].author | object | Who posted: id, name and profile picture. |
items[].group_title | string | The group's name. |
items[].likes_count | number | Likes on the post. |
items[].comments_count | number | Comments on the post. |
items[].shares_count | number | Shares of the post. |
items[].reactions | object | Reaction counts by type. |
items[].media | array | Attached photos and videos. |
items[].price | string | null | Listing price, in BuySell groups. |
items[].location | string | null | Listing location, in BuySell groups. |
items[].top_comments | array | A few top comments on the post. |
Example response
A real response, as returned.
{
"session_id": "4109d432-a394-40d2-85ab-daeb85145f7d",
"kind": "facebook_groups",
"url": "https://www.facebook.com/groups/874728723021553/",
"max_items": 2,
"sort": "CHRONOLOGICAL",
"partial": false,
"machine": {
"total_items": 2,
"items": [
{
"id": "UzpfSTEwMDA2NDM5NjI4NTkyMTpWSzoyNjUwMTgzNjg4ODA5Mzcy",
"url": "https://www.facebook.com/groups/874728723021553/permalink/2650183688809372/",
"time": "2026-10-26T09:16:06.000Z",
"text": "Let's welcome our new members! …",
"author": { "id": "100064396285921", "name": "AllMath" },
"source_id": "874728723021553",
"group_title": "Maths Formulas",
"likes_count": 3,
"comments_count": 0,
"shares_count": 0,
"reactions": { "like": 3, "love": null, "haha": null, "wow": null, "sad": null, "angry": null, "care": null },
"is_video": false,
"media": [
{
"type": "Photo",
"url": "https://www.facebook.com/photo/?fbid=1588055790017615&set=gm.2650183688809372&idorvanity=874728723021553",
"ocr_text": "May be pop art of crowd"
}
],
"price": null,
"location": null,
"top_comments": []
},
{
"id": "UzpfSTEwMDA2NDM5NjI4NTkyMTpWSzoyNjQ5Mjk2NjQ1NTY0NzQz",
"url": "https://www.facebook.com/groups/874728723021553/permalink/2649296645564743/",
"time": "2026-10-25T12:17:10.000Z",
"text": "Let's welcome our new members! …",
"author": { "id": "100064396285921", "name": "AllMath" },
"group_title": "Maths Formulas",
"likes_count": 2,
"comments_count": 0,
"shares_count": 1,
"reactions": { "like": 1, "love": null, "haha": null, "wow": null, "sad": null, "angry": null, "care": 1 },
"price": null,
"location": null,
"top_comments": []
}
],
"errors": []
},
"total_points": 20
}How to run it
The same lookup works from the app, the API, or as a tool an agent can call mid-task.
This endpoint is synchronous: the call blocks until the lookup completes and returns the records directly. If a lookup hits its time budget before finishing, the response comes back with partial: true and whatever it collected so far — re-run with a smaller max_items for a complete result. url is required. Optional: max_items (1-1,000, default 20), sort (CHRONOLOGICAL, RECENT_ACTIVITY, TOP_POSTS, or CHRONOLOGICAL_LISTINGS for BuySell groups; default CHRONOLOGICAL), newer_than (a date or a period).
curl -X POST https://api.neuralverge.ai/functions/v1/run-facebook-groups \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://www.facebook.com/groups/874728723021553", "max_items": 20, "sort": "TOP_POSTS" }'What teams use it for
Where this field shows up in an actual workflow.
Learn what a niche audience asks about, recommends and complains about.
See which tools and suppliers come up in practitioner groups, and in what tone.
Read BuySell listings with price and location to gauge second-hand prices.
Find the questions a community keeps asking and answer them.
Coverage, freshness and limits
What this source covers, how fresh it is, and where it stops.
Public Facebook groups.
Read at request time.
This source returns publicly visible content, which can include the names and words of private individuals. Use it for legitimate business purposes under your own lawful basis, honour deletion and opt-out requests, and check the acceptable use policy for what is out of bounds. Every record is stamped with the URL it was read from and a session id you can trace.
- —Private groups cannot be read — the response comes back with a not_available error and costs nothing.
- —Group admins' automated posts (welcome messages, rules reminders) come back like any other post; filter them out downstream.
- —Price and location fields are only filled in BuySell groups.
Questions, answered
Yes — every Data Source endpoint, including this one, is synchronous: the lookup runs inside the request and the result comes back in the same response, no polling. If a lookup hits its time budget before finishing, the response comes back with partial: true and whatever records it collected so far — re-run with a smaller max_items to get a complete result instead of a partial one.
Related sources
Try facebook groups on your own data
One request format across every source in the catalog.