# Facebook Posts Scraper – Pages & Profiles (`sfoln/facebook-page-posts`)

Scrape public posts from Facebook pages and profiles: text, date, type, reactions, comments, shares, video views, image and video URLs, links and hashtags, one row per post. $0.60 per 1,000 posts + $0.004 per request of up to 3 posts.

- Family: Social media data
- Categories: Social media, Lead generation, Automation
- Availability: on request (private on Apify). Email contact@sfoln.com with subject "Access request: Facebook Posts Scraper – Pages & Profiles (sfoln/facebook-page-posts)" before calling; calls fail until it is public.
- JSON: https://www.sfoln.com/actors/facebook-page-posts.json
- MCP: https://mcp.apify.com?tools=sfoln/facebook-page-posts
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~facebook-page-posts/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~facebook-page-posts/runs

Facebook Posts Scraper – Pages & Profiles gets public posts from Facebook pages and profiles, one normalized record per post: post ID, URL, text, date, type (reel, video, photo, link, status), reaction, comment and share counts, video views, thumbnail, video and image URLs, outbound link and hashtags. It's built for competitor and brand monitoring, social listening, content research, dataset building and AI agents.

## Price per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| Facebook post (`facebook-post`) | $0.0006 | $0.60 / 1,000 | Charged once per Facebook post delivered as a dataset record. Page summary records are never charged. |
| Facebook posts page (`facebook-posts-query`) | $0.004 | $4 / 1,000 | Charged once per page of posts (up to 3, an upstream limit) that delivered at least one new post. Covers the per-request upstream fee. Also charged for an empty page the upstream billed (when the budget covers it). |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
curl -X POST "https://api.apify.com/v2/actors/sfoln~facebook-page-posts/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"pages":["https://www.facebook.com/pacemorby"],"maxPostsPerPage":6}'
```

MCP client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/facebook-page-posts"
    }
  }
}
```

Example prompt: Get the 20 latest public posts of the Facebook page facebook.com/nasa and tell me which ones got the most reactions and shares.

## Input

Enter Facebook page or profile URLs. Each page produces one dataset record per post plus one summary record per page.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `pages` (required) | array | — | Pages: Facebook page or profile URLs (https://www.facebook.com/name, profile.php?id=…), vanity names, or numeric page IDs. Duplicates are removed. Accounts on the Apify free plan can process up to 10 pages per run. |
| `maxPostsPerPage` | integer | `20` | Max posts per page: How many posts to return per page (1–200). The upstream returns 3 posts per request; each delivered post is one charged event, plus one fee per request. |
| `maxPages` | integer | `100` | Max pages: Safety cap on the number of pages processed in this run. |
| `concurrency` | integer | `4` | Concurrency: How many pages are fetched in parallel (1–8). |
| `itemTimeoutSecs` | integer | `600` | Time limit per input (seconds): Pagination for one page stops cleanly shortly before this limit (60–3600). Raise it for very large per-input limits. |
| `includeRaw` | boolean | `false` | Include raw upstream response: Attach the unmodified provider object to each result record. |

Example input:

```json
{
  "pages": [
    "https://www.facebook.com/pacemorby"
  ],
  "maxPostsPerPage": 6
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | object | Input: The page URL, handle or ID as provided. |
| `recordType` | string | Record type: post (one per delivered post, charged) \| page (one summary per page, never charged) |
| `position` | integer | Position: 1-based position of the post within its input |
| `page` | string | null | Page: Vanity name or numeric id |
| `pageUrl` | string | null | Page URL |
| `postId` | string | null | Post ID |
| `url` | string | null | Post URL |
| `text` | string | null | Text |
| `createdAt` | string | null | Created at: ISO 8601 UTC |
| `type` | string | null | Type: reel \| video \| photo \| link \| status (inferred) |
| `authorName` | string | null | Author name |
| `authorId` | string | null | Author ID |
| `reactions` | number | null | Reactions: All reaction types combined |
| `comments` | number | null | Comments |
| `shares` | number | null | Shares |
| `videoViews` | number | null | Video views |
| `thumbnailUrl` | string | null | Thumbnail URL |
| `mediaUrls` | array | Media URLs: Temporary CDN links |
| `linkUrl` | string | null | Link URL |
| `hashtags` | array | Hashtags |
| `rowsDelivered` | integer | Posts delivered: Summary records only. |
| `pagesFetched` | integer | Pages fetched: Summary records only. |
| `pagesCharged` | integer | Pages charged: Summary records only. |
| `reachedEnd` | boolean | Reached end: Summary records only: the upstream reported no further pages. |
| `stopReason` | string | Stop reason: Summary records only: limit \| end \| budget \| max_pages \| deadline \| empty_pages \| error |
| `status` | string | Status: ok \| not_found \| error \| skipped_invalid \| skipped_budget \| skipped_free_plan |
| `charged` | boolean | Charged |
| `chargedEvent` | string | Charged event |
| `error` | object | Error |
| `warnings` | array | Warnings |
| `source` | string | Source |
| `fetchedAt` | string | Fetched at |

Example record:

```json
{
  "input": "https://www.facebook.com/pacemorby",
  "recordType": "post",
  "position": 1,
  "page": "pacemorby",
  "pageUrl": "https://www.facebook.com/pacemorby",
  "postId": "1204545088344463",
  "url": "https://www.facebook.com/reel/486651220706068/",
  "text": "I've had such a blast doing the No One Left Behind Challenge this year! Join me this Friday Dec 20 @ 5PM MST to learn about next month's challenge! https://subto.sjv.io/3Jk9Py",
  "createdAt": "2024-12-18T20:19:30.000Z",
  "type": "reel",
  "authorName": "Pace Morby",
  "authorId": "100063669491743",
  "reactions": 133,
  "comments": 12,
  "shares": null,
  "videoViews": null,
  "thumbnailUrl": "https://scontent-atl3-1.xx.fbcdn.net/v/t15.5256-10/….jpg",
  "mediaUrls": [
    "https://video-atl3-1.xx.fbcdn.net/o1/v/t2/f2/m69/….mp4"
  ],
  "linkUrl": "https://subto.sjv.io/3Jk9Py",
  "hashtags": [],
  "status": "ok",
  "charged": true,
  "chargedEvent": "facebook-post",
  "source": "scrapecreators",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}
```

## Related

- [Facebook Ads Library Scraper](https://www.sfoln.com/actors/facebook-ads-search.md) (`sfoln/facebook-ads-search`)
- [Instagram Posts Scraper (No Login)](https://www.sfoln.com/actors/instagram-user-posts.md) (`sfoln/instagram-user-posts`)
- [Instagram Hashtag Scraper (No Login)](https://www.sfoln.com/actors/instagram-hashtag-posts.md) (`sfoln/instagram-hashtag-posts`)
- [Brand Monitoring – X, Reddit, News & Bluesky](https://www.sfoln.com/actors/brand-mentions-monitor.md) (`sfoln/brand-mentions-monitor`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
