# Facebook Posts Scraper - Pages, Profiles & Timelines (`socialscrapers/facebook-profile-posts-scraper`) Actor

Facebook posts scraper for Pages and profiles: scrape public posts with text, date, reactions, comments and shares counts, photos, videos and links. Whole timelines or a date range; export to JSON, CSV, Excel or via API. No login, no cookies. $0.75 per 1,000 posts.

- **URL**: https://apify.com/socialscrapers/facebook-profile-posts-scraper.md
- **Developed by:** [Social Scrapers](https://apify.com/socialscrapers) (community)
- **Categories:** Social media, Marketing, Lead generation
- **Features:** Limited permissions
- **Stats:** 8 total users, 2 monthly users, 61.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 posts

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

This **Facebook Posts Scraper** extracts public posts from any Facebook profile or Page: text, date, link, reactions, comments and shares counts, photos and videos with their alt text, shared posts and links. Choose the newest 20 posts or a whole timeline going back years, keep only posts newer than a date, and download the results as JSON, CSV or Excel. **No Facebook account, no login, no cookies.** It costs **$0.75 per 1,000 posts**.

### What does Facebook Posts Scraper do?

Facebook Posts Scraper reads a profile's or Page's public timeline the way a logged-out visitor sees it and turns every post into a clean row of data:

- 📰 **Any public profile or Page**: brands, media, public figures, creators, organisations, local businesses.
- ⏪ **Full timelines**: the newest posts, a set number, or every post the timeline lists (`maxPostsPerProfile: 0`).
- 📅 **Date filter**: keep only posts newer than a date (`2026-01-31`, `31/01/2026`, `Jan 31 2026`) or an age (`7 days`, `2w`, `3 months`, `yesterday`); reading stops once the timeline goes past it.
- 📊 **Engagement**: reactions, comments and shares counts on every post.
- 🖼️ **Media**: photos and videos with their links, image URLs and Facebook's own alt text.
- 💸 **Pay only for posts saved**: private, empty or missing profiles cost nothing, and the run stops cleanly at the spending limit you set.

Because it runs on the Apify platform, you also get the API, scheduling, integrations, monitoring and proxy rotation without writing any code.

### What data can you extract from Facebook posts?

| Field | Example | What it is |
|---|---|---|
| `text` | `Nice shades. 😎 This structure, called a sunshade…` | The post's text (`null` for a photo or video without a caption) |
| `createdAt`, `timestamp` | `2026-11-06T18:55:18.000Z`, `1793991318` | When the post was published (ISO 8601 and Unix seconds) |
| `url`, `postId` | `https://www.facebook.com/NASA/posts/…` | The post's link and numeric ID |
| `reactionsCount` | `710` | All reactions: Like, Love, Haha, Wow, Sad, Angry, Care |
| `commentsCount`, `sharesCount` | `39`, `53` | Comments and shares |
| `media` | `[{ "type": "photo", … }]` | Photos and videos: type, link, image or thumbnail URL, alt text |
| `sharedPost` | `{ "text": …, "url": …, "authorName": … }` | The original post, when this post is a share |
| `linkTitle` | `<title of the shared article>` | The title of a shared link |
| `authorId`, `authorName`, `authorUrl`, `authorPictureUrl` | `NASA - National Aeronautics and Space Administration` | Who wrote the post |
| `profileId`, `inputUrl`, `scrapedAt` | `100044561550831` | The timeline the post is on, the entry you gave, and when it was read |

Every item has every field. Anything a post doesn't have comes back as `null` (or `[]` for `media`), so your spreadsheet columns stay the same from run to run.

### How to scrape Facebook posts

1. Click **Try for free** (or **Start**) on this page.
2. In **Facebook profiles and Pages**, paste links such as `https://www.facebook.com/NASA`, numeric IDs or usernames, one per line.
3. Set **Max posts per profile** (for example `100`, or `0` for every post) and, if you like, **Only posts newer than** (for example `3 months`).
4. Click **Start** and wait for the run to finish. A profile's newest 20 posts take a few seconds.
5. Download the posts from the **Output** tab as JSON, CSV, Excel or HTML, or read them through the API.

### How much does it cost to scrape Facebook posts?

**$0.75 per 1,000 posts**, platform usage and proxies included. You pay one `post` event for each post saved, nothing else:

| Your Apify plan | Price per 1,000 posts |
|---|---|
| Free and Starter (Bronze) | $0.75 |
| Scale (Silver) | $0.675 (−10%) |
| Business (Gold) | $0.60 (−20%) |

Two examples:

- **The latest 20 posts of 100 brand Pages** = 2,000 posts = **$1.50**.
- **A Page's whole timeline of 5,000 posts** = **$3.75**.

Profiles and Pages that don't exist, are private or have no public posts are **not charged**; the run log lists them. To cap a run's cost, set **Maximum cost per run** in the run options: the scraper saves posts until the next one would go over it, then stops cleanly and keeps everything saved. Apify's free plan comes with monthly usage credit, enough to try this scraper on thousands of posts.

### Input example

```json
{
  "startUrls": ["https://www.facebook.com/NASA", "https://www.facebook.com/profile.php?id=100044561550831"],
  "maxPostsPerProfile": 100,
  "onlyPostsNewerThan": "3 months",
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

| Field | Type | Description |
|---|---|---|
| `startUrls` | array of strings | Profiles and Pages: `https://www.facebook.com/<username>`, `https://www.facebook.com/profile.php?id=<ID>`, `https://www.facebook.com/people/<name>/<ID>/`, mobile links, numeric IDs or usernames. Share links from the Facebook app (`https://www.facebook.com/share/…`, `fb.me/…`) work too; a link to a post reads its author's posts. Duplicates are read once. |
| `maxPostsPerProfile` | integer, 0 or more | Most recent posts to save per profile, newest first. Default 20. `0` = every post the timeline lists. |
| `onlyPostsNewerThan` | string | Only posts published on or after this date (`2026-01-31`, `2026-1-31`, `31/01/2026`, `Jan 31 2026`), date-time (`2026-01-31T18:00:00Z`) or age (`7 days`, `2w`, `3 months`, `1 year`, `yesterday`). Dates are UTC days; with both day and month 12 or less (`01/02/2026`) the date is read month/day/year. Empty = no date limit. |
| `proxyConfiguration` | object | Keep the default: Apify Proxy with the `RESIDENTIAL` group. |

### Output example

A real post from NASA's Page (text and image link shortened):

```json
{
  "postId": "1679274853567884",
  "url": "https://www.facebook.com/NASA/posts/pfbid0i5jtfWbHAByDj1XDZ3R9XWEwLM97sDCDJAvCakqEf3pvwkqwnLw3jQMKRaNMXRw1l",
  "text": "Nice shades. 😎\n\nThis structure, called a sunshade, will fly on our NEO (Near-Earth Object) Surveyor, a spacecraft that will scout out nearby asteroids and comets…",
  "createdAt": "2026-11-06T18:55:18.000Z",
  "timestamp": 1793991318,
  "reactionsCount": 710,
  "commentsCount": 39,
  "sharesCount": 53,
  "media": [
    {
      "type": "photo",
      "url": "https://www.facebook.com/photo/?fbid=1679274836901219&set=a.416661013162614",
      "thumbnailUrl": "https://scontent.xx.fbcdn.net/v/…/892374373_1104277122356398_3961455661216587791_n.png",
      "altText": "Two strips of inky black solar arrays cross diagonally over the scene. In the background is a stark white clean room…"
    }
  ],
  "sharedPost": null,
  "linkTitle": null,
  "authorId": "100044561550831",
  "authorName": "NASA - National Aeronautics and Space Administration",
  "authorUrl": "https://www.facebook.com/NASA",
  "authorPictureUrl": "https://scontent.xx.fbcdn.net/v/…/243095782_416661036495945_3843362260429099279_n.png",
  "profileId": "100044561550831",
  "inputUrl": "https://www.facebook.com/NASA",
  "scrapedAt": "2026-11-08T10:53:46.172Z"
}
```

### Use cases

- **Social media monitoring**: follow what brands, public figures and creators post, and how people react.
- **Competitor analysis**: compare posting frequency, formats (photo, video, link, text) and engagement across Pages.
- **Content research**: find the posts that got the most reactions and shares on any topic's leading Pages.
- **Brand and media monitoring**: collect public posts about launches, campaigns or events from the accounts that matter to you.
- **Research datasets**: build multi-year timelines of public posts for academic or market research, with stable fields and timestamps.
- **Influencer vetting**: check how active a creator is and what their posts get before you work with them.

### Use Facebook Posts Scraper via API, Python, JavaScript and integrations

Run the scraper from your own code with the [Apify API](https://docs.apify.com/api/v2) or an Apify client:

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

const client = new ApifyClient({ token: 'MY-APIFY-TOKEN' });
const run = await client.actor('socialscrapers/facebook-profile-posts-scraper').call({
    startUrls: ['https://www.facebook.com/NASA'],
    maxPostsPerProfile: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

```python
from apify_client import ApifyClient

client = ApifyClient("MY-APIFY-TOKEN")
run = client.actor("socialscrapers/facebook-profile-posts-scraper").call(
    run_input={"startUrls": ["https://www.facebook.com/NASA"], "maxPostsPerProfile": 100}
)
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(post["createdAt"], post["reactionsCount"], post["text"])
```

- **Schedules**: collect new posts every day or week with an Apify schedule and `onlyPostsNewerThan: "1 day"` or `"7 days"`.
- **Integrations**: send the posts to Google Sheets, Slack, Airtable, Make, Zapier or n8n, or trigger your own webhook when a run finishes.
- **AI agents**: call the scraper as a tool through the Apify MCP server.

### Limits

- **Public data only, no login.** The scraper sees what Facebook shows a logged-out visitor: posts shared only with friends, and private profiles, are not available.
- The pinned post is left out; posts come newest first. Facebook can list fewer posts than a profile has.
- Comment and reaction **counts** are included, not the comments themselves.
- Share links (`https://www.facebook.com/share/…`, `fb.me/…`, links to a post, reel or photo) are followed to the profile they name, at no charge. Links in the bare `pfbid…` format can't be read: use the profile's username, numeric ID or `profile.php?id=` link.
- Facebook image and video links expire after some days: download the media if you need to keep it.

### FAQ

#### Is it legal to scrape Facebook posts?

This scraper only reads data that Facebook shows publicly to anyone who isn't logged in. Public data can still contain personal data, which laws such as the GDPR protect, so collect only what you need for a legitimate purpose and check the rules that apply to you. Apify explains the basics in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/).

#### Do I need a Facebook account or cookies?

No. Facebook Posts Scraper never logs in and never asks for cookies, so no account of yours is ever at risk.

#### How many posts can I scrape from one Page?

As many as its timeline lists: set `maxPostsPerProfile` to `0`. Big Pages go back years. The first 20 posts arrive in one request and older posts in pages of 3, so whole timelines take longer than recent posts.

#### Why did a profile return fewer posts than I asked for?

The timeline has fewer public posts, the date in `onlyPostsNewerThan` was reached, or the run hit its maximum cost. The run log says which for every profile, and how far back it went.

#### Why did my run finish with no posts?

Facebook showed nothing public for that profile: it is private, shows its posts only to logged-in visitors, has none, or no longer exists; or Facebook refused the requests even after 5 attempts on fresh IPs. The run still ends **Succeeded**, its status message says which, and nothing is charged. Only a run of 3 or more profiles that Facebook refused entirely ends **Failed**, because that means the scraper itself is being blocked.

#### Can I paste a link from the Facebook app's Share button?

Yes. Share links such as `https://www.facebook.com/share/1AbCdEfGh/` and `fb.me/…` links are followed to the profile or Page they open, without logging in and without charge. A share link to a single post reads the posts of that post's author.

#### How do I get only new posts?

Set **Only posts newer than** to an age such as `1 day` and run the scraper on a daily schedule.

#### Does it work for Facebook Pages and personal profiles?

Yes. Pages and public personal profiles take the same input and give the same fields.

#### Which proxy should I use?

The default, Apify Proxy `RESIDENTIAL`. Facebook doesn't show public posts to visitors from datacenter IPs.

### Other scrapers by Social Scrapers

| Scraper | What it gets |
|---|---|
| [Facebook Groups Scraper](https://apify.com/socialscrapers/facebook-groups-scraper) | Posts from public Facebook groups |
| [Facebook Pages Scraper](https://apify.com/socialscrapers/facebook-profile-scraper) | Public details of Facebook Pages and profiles: contact info, address, rating |
| [Facebook Ads Library Scraper](https://apify.com/socialscrapers/facebook-ads-library-scraper) | Ads from Meta's public Ad Library |
| [Instagram Profile Scraper](https://apify.com/socialscrapers/instagram-profile-scraper) | Instagram profiles and their latest posts |
| [Instagram Post Scraper](https://apify.com/socialscrapers/instagram-post-scraper) | Instagram posts, reels and comments |
| [Threads Scraper](https://apify.com/socialscrapers/threads-scraper) | Threads profiles, posts and replies |
| [X (Twitter) Profile Scraper](https://apify.com/socialscrapers/x-profile-scraper) | X profiles: bio, followers, counts |
| [Reddit Scraper](https://apify.com/socialscrapers/reddit-scraper) | Reddit posts, comments, users and search |
| [Quora Scraper](https://apify.com/socialscrapers/quora-scraper) | Quora questions, answers and profiles |
| [YouTube Scraper](https://apify.com/socialscrapers/youtube-scraper) | YouTube videos, channels, search and comments |
| [YouTube Transcript Scraper](https://apify.com/socialscrapers/youtube-transcript-scraper) | Transcripts and captions of YouTube videos |
| [LinkedIn Jobs Scraper](https://apify.com/socialscrapers/linkedin-jobs-scraper) | LinkedIn job listings |

# Actor input Schema

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

One per line: profile or Page links (https://www.facebook.com/NASA, https://www.facebook.com/profile.php?id=100044561550831, https://www.facebook.com/people/<name>/<ID>/), numeric IDs or usernames (NASA). Share links from the Facebook app (https://www.facebook.com/share/…, fb.me/…) work too; a link to a post reads its author's posts.

## `maxPostsPerProfile` (type: `integer`):

How many of each profile's or Page's most recent public posts to save, newest first, for example 100. 0 = every post the timeline lists (often years back). You pay per post saved.

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

Keep only posts published on or after this date; reading stops once the timeline goes past it. Pick a date or an age, or type one: a date (2026-01-31, 31/01/2026, Jan 31 2026), a date-time through the API (2026-01-31T18:00:00Z) or an age (7 days, 2w, 3 months, yesterday). Dates are UTC days. Leave empty for no date limit.

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

Keep Apify Proxy with the RESIDENTIAL group (the default). Facebook does not show public posts to visitors from datacenter IPs. Apify Proxy without the RESIDENTIAL group is switched to RESIDENTIAL (your country is kept), because Facebook turns datacenter IPs away; residential traffic is included in the price.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/NASA"
  ],
  "maxPostsPerProfile": 20,
  "onlyPostsNewerThan": "3 months",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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"
    ],
    "maxPostsPerProfile": 20,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("socialscrapers/facebook-profile-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"],
    "maxPostsPerProfile": 20,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("socialscrapers/facebook-profile-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"
  ],
  "maxPostsPerProfile": 20,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call socialscrapers/facebook-profile-posts-scraper --silent --output-dataset

```

## MCP server setup

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