# Facebook Reactions Scraper⚡ (`premiumscraper/facebook-reactions-scraper`) Actor

Extract Facebook reaction summaries from profile inputs, posts, videos, photos, shares, and reels in row per discovered item. Output includes total reactions, per-type counts and percentages, comments, shares, dominant reaction, reel play counts, and profile links ✨ Facebook Reactions Scraper⚡

- **URL**: https://apify.com/premiumscraper/facebook-reactions-scraper.md
- **Developed by:** [Premium Scraper](https://apify.com/premiumscraper) (community)
- **Categories:** Social media, Automation, Developer tools
- **Features:** Limited permissions
- **Stats:** 58 total users, 6 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 reaction summaries

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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 Reactions Scraper ⚡ — Profile, Post & Reel Reaction Summary

Extract Facebook reactions from public profile inputs, posts, and reels with one summary row per discovered post or reel. This Facebook reactions scraper accepts one mixed input box for usernames, profile/page URLs, direct post URLs, and direct reel URLs, and returns exact per-type reaction counts only when Facebook exposes them.

### Why Use This Facebook Reactions Scraper?

Most Facebook reactions tools either stop at a total reaction count or split one content item into many dataset rows. This Facebook reactions scraper keeps one clean row per discovered Facebook post or Facebook reel while still exposing Facebook reaction type detail, engagement percentages, and creator context. It works for direct URLs and for profile inputs where you choose how many posts and reels to collect.

### How This Facebook Reactions Scraper Works

1. Provide usernames, profile/page URLs, direct post URLs, direct media URLs, or direct reel URLs in one input field.
2. The Facebook reactions scraper resolves each input as either a direct post, a direct reel, or a profile source.
3. For profile sources, it collects up to your chosen `posts_count` and `reels_count` limits.
4. It extracts total Facebook reactions, comments, shares, and any public Facebook reaction type breakdown.
5. It calculates Facebook reaction percentages by type plus engagement mix percentages for reactions, comments, and shares.
6. It writes one summary row per discovered post or reel and charges one PPE row per pushed summary row.

### What This Facebook Reactions Scraper Returns

For each discovered Facebook post or Facebook reel, this Facebook reactions scraper returns:

- Facebook reaction totals for the source URL
- Facebook reaction counts by type when Facebook exposes exact per-type counts
- Facebook reaction percentages by type relative to total reactions when exact per-type counts are available
- Comment count and share count totals
- Engagement mix percentages showing how much of total engagement comes from reactions, comments, and shares
- Dominant Facebook reaction type and its percentage share
- Creator name, creator ID, creator URL, and verification state
- Canonical post or reel URL plus content ID
- Reels-only play counts when the source is a Facebook reel
- A `reaction_breakdown_has_exact_counts` flag when Facebook does not expose exact per-type counts in the raw response

### Supported Sources

This Facebook reactions scraper accepts mixed public Facebook inputs such as:

| URL Type | Example |
|---|---|
| Username | `Cristiano` |
| Profile / Page | `https://www.facebook.com/Cristiano` |
| Standard post | `https://www.facebook.com/Page/posts/pfbid0...` |
| Video post | `https://www.facebook.com/Page/videos/123456/` |
| Photo post | `https://www.facebook.com/photo?fbid=123456` |
| Share URL | `https://www.facebook.com/share/p/abc123/` |
| Permalink | `https://www.facebook.com/permalink.php?story_fbid=...` |
| Reel | `https://www.facebook.com/reel/1147473920797451` |
| Reel share | `https://www.facebook.com/share/r/17VyjaoJfm/` |

### Input Configuration

| Field | Type | Description |
|---|---|---|
| `facebook_urls` | URL\[] | One mixed input field for usernames, profile/page URLs, direct Facebook post URLs, and direct Facebook reel URLs |
| `posts_count` | integer | How many posts to collect from each profile input; use `0` to skip profile posts |
| `reels_count` | integer | How many reels to collect from each profile input; use `0` to skip profile reels |
| `proxyCountry` | string | Select country location for Apify Residential proxy exit nodes (`US`, `GB`, `CA`, `DE`, `FR`, `AU`, `BR`, `IN`, `JP`, `MX`) |

### Output Dataset

Each row is one full Facebook reactions summary for one discovered post or reel.

| Field | Type | Description |
|---|---|---|
| `type` | string | Always `reaction_summary` |
| `source_type` | string | `post` or `reel` |
| `source_number` | integer | Source URL order |
| `source_url` | string | Original direct URL, username, or profile/page input |
| `content_id` | string | Post or reel identifier |
| `post_id` | string | Post ID when the source is a post |
| `reel_id` | string | Reel ID when the source is a reel |
| `permalink_url` | string | Canonical post URL |
| `reel_url` | string | Canonical reel URL |
| `content_text` | string | Post text or reel caption excerpt |
| `creator_name` | string | Author or reel owner name |
| `creator_id` | string | Creator numeric ID |
| `creator_url` | string | Creator profile URL |
| `creator_is_verified` | boolean | Verification flag |
| `reaction_count_total` | integer | Total Facebook reactions |
| `reaction_counts_by_type` | object | Counts for each Facebook reaction type (`LIKE`, `LOVE`, `HAHA`, `WOW`, `SAD`, `ANGRY`, `CARE`) |
| `reaction_percentages_by_type` | object | Each Facebook reaction type as % of total reactions |
| `top_reactions_breakdown` | array | Array of objects with `reaction_type`, `reaction_emoji`, `reaction_count`, and `reaction_share_pct` |
| `dominant_reaction_type` | string | Most common Facebook reaction type |
| `dominant_reaction_count` | integer | Count for the dominant Facebook reaction |
| `dominant_reaction_share_pct` | number | Dominant reaction share of total reactions (%) |
| `comment_count_total` | integer | Total comments |
| `share_count_total` | integer | Total shares |
| `total_engagement` | integer | Reactions + comments + shares |
| `engagement_breakdown_counts` | object | Counts for reactions, comments, and shares |
| `engagement_breakdown_percentages` | object | Percent of total engagement from reactions, comments, and shares |
| `comment_vs_reactions_pct` | number | Comments as % of total reactions |
| `share_vs_reactions_pct` | number | Shares as % of total reactions |
| `engagement_rate_vs_views_pct` | number | Post engagement rate vs video views (%) |
| `engagement_rate_vs_plays_pct` | number | Reel engagement rate vs reel plays (%) |
| `video_view_count_total` | integer | Post video views when available |
| `play_count_total` | integer | Reel play count approximation when available |
| `reaction_breakdown_has_exact_counts` | boolean | Whether Facebook exposed exact per-type counts |

### 📋 Sample Output

```json
{
  "type": "reaction_summary",
  "source_type": "post",
  "source_number": 1,
  "source_url": "https://www.facebook.com/Cristiano/posts/pfbid0...",
  "post_id": "pfbid0...",
  "content_id": "pfbid0...",
  "permalink_url": "https://www.facebook.com/Cristiano/posts/pfbid0...",
  "created_at": "2025-12-15T10:00:00+0000",
  "content_text": "Great match today! Thank you for the support.",
  "creator_name": "Cristiano Ronaldo",
  "creator_id": "1034530909912481",
  "creator_url": "https://www.facebook.com/Cristiano",
  "creator_is_verified": true,
  "reaction_count_total": 850000,
  "comment_count_total": 12000,
  "share_count_total": 5000,
  "video_view_count_total": 15000000,
  "total_engagement": 867000,
  "engagement_rate_vs_views_pct": 5.78,
  "dominant_reaction_type": "LIKE",
  "dominant_reaction_count": 500000,
  "dominant_reaction_share_pct": 58.82,
  "reaction_counts_by_type": {
    "LIKE": 500000,
    "LOVE": 250000,
    "HAHA": 50000
  },
  "reaction_percentages_by_type": {
    "LIKE": 58.82,
    "LOVE": 29.41,
    "HAHA": 5.88
  },
  "top_reactions_breakdown": [
    { "reaction_type": "LIKE", "reaction_emoji": "👍", "reaction_count": 500000, "reaction_share_pct": 58.82 },
    { "reaction_type": "LOVE", "reaction_emoji": "❤️", "reaction_count": 250000, "reaction_share_pct": 29.41 },
    { "reaction_type": "HAHA", "reaction_emoji": "😆", "reaction_count": 50000, "reaction_share_pct": 5.88 }
  ],
  "engagement_breakdown_counts": {
    "reactions": 850000,
    "comments": 12000,
    "shares": 5000
  },
  "engagement_breakdown_percentages": {
    "reactions_pct": 98.04,
    "comments_pct": 1.38,
    "shares_pct": 0.58
  },
  "reaction_breakdown_has_exact_counts": true
}
```

# Actor input Schema

## `facebook_urls` (type: `array`):

One mixed input box for Facebook usernames, profile/page URLs, direct post/video/photo/share/permalink URLs, and direct reel/share-r URLs.

## `posts_count` (type: `integer`):

How many posts to collect from each username or profile/page input. Set 0 to skip profile posts.

## `reels_count` (type: `integer`):

How many reels to collect from each username or profile/page input. Set 0 to skip profile reels.

## `proxyCountry` (type: `string`):

Select country location for Apify Residential proxy exit nodes.

## Actor input object example

```json
{
  "facebook_urls": [
    {
      "url": "https://www.facebook.com/Cristiano"
    },
    {
      "url": "https://www.facebook.com/Cristiano/posts/pfbid0Dp9Wrmv1NAkFX1nSkKwLEKftjMSHbDYNBZE7L43y8JnTs77USeJ7cpC5FoGgm3inl"
    },
    {
      "url": "https://www.facebook.com/reel/1147473920797451"
    }
  ],
  "posts_count": 10,
  "reels_count": 10,
  "proxyCountry": "US"
}
```

# 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 = {
    "facebook_urls": [
        {
            "url": "https://www.facebook.com/Cristiano"
        },
        {
            "url": "https://www.facebook.com/Cristiano/posts/pfbid0Dp9Wrmv1NAkFX1nSkKwLEKftjMSHbDYNBZE7L43y8JnTs77USeJ7cpC5FoGgm3inl"
        },
        {
            "url": "https://www.facebook.com/reel/1147473920797451"
        }
    ],
    "posts_count": 10,
    "reels_count": 10,
    "proxyCountry": "US"
};

// Run the Actor and wait for it to finish
const run = await client.actor("premiumscraper/facebook-reactions-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 = {
    "facebook_urls": [
        { "url": "https://www.facebook.com/Cristiano" },
        { "url": "https://www.facebook.com/Cristiano/posts/pfbid0Dp9Wrmv1NAkFX1nSkKwLEKftjMSHbDYNBZE7L43y8JnTs77USeJ7cpC5FoGgm3inl" },
        { "url": "https://www.facebook.com/reel/1147473920797451" },
    ],
    "posts_count": 10,
    "reels_count": 10,
    "proxyCountry": "US",
}

# Run the Actor and wait for it to finish
run = client.actor("premiumscraper/facebook-reactions-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 '{
  "facebook_urls": [
    {
      "url": "https://www.facebook.com/Cristiano"
    },
    {
      "url": "https://www.facebook.com/Cristiano/posts/pfbid0Dp9Wrmv1NAkFX1nSkKwLEKftjMSHbDYNBZE7L43y8JnTs77USeJ7cpC5FoGgm3inl"
    },
    {
      "url": "https://www.facebook.com/reel/1147473920797451"
    }
  ],
  "posts_count": 10,
  "reels_count": 10,
  "proxyCountry": "US"
}' |
apify call premiumscraper/facebook-reactions-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,premiumscraper/facebook-reactions-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/wkPNh6Vi3KqSAGFqf/builds/5oOZ82yw8M2tqHiOk/openapi.json
