# Facebook Post Details Scraper – Text & Media (`scrapingmonkey/facebook-post-details-scraper`) Actor

Extract public non-Reel Facebook post details from URLs. Export text, author data, visible engagement, reactions, publication times, and ordered media attachments in one row per post.

- **URL**: https://apify.com/scrapingmonkey/facebook-post-details-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:**
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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

Extract the message, author, engagement, and media behind a public Facebook post URL. **Facebook Post Details Scraper** returns a consistent record for non-Reel text, photo, video, and multi-attachment posts, with visible reaction breakdowns and publication data.

Use it when you already have the post links you want to analyze. Each resolved post occupies one row, including posts with several attachments, and the table uses the same flat keys as JSON. No Facebook login or cookies are required.

| At a glance | Details |
|---|---|
| 📥 Input | Public Facebook post, photo-post, or non-Reel video URLs |
| 📤 Output | Message, author, engagement, reactions, and available media |
| 🔐 Login required | No |
| 📄 Scope | Selected posts; no feed or comment pagination |
| 💾 Delivery | One table, one row per resolved post |

### What the Facebook post details scraper extracts 🔎

The Actor returns post identifiers, canonical URL, type, message, publication time, author, visible engagement counts, and sponsored or pinned flags. A reaction breakdown includes returned reaction types and counts.

Media attachments stay in their original order. Photo fields can include image URLs, dimensions, and alternative text. Video fields can include HD and SD URLs, duration, playback references, and captions URLs. Fields that do not apply to an attachment remain empty.

### How to scrape Facebook post details 🚀

1. Copy the public Facebook post URLs you want to inspect.
2. Add them to `inputList`.
3. Run the Actor and review each post's `status`.
4. Export the data or send rows to your reporting workflow.

```json
{
  "inputList": [
    "https://www.facebook.com/photo.php?fbid=1100421822647027"
  ]
}
```

For `/reel/` links, use Facebook Reel Details Scraper. For post discussions, use Facebook Post Comments Scraper.

### Post details data fields and output 📦

| Field group | Included data |
|---|---|
| Identity and message | Post and story IDs, URL, type, message, publication time |
| Engagement | Reaction, comment, share, and view counts; reaction breakdown |
| Author | IDs, username, name, URL, picture, verification flag |
| Media | Ordered photo and video references, dimensions, duration, alternative text, playback and caption fields |
| State | Feedback ID, sponsored flag, pinned flag |

Complete illustrative success row. Harbor Workshop and the media URLs below are examples, not a live run.

```json
{
  "input": "https://www.facebook.com/harborworkshop/posts/123456789012345/",
  "status": "success",
  "id": "123456789012345",
  "story_id": "S:100012345678901:123456789012345",
  "url": "https://www.facebook.com/harborworkshop/posts/123456789012345/",
  "type": "carousel",
  "message": "Join our Saturday open day for a tour and a hands-on woodworking session.",
  "timestamp": 1788256800,
  "published_at": "2026-09-01T10:00:00Z",
  "reactions_count": 24,
  "comments_count": 7,
  "shares_count": 3,
  "views_count": 0,
  "image_url": "https://example.com/media/workshop-open-day.jpg",
  "thumbnail_url": "https://example.com/media/workshop-open-day-thumb.jpg",
  "video_url": "",
  "feedback_id": "ZmVlZGJhY2s6MTIzNDU2Nzg5MDEyMzQ1",
  "is_sponsored": false,
  "is_pinned": true,
  "author.id": "100012345678901",
  "author.page_id": "100012345678901",
  "author.username": "harborworkshop",
  "author.name": "Harbor Workshop",
  "author.url": "https://www.facebook.com/harborworkshop/",
  "author.profile_picture_url": "https://example.com/media/harbor-workshop.jpg",
  "author.is_verified": false,
  "reactions.id": [
    "1635855486666999",
    "1678524932434102"
  ],
  "reactions.type": [
    "Like",
    "Love"
  ],
  "reactions.count": [
    18,
    6
  ],
  "media.id": [
    "123456789012346",
    "123456789012347"
  ],
  "media.type": [
    "photo",
    "video"
  ],
  "media.url": [
    "https://www.facebook.com/photo/?fbid=123456789012346",
    "https://www.facebook.com/harborworkshop/videos/123456789012347/"
  ],
  "media.image_url": [
    "https://example.com/media/workshop-open-day.jpg",
    "https://example.com/media/workshop-tour-cover.jpg"
  ],
  "media.thumbnail_url": [
    "https://example.com/media/workshop-open-day-thumb.jpg",
    "https://example.com/media/workshop-tour-thumb.jpg"
  ],
  "media.video_url_hd": [
    "",
    "https://example.com/media/workshop-tour-hd.mp4"
  ],
  "media.video_url_sd": [
    "",
    "https://example.com/media/workshop-tour-sd.mp4"
  ],
  "media.dash_manifest_url": [
    "",
    ""
  ],
  "media.dash_manifest": [
    "",
    ""
  ],
  "media.duration_ms": [
    0,
    15000
  ],
  "media.width": [
    1200,
    1920
  ],
  "media.height": [
    800,
    1080
  ],
  "media.alt_text": [
    "Visitors making a wooden stool at the workshop open day.",
    "A short tour of the workshop."
  ],
  "media.captions_url": [
    "",
    "https://example.com/media/workshop-tour.vtt"
  ]
}
```

One post remains one row. JSON and the table share literal dotted keys such as `author.name` and `media.image_url`. Repeated attachment fields are aligned lists: `media.id[1]`, `media.type[1]`, and `media.video_url_hd[1]` refer to the same second attachment. Empty values retain their positions; nested lists retain their dimensions when present.

An unavailable field may be an empty string, `0`, `false`, or `null`; a zero count can reflect missing source data. A failed row keeps `input`, sets `status` to `failed`, and makes all post-data columns null.

### Input requirements and coverage ⚙️

| Parameter | Type | Required | Rules |
|---|---|---|---|
| `inputList` | Array of strings | Yes | At least one full Facebook URL containing a supported post or media identifier |

Common inputs include `/PAGE/posts/ID`, `/PAGE/videos/ID`, `story.php?story_fbid=ID`, `permalink.php?story_fbid=ID`, and `photo.php?fbid=ID`. Post identifiers after `/posts/` can also use Facebook's `pfbid` form. Use the full permalink rather than a bare ID, direct media URL, or shortened share link without an identifiable target.

`/reel/` URLs are rejected. There is no pagination or post-count setting: selected targets are resolved individually. Duplicate target IDs are deduplicated, while invalid individual inputs can save failed rows without stopping the rest of a valid batch.

### Facebook post detail use cases 🎯

#### Campaign reporting

Collect messages, publication times, visible counts, and author identity for a defined list of campaign posts.

#### Creative and format analysis

Compare text, photo, video, and multi-attachment content while retaining the relationship between each post and its media.

#### Content database enrichment

Add stable identifiers, URLs, author fields, and post text to records gathered by your discovery workflow.

#### Public communication research

Build a reviewable dataset of selected announcements, keeping source URLs attached to every record.

### Pricing and billable post rows 💰

Check the Actor's **Pricing** tab for the current model and rate. Under dataset-item pricing, each saved success or failed row can be billable. A post with several media attachments is still one success row.

Invalid, unavailable, or unresolved targets can produce failed rows. Automatic retry attempts do not independently create rows. The number of attachments does not multiply the number of post results.

### Facebook post details API and integrations 🔌

Replace `$ACTOR_ID` with the ID from the Actor's API tab and `$APIFY_TOKEN` with your Apify token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["https://www.facebook.com/photo.php?fbid=1100421822647027"]}'
```

Use Apify schedules for repeated snapshots, webhooks for completion events, and integrations for Google Sheets, Make, Zapier, cloud storage, or an analytics service.

### Reliability and limits ⚠️

Temporary request failures are retried. Deleted, private, restricted, or login-gated content may not be available. Public responses can omit engagement counts or some attachments.

The Actor returns media URLs and playback references; it does not download files. Media URLs can expire. Saved results describe the data returned during that run and are not a permanent copy of the Facebook post.

### Frequently asked questions ❓

#### Does this Actor support Reels?

No. Submit `/reel/` URLs to Facebook Reel Details Scraper for Reel-specific fields.

#### Can it discover posts from a Page?

This Actor starts from selected post URLs. It does not paginate a Page feed or search for posts.

#### Are multi-attachment posts split into several rows?

No. The post stays in one row, and each `media.*` list retains attachment order.

#### Does it include comments?

It includes the available comment count. Use Facebook Post Comments Scraper for comment text, authors, and embedded replies.

#### Why is a count zero on a popular post?

Facebook can omit a count, and the parser can default that field to zero. Check the source and context before interpreting it as a measured total.

### Support, responsible use, and related actors 🛟

For support, share the run ID, a safe public post URL, and the expected result. Keep credentials private.

Use public post data lawfully, respecting privacy, copyright, and applicable platform terms.

# Actor input Schema

## `inputList` (type: `array`):

Add one full Facebook post or video URL per item. Reels are handled by the Reel Details actor. Every input produces success or failed output.

## Actor input object example

```json
{
  "inputList": [
    "https://www.facebook.com/Meta/posts/pfbid02ncFBnDd4ghMFJVWsfRxaC4Zn6T8YoWTTkUHkGx7fz6WAvy4WGPpDt2VbzgK3jqb8l"
  ]
}
```

# Actor output Schema

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

Actor dataset results with input and status columns.

# 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 = {
    "inputList": [
        "https://www.facebook.com/Meta/posts/pfbid02ncFBnDd4ghMFJVWsfRxaC4Zn6T8YoWTTkUHkGx7fz6WAvy4WGPpDt2VbzgK3jqb8l"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/facebook-post-details-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 = { "inputList": ["https://www.facebook.com/Meta/posts/pfbid02ncFBnDd4ghMFJVWsfRxaC4Zn6T8YoWTTkUHkGx7fz6WAvy4WGPpDt2VbzgK3jqb8l"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/facebook-post-details-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 '{
  "inputList": [
    "https://www.facebook.com/Meta/posts/pfbid02ncFBnDd4ghMFJVWsfRxaC4Zn6T8YoWTTkUHkGx7fz6WAvy4WGPpDt2VbzgK3jqb8l"
  ]
}' |
apify call scrapingmonkey/facebook-post-details-scraper --silent --output-dataset

```

## MCP server setup

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