# Facebook Posts Scraper · No Login · $2/1k (`alfalfa/facebook-posts-scraper`) Actor

Scrape posts from public Facebook pages and profiles: text, links, photos, videos, reactions, comments, shares, top comments and co-authors. Date filters stop the run early so you only pay for what you keep. No login, $2 per 1,000 posts, same fields as the official scraper.

- **URL**: https://apify.com/alfalfa/facebook-posts-scraper.md
- **Developed by:** [Alfalfa](https://apify.com/alfalfa) (community)
- **Categories:** Social media, Marketing, Agents
- **Stats:** 3 total users, 2 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 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.

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 Posts Scraper (No Login)

Scrape posts from public **Facebook pages and profiles**: text, links, photos, videos, reels, reactions, comment and share counts, top comments and co-authors. No Facebook account, login or cookies needed. **Same output fields as the official Facebook Posts Scraper** at **$2 per 1,000 posts** with no start fee; 100 posts in under a minute.

Not affiliated with, endorsed by or connected to Meta Platforms, Inc. Facebook is a trademark of Meta.

### What you can do with Facebook post data

- **Social listening and brand monitoring**: pull every new post from the pages you watch on a schedule and track reactions, comments and shares over time.
- **Competitor content analysis**: see what a competitor posts, how often, which formats they use and what actually gets engagement.
- **Content archiving**: keep a copy of a page's posts with media URLs, timestamps and engagement counts.
- **Feeding dashboards and AI workflows**: clean JSON with stable field names goes straight into a spreadsheet, a database, or an LLM pipeline.
- **Influencer and creator research**: post frequency, reaction mix and top comments for any public profile.
- **Incremental scraping that stays cheap**: `onlyPostsNewerThan` stops the run as soon as it reaches posts you already have, so a daily job costs a few cents.

### What data do you get

| Field | Example |
|---|---|
| `text`, `textReferences`, `link` | post text, hashtags and mentions with URLs, the shared link |
| `previewTitle`, `previewDescription`, `previewSource`, `previewTarget`, `actionLink` | link preview card of a shared link and its call-to-action button |
| `time`, `timestamp`, `timeCreated`, `timestampCreated` | `2026-09-02T04:52:09.000Z`, `1788382329` |
| `likes`, `comments`, `shares`, `topReactionsCount` | `2275`, `86`, `169` |
| `reactionLikeCount`, `reactionLoveCount`, `reactionHahaCount`, ... | reaction breakdown by type |
| `media` | photos with full-size URLs and Facebook's image description, videos with playable URL, thumbnail, duration and play counts |
| `isVideo`, `viewsCount`, `videoPostViewCount`, `liveViewerCount` | video metrics (live viewers only while a broadcast is running) |
| `paidPartnership` | `true` when the post is labelled as a paid partnership |
| `captionText` | transcript of the video (with the `captionText` option on) |
| `topComments` | text, author, date and likes of the comments Facebook shows first |
| `collaborators`, `sharedPost` | co-authors and the original post of a share |
| `user`, `pageName`, `facebookId`, `pageAdLibrary` | author profile, page IDs, Ad Library ID |
| `url`, `topLevelUrl`, `postId`, `feedbackId` | post URLs and IDs |

### How to scrape Facebook posts

1. Paste page or profile URLs into **Start URLs**, one per line.
2. Set **Results limit** per URL, and optionally **Only posts newer than** (`2026-01-31`, `7 days`, `3 months`) to skip old posts for free.
3. Click **Start**. Posts stream into the dataset as they are found; export as JSON, CSV, Excel or XML, or read them through the API.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | array of `{ "url": ... }` | Page or profile URLs (same format as the official Actor, plain strings work too): `https://www.facebook.com/humansofnewyork/`, `https://www.facebook.com/zuck`, `https://www.facebook.com/profile.php?id=100044561550831`. |
| `resultsLimit` | integer | Max posts per URL, newest first. Empty = no limit. |
| `onlyPostsNewerThan` | string | `YYYY-MM-DD`, ISO date-time, or relative (`1 day`, `2 weeks`, `3 months`). Stops scraping when older posts are reached. |
| `onlyPostsOlderThan` | string | Same formats. Newer posts are skipped for free. |
| `captionText` | boolean | Add the video transcript (auto-generated captions) to video posts, same field as the official Actor. Add-on: $0.002 per video post looked up. Off by default. |
| `maxConcurrency` | integer | Pages scraped in parallel (default 5). |
| `proxyConfiguration` | object | Residential proxies by default, included in the price. Optionally pick a country or use your own proxy servers. |

Example:

```json
{
  "startUrls": [{ "url": "https://www.facebook.com/NASA/" }, { "url": "https://www.facebook.com/cern" }],
  "resultsLimit": 50,
  "onlyPostsNewerThan": "30 days"
}
```

### Output

One dataset record per post. Field names match the official Facebook Posts Scraper:

```json
{
  "facebookUrl": "https://www.facebook.com/NASA",
  "postId": "1619357056226331",
  "pageName": "NASA",
  "url": "https://www.facebook.com/NASA/posts/pfbid02UWQesyMaGaXHYs988uMZHerM5NuzhHxcnQp93c5BhLEXNRqphHTWqa81y7WYppKRl",
  "time": "2026-09-02T04:52:09.000Z",
  "timestamp": 1788382329,
  "user": {
    "id": "100044561550831",
    "name": "NASA - National Aeronautics and Space Administration",
    "profileUrl": "https://www.facebook.com/100044561550831",
    "profilePic": "https://scontent.xx.fbcdn.net/v/t39.30808-1/....png"
  },
  "collaborators": [],
  "text": "Red Moon over Louisiana\n\nOn the night of Aug. 27-28, the full moon slipped through Earth's shadow...",
  "textReferences": [],
  "link": null,
  "likes": 2275,
  "comments": 86,
  "shares": 169,
  "topReactionsCount": 2275,
  "isVideo": false,
  "media": [
    {
      "thumbnail": "https://scontent.xx.fbcdn.net/v/t39.30808-6/....jpg",
      "__typename": "Photo",
      "url": "https://www.facebook.com/photo/?fbid=1619357049559665",
      "id": "1619357049559665",
      "ocrText": "May be an image of the moon"
    }
  ],
  "topComments": [
    { "id": "Y29tbWVudDo...", "text": "Beautiful!", "date": "2026-09-02T06:11:03.000Z", "likes": 12,
      "author": { "id": "100000000000000", "name": "Jane Doe", "url": "https://www.facebook.com/jane.doe" } }
  ],
  "topLevelUrl": "https://www.facebook.com/100044561550831/posts/1619357056226331",
  "facebookId": "100044561550831",
  "pageAdLibrary": { "is_business_page_active": false, "id": "26325324934" },
  "inputUrl": "https://www.facebook.com/NASA/"
}
```

Video posts add `playable_url`, `playable_duration_in_ms` and play counts inside `media`; shared posts add `sharedPost` with the original post's ID, URL and author.

### Pricing

**$2 per 1,000 posts** ($0.002 per post), **no start fee**, platform usage and residential proxies included. You pay only for posts written to the dataset, so date filters cut the bill directly. Set the maximum budget per run in the Actor settings; the scraper stops when it is reached.

#### What that buys you

Your Apify plan comes with a monthly usage allowance, and this Actor draws from it at a flat rate.

| Allowance you have | Posts it covers |
|---|---|
| $5, which is what the free plan includes | about 2,500 |
| $29 | about 14,500 |
| $199 | about 99,500 |

Nothing extra is deducted for platform compute or for the residential proxies. Both are already inside the price per post.

#### What you are never charged for

- Posts that never reach your dataset, including anything skipped by a filter or hidden by Facebook.
- An input that returns nothing at all.
- Compute time and proxy traffic.
- Date filters stop paging as soon as older posts appear, so posts you filter out never reach the dataset and never appear on the bill.

#### The cap is a cap

Result limits and the run budget are checked **before** a record is fetched, not after it has been stored, so a run cannot overshoot the number you type. Set the maximum cost per run in the Actor settings and the scraper works out how many posts fit and stops there.

Optional add-on: **video transcripts** (`captionText`) cost $0.002 per video post looked up, so a run over an all-video page costs at most $4 per 1,000 posts. Posts without video are never charged for it.

For comparison, the official Facebook Posts Scraper charges $5 per 1,000 posts on the free plan, less on higher plans, plus a start fee and a fee per filter.

### Switching from the official Facebook Posts Scraper

1. Replace the Actor ID in your integration and keep your input (`startUrls`, `resultsLimit`, `onlyPostsNewerThan`, `onlyPostsOlderThan`).
2. Output field names are the same: every field of the official dataset schema is present with the same type, including the `reaction*Count` breakdown, `media`, `topComments`, `pageAdLibrary`, `paidPartnership` and `liveViewerCount`. `sharedPost` is extra.
3. Posts come newest first, same as the official Actor.

### Limitations

- Groups need a login and are not supported; single post, photo and video URLs are not accepted, use the page or profile URL.
- `paidPartnership` is detected from the post header and sponsor tags; `liveViewerCount` is only available while a live broadcast is running, otherwise `null`.
- Private profiles and pages Facebook hides from logged-out visitors return nothing.
- Video transcripts (`captionText`) are Facebook's auto-generated captions; videos without captions return `null` (the lookup is still charged).

### FAQ

#### Can I scrape Facebook posts without logging in?

Yes. No account, cookies or API key are needed, and nothing you own can get blocked or rate-limited.

#### How do I scrape only new posts every day?

Set `onlyPostsNewerThan` to `1 day` (or the date of your last run) and schedule the Actor. It stops as soon as it reaches older posts, so a daily run over a handful of pages costs a few cents.

#### Can I scrape comments?

The comments Facebook shows first are included in `topComments` with author, date and likes. Full comment threads are a separate job; tell us in the Issues tab if you need them.

#### Can I scrape a personal profile?

Yes, if the profile is public. Use the profile URL or `profile.php?id=...`.

#### How fast is it and how many posts can I get?

10 posts take about 5 seconds, 100 posts under a minute, and pages are scraped in parallel. There is no fixed limit.

#### Is scraping Facebook posts legal?

The scraper collects only what Facebook shows to anyone without logging in. Results can still contain personal data, so use them lawfully (GDPR and local rules) and do not use them for unsolicited bulk messaging.

### More Facebook scrapers by Alfalfa

All four read only what Facebook shows a signed-out visitor, use the same field names as the official Apify Actors, and charge only for records that reach your dataset.

| Actor | What it returns | Price |
|---|---|---|
| [Facebook Events Scraper](https://apify.com/alfalfa/facebook-events-scraper) | Events by keyword, city, page or URL: dates, venue with GPS, tickets, organizer, going counts, every date of a recurring event, optional organizer email | $5 / 1,000 events |
| [Facebook Posts Scraper](https://apify.com/alfalfa/facebook-posts-scraper) | Posts from pages and profiles: text, media, reaction breakdown, comments, shares, top comments, co-authors | $2 / 1,000 posts |
| [Facebook Pages Scraper](https://apify.com/alfalfa/facebook-pages-scraper) | Page profile: email, phone, website, address, likes, followers, rating, price range, About text, recent posts | from $3.50 / 1,000 pages |
| [Facebook Comments Scraper](https://apify.com/alfalfa/facebook-comments-scraper) | Comments and reply threads of any public post: text, author, date, likes, replies with parent links, three sort modes, date filter without surcharge | $1 / 1,000 comments |

### Not working?

Facebook changes things regularly. If a page that opens in your browser returns no posts, open an issue in the Issues tab with the URL; fixes are usually deployed within a day. If the scraper saved you time, a short review on the Actor page helps other users find it.

# Actor input Schema

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

Public page or profile URLs, e.g. <code>https://www.facebook.com/humansofnewyork/</code>, <code>https://www.facebook.com/zuck</code> or <code>https://www.facebook.com/profile.php?id=100044561550831</code>. One URL = one feed. Groups and single post URLs are not supported. Same format as the official Facebook Posts Scraper.

## `resultsLimit` (type: `integer`):

Maximum number of posts per page/profile, newest first. Leave empty for no limit (use a date filter or the run budget instead).

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

Keep only posts published after this date. Absolute <code>YYYY-MM-DD</code> (or full ISO date-time, UTC) or relative like <code>1 day</code>, <code>2 weeks</code>, <code>3 months</code>. Scraping stops when older posts are reached, so you pay only for the posts you get.

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

Keep only posts published before this date. Absolute <code>YYYY-MM-DD</code> (or full ISO date-time, UTC) or relative like <code>1 day</code>, <code>2 months</code>. Newer posts are skipped for free.

## `captionText` (type: `boolean`):

Add <code>captionText</code> with the transcript of each video post (Facebook's auto-generated captions, English preferred), same field as the official scraper. Add-on: $0.002 per video post looked up. Leave off unless you need the text.

## `maxConcurrency` (type: `integer`):

How many pages/profiles are scraped in parallel (default 5). Posts of one page are always read in order.

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

Residential proxies are included in the price per post. Leave the default unless you want to route the traffic through your own proxy servers.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/humansofnewyork/"
    }
  ],
  "resultsLimit": 10,
  "captionText": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `posts` (type: `string`):

All scraped posts as JSON (same fields as the official Facebook Posts Scraper, plus sharedPost). Append ?format=csv for CSV.

# 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": [
        {
            "url": "https://www.facebook.com/humansofnewyork/"
        }
    ],
    "resultsLimit": 10,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alfalfa/facebook-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": [{ "url": "https://www.facebook.com/humansofnewyork/" }],
    "resultsLimit": 10,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("alfalfa/facebook-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": [
    {
      "url": "https://www.facebook.com/humansofnewyork/"
    }
  ],
  "resultsLimit": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call alfalfa/facebook-posts-scraper --silent --output-dataset

```

## MCP server setup

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