# Facebook Video & Reels Downloader (`botverse/facebook-video-reels-downloader`) Actor

Download public Facebook videos, reels and watch links in HD with sound, including share links (facebook.com/share/...) and fb.watch - plus title and duration.

- **URL**: https://apify.com/botverse/facebook-video-reels-downloader.md
- **Developed by:** [BotVerse](https://apify.com/botverse) (community)
- **Categories:** Social media, Videos
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.50 / 1,000 link downloadeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Video & Reels Downloader

Download public Facebook videos, reels and watch links in HD with sound, including share links (facebook.com/share/...) and fb.watch - plus title and duration.

### Why this one

- HD when the post has it, always with sound
- Share links are resolved to the real video
- Facebook blocks ordinary data-center addresses, so this Actor uses residential addresses for you
- **You only pay for links that work.** Private, deleted and invalid links are returned with a clear error code and are not charged.
- Automatic retries with a fresh proxy session when the platform rate-limits.

### How to use it

1. Paste one or more links into **Post links**.
2. Click **Start**.
3. Download the results as JSON, CSV or Excel - or call the Actor from your code through the **API** tab.

#### Links it accepts

- `facebook.com/reel/...`
- `facebook.com/watch/?v=...` and `video.php?v=...`
- `facebook.com/<page>/videos/...`
- `facebook.com/share/r/...` and `fb.watch/...` share links

### Input example

```json
{
  "urls": [
    "https://www.facebook.com/video.php?v=274175099429670"
  ]
}
```

### Output example

One dataset item per link (a real result; long lists and links are shortened here - a real result holds every item
of the post, up to 20, with full links):

```json
{
  "inputUrl": "https://www.facebook.com/video.php?v=274175099429670",
  "success": true,
  "platform": "facebook",
  "id": "274175099429670",
  "title": "119 reactions · 1.4K shares | Asif Nawab Butt on Reels",
  "caption": "",
  "author": "Asif Nawab Butt",
  "duration": 131.03,
  "thumbnail": "https://scontent.flyp16-1.fna.fbcdn.net/v/t15.5256-10/315522185_2237433113103849...",
  "sourceUrl": "https://www.facebook.com/video.php?v=274175099429670",
  "mediaCount": 1,
  "media": [
    {
      "type": "video",
      "url": "https://video.flyp16-1.fna.fbcdn.net/o1/v/t2/f2/m412/AQMWylY3Zt1Cmgzh4Jykvjk_7hT...",
      "width": null,
      "height": null,
      "ext": "mp4",
      "has_audio": true,
      "quality": "sd"
    }
  ],
  "tookMs": 4458,
  "attempts": 1,
  "fetchedAt": "2026-10-07T23:05:31+00:00"
}
```

`media[]` lists every video and photo in post order. Videos come with their sound; `has_audio: false` means the
original post itself is silent. When a platform keeps picture and sound apart, the item has `audio_url` and
`needs_merge: true` - turn on **Save the files** and you get one joined MP4.
Turn on **Save the files** to also get `files[]` - public links to the files in the run's storage. Saved files are kept for your Apify plan's data-retention period (7 days on the free plan): download them, or copy them to a named storage, to keep them longer.

A summary of the run (`links`, `succeeded`, `failed`, `invalid`) is saved as the `OUTPUT` record of the key-value store.

### Use it from your code

Python (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("botverse/facebook-video-reels-downloader").call(run_input={"urls": ["https://www.facebook.com/video.php?v=274175099429670"]})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["success"], [m["url"] for m in item.get("media", [])])
```

JavaScript (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('botverse/facebook-video-reels-downloader').call({ urls: ["https://www.facebook.com/video.php?v=274175099429670"] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

One HTTP call that waits and returns the results:

```bash
curl -X POST "https://api.apify.com/v2/acts/botverse~facebook-video-reels-downloader/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" -d '{"urls": ["https://www.facebook.com/video.php?v=274175099429670"]}'
```

### Use cases

- Save your own posts and campaign videos for your archive or for re-editing
- Add a "save this video" feature to your app or bot without building scrapers
- Collect public media for research, moderation or trend analysis
- Move content between platforms (only where you hold the rights)

### Errors

A link that cannot be downloaded returns `"success": false` and an `error`:

| code | meaning |
|---|---|
| `PRIVATE` | private account, or the post needs a login |
| `NOT_FOUND` | the post was deleted or never existed |
| `NO_MEDIA` | the post has no video or photo |
| `BLOCKED` | the platform blocks this post for the network or country |
| `RATE_LIMITED` | the platform is limiting requests - retried automatically, then reported |
| `TIMEOUT` | the platform answered too slowly |
| `TOO_LARGE` | the file is over 200 MB (links-only mode has no size limit) |
| `COST_LIMIT` / `RUN_TIMEOUT` | the run's maximum cost or time limit was reached before this link - not processed |
| `INVALID_URL` | not a supported post link |

Failed links are **not charged**.

### Pricing

Pay per result: **$3.50 per 1,000 successful links** ($0.0035 each), all-inclusive - no extra compute, proxy or storage charges. Failed links are free.

| Links | You pay |
|---|---|
| 100 | $0.35 |
| 1,000 | $3.50 |
| 10,000 | $35.00 |

### Proxy

The default is Apify's **residential** proxy, used only for the sites that need it (Instagram, TikTok and Facebook block ordinary addresses). Its cost is included in the price - you pay nothing extra. Other sites are fetched directly and use the proxy only as a retry.

### FAQ

**Do I need an account or cookies?** No. Only public posts are supported.

**How fast is it?** Usually 2-6 seconds per link; several links run in parallel (**Links at the same time**).

**Is it legal?** It downloads public content the same way a browser shows it. Use the media in line with the
platform's terms and the creator's copyright.

**Something does not work?** Open an issue on the **Issues** tab with the link - we answer quickly.

# Actor input Schema

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

Public Facebook links, one per line.

## `downloadFiles` (type: `boolean`):

Also download every video/photo into this run's storage and return public links in files\[] (kept for your Apify plan's data-retention period, 7 days on the free plan). Off = direct links from the platform (they expire after a few hours).

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

How many links are processed in parallel.

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

Residential addresses are used for Facebook (they block ordinary addresses). Its cost is included in the price.

## Actor input object example

```json
{
  "urls": [
    "https://www.facebook.com/video.php?v=274175099429670"
  ],
  "downloadFiles": false,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `files` (type: `string`):

No description

## `summary` (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/video.php?v=274175099429670"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("botverse/facebook-video-reels-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/video.php?v=274175099429670"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("botverse/facebook-video-reels-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/video.php?v=274175099429670"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call botverse/facebook-video-reels-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,botverse/facebook-video-reels-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/7tjogrZgqvwDJkFtv/builds/zIx9bkgUQQBp10O8n/openapi.json
