# Facebook Reels Scraper (`data_minds/facebook-reels-scraper`) Actor

Facebook Reels Scraper extracts captions, play counts, reactions, hashtags and HD/SD video links — scrape Facebook Reels in bulk for analytics, influencer research, monitoring and short-video content export.

- **URL**: https://apify.com/data_minds/facebook-reels-scraper.md
- **Developed by:** [Data Minds](https://apify.com/data_minds) (community)
- **Features:** Limited permissions
- **Stats:** 52 total users, 43 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.80 / 1,000 results

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

### What is Facebook Reels Scraper?

**Facebook Reels Scraper** works as a Facebook reels extractor for public [Facebook](https://www.facebook.com/) pages, profiles and single reel links. Paste one or more URLs or usernames, click Start, and get captions, play counts, reactions, comments, shares, video links, thumbnails, music and author details in a dataset. No login is needed. Pricing starts at $2.80 per 1,000 reels on the Gold plan, plus platform usage.

Use it for:

- **Facebook reels analytics:** use it as a views and likes scraper to track the view count, reactions, comments and shares of each reel across many pages.
- **Competitor reels analysis:** compare how rival pages perform and which captions and hashtags they use.
- **Short video content research:** study captions, hashtags and music of reels that work, as a Facebook short video scraper would.
- **Hashtag research:** use it as a Facebook reels hashtag scraper to collect the hashtags behind top reels.
- **Influencer research:** collect author names, usernames and verified flags for creators you want to review.
- **Find viral Facebook reels:** set a minimum play count to keep only the reels that took off.
- **Trend monitoring:** schedule Facebook reels scraping with a date window to catch new reels as they appear.
- **Download Facebook reels in bulk:** use it as a Facebook reels video downloader that saves MP4 copies to storage with a link that keeps working.

Because it runs on Apify, you also get API access, scheduling, webhooks, integrations and export to JSON, CSV, Excel, XML and HTML.

#### What can Facebook Reels Scraper do?

- 🔗 **Accept many input types:** page and profile URLs, Reels tab links, numeric profile links, single reel links, share links and bare usernames, with bulk input and automatic de-duplication.
- 📅 **Filter by date:** keep reels newer or older than an absolute date or a relative value such as 3 days.
- 📈 **Filter by popularity and length:** set minimum and maximum play counts and durations.
- 💾 **Save the video files:** optionally store the HD or SD MP4 of each reel with a public link.
- 📦 **Run in bulk:** a bulk scraper for Facebook reels that handles many inputs in one run.
- 🧾 **Collect reel details:** a Facebook reels metadata extractor with captions, counts, music and authors.
- ⚡ **Stream results live:** each reel appears in the dataset as soon as it is ready.
- 📋 **See what happened:** optional per-input summary rows and error rows explain every stop and failure.

***

### What data can Facebook Reels Scraper extract?

Every reel is saved as one dataset row with the fields below.

| Data | Fields | What it holds |
|---|---|---|
| 🎬 Reel identity | `recordType`, `reelId`, `postId`, `storyId`, `feedbackId`, `video`, `attachments`, `tracking` | Row type and the identifiers of the reel |
| 🔗 Links | `reelUrl`, `shareable_url`, `if_should_change_url_for_reels`, `topLevelUrl`, `topLevelReelUrl`, `postUrl`, `permalinkUrl`, `facebookUrl`, `inputUrl`, `pageName` | Links to the reel and the page it came from |
| 📝 Caption | `text`, `message`, `hashtags`, `mentions`, `links` | Caption text, hashtags, mentions and links found in it |
| 📅 Time | `time`, `timestamp`, `scheduledPublishTime`, `scrapedAt` | When the reel was posted and when it was scraped |
| 📈 Engagement | `playCount`, `playCountRounded`, `play_count_reduced`, `reactionCount`, `likeCount`, `commentCount`, `shareCount`, `shareCountReduced` | Plays, reactions, comments and shares |
| 🕒 Video details | `durationSeconds`, `durationMs`, `width`, `height`, `aspectRatio`, `audioAvailability`, `videoLabel`, `dubbedTrackMapping` | Length, size and audio information |
| 🖼 Thumbnails | `thumbnailUrl`, `firstFrameThumbnailUrl` | Preview images |
| 💾 Video files | `videoUrlHd`, `videoUrlSd`, `bestVideoUrl`, `bestVideoQualityLabel`, `dashManifestUrl`, `videoQualities`, `playback_video`, `localVideoPath`, `downloadedVideoUrl` | Video links, quality list and the saved copy when download is on |
| 💬 Captions and languages | `captionsUrl`, `availableCaptionLocales` | Subtitle file link and available languages |
| 🎵 Music | `musicTitle`, `track_title`, `musicIsOriginal`, `is_original_audio_on_facebook`, `soundtrack_info`, `soundtrackId`, `soundtrackType`, `music_album_art_uri` | Track title and audio details |
| 👤 Author | `authorName`, `authorId`, `authorUsername`, `authorUrl`, `authorVerified`, `authorProfilePicUrl`, `authorPageId`, `authorType`, `video_owner`, `video_owner_type`, `subscribeStatus` | Who published the reel |
| 🏷 Flags | `isSponsored`, `isBrandedContent`, `isReshare`, `fb_shorts_reshare_context`, `isRemixable`, `remix_info`, `isAiGenerated`, `aiTransparencyType`, `isMadeWithMetaAi`, `is_passive_content`, `self_view_boost`, `privacy`, `publishStatus` | Sponsored, reshare, remix and AI markers |
| 📦 Collection | `collectionId`, `collectionIdDecoded` | Identifier of the reels list the row came from |
| ✅ Status | `success`, `error` | Whether the row is a normal result and any error text |

With the optional raw data setting, a `raw` field holds the complete reel object.

If you turn on per-page summaries, one extra row per input URL (`recordType` set to `profileSummary`) holds `pageName`, `targetKind`, `reelsFound`, `reelsSaved`, `reelsFilteredOut`, `pagesWalked`, `hasMoreReels`, `stoppedBecause`, `connectionTier`, `durationSeconds`, `success`, `error`, `facebookUrl`, `inputUrl` and `scrapedAt`. Inputs that fail, or return no reels, can add an error row (`recordType` set to `error`) with the same fields as a reel row, `success` set to false and the reason in `error`.

> **Note:** Fields are filled only when the reel shows them publicly. Counts, music, captions, video links and author details can be empty (null) for some reels.

#### What data can't Facebook Reels Scraper extract?

- Comments text, reaction lists and follower lists. Only counts are saved.
- Private, removed or login-only content.
- Posts, photos and events. For page details, use [Facebook Pages Scraper](https://apify.com/data_minds/facebook-pages-scraper).

***

### How to scrape Facebook reels

This Actor is built for an easy start, even if you have never extracted data from the web before.

1. [Create a free Apify account](https://console.apify.com/sign-up) with your email.
2. Open [Facebook Reels Scraper](https://apify.com/data_minds/facebook-reels-scraper).
3. Paste one or more Facebook page, profile or reel URLs into **Facebook URLs**, or add names to **Facebook usernames**.
4. Set **Max reels per page / profile** and, if you want, a date range or play-count filter.
5. Click **Start** and wait for the run to finish.
6. Download your data in JSON, CSV, Excel, XML or HTML from the Output tab.

***

### How much does it cost to scrape Facebook reels?

This Actor uses a **pay-per-event** model. You pay for each reel saved, and the price per reel falls on higher Apify plans. Summary rows and error rows are not charged. Platform usage is billed in addition.

| Apify plan | Price per reel | Price per 1,000 reels |
|---|---|---|
| Free | $0.004 | $4.00 |
| Bronze | $0.0036 | $3.60 |
| Silver | $0.0032 | $3.20 |
| Gold | $0.0028 | $2.80 |

Each run also has a start event of $0.00005 per GB of memory, with a minimum of one. The default memory is 1 GB, so a run starts with one event, which is $0.00005.

**Example:** scraping 1,000 reels on the Gold plan costs $2.80 in result events plus $0.00005 for the start, with platform usage billed in addition. The same 1,000 reels cost $4.00 on the Free plan.

See the [pricing tab](https://apify.com/data_minds/facebook-reels-scraper/pricing) for all events.

#### Is scraping Facebook reels free?

You can start for free. The $5 monthly credit of the Apify Free plan covers about 1,250 reels at the Free price of $0.004 each, before platform usage. A small test run with the default settings is a cheap way to check the output first.

***

### Input

To run this Actor you only need **one Facebook URL or one username**. Set the input in the Actor interface or send it as JSON through the API.

This example collects up to 20 reels from one public page:

```json
{
  "startUrls": ["https://www.facebook.com/LeonardoDiCaprio/"],
  "resultsLimit": 20,
  "language": "en-US",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

See the [input tab](https://apify.com/data_minds/facebook-reels-scraper/input-schema) for the full description of every field.

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `startUrls` | array | One of the two | none | Facebook page, profile, Reels tab, single reel or share links |
| `usernames` | array | One of the two | none | Usernames or numeric profile IDs, one per line |
| `resultsLimit` | integer | No | 20 | Reels per page or profile. 0 means every reel |
| `onlyPostsNewerThan` | string | No | none | Keep reels posted on or after this date |
| `onlyPostsOlderThan` | string | No | none | Keep reels posted on or before this date |
| `minPlayCount` | integer | No | none | Skip reels with fewer plays |
| `maxPlayCount` | integer | No | none | Skip reels with more plays |
| `minDurationSeconds` | number | No | none | Skip shorter reels |
| `maxDurationSeconds` | number | No | none | Skip longer reels |
| `downloadVideos` | boolean | No | false | Save each reel as an MP4 in the key-value store |
| `videoQuality` | string | No | `hd` | `hd` or `sd` for downloads |
| `includeDashManifest` | boolean | No | true | Keep the full playback data in each row |
| `includeRawNode` | boolean | No | false | Add the complete raw reel object as `raw` |
| `includeProfileSummary` | boolean | No | true | Add one summary row per input |
| `includeErrorRows` | boolean | No | true | Add one error row per failed input |
| `language` | string | No | `en-US` | Preferred language for labels |
| `concurrency` | integer | No | 3 | Inputs processed at the same time (1 to 20) |
| `maxProfiles` | integer | No | 0 | Process only the first N inputs. 0 means all |
| `minRequestDelay` | number | No | 0.5 | Minimum pause before each request, in seconds |
| `maxRequestDelay` | number | No | 1.5 | Maximum pause before each request, in seconds |
| `maxRetries` | integer | No | 3 | Retries for one failed request (1 to 10) |
| `requestTimeout` | integer | No | 60 | Seconds to wait for one response |
| `maxPages` | integer | No | 0 | Cap on batches of about 10 reels per input. 0 means no cap |
| `proxyConfiguration` | object | No | `{"useApifyProxy": false}` | Optional connection settings |
| `debug` | boolean | No | false | Log extra detail about retries |

#### Facebook URLs and usernames

You can mix formats in one run. Duplicates are removed.

- ✅ Good: `https://www.facebook.com/LeonardoDiCaprio/`
- ✅ Good: `https://www.facebook.com/reel/31939704905645094`
- ✅ Good: `Cristiano` in `usernames`
- ❌ Bad: a private profile or a group link

> **Warning:** Private or removed pages cannot be read. They return an error row instead of reels.

#### Date filters

Use `YYYY-MM-DD`, an ISO timestamp, or a relative value such as `3 days`, `2 weeks`, `6 months` or `1 year`. Combine both fields to get an exact range.

- ✅ Good: `2025-01-01` or `2 weeks`
- ❌ Bad: `last Tuesday`

> **Warning:** A value the Actor cannot read is ignored, and the run log says so.

#### Max reels per page / profile

The limit applies to each page or profile separately. A single reel link returns one record, unless your date, play-count or duration filters drop it. Start with 10 to 50 to test, then raise it.

***

### Output

Results are stored in a dataset, which you can open in the Output or Storage tab. View them as a table or JSON, pick the fields you need, and download them in JSON, CSV, Excel, XML or HTML. Views are available for Reels, Profile summary and Errors. When a run saves records, a combined file with the same records is also written to the key-value store under the key `OUTPUT`. Downloaded videos are saved there as `reel-<reelId>.mp4`.

#### JSON example

Results for the input example above (shortened to the main fields, with example values):

```json
{
  "recordType": "reel",
  "facebookUrl": "https://www.facebook.com/LeonardoDiCaprio",
  "inputUrl": "https://www.facebook.com/LeonardoDiCaprio/",
  "pageName": "LeonardoDiCaprio",
  "reelId": "1234567890123456",
  "reelUrl": "https://example.com/reel/1234567890123456",
  "text": "Example caption #nature",
  "time": "2026-01-15T10:00:00Z",
  "playCount": 246000,
  "reactionCount": 12000,
  "commentCount": 340,
  "shareCount": 910,
  "durationSeconds": 24.5,
  "width": 720,
  "height": 1280,
  "thumbnailUrl": "https://example.com/thumb.jpg",
  "videoUrlHd": "https://example.com/video-hd.mp4",
  "videoUrlSd": "https://example.com/video-sd.mp4",
  "downloadedVideoUrl": null,
  "hashtags": ["nature"],
  "mentions": [],
  "authorName": "Example Page",
  "authorUsername": "LeonardoDiCaprio",
  "authorVerified": true,
  "musicTitle": "Original audio",
  "isSponsored": false,
  "isReshare": false,
  "scrapedAt": "2026-10-26T12:00:00Z",
  "success": true,
  "error": null
}
```

With summaries on, each input also adds a row like this:

```json
{
  "recordType": "profileSummary",
  "facebookUrl": "https://www.facebook.com/LeonardoDiCaprio",
  "inputUrl": "https://www.facebook.com/LeonardoDiCaprio/",
  "pageName": "LeonardoDiCaprio",
  "targetKind": "profile",
  "reelsFound": 20,
  "reelsSaved": 20,
  "reelsFilteredOut": 0,
  "pagesWalked": 2,
  "hasMoreReels": true,
  "stoppedBecause": "reached resultsLimit (20)",
  "durationSeconds": 8.4,
  "success": true,
  "error": null,
  "scrapedAt": "2026-10-26T12:00:08Z"
}
```

#### Notes and limitations

- Only public content is read. No login is used.
- Facebook's own video links expire after a few hours. Turn on `downloadVideos` to get a saved copy with a lasting link.
- Downloads are slower and use more bandwidth. Raise the Actor memory for big batches.
- The combined `OUTPUT` file is skipped when it would be larger than 40 MB. Export the dataset instead.
- If your spending limit is reached, the run stops and keeps the reels collected so far.

***

### Tips and advanced usage

#### How many reels can you scrape with Facebook Reels Scraper?

The number depends on how many public reels a page has, your `resultsLimit`, your filters and your date range. Set `resultsLimit` to 0 to collect every reel a page shows. The best way to know for your use case is a quick test run.

#### How to get faster or cheaper results

- Use `onlyPostsNewerThan`. The run stops once the feed is older than your date.
- Keep `downloadVideos` off unless you need the files.
- Turn off `includeDashManifest` for smaller rows. Each row is then about 10 to 25 KB leaner.
- Use `maxPages` as a safety cap on very large pages.

#### Known issues

- If many requests fail, raise the delays and the retry count, or review the network setting in the input, then run again.
- Some pages do not show a public Reels tab. Those inputs return an error row.

***

### Integrations and API

#### Can I use Facebook Reels Scraper as an API?

Yes. The [Apify API](https://docs.apify.com/api/v2) lets you start runs, schedule them and fetch results. Use the `apify-client` package for Node.js or Python. See the [API tab](https://apify.com/data_minds/facebook-reels-scraper/api) for ready-made code.

#### How to scrape Facebook reels with Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("data_minds/facebook-reels-scraper").call(run_input={
    "startUrls": ["https://www.facebook.com/LeonardoDiCaprio/"],
    "resultsLimit": 20,
    "language": "en-US",
    "proxyConfiguration": {"useApifyProxy": False},
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### Can I integrate Facebook Reels Scraper with other apps?

Yes. Connect it to Make, Zapier, Google Sheets, Slack and more through Apify integrations. Use [webhooks](https://docs.apify.com/integrations/webhooks) to react when a run finishes, and schedules to repeat runs for trend monitoring.

#### Can I use Facebook Reels Scraper with AI agents (MCP)?

Yes. Open the [MCP tab](https://apify.com/data_minds/facebook-reels-scraper/api/mcp) for setup steps to connect the Actor to Claude and other MCP clients.

***

### Other Facebook scrapers

| Actor | What it does |
|---|---|
| 📣 [Facebook Ads Library Scraper](https://apify.com/data_minds/facebook-ads-library-scraper) | Public ads from the Meta Ad Library by keyword, page or link |
| 📆 [Facebook Event Scraper](https://apify.com/data_minds/facebook-event-scraper) | Public Facebook events: dates, places, attendance and organizers |
| 📄 [Facebook Pages Scraper](https://apify.com/data_minds/facebook-pages-scraper) | Public Facebook Page data in bulk: category, followers, contact details and more |
| 📸 [Instagram Scraper](https://apify.com/data_minds/instagram-scraper) | Public Instagram profiles, posts, reels, comments and hashtags |
| 🔗 [Whop Content Rewards Scraper](https://apify.com/data_minds/whop-content-rewards-scraper) | Every Whop Content Rewards clipping & UGC campaign as clean data — per-platform payout tables, creator counts, budget burn, days-to-depletion... |

***

### FAQ

#### Is it legal to scrape Facebook reels?

Scraping publicly available data is generally legal, but you must respect personal data rules such as GDPR, copyright and Facebook's terms. Collect only what you need and have a legitimate reason. Read [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/) for background. This is not legal advice.

#### How does Facebook Reels Scraper work?

You give it Facebook page, profile or reel links, plus optional filters. It reads each public Reels list the way a visitor would, applies your date and popularity filters, and saves every matching reel to the dataset as it goes. It stops at your limit, at the end of the list, or at your spending limit.

#### Why scrape Facebook reels?

Scraping reels turns scattered public videos into a table you can sort. Teams use it for Facebook reels analytics, competitor research, influencer discovery, hashtag and music trend tracking, and brand monitoring. Scheduled runs keep the data fresh, and exports to CSV or Excel make reporting simple for marketing and research teams.

#### Do I need a Facebook login or API key?

No. Facebook Reels Scraper reads public pages only and uses no login, cookies or API key. This also means private profiles, removed reels and pages that do not show a public Reels tab cannot be scraped. Those inputs return an error row with a plain reason when error rows are enabled.

#### Can I download Facebook reels in bulk?

Yes. Turn on `downloadVideos` and choose HD or SD. Each reel is saved as an MP4 in the run's key-value store, and its public link appears in `downloadedVideoUrl`. Downloads are slower and use more bandwidth, so test with a small `resultsLimit` first and raise the Actor memory for large batches.

#### Why am I getting fewer results than expected?

Check these causes first. Your `resultsLimit`, date range, play-count or duration filters may be removing reels. The page may have few public reels, or a `maxPages` cap may apply. Open the profile summary row: `stoppedBecause`, `reelsFound` and `reelsFilteredOut` show exactly why the run ended.

#### How do I export Facebook reels to CSV or Excel?

When the run finishes, open the Output or Storage tab, choose the export format and select the fields you need. JSON, CSV, Excel, XML and HTML are available. You can also fetch the dataset through the API, or send it straight to Google Sheets with an integration.

#### What if Facebook Reels Scraper is not working?

First run it with the example input to confirm your setup. Then check the run log and the Errors view for the reason. If the problem remains, open a ticket on the [Issues tab](https://apify.com/data_minds/facebook-reels-scraper/issues/open) with your run link, and we will look into it.

***

### Support and feedback

We are always improving this Actor. If you have feedback or found a bug, please create an issue on the [Issues tab](https://apify.com/data_minds/facebook-reels-scraper/issues/open).

Need a custom solution or have questions? Contact hello.dataminds@gmail.com.

Built and maintained by the [data_minds](https://apify.com/data_minds) team on Apify.

Facebook Reels Scraper is an independent tool and is not affiliated with or endorsed by Meta or Facebook. Use it in line with applicable laws and the platform's terms.

# Changelog

This Actor's version history is a separate document: https://apify.com/data_minds/facebook-reels-scraper/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

One or more Facebook links — bulk paste supported. Accepted formats:<br>📄 Page / profile: <code>https://www.facebook.com/LeonardoDiCaprio/</code><br>🎞️ Reels tab: <code>https://www.facebook.com/LeonardoDiCaprio/reels/</code><br>🆔 Numeric profile: <code>https://www.facebook.com/profile.php?id=100044203430980</code> or <code>people/Name/123456789</code><br>🎬 Single reel: <code>https://www.facebook.com/reel/31939704905645094</code> or <code>/videos/\<id></code><br>🔗 Share links: <code>https://www.facebook.com/share/r/…</code>, <code>fb.watch/…</code><br>👤 Bare usernames such as <code>LeonardoDiCaprio</code> work too.<br><strong>At least one URL here or one username below is required.</strong>

## `usernames` (type: `array`):

✨ One username or numeric profile ID per line — bulk paste supported. Each is turned into a full profile URL automatically, e.g. <code>Cristiano</code>, <code>nike</code>, <code>100044203430980</code>. Use this instead of (or together with) the URL list above.

## `resultsLimit` (type: `integer`):

Stop after this many reels for each page or profile. <code>0</code> = every reel the page has. Start low (10–50) to test, then scale up. Single-reel URLs always return exactly one record.

## `onlyPostsNewerThan` (type: `string`):

Only keep reels posted on or after this date. Absolute <code>YYYY-MM-DD</code> / ISO timestamp (<code>2025-09-23T10:02:01</code>, UTC) or relative like <code>3 days</code>, <code>2 weeks</code>, <code>6 months</code>, <code>1 year</code>. Pagination stops automatically once the feed gets older than this, saving time and cost.

## `onlyPostsOlderThan` (type: `string`):

Only keep reels posted on or before this date — combine with the field above to scrape an exact date range. Same formats: <code>YYYY-MM-DD</code>, ISO timestamp, or relative (<code>1 month</code>).

## `minPlayCount` (type: `integer`):

Skip reels with fewer plays than this. Leave empty / <code>0</code> for no minimum. Great for surfacing only viral content.

## `maxPlayCount` (type: `integer`):

Skip reels with more plays than this. Leave empty / <code>0</code> for no maximum.

## `minDurationSeconds` (type: `number`):

Skip reels shorter than this many seconds. Leave empty / <code>0</code> for no minimum.

## `maxDurationSeconds` (type: `number`):

Skip reels longer than this many seconds. Leave empty / <code>0</code> for no maximum.

## `downloadVideos` (type: `boolean`):

When ON, each reel's MP4 (progressive, with audio) is downloaded and saved to this run's key-value store with a public download link in <code>downloadedVideoUrl</code>. Facebook's own video URLs expire after a few hours — this gives you a link that keeps working. ⚠️ Slower and uses more bandwidth; raise the Actor memory for big batches.

## `videoQuality` (type: `string`):

Which progressive MP4 to download when video download is ON. HD falls back to SD when Facebook only offers SD.

## `includeDashManifest` (type: `boolean`):

Keep the complete <code>playback_video</code> block including the DASH manifest XML (every video/audio rendition with direct URLs). Adds ~10–25 KB per reel. Turn OFF for a leaner dataset — the parsed <code>videoQualities</code> list and HD/SD URLs stay either way.

## `includeRawNode` (type: `boolean`):

Attach the complete raw reel object under <code>raw</code> — for power users and debugging, or if a field you need isn't mapped yet.

## `includeProfileSummary` (type: `boolean`):

Emit one bookkeeping record per input URL (<code>recordType: "profileSummary"</code>) with reels found / saved / filtered, batches walked and why scraping stopped — shown in its own <em>Profile summary</em> view of the Output tab. These rows are never charged.

## `includeErrorRows` (type: `boolean`):

Emit one record (<code>recordType: "error"</code>, <code>success: false</code>) for every input URL that could not be scraped, with a plain-English reason — shown in the <em>Errors</em> view. Never charged.

## `language` (type: `string`):

Preferred language for localized labels such as privacy. Default <code>en-US</code>.

## `concurrency` (type: `integer`):

How many pages/profiles are scraped at the same time. 2–5 is a good balance between speed and stable runs.

## `maxProfiles` (type: `integer`):

Cap the merged, de-duplicated worklist to the first N targets. <code>0</code> = process everything you pasted.

## `minRequestDelay` (type: `number`):

A polite randomized pause is taken before every request, between this and the maximum below.

## `maxRequestDelay` (type: `number`):

Upper bound of the randomized pause. Raise both delays if you see a lot of retry / backoff activity in the log.

## `maxRetries` (type: `integer`):

How many times one failed request is retried (with backoff) before giving up on it.

## `requestTimeout` (type: `integer`):

How long to wait for one response. Large reel lists can be slow to load, so keep this generous.

## `maxPages` (type: `integer`):

Safety valve: hard cap on how many batches (≈10 reels each) are loaded per page or profile. <code>0</code> = no cap (until the limit / date range / end of feed).

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

🚦 Optional connection settings. The default works for most runs. Change them only if runs are blocked or return fewer reels than expected.

## `debug` (type: `boolean`):

Log every retry / backoff with details. Handy when reporting an issue.

## `paginationDocId` (type: `string`):

Internal — leave empty.

## `paginationFriendlyName` (type: `string`):

Internal — leave empty.

## `graphqlPageSize` (type: `integer`):

Internal — leave at the default.

## `extraRelayFlags` (type: `object`):

Internal — leave empty.

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

Plain-string alias of startUrls for API callers.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/LeonardoDiCaprio/",
    "https://www.facebook.com/reel/31939704905645094"
  ],
  "usernames": [
    "Cristiano",
    "nike"
  ],
  "resultsLimit": 20,
  "onlyPostsNewerThan": "2025-01-01",
  "onlyPostsOlderThan": "2025-12-31",
  "downloadVideos": false,
  "videoQuality": "hd",
  "includeDashManifest": true,
  "includeRawNode": false,
  "includeProfileSummary": true,
  "includeErrorRows": true,
  "language": "en-US",
  "concurrency": 3,
  "maxProfiles": 0,
  "minRequestDelay": 0.5,
  "maxRequestDelay": 1.5,
  "maxRetries": 3,
  "requestTimeout": 60,
  "maxPages": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "debug": false,
  "graphqlPageSize": 10
}
```

# Actor output Schema

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

Every scraped record together, in scrape order.

## `reels` (type: `string`):

Only reel records — caption, engagement, video & thumbnail links, music, hashtags and author details.

## `profileSummary` (type: `string`):

Per-input bookkeeping: reels found / saved / filtered, batches walked, why scraping stopped.

## `errors` (type: `string`):

Input URLs that could not be scraped, with the reason.

## `outputJson` (type: `string`):

Every record from this run in a single JSON array — the classic output.json shape — saved to the run's key-value store under the 'OUTPUT' key.

## `videos` (type: `string`):

Downloaded reel videos (MP4) saved in the key-value store.

# 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 = {
    "startUrls": [
        "https://www.facebook.com/LeonardoDiCaprio/"
    ],
    "resultsLimit": 20,
    "language": "en-US",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_minds/facebook-reels-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 = {
    "startUrls": ["https://www.facebook.com/LeonardoDiCaprio/"],
    "resultsLimit": 20,
    "language": "en-US",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("data_minds/facebook-reels-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 '{
  "startUrls": [
    "https://www.facebook.com/LeonardoDiCaprio/"
  ],
  "resultsLimit": 20,
  "language": "en-US",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call data_minds/facebook-reels-scraper --silent --output-dataset

```

## MCP server setup

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