# Facebook Media Downloader (`parsebird/facebook-media-downloader`) Actor

Download Facebook videos, reels and photos from public links. Get HD and SD MP4 links, every DASH quality, audio track, thumbnail, caption, author, publish date, duration, views, plays, comments and reactions. Export JSON, CSV, Excel.

- **URL**: https://apify.com/parsebird/facebook-media-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.79 / 1,000 media items

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 Media Downloader

Facebook Media Downloader turns public [Facebook](https://www.facebook.com) video, reel, photo, and post links into direct download links: HD and SD MP4 files, every other video quality Facebook stores, the separate audio track, full-size photos, plus the caption, author, publish date, duration, and engagement counts.

<table><tr>
<td style="border-left:4px solid #1877F2;padding:12px 16px;font-weight:600">
Paste up to 100 watch, reel, video, photo, post, m.facebook.com, fb.watch, or share links and get one row per media item with HD and SD MP4 links, 240p-1080p DASH streams, audio, views, plays, comments, and reaction counts, plus a per-URL outcome report, with no Facebook login.
</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-media-downloader to get download links for public Facebook videos, reels, and photos. Example with ApifyClient (Python): client.actor("parsebird/facebook-media-downloader").call(run_input={"urls":["https://www.facebook.com/watch?v=1358040539510776","https://www.facebook.com/reel/1195289147628387"],"preferredQuality":"best"}). Inputs: urls array of strings required (1 to 100 public links: facebook.com/watch?v=, /videos/, /reel/, video.php?v=, /photo/?fbid=, photo.php?fbid=, /photos/, /posts/ with a video or photo, permalink.php, story.php, m.facebook.com and web.facebook.com versions, fb.watch short links, and /share/ links; duplicates processed once); preferredQuality string best | hd | sd, default best (picks downloadUrl; falls back to the best available). Output: one dataset row per media item. Fields: inputUrl, facebookId, mediaType (video | reel | photo), sourceUrl, title, caption, authorName, authorUrl, publishedAt (ISO 8601), thumbnailUrl, downloadUrl, quality (HD | SD | original), format (mp4, jpg, png), durationSeconds, downloadAvailable (main link checked), expiresAt, downloadLinks[{url, quality (HD, SD, 240p..1080p, audio, DASH manifest, original), format (mp4, m4a, mpd, jpg), width, height, bitrate, durationSeconds, type (video+audio | video | audio | manifest | image), codec}], engagement {reactionCount, commentCount, shareCount, viewCount, playCount, reactionCounts {like, love, care, haha, wow, sad, angry}}. Every input URL also gets an entry in the key-value store record TARGET-OUTCOMES: {url, stage, success, reason}. Links are signed by Facebook and expire (see expiresAt). 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 Media Downloader?

**Facebook Media Downloader** is a **Facebook video downloader API** for public content. It works with **videos, reels, and photos**, and with **posts** that contain a video or photo. For each link it returns a **direct MP4 download link in HD or SD**, the **full list of qualities** Facebook stores (from 240p to 1080p and the audio track), the **thumbnail**, **caption**, **author**, **publish date**, **duration**, and **views, plays, comments, shares, and reactions** when Facebook shows them.

You don't need a Facebook account, cookies, or an API key. The easiest way to try it is to open the actor, keep the prefilled Meta reel, and click **Start**. One link takes a couple of seconds.

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

### What can Facebook Media Downloader do?

- 🎬 **Download Facebook videos and reels** as MP4 with sound, in HD or SD. Choose the quality with **Preferred quality**.
- 📶 **Get every quality**: the DASH video streams Facebook keeps (for example 240p, 360p, 720p, 1080p, in AV1 or VP9) and the audio track, each with width, height, bitrate, and codec.
- 🖼️ **Save Facebook photos** in the full size Facebook serves to visitors.
- 🔗 **Paste links as you find them**: watch, video, reel, photo, post, `m.facebook.com`, `web.facebook.com`, `fb.watch`, and `/share/` links.
- 📊 **Get engagement**: views, plays, comments, shares, total reactions, and Like/Love/Care/Haha/Wow/Sad/Angry counts.
- 🧾 **See what happened to every link** in the `TARGET-OUTCOMES` report: the stage reached and a short reason for each URL.
- ⏱️ **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 videos and photos?

| Field | Description |
|-------|-------------|
| `downloadUrl`, `quality`, `format` | Main download link for your chosen quality (`HD`, `SD`, or `original` for photos) and its file format |
| `downloadLinks` | Every link found: HD and SD MP4 with sound, video-only DASH streams (`240p` to `1080p`), the `audio` track, a `DASH manifest` (`.mpd`), or the photo, with `width`, `height`, `bitrate`, `codec`, and `type` |
| `downloadAvailable` | Whether `downloadUrl` responded to a download check during the run |
| `expiresAt` | When Facebook's signed link stops working |
| `facebookId`, `mediaType`, `sourceUrl` | Facebook media ID, `video`, `reel`, or `photo`, and the Facebook page for it |
| `title`, `caption` | Title and the post's caption |
| `authorName`, `authorUrl` | Page or profile that posted it |
| `publishedAt`, `durationSeconds`, `thumbnailUrl` | Publish time (ISO 8601), length in seconds, and thumbnail |
| `engagement` | `viewCount`, `playCount`, `commentCount`, `shareCount`, `reactionCount`, and `reactionCounts` by type |

### How to download Facebook videos, reels, and photos

1. Open [Facebook Media Downloader](https://apify.com/parsebird/facebook-media-downloader) and click **Try for free** or **Start**.
2. In **Facebook URLs**, paste one link per line. On Facebook, use **Share → Copy link**, or copy the address from your browser.
3. Pick **Preferred quality**: **Best available**, **HD**, or **SD**.
4. Click **Start**.
5. Open the **Output** tab and click `downloadUrl` to save the file, or export the results as JSON, CSV, or Excel. Open the **Storage → Key-value store** tab and select `TARGET-OUTCOMES` to see the result for every link.

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `urls` | array of strings | **Yes** | — | 1 to 100 public Facebook video, reel, photo, post, mobile, fb.watch, or share links |
| `preferredQuality` | string | No | `best` | `best`, `hd`, or `sd`. Picks `downloadUrl`; if that quality isn't available, the best available one is used |
| `proxyConfiguration` | object | No | — | Optional. The actor picks its own network route and doesn't need a proxy |

### Input / Output

**Example input**

```json
{
    "urls": [
        "https://www.facebook.com/watch?v=1358040539510776"
    ],
    "preferredQuality": "best"
}
```

**Example output** (a real row, with signed link parameters shortened to `?...` and 7 of the 12 download links left out)

```json
{
  "inputUrl": "https://www.facebook.com/watch?v=1358040539510776",
  "facebookId": "1358040539510776",
  "mediaType": "reel",
  "sourceUrl": "https://www.facebook.com/reel/1358040539510776/",
  "title": "@jackedjumper is bringing viewers directly into the game, capturing high-energy beach volleyball matches ... | Meta",
  "caption": "@jackedjumper is bringing viewers directly into the game, capturing high-energy beach volleyball matches ...",
  "authorName": "Meta",
  "authorUrl": "https://www.facebook.com/Meta",
  "publishedAt": "2026-06-15T16:00:27.000Z",
  "thumbnailUrl": "https://scontent-iad3-2.xx.fbcdn.net/v/t15.5256-10/724194478_138536397?...",
  "downloadUrl": "https://video-iad3-2.xx.fbcdn.net/o1/v/t2/f2/m412/AQOoSdp-4c110y3ApLpY?...",
  "quality": "HD",
  "format": "mp4",
  "durationSeconds": 14.166,
  "downloadAvailable": true,
  "expiresAt": "2026-10-05T23:16:06.000Z",
  "downloadLinks": [
    { "url": "https://video-iad3-2.xx.fbcdn.net/o1/v/t2/f2/m412/AQOoSdp-4c110y3ApLpY?...", "quality": "HD", "format": "mp4", "width": 1080, "height": 1920, "bitrate": 4082158, "durationSeconds": 14.166, "type": "video+audio", "codec": null },
    { "url": "https://video-iad6-1.xx.fbcdn.net/o1/v/t2/f2/m412/AQNgSUpuUYXNd64vdzR4?...", "quality": "SD", "format": "mp4", "width": 360, "height": 640, "bitrate": 606709, "durationSeconds": 14.166, "type": "video+audio", "codec": null },
    { "url": "https://video-iad6-1.xx.fbcdn.net/o1/v/t2/f2/m412/AQMme5a8CKLEw7Uxc8Ls?...", "quality": "1080p", "format": "mp4", "width": 1080, "height": 1920, "bitrate": 1846741, "durationSeconds": 14.166, "type": "video", "codec": "av01.0.08M.08.0.111.01.01.01.0" },
    { "url": "https://video-iad3-1.xx.fbcdn.net/o1/v/t2/f2/m412/AQMkVq4VFdzkhOEmwnMC?...", "quality": "audio", "format": "m4a", "width": null, "height": null, "bitrate": 76072, "durationSeconds": 14.166, "type": "audio", "codec": "mp4a.40.5" },
    { "url": "https://api.apify.com/v2/key-value-stores/1KLz4k1PCZ1KS14oI/records/MPD-1358040539510776", "quality": "DASH manifest", "format": "mpd", "width": null, "height": null, "bitrate": null, "durationSeconds": 14.166, "type": "manifest", "codec": null }
  ],
  "engagement": {
    "reactionCount": 4339,
    "commentCount": 843,
    "shareCount": null,
    "viewCount": 191499,
    "playCount": 558335,
    "reactionCounts": { "like": 3816, "love": 409, "care": 62, "haha": 10, "wow": 33, "sad": 1, "angry": 8 }
  }
}
```

**Example `TARGET-OUTCOMES` record**

```json
[
  { "url": "https://www.facebook.com/watch?v=1358040539510776", "stage": "media parsing", "success": true, "reason": "Saved reel 1358040539510776 with 12 links" },
  { "url": "https://www.facebook.com/groups/abc", "stage": "input validation", "success": false, "reason": "Not a Facebook video, reel, photo, post, fb.watch, or share URL" }
]
```

Download results from the **Output** tab in JSON, CSV, Excel, HTML, or XML.

### Python API example

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("parsebird/facebook-media-downloader").call(
    run_input={
        "urls": [
            "https://www.facebook.com/watch?v=1358040539510776",
            "https://www.facebook.com/photo.php?fbid=1144854114870464",
        ],
        "preferredQuality": "hd",
    }
)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["mediaType"], item["quality"], item["downloadUrl"])

outcomes = client.key_value_store(run["defaultKeyValueStoreId"]).get_record("TARGET-OUTCOMES")
for o in outcomes["value"]:
    print(o["success"], o["stage"], o["reason"])
```

### JavaScript API example

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });

const run = await client.actor('parsebird/facebook-media-downloader').call({
    urls: [
        'https://www.facebook.com/watch?v=1358040539510776',
        'https://www.facebook.com/photo.php?fbid=1144854114870464',
    ],
    preferredQuality: 'hd',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => console.log(item.mediaType, item.quality, item.downloadUrl));

const outcomes = await client.keyValueStore(run.defaultKeyValueStoreId).getRecord('TARGET-OUTCOMES');
console.log(outcomes.value);
```

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

- **Social media and brand teams**: save your own videos, reels, and photos in the best quality for reposting and archiving.
- **Researchers and journalists**: archive public videos with their caption, author, date, and engagement before they are removed.
- **Video editors**: grab the 1080p stream and the audio track separately, or use the DASH manifest with a player or ffmpeg.
- **Content analysis**: compare views, plays, comments, and reactions across a list of videos.
- **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 checks each link and works out whether it points at a video, reel, photo, or post. Short and share links are followed to the page they point at.
2. It opens the page the way a logged-out visitor sees it and reads the media and its details.
3. It picks the main link for your quality, checks that it responds, saves one row per media item, and writes the result for every link to `TARGET-OUTCOMES`.

### How much does it cost to download Facebook videos and photos?

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

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

| Event | Free plan | Bronze | Silver | Gold |
|-------|-----------|--------|--------|------|
| `media-extracted` | $0.00439 (**$4.39 / 1,000**) | $0.00419 (**$4.19 / 1,000**) | $0.00399 (**$3.99 / 1,000**) | $0.00379 (**$3.79 / 1,000**) |

One `media-extracted` event is one row in the dataset: a video, reel, or photo. Links that fail are not charged, and the same media pasted twice is saved and charged once. The prefilled one-link run costs about $0.0044 on the Free plan, and 1,000 media items cost $4.39. Apify's free plan includes monthly platform credits you can use to try the actor.

### Is it legal to download Facebook videos and photos?

**Is downloading Facebook videos legal?**

The actor only reads public videos, reels, photos, and posts that Facebook shows to anyone without logging in. Downloading public data is generally legal in many jurisdictions, but media belongs to its creators and is protected by copyright, and posts can contain personal data covered by laws such as GDPR and CCPA. Get permission before reusing someone else's media, 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 |
|-------|----------|
| [Facebook Page Video Downloader](https://apify.com/parsebird/facebook-page-video-downloader) | Every video from whole Facebook Pages |
| [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 |
| [Video & Audio Transcriber](https://apify.com/parsebird/video-audio-transcriber) | Transcribing the videos you download |

### FAQ

**Which links work?**
`facebook.com/watch?v=`, `/watch/?v=`, `video.php?v=`, `/<page>/videos/...`, `/reel/...`, `/photo/?fbid=`, `photo.php?fbid=`, `/<page>/photos/...`, `/<page>/posts/...`, `permalink.php`, and `story.php` links, the same links on `m.facebook.com` and `web.facebook.com`, `fb.watch` short links, and `/share/` links. Group, Page, and profile links are rejected at the input validation stage.

**What's the difference between HD/SD and the other qualities?**
`HD` and `SD` are single MP4 files with sound. The `240p` to `1080p` entries (`type: "video"`) are video-only streams, and the `audio` entry is the matching sound track. Use them with a tool that merges video and audio, such as ffmpeg.

**What is the DASH manifest link?**
Facebook's own manifest URL only works when you're logged in, so the actor saves the manifest from the page in the run's key-value store and links to it (`format: "mpd"`). DASH players and ffmpeg can read it. It points at the same signed links, so it expires with them.

**How long do the download links work?**
Facebook signs every link with an expiry time, shown in `expiresAt`. In our tests links stayed valid for about four days. Download what you need soon after the run, or run the actor again for fresh links.

**Why did a link fail?**
Open `TARGET-OUTCOMES`. Each failed link has the stage it reached (`input validation`, `fetching`, `redirect handling`, `source access classification`, or `media parsing`) and a short reason, for example that Facebook asked for login, said the content isn't available, or the page had no downloadable video. The actor only says content is unavailable when Facebook says so. Failed links aren't charged.

**Why didn't a share link work?**
Share links are resolved by following Facebook's redirect. If Facebook shows a login page instead of redirecting, the link may be private, expired, or mistyped, and the outcome says so.

**Why are some engagement numbers null?**
The actor only fills in counts that Facebook shows on the public page. Photos have no views or plays, and some videos don't show a share count.

**Which time is `publishedAt`?**
It is the time the post was published. If Facebook doesn't show that on the page, it is the video's own publish time.

**Can I download private videos or videos from private groups?**
No. The actor only reads content Facebook shows to logged-out visitors.

**Can I run it on a schedule or from my app?**
Yes. Use [Apify schedules](https://docs.apify.com/platform/schedules), call it from the [API tab](https://apify.com/parsebird/facebook-media-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-media-downloader/changelog.md

# Actor input Schema

## `urls` (type: `array`):

Add 1 to 100 public Facebook links, one per line: videos (facebook.com/watch?v=..., /videos/...), reels (/reel/...), photos (/photo/?fbid=..., /photo.php?fbid=...), posts with a video or photo, m.facebook.com links, fb.watch short links, or /share/ links. Duplicates are processed once.

## `preferredQuality` (type: `string`):

Choose which video link goes into 'downloadUrl'. If that quality isn't available, the best available one is used. Every quality is always listed in 'downloadLinks'.

## `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
{
  "urls": [
    "https://www.facebook.com/watch?v=1358040539510776"
  ],
  "preferredQuality": "best"
}
```

# Actor output Schema

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

No description

## `targetOutcomes` (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 = {
    "urls": [
        "https://www.facebook.com/watch?v=1358040539510776"
    ],
    "preferredQuality": "best"
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/facebook-media-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 = {
    "urls": ["https://www.facebook.com/watch?v=1358040539510776"],
    "preferredQuality": "best",
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/facebook-media-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 '{
  "urls": [
    "https://www.facebook.com/watch?v=1358040539510776"
  ],
  "preferredQuality": "best"
}' |
apify call parsebird/facebook-media-downloader --silent --output-dataset

```

## MCP server setup

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