# Facebook Post Scraper (`insights_data/facebook-post-scraper`) Actor

Scrape public Facebook posts from pages, profiles, groups and post links. Get text, date, author, reactions by type, comments with replies, shares, photos, videos, views and transcripts as clean JSON. Date filters, live results, no account or cookies needed.

- **URL**: https://apify.com/insights_data/facebook-post-scraper.md
- **Developed by:** [Insights Data](https://apify.com/insights_data) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.10 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### 📘 What is Facebook Post Scraper?

**Facebook Post Scraper** lets marketers, researchers and analysts scrape public Facebook posts from pages, profiles, public groups and single post links. Just paste one or more Facebook URLs and click **Start**. For each post you get text, publish time, author, reaction counts by type, comments with replies, shares, photos and videos, video views and transcripts. No Facebook account, no login and no coding are needed.

It works as a Facebook scraper for public content only: it reads what a logged-out visitor can see, so you can scrape Facebook posts and comments without a developer app or API token. One tool covers three jobs: a Facebook page scraper, a Facebook group scraper, and a Facebook posts scraper for single links. Because each post arrives with its comments and replies, it also works as a Facebook post and comment scraper.

- **Monitor brands and competitors:** follow what pages publish and how people react, for Facebook page competitor analysis.
- **Social listening:** collect posts from public groups for Facebook social listening and community research.
- **Measure engagement:** get likes, comments, shares, all seven reaction types and an engagement rate for Facebook post analytics.
- **Analyze comments:** collect comment threads and replies as input for Facebook comment sentiment analysis.
- **Archive content:** keep post text, media links and video transcripts in a structured Facebook post dataset.
- **Feed AI and data pipelines:** send clean JSON to an LLM, a vector store or a BI dashboard.

#### What can Facebook Post Scraper do?

- 🔗 **Mix many sources in one run:** pages, profiles (including `profile.php?id=` links), public groups and direct post, reel, video, photo, share and event links.
- 📅 **Filter by date:** an absolute date (`2026-01-01`) or a relative one (`30 days`, `2 months`).
- 💬 **Collect comments and replies:** choose the comment order and how many comments and replies to keep per post.
- 🎬 **Add video details:** exact view and play counts for videos and reels, plus the auto-generated transcript when Facebook has one.
- 📸 **Get full photo albums:** feeds show at most 5 photos per album; the Actor can collect the rest.
- 📛 **Add page or group details:** followers, likes, category and verification for pages, or members and privacy for groups.
- ⚡ **See results live:** each post is saved to the dataset as soon as it is ready, not at the end of the run.
- 📦 **Export anywhere:** download JSON, CSV, Excel, XML or HTML, run it via API, schedule runs, monitor them and connect Make, Zapier, Google Sheets and more.

***

### 📋 What data can Facebook Post Scraper extract?

Facebook Post Scraper is a Facebook post extractor that returns one dataset item per post. These are the main fields (names as in the output):

| | |
|---|---|
| 🔗 Post link and ID: `url`, `postId`, `facebookUrl` | 📅 Publish time: `time`, `timestamp` |
| 📝 Post text: `text`, `hashtags`, `mentions`, `links` | 👤 Author: `user`, `pageName`, `collaborators` |
| ⭐ Totals: `likes` (all reactions), `comments`, `shares` | 😮 Reaction types: `reactionLikeCount`, `reactionLoveCount`, `reactionHahaCount`, `reactionWowCount`, `reactionSadCount`, `reactionAngryCount`, `reactionCareCount`, `reactionsBreakdown`, `topReactionsCount` |
| 📊 Engagement: `engagement`, `engagementRate` | 💬 Comments and replies: `topComments` |
| 📸 Media: `media`, `albumPhotoCount`, `albumTruncated` | 🎬 Video: `isVideo`, `viewsCount`, `videoPostViewCount`, `playCount`, `liveViewerCount`, `videoTranscript` |
| 🌐 Links and previews: `link`, `actionLink`, `previewTitle`, `previewDescription`, `previewSource`, `previewTarget` | 🔁 Shares: `sharedPost` |
| 🏷️ Type: `postType`, `sourceType`, `storyTitle`, `paidPartnership` | 📛 Source details: `sourceInfo`, `group` |
| 🕒 Backdating: `timeCreated`, `timestampCreated` | 🗂️ Other: `textReferences`, `feedbackId`, `scrapedAt` |

What some fields mean:

- `likes` is the total number of reactions. The seven `reaction…Count` fields split it by type, `reactionsBreakdown` also lists reaction types outside those seven, and `topReactionsCount` is the sum of all reported types.
- `engagement` is likes + comments + shares. `engagementRate` is engagement divided by the page's followers (or the group's members) × 100, so you can compare the Facebook post engagement rate across pages of different sizes.
- `postType` is one of `text`, `photo`, `album`, `video`, `reel`, `link`, `share` or `event`. `sourceType` is `profile` (page or person), `group` or `post`.
- `mentions`, `textReferences` and `collaborators` are lists of objects (name, id, URL and type), not plain text.
- Each comment in `topComments` has `id`, `text`, `time`, `author`, `reactionCount`, `commentCount`, `depth`, `parentId`, `replyToName` and `url`, plus `replies` when replies were collected.

> **Note:** Fields are `null` or empty when Facebook does not provide them for a post. Video counts (`viewsCount`, `playCount` and similar) can be `null`. `videoTranscript` exists only when Facebook generated a transcript. `sourceInfo` and `engagementRate` are `null` for direct post links, because no page or group follower count is read for them. `group` is filled only for posts from a group source. `timeCreated` is filled only for backdated posts. Follower and member counts come from Facebook's rounded labels (for example "17M"), so they are approximate.

#### What data can't Facebook Post Scraper extract?

- Posts in private groups or other content that needs a login
- Facebook search results (search URLs are rejected)
- Lists of the people who reacted or shared (you get the counts)
- Marketplace listings, Ads Library entries and group member lists

For comments and replies on another social platform, see [TikTok Comments & Replies Scraper](https://apify.com/insights_data/tiktok-comments-replies-scraper).

***

### 🔍 How to scrape Facebook posts

Facebook Post Scraper is designed for an easy start, even if you've never extracted data from the web before.

1. [Create a free Apify account](https://console.apify.com/sign-up) using your email.
2. Open [Facebook Post Scraper](https://apify.com/insights_data/facebook-post-scraper).
3. Paste one or more Facebook URLs into **🔗 Facebook URLs**.
4. Click **Start** and wait for the run to finish. Posts appear in the **Output** tab while the run is going.
5. Download your data in JSON, CSV, Excel, XML or HTML.

> ⚠️ The first run looks small on purpose: **🔢 Max posts per source** is 10 by default. Raise the cap when you want more.

How long does a run take? It depends on the source and your settings, so time your first 10-post run. Comments, replies, video details and full albums add requests, so they make runs longer. To scrape Facebook posts on a schedule, see [Integrations and API](#integrations-and-api).

***

### 💲 Facebook Post Scraper pricing: how much does it cost to scrape Facebook?

Facebook Post Scraper uses **pay-per-event** pricing. Your bill has three parts:

| Part | Price | When it is charged |
|---|---|---|
| 💲 Results | **$2.99 per 1,000 results** ($0.00299 per result) on the Free plan (lower on paid plans, see below) | Once for each post saved to the dataset |
| 🚀 Actor start | $0.00005 per GB of run memory | Once per run. At the default 1 GB memory this is **$0.00005 per run** |
| ⚙️ Platform usage | Apify platform rates | The server time the run uses (memory × run time) plus Apify Proxy traffic, billed on top of the event prices |

| Apify plan | Price per post | Price per 1,000 posts |
|---|---|---|
| Free | $0.00299 | $2.99 |
| Starter | $0.0027 | $2.70 |
| Scale | $0.0024 | $2.40 |
| Business and higher | $0.0021 | $2.10 |

The plan discount applies to the result price only. The start fee is the same on every plan, and platform usage is billed at your Apify plan's own rates.

What counts as a result: **one result = one post**. Comments, replies, media and page details are stored inside the post's item and are not charged separately. Only saved posts are charged: a source that returns no posts (for example, a private group or a page that was not found) adds no result charges.

Example result charges at the Free plan price:

| Posts saved | Results | + start fee | Event total |
|---|---|---|---|
| 10 | $0.0299 | $0.00005 | about $0.03 |
| 100 | $0.299 | $0.00005 | about $0.30 |
| 1,000 | $2.99 | $0.00005 | about $2.99 |

Platform usage comes on top. In plain words, it is what Apify charges for the server and network the run uses: the run's memory multiplied by how long it runs, plus the traffic that goes through Apify Proxy. It depends on your settings, so there is no fixed number per post. Comments, replies, video details and full albums mean extra requests per post, and group details mean one extra request per group, so they add usage and make runs longer.

To estimate your total bill:

1. Start a run with your real settings and **Max posts in total** set to `10`.
2. When it finishes, open the run in Apify Console and read its total cost on the run page (it includes results, the start fee and platform usage).
3. Divide that cost by the number of posts saved, then multiply by the number of posts you plan to scrape.

Use the same test run to see how long your runs take.

To cap spending, set the **maximum charge limit** when you start a run. When it is reached, the Actor stops cleanly and keeps the posts it already saved.

See the [pricing tab](https://apify.com/insights_data/facebook-post-scraper/pricing) for the current events and prices.

#### Is scraping Facebook free?

You can try it on the Apify Free plan, which gives you [$5 of monthly credit](https://apify.com/pricing). Free-plan runs work the same as paid runs. The credit pays for result charges and platform usage together, so set a **maximum charge limit** when you start a run and do a small test run first.

***

### ⬇️ Facebook Post Scraper input

To run Facebook Post Scraper, you only need **🔗 Facebook URLs** (`urls`). Everything else has a sensible default. Set the input in the Actor's form or send it as JSON via the API.

Here's an example that collects up to 10 recent posts of a public page, with comments, replies and video details turned on (the defaults):

```json
{
  "urls": ["https://www.facebook.com/mrbeast/"],
  "maxPostsPerSource": 10
}
```

See the [input tab](https://apify.com/insights_data/facebook-post-scraper/input-schema) for a full description of all fields.

#### Settings most people change

| Form title | JSON name | Default | What it does |
|---|---|---|---|
| 🔗 Facebook URLs | `urls` | required | Pages, profiles, public groups and post links. Bulk input, mixed freely. |
| 🔢 Max posts per source | `maxPostsPerSource` | 10 | Posts per page, profile or group. `0` = no per-source cap. Ignored for direct post links (one post each). |
| 🧮 Max posts in total | `maxPostsTotal` | 0 | Posts for the whole run. `0` = no run cap. |
| 📅 Only posts newer than | `onlyPostsNewerThan` | empty | Keep posts published after this date. |
| 📆 Only posts older than | `onlyPostsOlderThan` | empty | Keep posts published before this date. |
| 📊 Max comments per post | `maxCommentsPerPost` | 5 | Top-level comments per post. `0` = all available. |
| 🧾 Output format | `outputFormat` | `full` | `full` = nested JSON; `flat` = simple columns for CSV and Excel. |

#### Advanced settings

| Form title | JSON name | Default | What it does |
|---|---|---|---|
| 🔃 Group feed order | `groupSort` | `new_posts` | Newest posts first (`new_posts`), Recent activity or Most relevant. Used for group sources; pick the option in the form or see the input tab for the JSON values. |
| 💬 Collect comments | `includeComments` | on | Read each post's comment thread instead of only the few comments shown in the feed. |
| 🔀 Comment order | `commentsSortOrder` | `all` | `all`, `most_relevant` or `newest`. |
| 🧵 Collect replies | `includeReplies` | on | Replies under each comment, nested replies included. Switches comments on. |
| 🪜 Max replies per comment | `maxRepliesPerComment` | 2 | `0` = all available. |
| 🎬 Exact video views | `includeVideoDetails` | on | Exact view and play counts for videos and reels. One extra request per video. |
| 📜 Video transcript | `includeVideoTranscript` | on | Facebook's auto-generated transcript, when one exists. Uses the same request as "Exact video views". |
| 📸 Full photo albums | `includeFullAlbums` | on | Collect every photo of an album, not just the 5 shown in the feed. |
| 📛 Page or group details | `includeSourceInfo` | on | Followers, likes, category and verification, or group members and privacy, on each post. |

#### Facebook URLs

Paste any mix of public Facebook links. Mobile links (`m.facebook.com`) work too.

- ✅ Page: `https://www.facebook.com/mrbeast/`
- ✅ Personal profile: `https://www.facebook.com/profile.php?id=<number>` (public posts only)
- ✅ Public group: `https://www.facebook.com/groups/<group-name>/`
- ✅ Single post: `https://www.facebook.com/<page-name>/posts/<post-id>` or a group post `https://www.facebook.com/groups/<group-name>/posts/<post-id>`
- ✅ Share link: `https://www.facebook.com/share/p/<code>/` (the Actor opens it and reads the post it points to)
- ✅ Reel or video: `https://www.facebook.com/reel/1635638018279834/`, `/videos/` and `fb.watch` links
- ✅ Event post: `https://www.facebook.com/events/<event-id>/` (read like a single post link)
- ❌ Bad: `https://www.facebook.com/search/posts?q=coffee` (search URL), a link to a private group

> ⚠️ Search URLs and non-Facebook links are rejected. Private groups return no posts because the Actor does not log in.

#### Date window

Use `YYYY-MM-DD`, a full ISO date, or a relative value such as `3 days` or `2 months`.

- ✅ Good: `"onlyPostsNewerThan": "30 days"`
- ❌ Bad: `"onlyPostsNewerThan": "last month"`

> ⚠️ "Only posts newer than" must be earlier than "Only posts older than", otherwise the run stops with an input error. For groups, the date window can stop the feed early only with **Newest posts first** (`new_posts`).

#### Comments and replies

`0` means "all available" for comments and replies. More comments mean more requests per post, so longer runs and more platform usage (the per-result price stays the same).

> ⚠️ To skip reading comment threads, turn off **both** "💬 Collect comments" and "🧵 Collect replies". Replies need comments, so leaving "Collect replies" on (the default) keeps comments on. `topComments` then holds only the few comments Facebook shows in the feed, if any.

***

### ⬆️ Facebook Post Scraper output

Results are stored in a dataset. You can see them in the **Output** tab while the run is going, view them as a table or JSON, and pick only the fields you need. To download, open **Storage → Datasets**, choose the dataset and click **Export** to get JSON, CSV, Excel, XML or HTML. This is how you export Facebook post data for your own tools.

The Output tab groups the data into seven views: **Overview**, **Engagement**, **Content**, **Media**, **Video**, **Comments** (one row per comment) and **Source**. A `RUN_SUMMARY` record shows the per-source results of the run. To open it, go to **Storage → Key-value stores**, open the run's store and click `RUN_SUMMARY` (or open the run and use its **Storage** tab).

When optional fields are filled:

- `topComments` holds the collected comment thread when "Collect comments" is on and the post has comments. It can be an empty list if Facebook does not return the comments for a post.
- Video fields are filled for video and reel posts; exact counts need "Exact video views".
- `videoTranscript` is present only when "Video transcript" is on.
- `sourceInfo` is present only when "Page or group details" is on (and `null` for direct post links).

#### JSON example

Shortened example for one MrBeast reel from the input example above (values from the schema examples, with `isVideo` and `engagement` worked out from them; most fields are left out to keep it short):

```json
{
  "facebookUrl": "https://www.facebook.com/mrbeast/",
  "postId": "1672376377590626",
  "url": "https://www.facebook.com/reel/1635638018279834/",
  "time": "2026-10-10T16:00:45.000Z",
  "timestamp": 1791648045,
  "text": "I Handcuffed 10 Guys Together",
  "pageName": "MrBeast",
  "likes": 2931,
  "comments": 761,
  "shares": 23,
  "isVideo": true,
  "postType": "reel",
  "sourceType": "profile",
  "engagement": 3715
}
```

`postId` is Facebook's ID for the post. For reels and videos, the link in `url` contains the video's ID instead, so the two numbers can differ. That is expected.

#### Comment structure

Each entry in `topComments` looks like this. This shows the structure only: the values in angle brackets are placeholders, not real data. `replies` appears only on comments whose replies were requested, and it can be empty. Replies have the same fields except `replies` (they have no list of their own); nested replies sit in the same list and are marked by `parentId` and `replyToName`:

```json
{
  "id": "<comment ID>",
  "text": "<comment text>",
  "createdAt": "<Unix timestamp>",
  "time": "<ISO 8601 time>",
  "author": {
    "name": "<name>",
    "id": "<ID>",
    "gender": "<as provided by Facebook>",
    "url": "<profile URL>",
    "profilePicture": "<image URL>",
    "shortName": "<short name>",
    "isVerified": "<true or false>"
  },
  "reactionCount": "<number>",
  "commentCount": "<number of replies>",
  "depth": "<nesting level>",
  "parentId": "<parent comment ID, or null for top-level comments>",
  "replyToName": "<name of the person replied to>",
  "url": "<comment URL>",
  "replies": ["<reply objects with the same fields, without replies>"]
}
```

#### Flat format for spreadsheets

With `outputFormat` set to `flat`, nested objects become simple columns, so you can export Facebook comments to Excel or CSV in one file. For example, `user` becomes `userName`, `userUrl` and a user ID column; `media` becomes `mediaCount`, `mediaUrls` and `mediaTypes`; and comments become `topCommentsCount` and `topCommentsText`. Use the full format when you need each comment's author and replies.

***

### 💡 Tips and advanced usage

#### How many results can you scrape with Facebook Post Scraper?

Every Apify plan works the same way, the Free plan included: you control the volume with **Max posts per source** and **Max posts in total**. The exact number depends on how many posts the source shows to logged-out visitors, your date window, and Facebook's availability during the run. Very large sources may stop before the end of the feed. Like any Facebook post scraper tool that works without a login, it only sees what Facebook shows to logged-out visitors. The best way to know for your use case is a quick test run.

#### How to get faster or cheaper results

- Turn off what you don't need. Comments, replies, full albums, video details and transcripts (one shared request per video, so turning off transcripts alone saves nothing while "Exact video views" is on), and group details (one extra request per group) each add requests. Page details need no extra request.
- Keep `maxCommentsPerPost` and `maxRepliesPerComment` small unless you need full threads.
- Use a date window to stop at the posts you care about.
- Set `maxPostsTotal` and a maximum charge limit for predictable costs.

#### Scrape Facebook group posts

Add the public group URL to `urls`. With `groupSort` set to `new_posts`, a date window lets the Actor stop early once posts get too old. With **Recent activity** or **Most relevant**, the date window still filters posts, but it can't stop the feed early, so runs read more posts. So when you set up a Facebook group post scraper run with a date window, choose **Newest posts first**. Turn on "Page or group details" to add members and privacy (group details take one extra request per group).

#### Scrape Facebook page posts

Add page or profile URLs. Page and profile feeds are read newest first, so a date window stops early on its own. Page details (followers, likes, category, verification) come from the same page with no extra request. Setup is the same whether you need a Facebook page post scraper for brand pages or a Facebook profile post scraper for public personal profiles.

#### Known issues

- Private groups and login-only content can't be read.
- If Facebook doesn't offer the chosen comment order for a post type, Facebook's default order is used.
- Very large albums may not be complete; `albumTruncated` is `true` when fewer photos were collected than the album holds.

***

### 🔌 Integrations and API

#### Can I use Facebook Post Scraper as an API?

Yes. The [Apify API](https://docs.apify.com/api/v2) gives you programmatic access to Facebook Post Scraper, so you can use it as a Facebook posts API: start runs, schedule them and fetch results. Use the `apify-client` [NPM package](https://apify.com/insights_data/facebook-post-scraper/api/javascript) for Node.js or the `apify-client` [PyPI package](https://apify.com/insights_data/facebook-post-scraper/api/python) for Python. See the [API tab](https://apify.com/insights_data/facebook-post-scraper/api) for ready-to-use code.

This is a Facebook post scraper API built on the Apify API. It is not Facebook's official Graph API, and it doesn't need a Facebook developer app. You can use it as a Facebook public posts API for any public page, profile or group, or as a general Facebook scraper API in your own backend.

#### How to use Facebook post scraper Python code

Install `apify-client` with `pip install apify-client`, then run:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("insights_data/facebook-post-scraper").call(run_input={
    "urls": ["https://www.facebook.com/mrbeast/"],
    "maxPostsPerSource": 10,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["postId"], item["likes"], item["text"])
```

The client starts the run, waits for it to finish and then reads the dataset.

#### Can I integrate Facebook Post Scraper with other apps?

Yes. Connect Facebook Post Scraper with almost any cloud service through [Apify integrations](https://apify.com/integrations): **Make, Zapier, Slack, Google Sheets, Google Drive, Airbyte, GitHub, LangChain** and more. Use [webhooks](https://docs.apify.com/integrations/webhooks) to trigger actions when a run finishes.

Example workflow: schedule a daily run on your competitors' pages with `"onlyPostsNewerThan": "1 day"`, then send new posts to Google Sheets and post a Slack message when the run finishes.

#### Can I use Facebook Post Scraper with AI agents (MCP)?

Yes. Connect Facebook Post Scraper to Claude and other AI assistants through the Apify MCP server. Open the [MCP tab](https://apify.com/insights_data/facebook-post-scraper/api/mcp) for setup steps.

***

### 🔗 Other social media scrapers

More social media scrapers from the same developer, for posts, comments and profiles on other platforms:

| | |
|---|---|
| 🎵 [TikTok Profile Scraper](https://apify.com/insights_data/tiktok-profile-scraper): videos, reposts, stories and playlists with views, likes, comments and shares | 💬 [TikTok Comments & Replies Scraper](https://apify.com/insights_data/tiktok-comments-replies-scraper): comments and replies from videos, photo posts and profiles |
| 🌏 [Weibo Scraper — Posts, Comments, Profiles & Hot Search](https://apify.com/insights_data/weibo-scraper): Sina Weibo posts, comments, profiles and hot search boards | 📈 [Stocktwits Scraper](https://apify.com/insights_data/stocktwits-scraper): stock and crypto messages with bullish/bearish sentiment |

***

### ❓ FAQ

#### Is it legal to scrape Facebook?

Scraping publicly available data is generally legal, but how you collect and use it matters. Facebook Post Scraper reads only public content, without logging in. Posts and comments can contain personal data, so collect it only with a legitimate reason and follow data protection laws such as the GDPR. Also take Facebook's [Terms of Service](https://www.facebook.com/terms.php) into account. This is not legal advice; if you're unsure, ask a lawyer.

#### How does Facebook Post Scraper work?

It works like you browsing Facebook while logged out, only faster. For each URL it checks whether it's a page or profile, a group or a single post. It then reads the feed newest first (or in your chosen group order) and applies your date window and caps. If you turned them on, it also reads each post's comments and replies, exact video views and transcript, the rest of the photo album, and the page or group details. Each finished post is saved to the dataset right away.

#### How is Facebook Post Scraper different from copying posts by hand?

| | Facebook Post Scraper | Copying by hand |
|---|---|---|
| Many pages, groups and posts at once | ✅ Bulk URL list | ❌ One at a time |
| Reaction types, engagement rate, video views | ✅ Structured fields | ❌ Read and type each number |
| Export to JSON, CSV, Excel | ✅ One click | ❌ Manual spreadsheet |
| Scheduling and API | ✅ | ❌ |
| Cost | $2.99 per 1,000 posts on the Free plan, down to $2.10 on Business, + start fee + platform usage | Your time |

#### Why scrape Facebook posts?

- **Content research:** see which topics and formats get the most Facebook post reactions on pages you follow.
- **Competitor tracking:** compare posting frequency and engagement across pages.
- **Community insight:** read what members discuss in public groups.
- **Comment analysis:** collect comments for sentiment or topic analysis.
- **Video research:** pull view counts and the Facebook video transcript of reels and videos.
- **Data science:** build training or evaluation data from public posts.

#### How to scrape Facebook comments?

Turn on "💬 Collect comments" (on by default), set "📊 Max comments per post" (`0` = all), and keep "🧵 Collect replies" on if you want replies. Each post's comments are stored in `topComments`, with replies nested inside each comment. Comments arrive together with their post, so you don't need a separate Facebook comments scraper.

#### Can I use it as a Facebook post comments scraper for one post?

Yes. Paste the post's direct link into `urls`. The run returns that one post with its comments and replies, up to your comment and reply limits.

#### How do I export Facebook comments to CSV or Excel?

Set `outputFormat` to `flat` for one row per post with the comment texts joined in `topCommentsText`. Or keep the full format and open the **Comments** view, which shows one row per comment, then export it. Both ways give you a Facebook post comments export that opens in any spreadsheet app.

#### Can I scrape Facebook reels and videos?

Yes. Paste reel or video links directly, or scrape a page, and any reels and videos Facebook shows in its feed come with the other posts (`postType` is `reel` or `video`). As a Facebook reels scraper it adds exact views and plays when "Exact video views" is on, and the transcript when Facebook has one.

#### Do I need a Facebook account?

No. Facebook Post Scraper is a Facebook public post scraper: it reads public pages, profiles, groups and posts while logged out. It has no login option, so private groups can't be scraped.

#### Why am I getting fewer results than expected?

Check these, in order:

1. **Caps:** "Max posts per source" is 10 by default, and "Max posts in total" may be set.
2. **Date window:** your dates may exclude most posts.
3. **Source access:** private groups, login-only pages and unavailable pages return no posts. Open the `RUN_SUMMARY` record to see the result for each source.
4. **Spend limit:** the run stops when your maximum charge limit is reached.
5. **Duplicates:** a post that appears under two of your sources is saved once.

#### Can I schedule a Facebook post data scraper?

Yes. Schedule the Actor in Apify Console (for example daily) with a relative date window like `1 day`. Each run creates a fresh dataset you can fetch via API or send to Google Sheets.

#### Can Facebook Post Scraper scrape a whole page?

Yes. To scrape Facebook page content, add the page URL: the Actor collects the page's posts and adds page details to each post. Set "Max posts per source" to `0` (no cap) or to a number, and add a date window if you only need recent posts. It doesn't scrape a page's About section, photos tab or reviews on their own; it collects posts.

***

### 📧 Support and feedback

Found a bug or have a feature request? Please create an issue on the [Issues tab](https://apify.com/insights_data/facebook-post-scraper/issues/open).

Need a **custom solution**, more fields or a different data source? Contact us at hello.insights.data@gmail.com.

Built and maintained by [insights_data](https://apify.com/insights_data).

# Actor input Schema

## `urls` (type: `array`):

Facebook pages, profiles (including profile.php?id=), public groups and direct post, reel, video, photo or share links. Paste as many as you like (bulk input) and mix them freely.

## `maxPostsPerSource` (type: `integer`):

Maximum posts collected from each page, profile or group. 0 means no per-source cap. Ignored for direct post links.

## `maxPostsTotal` (type: `integer`):

Maximum posts for the whole run across all sources. 0 means no global cap.

## `onlyPostsNewerThan` (type: `string`):

Keep only posts published after this date. Use YYYY-MM-DD, a full ISO date, or a relative value like 3 days or 2 months. Leave empty for no lower bound.

## `onlyPostsOlderThan` (type: `string`):

Keep only posts published before this date. Same formats as above. Leave empty for no upper bound.

## `groupSort` (type: `string`):

Order used when a source is a group. Newest posts first lets date filters stop early.

## `includeComments` (type: `boolean`):

Read the comment thread of each post instead of only the few comments shown in the feed.

## `maxCommentsPerPost` (type: `integer`):

Top-level comments to collect per post. 0 means all available comments.

## `commentsSortOrder` (type: `string`):

Order of the comments. All comments returns the most replies when not logged in.

## `includeReplies` (type: `boolean`):

Also collect replies under each comment. Needs comments to be on.

## `maxRepliesPerComment` (type: `integer`):

Replies collected under each comment, nested replies included. 0 means all available replies.

## `includeVideoDetails` (type: `boolean`):

Add exact view and play counts for video and reel posts. Costs one extra request per video.

## `includeVideoTranscript` (type: `boolean`):

Add the auto-generated transcript of video posts when one exists.

## `includeFullAlbums` (type: `boolean`):

Feeds show at most 5 photos per album. Turn on to collect every photo of the album.

## `includeSourceInfo` (type: `boolean`):

Attach followers, likes, category, verification or group members and privacy to every post.

## `outputFormat` (type: `string`):

Full keeps nested objects. Flat gives one level of simple columns that is easy to export to CSV or Excel.

## Actor input object example

```json
{
  "urls": [
    "https://www.facebook.com/mrbeast/"
  ],
  "maxPostsPerSource": 10,
  "maxPostsTotal": 0,
  "groupSort": "new_posts",
  "includeComments": true,
  "maxCommentsPerPost": 5,
  "commentsSortOrder": "all",
  "includeReplies": true,
  "maxRepliesPerComment": 2,
  "includeVideoDetails": true,
  "includeVideoTranscript": true,
  "includeFullAlbums": true,
  "includeSourceInfo": true,
  "outputFormat": "full"
}
```

# Actor output Schema

## `overview` (type: `string`):

Core post data.

## `engagement` (type: `string`):

Likes, comments, shares and every reaction count.

## `content` (type: `string`):

Post text, hashtags, mentions and links.

## `media` (type: `string`):

Photos, videos and album details.

## `video` (type: `string`):

Views, plays and transcripts for video posts.

## `comments` (type: `string`):

One row per collected comment.

## `source` (type: `string`):

Page, profile or group details for each post.

## `runSummary` (type: `string`):

Per-source results, proxy used and resume points.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        "https://www.facebook.com/mrbeast/"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("insights_data/facebook-post-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "urls": ["https://www.facebook.com/mrbeast/"] }

# Run the Actor and wait for it to finish
run = client.actor("insights_data/facebook-post-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    "https://www.facebook.com/mrbeast/"
  ]
}' |
apify call insights_data/facebook-post-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,insights_data/facebook-post-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/WUcS2lfqzYoTbBdtf/builds/S05dat8TlrTUuPFdR/openapi.json
