# Facebook Public Page Posts Scraper (`zinin/facebook-public-page-posts-scraper`) Actor

Scrape current public Facebook Page posts, messages, dates, Page identity, and validated source links from logged-out Page HTML.

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

## Pricing

from $5.60 / 1,000 public facebook 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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Facebook Public Page Posts Scraper

![Facebook public Page posts](https://api.apify.com/v2/key-value-stores/IwI7VoxszQjT6v69X/records/facebook-public-page-posts-scraper-0c36db05fe02fa4c-readme-hero.webp?signature=ZT6nNFfd5X2hxfk9YH3J)

Turn a public Facebook Page into structured post rows for monitoring, research, or an internal content feed. Submit an exact Page root such as `https://www.facebook.com/NASA/`; the Actor returns the source post ID, validated first-party permalink, creation time, public message text, Page name and ID, observation timestamp, and source evidence. It reads logged-out public Page HTML through Apify Residential Proxy. No Facebook login, cookies, browser session, or customer credential is required.

Each run observes one currently returned HTML document per requested Page and delivers at most 12 rows in total. This is a bounded current-page observation, not a full Page archive or pagination service. If the first Page fills the shared cap, later Pages are not requested. The retained real NASA source fixture produced one qualifying post and exposed an opaque Relay continuation cursor. The Actor records that continuation as available but does not replay the private Relay request. Likes, comments, and shares are `null` because the observed anonymous payload did not expose values the Actor could verify.

```json
{"pageUrls":["https://www.facebook.com/NASA/"],"maxItems":12}
```

The price is **$0.008 per delivered public post** through `result-found`. There is no start fee or default Dataset-item fee, and source failures or diagnostics are free. Bronze pays $0.0072, Silver $0.0064, and Gold, Platinum, and Diamond $0.0056 per delivered row. Repeating a successful observation is billable again because it delivers a fresh timestamped Dataset row.

Selected fields from the retained public fixture:

```json
{"postId":"1626865878808782","postUrl":"https://www.facebook.com/NASA/posts/pfbid02yzKA4Z5Wnep5xU3PLWyWgRuVebWg3UZoATsEH3wuZcKoZuiLSBL8rEkbe4qTZ65Jl","creationTime":"2026-09-11T14:29:12.000Z","text":"25 years ago, the Sept. 11th tragedy left us forever changed. Today, we pause to remember the Americans who lost their lives — as well as the survivors and the heroes of that day.\n \nWe will never forget: https://go.nasa.gov/3T2hFeV","pageName":"NASA - National Aeronautics and Space Administration","pageId":"100044561550831","likeCount":null,"commentCount":null,"shareCount":null,"sourceUrl":"https://www.facebook.com/NASA/","observedAt":"2026-09-12T00:00:00.000Z"}
```

### What you receive

The default Dataset contains one row per delivered source story. Every row includes `schemaVersion`, `recordType`, `postId`, `postUrl`, `creationTime`, `text`, `pageName`, `pageId`, `likeCount`, `commentCount`, `shareCount`, `sourceUrl`, `observedAt`, a SHA-256 source reference, and billing metadata. Nullable fields remain `null`; the Actor does not manufacture engagement counts.

`OUTPUT` records the outcome, delivery status, per-Page evidence, errors, and a compact snapshot of delivered rows. `outcome: "completed"` means the available rows were delivered without a source error. `deliveryComplete` and `coverage.complete` remain `false` at the one-document boundary because the result is not a full archive. `source_failed`, `partial`, `empty`, and `budget_stopped` stay distinct.

### How the source is handled

![Facebook public Page workflow](https://api.apify.com/v2/key-value-stores/IwI7VoxszQjT6v69X/records/facebook-public-page-posts-scraper-04adbec9ac8c40b1-readme-workflow.webp?signature=1exlZp9M79RBAze1iRE26)

The parser reads only `data.user.timeline_list_feed_units.edges[].node` from `data-sjs` Relay payloads in the received logged-out Page. A row is accepted only when its actor URL exactly matches the requested Page root and its permalink is an HTTPS `facebook.com/{Page}/posts/{id}` URL tied to that Page. Coverage reports whether the document exposed an opaque continuation, while keeping `complete: false`; the Actor does not create private GraphQL calls or claim that it followed pagination.

Requests use HTTPS with certificate validation, reject redirects, allow one attempt per Page, cap both compressed and decoded content at 5 MiB, and share a bounded run deadline. A login redirect, HTTP error, unexpected content type, malformed Relay data, oversized response, or timeout produces no paid row.

### Ready-to-use Task recipes

**Current NASA Page observation**

```json
{"pageUrls":["https://www.facebook.com/NASA/"],"maxItems":12}
```

**One-row source check**

```json
{"pageUrls":["https://www.facebook.com/NASA/"],"maxItems":1}
```

**Repeat snapshot — schedule the same bounded input**

```json
{"pageUrls":["https://www.facebook.com/NASA/"],"maxItems":12}
```

Replace `NASA` with the exact root of the public Page you are authorized to observe. Inputs can contain up to 10 unique Pages, but the 12-row cap is shared and input order matters.

### Costs and run budgets

| Tier | Price per delivered row | 12 delivered rows |
|---|---:|---:|
| Base | $0.0080 | $0.0960 |
| Bronze | $0.0072 | $0.0864 |
| Silver | $0.0064 | $0.0768 |
| Gold / Platinum / Diamond | $0.0056 | $0.0672 |

The runtime checks the run's effective charge limit before requesting the source and again before each paid write. When starting runs through the Apify API, use a **positive** `maxTotalChargeUsd`. A value of `0` can be treated by the platform as unset and replaced by its default. To verify the no-affordable-row path, use a small positive value below one result price, such as `0.0001`.

### Repeat observations safely

Keep the exact input, run ID, Dataset, and `OUTPUT` together. Compare `postId` values only across the same ordered Page list and `maxItems`. A missing ID means only that the item was not observed within that run's one-document, 12-row boundary; it does not prove deletion. A source failure is reported separately from a valid observed page with no qualifying rows.

Use the data only for lawful purposes and according to Facebook's terms and applicable rights. The Actor reads public Pages and does not access private profiles, groups, messages, or account data.

# Actor input Schema

## `pageUrls` (type: `array`):

Exact public Page roots. Up to 10 Pages per run.

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

Total delivered posts across all input Pages. The Actor reads one observed document per Page.

## Actor input object example

```json
{
  "pageUrls": [
    "https://www.facebook.com/NASA/"
  ],
  "maxItems": 12
}
```

# Actor output Schema

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

One billable facebook\_public\_page\_post row for each delivered public timeline node.

## `summary` (type: `string`):

Observed Page-document coverage, delivery state and delivered-row snapshot.

# 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 = {
    "pageUrls": [
        "https://www.facebook.com/NASA/"
    ],
    "maxItems": 12
};

// Run the Actor and wait for it to finish
const run = await client.actor("zinin/facebook-public-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 = {
    "pageUrls": ["https://www.facebook.com/NASA/"],
    "maxItems": 12,
}

# Run the Actor and wait for it to finish
run = client.actor("zinin/facebook-public-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 '{
  "pageUrls": [
    "https://www.facebook.com/NASA/"
  ],
  "maxItems": 12
}' |
apify call zinin/facebook-public-page-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zinin/facebook-public-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/CdrTi8VR7UzEbbYIs/builds/YBAhoOQUpFZrQIsJG/openapi.json
