# Facebook Page Posts Scraper - Text, Reactions & Media (`scrapewise/facebook-page-posts-scraper`) Actor

Scrape public Facebook Page posts by Page link or username, no login: text, date, reactions, comments, shares, photos, video links, shared links and shared posts, plus Page name, id, category and followers. Date filter and onlyNew for schedules. Error rows are free.

- **URL**: https://apify.com/scrapewise/facebook-page-posts-scraper.md
- **Developed by:** [Scrapewise Data](https://apify.com/scrapewise) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.55 / 1,000 post delivereds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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

## Facebook Page Posts Scraper: posts, reactions, comments, shares and media of any public Page

Facebook Page Posts Scraper collects **the posts of the public Facebook Pages you give it**, without a Facebook
account, cookies or a browser. Each post comes back as one clean row: the full text, when it was published, the
reaction, comment and share counts, every photo and the video file link, the external link it points to, the post it
shares (if any), and the Page's name, id, category and follower count.

It is used to track what brands, media outlets and public organizations publish, to benchmark engagement against
competitors, to feed social listening and reporting dashboards, to archive a Page's content, and to build datasets for
AI and content research.

### At a glance

| What | Price |
|---|---|
| Post delivered | **US$ 3.00 per 1,000 posts** (US$ 0.003 each) |
| Run start | US$ 0.005 per run |

- 5 Pages with 20 posts each = 100 posts = **US$ 0.305**.
- Error rows, duplicates, posts outside your date filter and posts already delivered in earlier runs (onlyNew) are
  never charged.
- `maxPostsPerPage` and `maxItems` are hard caps, and a spending limit set on the run stops it cleanly with everything
  delivered so far.
- Proxy is included. The Actor starts on datacenter IPs and moves to residential IPs on its own only if Facebook
  refuses them.

### Quick start

```json
{
  "startUrls": ["https://www.facebook.com/NASA"],
  "maxPostsPerPage": 20
}
```

Several Pages, only the last 7 days:

```json
{
  "startUrls": [
    "https://www.facebook.com/NASA",
    "https://www.facebook.com/nike",
    "https://www.facebook.com/Starbucks"
  ],
  "maxPostsPerPage": 50,
  "onlyPostsNewerThan": "7 days"
}
```

Daily monitoring of a list of Pages, new posts only (run it on a schedule):

```json
{
  "pages": ["NASA", "natgeo", "cnn"],
  "maxPostsPerPage": 30,
  "onlyNew": true
}
```

### Input

| Field | What it does |
|---|---|
| `startUrls` | Facebook Page links, one per line. A post link of the Page, a `profile.php?id=` link or a numeric Page id also work. |
| `pages` | Page usernames instead of links (`nike`, `Starbucks`): the part after `facebook.com/`. |
| `maxPostsPerPage` | Newest posts per Page, in timeline order (default 20; 0 = as far back as the timeline goes). |
| `maxItems` | Optional cap for the whole run, across all Pages. |
| `onlyPostsNewerThan` | A date (`2026-10-01`) or a period (`7 days`, `24 hours`, `2 weeks`, `1 month`). Older posts are skipped for free. |
| `onlyNew` | Deliver only posts not delivered in earlier runs (memory kept per Page in your account). |
| `proxyConfiguration` | Apify datacenter proxy by default, with automatic residential fallback. |

`startUrls` also accepts objects like `{"url": "https://www.facebook.com/NASA"}`, and `resultsLimit`, `maxPosts`,
`urls` and `pageUrls` are accepted too, so inputs written for other Facebook tools keep working.

### Output

One row per post (`type: post`):

| Field | What it is |
|---|---|
| `postId`, `url` | Facebook post id and the post link (a `/posts/`, `/reel/`, `/videos/` or `/events/` link) |
| `text` | Full post text as written by the Page (null for media-only posts and plain shares) |
| `hashtags` | Hashtags found in the text |
| `publishedAt`, `timestamp` | Publication time in UTC (ISO 8601) and as a Unix timestamp |
| `reactionsCount`, `commentsCount`, `sharesCount` | Engagement counts as Facebook shows them at run time |
| `isVideo` | True for videos and reels |
| `media` | Every photo or video of the post: `type` (`photo`, `video`, `linkPreview`), `url` (image or MP4 file), `thumbnailUrl`, `pageUrl`, `width`, `height`, `durationMs` |
| `imageUrls`, `videoUrl` | Shortcuts: all photo links, and the video file link |
| `link` | External link the post points to (link card or link in the text), unwrapped from Facebook's redirect |
| `isShare`, `sharedPost` | Whether the Page shared another post, and that post's id, link, Page, text, date, media and link |
| `pageName`, `pageUrl`, `pageId`, `pageProfileId` | The Page, its classic Page id and its profile id |
| `pageCategory`, `pageFollowers` | Page category and exact follower count |
| `authorName` | Name shown as the author of the post |
| `position` | Order of the post in the Page timeline during this run |
| `source` | The link or username you sent |
| `scrapedAt` | When the row was collected (UTC) |

One real row (text and media links shortened):

```json
{
  "type": "post",
  "postId": "1658860588942644",
  "url": "https://www.facebook.com/reel/1557618349384047/",
  "pageName": "NASA - National Aeronautics and Space Administration",
  "pageUrl": "https://www.facebook.com/NASA",
  "pageId": "54971236771",
  "pageCategory": "Government organization",
  "pageFollowers": 28744320,
  "text": "The aircraft lineup just keeps getting bigger. MAX POWER, a new aerospace expo, is set for Nov. 7-8 at NASA's Kennedy Space Center in Florida...",
  "publishedAt": "2026-10-16T19:37:44Z",
  "timestamp": 1792179464,
  "reactionsCount": 969,
  "commentsCount": 19,
  "sharesCount": 79,
  "isVideo": true,
  "media": [
    {
      "type": "video",
      "url": "https://video.xx.fbcdn.net/o1/v/t2/f2/m366/...mp4",
      "thumbnailUrl": "https://scontent.xx.fbcdn.net/v/t15.5256-10/...jpg",
      "pageUrl": "https://www.facebook.com/reel/1557618349384047/",
      "durationMs": 17770,
      "width": 1080,
      "height": 1920
    }
  ],
  "link": "https://www.nasa.gov/maxpower/",
  "isShare": false,
  "sharedPost": null,
  "source": "https://www.facebook.com/NASA"
}
```

In the local test of 17 Oct 2026 (NASA, Nike and Starbucks, 20 posts each), every row had the post id, link, date,
Page id and the three engagement counts; 92% had text (the rest were media-only posts or plain shares).

### Date filter and timeline order

A Page timeline is mostly newest first, but Facebook sometimes shows an older highlighted post near the top. The date
filter is applied post by post, so those older posts are skipped (and not charged) while newer posts below them are
still delivered. A Page stops once several posts in a row are older than your date, so a "last 7 days" run only reads
what it needs.

### Only new posts (schedules)

With `onlyNew` on, the Actor stores the ids of the posts it delivered for each Page in a named key-value store of your
account. The next run skips those ids for free and stops reading a Page as soon as it reaches posts you already have.
A typical setup: `maxPostsPerPage` 30, `onlyNew` on, a schedule every few hours or once a day. Runs with nothing new
cost only the run start.

### Errors you may see

Every error is a row with `errorCode` and is never charged:

| errorCode | Meaning |
|---|---|
| `INVALID_INPUT` | Not a Facebook Page link or username (groups, events and search links are not Pages), or a wrong date or number |
| `NOT_FOUND` | The Page does not exist, was removed, or is restricted by age or country (those need a login) |
| `NOT_A_PAGE` | The link is a personal profile; only public Pages are supported |
| `NO_POSTS` | The Page opened but shows no public posts without login |
| `BLOCKED` | Facebook refused every attempt for this Page; run it again in a few minutes |
| `NOT_REACHED` | The run timeout, the spending limit or the cost guard arrived before this Page |

### Integrations, scheduling and AI agents

- **Schedule** the same Pages hourly or daily in [Apify schedules](https://docs.apify.com/platform/schedules) with
  `onlyNew` on to get each new post once, with its engagement at that moment.
- **Export** as JSON, CSV, Excel or XML, or read the dataset from the [Apify API](https://docs.apify.com/api/v2).
- **Connect** it to Make, n8n, Zapier, Google Sheets, Slack or a webhook through
  [Apify integrations](https://docs.apify.com/platform/integrations), for example to post every new competitor post in
  a Slack channel.
- **AI agents:** call it as a tool through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp)
  in Claude, ChatGPT, Cursor or any MCP client, for example "get the last 30 posts of these 5 brand Pages and tell me
  which topics get the most shares".

### FAQ

**Do I need a Facebook account or cookies?** No. The Actor reads what Facebook shows to logged-out visitors of public
Pages. Nothing is posted, liked or followed.

**How far back can it go?** As far as the Page timeline goes for a logged-out visitor. In tests, NASA returned six
months of posts (211 posts) and Nike went back years. Set `maxPostsPerPage` to 0 or a large number, or use
`onlyPostsNewerThan`.

**Can I search posts by keyword or find Pages by name?** No. Facebook does not show search results to logged-out
visitors. Paste the Page links you want to follow.

**Does it collect the comments or who reacted?** No. It returns the counts only: `reactionsCount`, `commentsCount`
and `sharesCount`. No list of people is collected.

**Why is `text` empty on some posts?** The Page posted only a photo or video, or shared another post without adding
text. In a share, the original text is in `sharedPost.text`.

**Do the media links expire?** Photo and video links come from Facebook's CDN and are signed; they work for some days.
Download the files soon after the run if you need to keep them.

**Is it legal?** The Actor reads public Page content only and returns no emails, phone numbers or personal profiles.
You are responsible for how you use the data under the laws that apply to you.

**Something broke or a field is missing?** Open an issue on the Actor page; issues are answered within a day.

### Limitations

- Public Pages only. Personal profiles, groups, and Pages restricted by age or country are not supported.
- Engagement counts are the ones Facebook shows at the moment of the run.
- Reaction types (like, love, haha...) are not split; `reactionsCount` is the total.
- Live videos that are not processed yet may come without the video file link (the thumbnail and link are there).

### Changelog

- **17 Oct 2026:** first version: posts of public Pages by link or username, text, date, reactions, comments, shares,
  photos and video files, shared links and shared posts, Page id, category and followers, date filter, onlyNew.

# Actor input Schema

## `startUrls` (type: `array`):

Public Facebook Page links, one per line, for example https://www.facebook.com/NASA. A post link of the Page, a profile.php?id= link or a numeric Page id also work.

## `pages` (type: `array`):

Optional: Page usernames instead of links, one per line, for example nike or Starbucks (the part after facebook.com/).

## `maxPostsPerPage` (type: `integer`):

Newest posts to collect from each Page, in the order of the Page timeline. 0 = as many as the timeline gives (months or years back).

## `maxItems` (type: `integer`):

Optional hard cap for the whole run, across all Pages. Empty or 0 = no cap besides the per-Page limit.

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

Optional date filter: a date like 2026-10-01, or a period like 7 days, 24 hours, 2 weeks or 1 month. Older posts are skipped (free), and each Page stops once its timeline reaches older posts.

## `onlyNew` (type: `boolean`):

On: remembers the posts delivered in earlier runs (in your account, per Page) and delivers only posts not delivered before. Each Page stops when it reaches posts you already have. Skipped posts are free.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy by default. If Facebook refuses those IPs, the Actor switches to residential IPs on its own (included in the price).

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/NASA"
  ],
  "maxPostsPerPage": 20,
  "onlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `resultsCsv` (type: `string`):

No description

# 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 = {
    "startUrls": [
        "https://www.facebook.com/NASA"
    ],
    "maxPostsPerPage": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapewise/facebook-page-posts-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 = {
    "startUrls": ["https://www.facebook.com/NASA"],
    "maxPostsPerPage": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapewise/facebook-page-posts-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 '{
  "startUrls": [
    "https://www.facebook.com/NASA"
  ],
  "maxPostsPerPage": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapewise/facebook-page-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapewise/facebook-page-posts-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/VrQIN6Ib5QXDd1Yta/builds/kxsK9pbbLjOrHUA0E/openapi.json
