# Facebook Page Video Downloader (`parsebird/facebook-page-video-downloader`) Actor

Download every public video from Facebook Pages. Get direct MP4 links, thumbnails, titles, captions, publish dates, duration, play counts and reaction breakdowns from Page URLs, handles or IDs. No login. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/facebook-page-video-downloader.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.49 / 1,000 page videos

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 Page Video Downloader

Facebook Page Video Downloader collects every public video from one or more [Facebook](https://www.facebook.com) Pages and gives you a direct MP4 download link, a thumbnail, the title and caption, publish date, duration, play count, and the reaction breakdown for each one.

<table><tr>
<td style="border-left:4px solid #1877F2;padding:12px 16px;font-weight:600">
Paste up to 50 Page URLs, handles, profile IDs, or Page IDs and get one clean row per video, with 25+ fields from the Page's public Videos tab, newest first, with no Facebook login, cookies, or Graph API token.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```text
Use Apify Actor parsebird/facebook-page-video-downloader to download public videos from Facebook Pages. Example with ApifyClient (Python): client.actor("parsebird/facebook-page-video-downloader").call(run_input={"pageTargets":["https://www.facebook.com/WhatsApp","natgeo"],"maxResults":25}). Inputs: pageTargets array of strings required (1 to 50 public Facebook Pages as Page URLs like https://www.facebook.com/WhatsApp, handles or slugs like WhatsApp, profile IDs like 100064758844406, profile.php?id= links, or delegate Page IDs like 280034132055819; duplicates of the same Page are processed once); maxResults integer optional, minimum 1 (run-wide cap on saved videos across all Pages; leave empty to get every public video). Output: one row per video, newest first per Page; failed Pages create no rows. Fields: target, page {id, delegatePageId, name, handle}, videoId, url, title, description, publishedAt (ISO 8601), durationSeconds, playCount, reactionCount, shareCount (null, Facebook does not expose it in Page video lists), reactions {like, love, care, haha, wow, sad, angry}, author {id, delegatePageId, name}, media {playableUrl (direct MP4), thumbnailUrl, quality (sd or hd), format, width, height}. MP4 links are signed by Facebook and expire after a few days. API docs: https://docs.apify.com/api/client/python/ and https://docs.apify.com/api/client/js/. Token: https://console.apify.com/account/integrations.
```

### What is Facebook Page Video Downloader?

**Facebook Page Video Downloader** is a **Facebook video scraper and downloader API** for public Pages. Give it a Page link, handle, or ID, and it returns **every video on the Page's public Videos tab** with a **direct MP4 link**, **thumbnail**, **title and caption**, **publish date**, **duration**, **play count**, and **reactions split by type** (Like, Love, Care, Haha, Wow, Sad, Angry).

You don't need a Facebook account, cookies, or a [Graph API](https://developers.facebook.com/docs/graph-api/) app. The easiest way to try it is to open the actor, keep the four prefilled Pages (Facebook, Instagram, Meta, and WhatsApp), and click **Start**. The prefilled run saves 25 videos in a few seconds.

The actor returns download links. It does not store the video files; open `media.playableUrl` in a browser or pass it to any download tool.

### What can Facebook Page Video Downloader do?

- 🎬 **Download Facebook Page videos** as MP4 through a direct `fbcdn.net` link.
- 📚 **Get a Page's whole video library**: leave **Max videos** empty and the actor pages through the full Videos tab, newest first.
- 🔗 **Use any Page identifier**: Page URLs (including `m.facebook.com` and `web.facebook.com`), handles, slugs, `profile.php?id=` links, profile IDs, and delegate Page IDs.
- 📊 **Track performance**: play counts, total reactions, and a per-reaction breakdown for every video.
- 🧹 **Clean input handling**: the same Page entered twice in different forms is processed once, and links that are not Pages (groups, watch links) are skipped with a log message.
- ⏱️ **Automate** with [Apify schedules](https://docs.apify.com/platform/schedules), the [Apify API](https://docs.apify.com/api/v2), webhooks, and [integrations](https://apify.com/integrations) such as Google Sheets, Make, Zapier, and Slack.
- 📁 **Export** results as JSON, CSV, Excel, HTML, or XML.

### What data can you extract from Facebook Page videos?

| Field | Description |
|-------|-------------|
| `videoId`, `url` | Facebook video ID and the video's Facebook link |
| `title`, `description` | Video title and the post caption |
| `publishedAt` | Publish time in ISO 8601 (UTC) |
| `durationSeconds` | Video length in seconds |
| `playCount` | Public play count |
| `reactionCount`, `reactions` | Total reactions and counts for Like, Love, Care, Haha, Wow, Sad, and Angry |
| `media.playableUrl` | Direct MP4 link |
| `media.thumbnailUrl` | Video thumbnail image |
| `media.quality`, `media.format`, `media.width`, `media.height` | Quality hint (`sd` or `hd`), file format (`mp4`), and the video's dimensions |
| `page` | Page profile ID, delegate Page ID, name, and handle |
| `author` | ID, delegate Page ID, and name of the video owner |
| `target` | The Page link, handle, or ID you entered for this row |

### How to download videos from a Facebook Page

1. Open [Facebook Page Video Downloader](https://apify.com/parsebird/facebook-page-video-downloader) and click **Try for free** or **Start**.
2. In **Facebook Pages**, add one Page per line, for example `https://www.facebook.com/WhatsApp`, `natgeo`, or `100064758844406`.
3. Set **Max videos** to cap the run, or leave it empty to download every public video from every Page.
4. Click **Start**.
5. Open the **Output** tab and click a `media.playableUrl` to save the MP4, or export the results as JSON, CSV, or Excel.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `pageTargets` | array of strings | **Yes** | — | 1 to 50 public Facebook Pages: Page URLs, handles, slugs, profile IDs, or delegate Page IDs |
| `maxResults` | integer | No | empty (all videos) | Run-wide cap on saved videos across all Pages, minimum 1. Prefilled with 25 |
| `proxyConfiguration` | object | No | — | Optional. The actor picks its own network route and doesn't need a proxy |

`maxResults` is shared by all Pages in the run. With several Pages and a low cap, Pages are read in parallel, so the videos you get come from a mix of Pages rather than from the first Page only.

### Input / Output

**Example input**

```json
{
    "pageTargets": [
        "https://www.facebook.com/facebook",
        "https://www.facebook.com/instagram",
        "https://www.facebook.com/Meta",
        "https://www.facebook.com/WhatsApp"
    ],
    "maxResults": 25
}
```

**Example output** (one row from a real run)

```json
{
  "target": "https://www.facebook.com/WhatsApp",
  "page": {
    "id": "100064758844406",
    "delegatePageId": "280034132055819",
    "name": "WhatsApp",
    "handle": "WhatsApp"
  },
  "videoId": "1467263565193775",
  "url": "https://www.facebook.com/WhatsApp/videos/the-tldr-version/1467263565193775/",
  "title": "the tldr version",
  "description": "the tldr version",
  "publishedAt": "2026-03-30T16:31:43.000Z",
  "durationSeconds": 10,
  "playCount": 1256116,
  "reactionCount": 8036,
  "shareCount": null,
  "reactions": {
    "like": 7768,
    "love": 181,
    "care": 31,
    "haha": 45,
    "wow": 6,
    "sad": 2,
    "angry": 3
  },
  "author": {
    "id": "100064758844406",
    "delegatePageId": "280034132055819",
    "name": "WhatsApp"
  },
  "media": {
    "playableUrl": "https://video-bos5-1.xx.fbcdn.net/o1/v/t2/f2/m412/AQPSiP3myhFQSiZcDA82HWFVSy4tZBsuWPIikYtK2uRw6Lb6-TdWWcBL72IqeDW3BFlbuejxOZS8Syv3kcDDkeUgIr8fIaDDHxfOXsdcvg.mp4?_nc_cat=103&_nc_sid=8bf8fe&...&oe=6AC4371F&bitrate=170448&tag=sve_sd",
    "thumbnailUrl": "https://scontent-bos5-1.xx.fbcdn.net/v/t15.5256-10/660804614_3856253358008608_4227983087319331556_n.jpg?stp=dst-jpg_s960x960_tt6&...",
    "quality": "sd",
    "format": "mp4",
    "width": 1080,
    "height": 1350
  }
}
```

The two media links are shortened here. Real rows contain the full signed URL. Download results from the **Output** tab in JSON, CSV, Excel, HTML, or XML, or set up a run on the [Input tab](https://console.apify.com/actors/yTrwjSScB2Q80TQ3J/input).

### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("parsebird/facebook-page-video-downloader").call(
    run_input={
        "pageTargets": ["https://www.facebook.com/WhatsApp", "natgeo"],
        "maxResults": 50,
    }
)

for video in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(video["page"]["name"], video["publishedAt"], video["playCount"], video["media"]["playableUrl"])
```

### JavaScript API example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });

const run = await client.actor('parsebird/facebook-page-video-downloader').call({
    pageTargets: ['https://www.facebook.com/WhatsApp', 'natgeo'],
    maxResults: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const video of items) {
    console.log(video.page.name, video.publishedAt, video.playCount, video.media.playableUrl);
}
```

See the [Python client docs](https://docs.apify.com/api/client/python/) and [JavaScript client docs](https://docs.apify.com/api/client/js/) for more options.

### Use cases

- **Brand and social media teams**: back up your own Page's video library, or keep a copy of partner content you have rights to repost.
- **Competitor research**: compare how often rival Pages post video and which videos get the most plays and reactions.
- **Media monitoring**: schedule daily runs with a low **Max videos** to catch new uploads from news or brand Pages.
- **Researchers and journalists**: archive public Page videos with their captions, dates, and engagement before they are removed.
- **AI and data pipelines**: send MP4 links to transcription or moderation tools, such as our [Video & Audio Transcriber](https://apify.com/parsebird/video-audio-transcriber).

### How it works

1. The actor opens each Page's public Videos tab the way a logged-out visitor sees it and reads the Page's IDs, name, and handle.
2. It then pages through the Page's video list, newest first, and builds one row per video with links, counts, and reactions.
3. It stops when the Page has no more videos or when the run reaches **Max videos**. Pages that can't be found are logged and skipped, and they don't create rows.

### How much does it cost to download Facebook Page videos?

**What is the price per Facebook video?**

The actor uses pay-per-event pricing: you pay per video saved, and platform usage is included.

| Event | Free plan | Bronze | Silver | Gold |
|-------|-----------|--------|--------|------|
| `video-extracted` | $0.00429 (**$4.29 / 1,000**) | $0.00399 (**$3.99 / 1,000**) | $0.00379 (**$3.79 / 1,000**) | $0.00349 (**$3.49 / 1,000**) |

One `video-extracted` event is one video row in the dataset. Pages that fail don't cost anything. The prefilled 25-video run costs about $0.11 on the Free plan, and 1,000 videos cost $4.29. Apify's free plan includes monthly platform credits you can use to try the actor.

### Is it legal to download videos from Facebook Pages?

**Is scraping Facebook Page videos legal?**

The actor only reads public Pages and videos that Facebook shows to anyone without logging in. Downloading public data is generally legal in many jurisdictions, but videos belong to their creators and are protected by copyright, and Pages can contain personal data covered by laws such as GDPR and CCPA. Get permission before reusing someone else's videos, respect [Facebook's Terms](https://www.facebook.com/terms.php), and consult your lawyer if unsure. Read more in Apify's guide: [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

### Other video downloaders and related Actors

| Actor | Best for |
|-------|----------|
| [Twitter (X) Video Downloader](https://apify.com/parsebird/twitter-video-downloader) | MP4 links for videos and GIFs in tweets |
| [Instagram Reels Audio Scraper](https://apify.com/parsebird/instagram-reels-audio-scraper) | Reels that use a given Instagram sound |
| [YouTube Shorts Downloader](https://apify.com/parsebird/youtube-shorts-downloader) | YouTube Shorts download links |
| [TikTok Slideshow Downloader](https://apify.com/parsebird/tiktok-slideshow-downloader) | Every photo from TikTok photo-mode posts |
| [Telegram Media Downloader](https://apify.com/parsebird/telegram-media-downloader) | Media from public Telegram channels |
| [Kick Video Downloader](https://apify.com/parsebird/kick-video-downloader) | Kick clips and VODs |
| [Video & Audio Transcriber](https://apify.com/parsebird/video-audio-transcriber) | Transcribing the videos you download |

### FAQ

**Which inputs work?**
Page URLs from www.facebook.com, m.facebook.com, web.facebook.com, or fb.com; `profile.php?id=` links; `/pages/<name>/<id>` links; handles and slugs such as `WhatsApp` or `@WhatsApp`; numeric profile IDs such as `100064758844406`; and delegate Page IDs such as `280034132055819`. Group, event, and watch links are skipped with a warning in the log.

**Does it get every video on the Page?**
It gets every video that Facebook lists on the Page's public Videos tab. In our tests that was 327 videos for WhatsApp and more than 1,800 for National Geographic (back to 2021). Some Pages list fewer videos publicly than you might expect. NASA's Videos tab, for example, showed 41 videos.

**What video quality do I get?**
`media.playableUrl` is the MP4 that Facebook serves to logged-out visitors. In our tests it was the standard-definition (`sd`) version. `media.quality` tells you which one each link is.

**Why is `shareCount` always null?**
Facebook's Page video list doesn't include share counts, so the field is always null. It stays in the output so the row shape is stable.

**Why is `description` empty for some videos?**
The video was posted without a caption. `title` usually still has the video's title.

**How long do the download links work?**
Facebook signs the links with an expiry time. Links from our test runs expired about four days after the run. Download the files you need soon after the run, or run the actor again for fresh links.

**Why was a Page skipped?**
The Page doesn't exist, the handle is misspelled, or the Page restricts who can see it and isn't visible to logged-out visitors. The run log names each Page that failed. Failed Pages don't create rows and aren't charged.

**Can I download videos from personal profiles or private groups?**
The actor works for public Pages and public profiles in professional mode that have a Videos tab. It can't read private profiles or groups.

**Can I run it on a schedule or from my app?**
Yes. Use [Apify schedules](https://docs.apify.com/platform/schedules) for recurring runs, call it from the [API tab](https://apify.com/parsebird/facebook-page-video-downloader/api), or connect it to Make, Zapier, Google Sheets, or Slack through [integrations](https://apify.com/integrations).

**Where can I report issues?**
Open the **Issues** tab on the actor page with your input and run ID.

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/facebook-page-video-downloader/changelog.md

# Actor input Schema

## `pageTargets` (type: `array`):

Add 1 to 50 public Facebook Pages, one per line: a Page URL (https://www.facebook.com/WhatsApp), a handle or slug (WhatsApp), a profile ID (100064758844406) or a delegate Page ID (280034132055819). Duplicates are processed once.

## `maxResults` (type: `integer`):

Stop after this many videos in total across all Pages. Leave empty to download every public video from every Page.

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

No proxy is needed for most runs. If Facebook limits requests, the actor switches to Apify Proxy on its own.

## Actor input object example

```json
{
  "pageTargets": [
    "https://www.facebook.com/facebook",
    "https://www.facebook.com/instagram",
    "https://www.facebook.com/Meta",
    "https://www.facebook.com/WhatsApp"
  ],
  "maxResults": 25
}
```

# Actor output Schema

## `results` (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 = {
    "pageTargets": [
        "https://www.facebook.com/facebook",
        "https://www.facebook.com/instagram",
        "https://www.facebook.com/Meta",
        "https://www.facebook.com/WhatsApp"
    ],
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/facebook-page-video-downloader").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 = {
    "pageTargets": [
        "https://www.facebook.com/facebook",
        "https://www.facebook.com/instagram",
        "https://www.facebook.com/Meta",
        "https://www.facebook.com/WhatsApp",
    ],
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/facebook-page-video-downloader").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 '{
  "pageTargets": [
    "https://www.facebook.com/facebook",
    "https://www.facebook.com/instagram",
    "https://www.facebook.com/Meta",
    "https://www.facebook.com/WhatsApp"
  ],
  "maxResults": 25
}' |
apify call parsebird/facebook-page-video-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/facebook-page-video-downloader"
        }
    }
}
```

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/yTrwjSScB2Q80TQ3J/builds/TAGTZAbHQBR3lciZo/openapi.json
