# Facebook Post Scraper: Reactions and Shares by URL (`automation_craft/facebook-post-scraper`) Actor

Scrape public Facebook posts by URL without a login: paste post, photo, video, reel, group or share links and get reactions by type, comments, shares, exact video plays, text, author, media and link preview. Free rows for dead links, change tracking for re-checks. Pay per post.

- **URL**: https://apify.com/automation_craft/facebook-post-scraper.md
- **Developed by:** [Automation Craft](https://apify.com/automation_craft) (community)
- **Categories:** Social media, Marketing, Automation
- **Stats:** 9 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.94 / 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

### Facebook Post Scraper: Reactions and Shares by URL

**Facebook post scraper by URL, with no login and no cookies.** Paste the links of public Facebook posts, photos, videos, reels or group posts and get one row per post: the text, the time, the author, the reaction count and the breakdown by type (like, love, care, haha, wow, sad, angry), the comment count, the share count, the exact play count of videos and reels, the photos, the video file and the link preview. A dead, private or unreadable link gets a free status row that keeps its link. Each post is charged once per run, however many of your links name it, from $0.94 per 1,000 posts.

#### What it is for

- **Agencies and brand teams**: the numbers of your campaign posts, your competitors' posts and the posts your brand is tagged in, in one table.
- **Influencer marketing**: check creators' posts and reels after publication: reactions, comments, shares and plays.
- **Re-checks on a schedule**: name a watch list (memory) and every run adds the previous figures and the change since the last run, so you see how each post moved.
- **Researchers and newsrooms**: the public figures of a list of news, government or campaign posts, with the time they were published.
- **Automation users**: one row per post, ready for n8n, Make, Zapier, Power BI, Google Sheets or a database.

### Quick start

1. Paste your links into **Post links**, one per line: page posts, pfbid links, photos, videos, `/watch/?v=` links, reels, public group posts, share links (`/share/p/`, `/share/r/`, `/share/v/`) or `fb.watch` links.
2. Optional: turn on **Include the top comments the post shows**, **Include video captions (transcript)** or **Include author follower counts** (**Read every photo of a post** is on already). None of them changes the price.
3. Optional, for re-checks: give a **memory name** (for example `campaign october`) and schedule the run.
4. Click **Start**. Download the rows as JSON, CSV or Excel, or read them through the API.

### What you get

One row per post (`type: "post"`), the Post event. Fill rates are counted over the 76 distinct posts the platform test runs delivered on 2026-10-14 (57 page posts, 2 photos, 2 posts with a video, 4 videos, 8 reels, 3 group posts, of brands, news, a space agency, a public figure, a small business and public groups).

| Field | What it holds | Filled |
|---|---|---|
| `postId`, `postKind`, `postUrl` | Facebook's number of the post, its kind (`post`, `photo`, `video`, `video_post`, `reel`, `group_post`) and its own link | every row |
| `feedbackId` | Facebook's id of the reactions and comments the row's figures come from (base64 of `feedback:<number>`: the post's number on post rows; on video and reel rows the number Facebook gives the video's story, which can differ from `postId`), the key comment tools take for a post | every row |
| `inputUrl`, `position` | the link you gave and its place in your list | every row |
| `videoId`, `photoId` | the video number (videos and reels) and the photo number (photo links) | where the post has one |
| `createdAt`, `createdAtUnix` | when the post was published (UTC) | 76 of 76 |
| `text`, `title` | the post's text, and a video's title | text 74 of 76 (one photo post and one video had none) |
| `hashtags`, `mentions`, `linksInText`, `events` | hashtags, tagged people and pages, the web links written in the text, and the Facebook events the post links | where the post has them |
| `authorName`, `authorId`, `authorUrl`, `authorType` | the page or person who posted | 76, 76 and 73 of 76 (group posts name their author without a link) |
| `authorPageId`, `authorIsBusinessPageActive` | the author page's id (the one Meta's Ad Library uses) and Facebook's business page flag, from the post's header | 72 of 76 (the four others were group members and a person) |
| `authorIsVerified`, `authorFollowers`, `authorCategory` | the verified mark (from the post's header where it shows one, and from the author's page with the option) and, with **Include author follower counts**, the follower count as Facebook shows it (rounded, for example 28,000,000 for "28M") and the page's category | 6 of 6 posts of the run with the option on (verified mark on 5) |
| `reactionCount`, `reactionCountIsExact` | all reactions; exact where Facebook gives the number | 76 of 76 |
| `reactions` | like, love, care, haha, wow, sad and angry | 75 of 76 (one post had no reactions) |
| `commentCount` | Facebook's comment count | 76 of 76 |
| `shareCount`, `shareCountIsExact` | Facebook's share count; on larger reels Facebook shows it rounded ("1.2K") and `shareCountIsExact` is false | 72 of 72 posts and reels (videos show no share count) |
| `playCount`, `viewCount` | a video's or reel's play count and view count, exact | 12 of 12 videos and reels |
| `engagementTotal` | reactions plus comments plus shares | every row |
| `photoCount`, `photos` | the photos with their links, sizes and Facebook's own description of the image (`altText`); with **Read every photo of a post** (on by default) every photo of a post with more than five | 47 of 76 posts had photos |
| `mediaTotal`, `photosComplete` | how many photos and videos the post holds, and whether every one is in the row | where the post has media |
| `video`, `videos` | a video's or reel's link, duration, thumbnail (`thumbnailUrl`), the video file link (`videoFileUrl`, HD where Facebook offers it), the SD file link (`videoFileUrlSd`) and Facebook's own captions file (`captionsUrl`, an .srt, where the video has captions); `videos` lists every video of a post with several | 14 of 14 posts with a video |
| `music` | a reel's audio track (title, audio id, album art) where the reel names one | where shown |
| `link` | the link preview of a post that shares a web page (address, title, description, site) | 10 of 76 posts shared a link |
| `isShare`, `sharedPost` | whether the post shares another post, and that post's number, link, author and text | where the post shares one |
| `taggedPlace`, `taggedProfiles`, `collaborators` | the place the post is tagged at, the people and pages tagged with "with", and the post's collaborators | where shown |
| `groupId`, `groupName`, `groupUrl` | the group of a group post | 3 of 3 group posts |
| `topComments` | with **Include the top comments the post shows**: the comments the post's page shows a logged out visitor (usually up to 10), each with text, author, time, reactions and reply count | 4 of 4 posts of the run with the option on |
| `transcript`, `transcriptStatus` | with **Include video captions**: the text of Facebook's own captions of a video or reel (`ok`, `truncated` past 200,000 characters, `no_captions`, `not_a_video`, `failed`, or `not_read` when the run stopped first) | 2 of 2 videos and reels of the run with the option on had captions (one past 200,000 characters, `truncated`) |
| `previous`, `change` | with a memory name: the figures of the last run that read the post (and when), and the difference for reactions, comments, shares, plays and views, with the hours between the two reads | from the second run on |
| `source`, `scrapedAt` | the page the row was read from, and when | every row |

**Status rows** (`type: "status"`, free) answer every link that does not become a post row, with its `position` and, where the link is readable, its `inputUrl`: `post_not_available` (deleted, private, restricted or never published), `login_required` (Facebook asked for a login on every address tried, for example a post in a private group), `post_unresolved` (the page did not show the post the link names), `duplicate` (another link of the run already delivered this post), `outside_date_window`, `lookup_failed` (Facebook did not answer; run it again), `link_not_read` and `not_a_post` (values that are not a single post link: one row per kind, listing their `positions` and `reasons`), `skipped` (one row listing the links a stopped run did not read), `invalid` (the input could not be read; nothing was read and only the run's start fee was billed, plus any posts billed before a platform restart of the run) and `change_tracking_unavailable` (the memory name could not be used: rows come without previous figures, billed as usual). The **summary row** (`type: "summary"`, free) closes every run with its counters and what was billed. A run that fails ends with an **error row** (`type: "error"`, free) saying why.

### Links it reads

| Link | Example | Read how |
|---|---|---|
| Page or profile post | `facebook.com/NASA/posts/1637283811100322`, `facebook.com/nike/posts/pfbid04GE...` | the post's own page |
| Mobile and slug links | `m.facebook.com/NASA/posts/...`, `facebook.com/NASA/posts/some-title/1637...` | the same post page |
| Photo | `facebook.com/photo/?fbid=...&set=a....`, `photo.php?fbid=...`, `facebook.com/nike/photos/a.../...` | the owner's post page of the photo (the photo's owner is read from its embed when the link does not name it) |
| Video, watch | `facebook.com/NASA/videos/1408202287429345/`, `facebook.com/watch/?v=...`, `video.php?v=...` | the video's page: exact plays and views, reactions by type |
| Reel | `facebook.com/reel/1082585924135116` | the reel's video page (exact plays, reactions by type), then its reel page for the share count |
| Public group post | `facebook.com/groups/dogspotting/posts/...`, `/permalink/...`, `?multi_permalinks=...` | the group post page |
| permalink.php, story.php | `facebook.com/permalink.php?story_fbid=...&id=...` | the owner's post page |
| Share and short links | `facebook.com/share/p/...`, `/share/r/...`, `/share/v/...`, `fb.watch/...` | the link's first redirect names the post, which is then read as above |

Page, profile and group home links are not posts: they get a free status row (for a page's posts, use our Facebook page posts listing, linked at the end of this page).

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

Pay per event: you pay for each post delivered, nothing for status rows, duplicates or links Facebook does not show.

| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| Post (per 1,000 posts) | $1.32 | $1.20 | $1.09 | $0.94 |
| Actor start (per run) | $0.005 | $0.005 | $0.005 | $0.005 |

Platinum and Diamond plans pay the Gold price. The Store pricing card shows these same prices per 1,000 events: "$0.94 / 1,000" on the Post row means one post costs $0.00094. The Actor start is charged once per run, by the platform, per GB of run memory (a 256 MB run pays one). The options (top comments, captions, author follower counts, every photo of a post, reel share counts, change tracking) cost nothing extra.

Examples at the Gold price:

- One post: $0.005 + $0.00094 = **$0.00594**.
- 100 posts: $0.005 + 100 x $0.00094 = **$0.099**.
- 1,000 posts: $0.005 + $0.94 = **$0.945**.
- A daily re-check of 20 campaign posts for 30 days: 30 x ($0.005 + 20 x $0.00094) = **$0.714**.

Free, always: status rows (dead, private, walled, unreadable or duplicate links, posts outside your date window), the summary, and the sample post of an empty input (a fresh run started that way pays only the Actor start).

### Input

| Field | What it does |
|---|---|
| `postUrls` | the post links (up to 5,000). `startUrls` with `{ "url": ... }` objects, `urls`, `directUrls` and `links` are read too |
| `maxPosts` | stop after this many posts (empty: every link, within your charge limit and the run's allowance of unpaid work) |
| `postedAfter`, `postedBefore` | a date window: `YYYY-MM-DD`, `YYYY-MM-DD HH:MM` or `YYYY-MM-DDTHH:MM` (UTC), `today`, `yesterday`, `"7 days"`, `"2 weeks"`, `"3 months"`, `"12 hours"` (back from the run's start); a post outside it gets a free row |
| `includeTopComments` | add the comments the post's page shows (empty: off) |
| `includeTranscript` | add the text of Facebook's own captions of videos and reels (empty: off) |
| `includeAuthorDetails` | add the author's follower count, verified mark and category (empty: off) |
| `includeAllPhotos` | read every photo of a post with more than five (empty: on) |
| `reelShareCount` | read a reel's share count from its reel page (empty: on) |
| `memoryName`, `resetMemory` | change tracking: previous figures and the change since the last run |
| `maxConcurrency` | how many links are read at once (empty: 4) |
| `proxyUrls` | your own proxies (optional, secret) |

Example:

```json
{
  "postUrls": [
    "https://www.facebook.com/NASA/posts/1637283811100322",
    "https://www.facebook.com/reel/1082585924135116",
    "https://www.facebook.com/groups/dogspotting/posts/10159050659364467/"
  ],
  "includeTopComments": true,
  "memoryName": "campaign october"
}
```

### Change tracking (watch lists)

Give the same `memoryName` to scheduled runs of the same list. Each row then carries `previous` (the reactions, comments, shares, plays and views the last run delivered for that post, and when) and `change` (the difference, and the hours between the two reads). The first run of a name has no previous figures. Every post read is a Post, on every run: the memory only keeps figures and never makes a re-check free or skips it. A memory belongs to this Actor and your account; it keeps up to 20,000 posts (past that the posts checked longest ago are dropped first). Two runs on one memory name at the same time: the second one delivers without previous figures and a free row says so.

### Use it through the API

```bash
curl -X POST "https://api.apify.com/v2/acts/automation_craft~facebook-post-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"postUrls": ["https://www.facebook.com/NASA/posts/1637283811100322"]}'
```

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation_craft/facebook-post-scraper').call({ postUrls: ['https://www.facebook.com/reel/1082585924135116'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => x.type === 'post'));
```

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_TOKEN>")
run = client.actor("automation_craft/facebook-post-scraper").call(run_input={"postUrls": ["https://www.facebook.com/NASA/posts/1637283811100322"]})
posts = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "post"]
```

### What this Actor does NOT do

- **No login, no private content.** It reads what Facebook shows a logged out visitor. Posts in private groups, friends only posts and posts of restricted pages get a free `login_required` or `post_not_available` row.
- **No page or profile timelines.** It reads the posts you link. For a page's posts over time use our Facebook page posts listing (linked below); for keyword search there is no mode here.
- **No full comment lists or reactor lists.** The top comments option gives what the post's page shows (usually up to 10). For every comment and reply use our Facebook Comments Scraper; the people who reacted are not read.
- **No share count on videos.** Facebook shows none on video and watch pages; reels get theirs from the reel page.
- **No paid partnership flag.** Facebook does not show the paid partnership label to a logged out visitor (checked on 3 posts Meta's branded content library lists as paid partnerships, 2026-10-14); the brand a creator tags shows in `taggedProfiles`.
- **No live viewer counts, marketplace flags, product tags on photos or reactions per photo.** On the logged out pages read for this Actor, product tags were empty on every photo and no photo carried its own reaction counts.
- **No gender or other data Facebook does not display.** Author and commenter fields are what the post's page shows a visitor: name, id and profile link.
- **No speech to text.** Transcripts are Facebook's own captions; a video without captions says `no_captions`.
- **No stored copies of photos or videos.** Rows carry Facebook's links to the files, which expire after some days.
- **Exact follower counts.** Author follower counts are Facebook's rounded figure ("28M").

### FAQ

#### How do I get the number of likes, comments and shares of a Facebook post I do not own?

Paste the post's link into **Post links** and start the run. The row carries `reactionCount` with the breakdown by type, `commentCount` and `shareCount`, as Facebook shows them to a logged out visitor; no login or access to the page is needed.

#### Can I scrape Facebook reel and video views?

Yes. A video or reel link gives `playCount` and `viewCount` exactly, from the video's own page, and a reel also gets its share count from its reel page.

#### Does it work with photo links, share links and fb.watch links?

Yes. Photo links, `permalink.php` and `story.php` links are read through the owner's post page, and share and `fb.watch` links through their first redirect, which names the post.

#### Is scraping Facebook posts without logging in possible?

Yes, for public posts. This Actor never logs in and never sends cookies; posts that need a login get a free status row.

#### How do I track how a post's engagement changes over time?

Give a **memory name** and schedule the run. Each row then shows the previous figures, when they were read, and the change since then.

#### Why does this Actor run with limited permissions?

It runs with the least privilege Apify offers: it reads Facebook and writes only to its own run's storage, plus the memory store it creates itself under your memory name. It cannot see your other Actors, datasets or account data.

### More data tools by Automation Craft

- [Facebook page posts, no login (our page posts listing)](https://apify.com/automation_craft/facebook-posts-scraper)
- [Facebook Page ID Finder: Names to Page IDs](https://apify.com/automation_craft/facebook-page-id-finder)
- [Facebook Marketplace Scraper with Sold Tracker](https://apify.com/automation_craft/facebook-marketplace-scraper)
- [Facebook Ads Library Scraper - Ad Library & Spy](https://apify.com/automation_craft/facebook-ads-library-scraper)
- [Meta Branded Content Scraper: Paid Partnerships](https://apify.com/automation_craft/meta-branded-content-scraper)
- [Instagram Posts Scraper: Profiles, Reels, No Login](https://apify.com/automation_craft/instagram-posts-scraper)
- [Threads Scraper: Posts, Search, Tags, Replies](https://apify.com/automation_craft/threads-scraper)

### Changelog

See the Changelog tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/automation_craft/facebook-post-scraper/changelog.md

# Actor input Schema

## `postUrls` (type: `array`):

Links of public Facebook posts: page and profile posts (number or pfbid links), photos (/photo/?fbid=, photo.php, /<page>/photos/), videos (/videos/, /watch/?v=), reels (/reel/), public group posts (/groups/<group>/posts/ or /permalink/), permalink.php and story.php links, share links (/share/p/, /share/r/, /share/v/), fb.watch and m.facebook.com links. Up to 5,000 links. Page, profile and group home links are not read (a free row says so).

## `maxPosts` (type: `integer`):

Stop after this many posts were delivered. Links not read get one free row that lists them. Empty: every link is read, within your charge limit and the run's allowance of unpaid work (pages that bill nothing, such as dead links, are bounded per run; a free row lists any link it stops before).

## `postedAfter` (type: `string`):

Deliver only posts created on or after this time (UTC): YYYY-MM-DD (from 00:00), YYYY-MM-DD HH:MM or YYYY-MM-DDTHH:MM (seconds and a closing Z or +00:00 allowed, UTC only), today, yesterday, or a time back from the run's start such as "7 days", "2 weeks", "3 months" or "12 hours". An older post gets a free row instead of its row (it is read, not charged).

## `postedBefore` (type: `string`):

Deliver only posts created on or before this time (UTC), in the same forms as above (YYYY-MM-DD to 23:59:59). A newer post gets a free row instead of its row (it is read, not charged).

## `includeTopComments` (type: `boolean`):

Add the comments the post's own page shows to a logged out visitor (usually up to 10, with text, author, time, reactions and reply count) to each row, at no extra charge. Videos and reels show none. Empty: off.

## `includeTranscript` (type: `boolean`):

For videos and reels that carry Facebook's own captions, add their text as the transcript (one more small download per video, no extra charge). A video without captions says so in transcriptStatus; no speech is transcribed. Empty: off.

## `includeAuthorDetails` (type: `boolean`):

Add the author's follower count as Facebook shows it (rounded, for example 28M), the verified mark and the category where shown, read once per author per run from the author's page embed (no extra charge). Empty: off.

## `includeAllPhotos` (type: `boolean`):

A post page shows its first five photos. When a post has more, read its photo set too (one more page for that post only, no extra charge) so photos holds every photo and video Facebook shows; mediaTotal and photosComplete say how many the post has and whether all came. Empty: on.

## `reelShareCount` (type: `boolean`):

Reels are read from their video page (exact plays, reactions by type) and then from their reel page for the share count, which Facebook shows rounded on larger reels (shareCountIsExact says so). Turn off to skip the second page: the reel row then has no share count. Empty: on.

## `memoryName` (type: `string`):

Name a watch list (for example "campaign october"). Each run then adds the figures of the last run that read the same post under this name (previous) and the difference (change), so a scheduled run shows how reactions, comments, shares and plays moved. Every post read is still a Post. A memory belongs to this Actor and your account.

## `resetMemory` (type: `boolean`):

Forget the figures kept under the memory name before this run (no post then has previous figures). Empty: off.

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

How many links are read at the same time (each on its own address). Empty: 4.

## `proxyUrls` (type: `string`):

Optional: your own proxy addresses, one per line, as http://user:password@host:port, used instead of the Apify datacenter pool this Actor uses on its own. Up to 50.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.facebook.com/NASA/posts/1637283811100322",
    "https://www.facebook.com/reel/1082585924135116",
    "https://www.facebook.com/groups/dogspotting/posts/10159050659364467/"
  ],
  "includeAllPhotos": true,
  "reelShareCount": true
}
```

# Actor output Schema

## `items` (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 = {
    "postUrls": [
        "https://www.facebook.com/NASA/posts/1637283811100322",
        "https://www.facebook.com/reel/1082585924135116",
        "https://www.facebook.com/groups/dogspotting/posts/10159050659364467/"
    ],
    "includeTopComments": false,
    "includeAllPhotos": true,
    "reelShareCount": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation_craft/facebook-post-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 = {
    "postUrls": [
        "https://www.facebook.com/NASA/posts/1637283811100322",
        "https://www.facebook.com/reel/1082585924135116",
        "https://www.facebook.com/groups/dogspotting/posts/10159050659364467/",
    ],
    "includeTopComments": False,
    "includeAllPhotos": True,
    "reelShareCount": True,
}

# Run the Actor and wait for it to finish
run = client.actor("automation_craft/facebook-post-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 '{
  "postUrls": [
    "https://www.facebook.com/NASA/posts/1637283811100322",
    "https://www.facebook.com/reel/1082585924135116",
    "https://www.facebook.com/groups/dogspotting/posts/10159050659364467/"
  ],
  "includeTopComments": false,
  "includeAllPhotos": true,
  "reelShareCount": true
}' |
apify call automation_craft/facebook-post-scraper --silent --output-dataset

```

## MCP server setup

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