# Facebook Video Scraper (`neuro-scraper/facebook-video-scraper-pro`) Actor

Facebook Video Scraper SD - Facebook Video Scraper is a social media data tool that extracts every video of public Facebook pages from their videos tab with plays, reactions, durations, captions and links, paginated - Facebook page videos extractor.

- **URL**: https://apify.com/neuro-scraper/facebook-video-scraper-pro.md
- **Developed by:** [Neuro Scraper](https://apify.com/neuro-scraper) (community)
- **Categories:** Videos, Social media
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.49 / 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

### Facebook Video Scraper — all videos of any public page

The Facebook Video Scraper exports the videos of public Facebook pages from their videos tab: title, caption, plays, reactions, duration, date and thumbnail, page after page; optionally with HD/SD links and view counts.

It runs on Apify, needs no Facebook login and no cookies, and exports to JSON, CSV, Excel or an API call. Every session key it needs (tokens, query ids, cursors) is read from Facebook on each run, so it keeps working when Facebook ships new code.

#### What the Facebook Video Scraper does

- Reads the page's latest-videos list and follows Facebook's cursor.
- Returns reactions by type for each video.
- Optional second pass adds MP4 links, view count and caption tracks.
- Accepts single video links as well.

#### Who uses the Facebook Video Scraper

- Media monitors tracking a publisher's videos.
- Agencies benchmarking video performance.
- Researchers building video datasets.

### How the Facebook Video Scraper works

Facebook serves public pages, videos and listings to logged-out visitors and embeds the first page of data in the HTML.

The Actor loads that page like a browser, reads the session values (LSD token, revision, query ids) Facebook writes into it, and requests the following pages from Facebook's GraphQL endpoint with the returned cursor.

Query ids that a page does not preload are read from the JavaScript bundles the page lists, and the variable names of each query come from its own module, so the request always matches Facebook's current code.

Nothing is guessed: if Facebook stops publishing a value the Facebook Video Scraper needs, the run log names it and the item is skipped instead of being filled with a stale value.

### Input of the Facebook Video Scraper

| Field | Type | Default | What it does |
|---|---|---|---|
| `startUrls` | array | \["NASA"] | Page usernames (NASA), page URLs (https://www.facebook.com/NASA) or profile.php?id= links. Video links are read directly. |
| `maxItems` | integer | 20 | Newest videos per page (paginated). |
| `includeDownloadUrls` | boolean | False | Opens each video once more for HD/SD links, view count and caption tracks. |
| `maxTotalItems` | integer | 0 | Stops the whole run after this many dataset rows. |
| `proxyConfiguration` | object | {"useApifyProxy": true, "apifyProxyGroups": \["RESIDENTIAL"]} | Facebook limits logged-out visitors per IP address. Residential proxies (the default) give the most reliable results; the Actor switches to a fresh IP when Face |

Example input for the Facebook Video Scraper:

```json
{
  "startUrls": [
    "NASA"
  ],
  "maxItems": 20
}
```

### Output of the Facebook Video Scraper

Each dataset row is one video. These are the fields the Facebook Video Scraper produced in its test runs:

| Field | Meaning |
|---|---|
| `commentsCount` | Comments count |
| `durationSec` | Length in seconds |
| `id` | Platform id of the item |
| `inputUrl` | inputUrl |
| `ownerId` | Owner account id |
| `ownerName` | Page or creator name |
| `playCount` | Video plays |
| `postPlayCount` | postPlayCount |
| `publishedAt` | Publication time (UTC, ISO 8601) |
| `reactions` | Reactions by type |
| `reactionsCount` | All reactions |
| `scrapedAt` | When this row was read |
| `text` | Post or video text |
| `thumbnailUrl` | thumbnailUrl |
| `title` | Title |
| `url` | Public link of the item |
| `captionLocales` | captionLocales |
| `captionsUrl` | captionsUrl |
| `hdUrl` | HD MP4 link (signed, expires) |
| `height` | height |
| `sdUrl` | SD MP4 link (signed, expires) |
| `viewCount` | Video views |
| `width` | width |

Fields that Facebook does not publish for an item are left empty rather than guessed. Download the dataset as JSON, CSV, Excel, XML or HTML, or read it through the Apify API.

#### Example row from a Facebook Video Scraper test run

A real row from the local test run (long values shortened):

```json
{
  "id": "1665351285019129",
  "url": "https://www.facebook.com/NASA/videos/whats-up-for-october-2026/1665351285019129/",
  "title": "What's Up for October 2026",
  "text": "This October, you can look forward to these sights in the night sky:\n- A good look at S...",
  "publishedAt": "2026-10-02T14:11:36.000Z",
  "playCount": 34576,
  "postPlayCount": 4938,
  "durationSec": 162.37,
  "reactionsCount": 570,
  "reactions": {
    "Like": 466,
    "Love": 87,
    "Care": 9,
    "Haha": 4,
    "Wow": 4
  },
  "commentsCount": 26,
  "thumbnailUrl": "https://scontent.fdac5-2.fna.fbcdn.net/v/t15.5256-10/831402639_1080742941480555_4837841...",
  "ownerId": "100044561550831",
  "ownerName": null,
  "scrapedAt": "2026-10-02T18:52:17.000Z",
  "inputUrl": "https://www.facebook.com/NASA",
  "hdUrl": "https://video.fdac5-1.fna.fbcdn.net/o1/v/t2/f2/m366/AQPpeR0gP4nq8obbaWrZPWtxkSEHNXlhz2T...",
  "sdUrl": "https://video.fdac5-2.fna.fbcdn.net/o1/v/t2/f2/m412/AQNwQpD-l8hWp7FJL8eoiVSXzneBzbqpBu9...",
  "viewCount": 4938,
  "captionsUrl": null,
  "captionLocales": null,
  "width": 1920
}
```

#### Data quality of the Facebook Video Scraper

- Every value in a Facebook Video Scraper row is read from Facebook during your run; nothing is filled from a cache or an old snapshot.
- Rows are de-duplicated by id inside a run, so the same video never appears twice in one dataset.
- Counts are numbers you can sort and sum (not "1.2K" text) wherever Facebook publishes the exact number.
- Dates are UTC in ISO 8601 format, which Excel, Google Sheets, Python and SQL all read directly.

### Facebook Video Scraper test results

These numbers come from live test runs of the Facebook Video Scraper on 2026-10-03 (home connection, no proxy). Runs on the Apify platform use residential proxies and can be faster or slower.

| Test | Rows | Time |
|---|---|---|
| page videos paginated (25) | 25 | 16 s |
| with download URLs (3) | 3 | 8 s |

### Facebook Video Scraper limits, stated plainly

- Measured locally: 25 videos of NASA in 16 seconds; with MP4 links 3 videos in 8 seconds.

### How to run the Facebook Video Scraper

1. Open the Facebook Video Scraper in Apify Console and fill in the input fields described above.
2. Keep the default residential proxy unless you have a reason to change it; Facebook limits logged-out visitors per IP address.
3. Start the run, watch the log, and download the dataset when the status says Done.
4. To automate it, call the Facebook Video Scraper from the Apify API, schedule it, or connect it to Make, Zapier, n8n or Google Sheets through an integration or webhook.

Python example with the Apify API client:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
    "startUrls": [
        "NASA"
    ],
    "maxItems": 20
}
run = client.actor("neuro-scraper/facebook-video-scraper-pro").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

### Facebook Video Scraper pricing

The Facebook Video Scraper uses pay-per-event pricing: you pay per dataset row (event "result"), plus the Apify platform usage of your run. Free-plan users get up to 30 rows per run, which is enough to test the Facebook Video Scraper on real data.

Set a maximum cost per run in Apify and the Facebook Video Scraper stops cleanly when it is reached.

#### Tips for large runs of the Facebook Video Scraper

- Start with a small limit to check the Facebook Video Scraper output, then raise it; the first rows arrive within seconds.
- Split very large jobs into several inputs and run them in parallel tasks; each run gets its own proxy sessions.
- Set a maximum cost per run in Apify; the Facebook Video Scraper stops cleanly when the budget is reached and keeps every row it already saved.
- Schedule repeat runs instead of one huge run when you track the same targets over time.
- Keep the residential proxy: datacenter IPs are refused by Facebook far more often for logged-out visitors.

#### Facebook Video Scraper compared with copying by hand

|  | Facebook Video Scraper | Manual work |
|---|---|---|
| Speed | Seconds per page of results | Minutes per item |
| Fields | Every public field, same order every time | Whatever you copy |
| Format | JSON, CSV, Excel, API | Spreadsheet you build yourself |
| Repeatable | Schedule it daily | Start again each time |
| Errors | Logged per item | Unnoticed typos |

### Using the Facebook Video Scraper in a workflow

- Send every new row to Google Sheets or Airtable with the Apify integration and keep a live table.
- Trigger a Make, Zapier or n8n scenario with a webhook when the run finishes.
- Load the JSON export into Python or BigQuery for analysis and dashboards.
- Use the Apify API: start the Facebook Video Scraper with a POST request and read the dataset items endpoint when the run finishes.
- Chain it: pass the Facebook Video Scraper output to another Apify Actor (for example a downloader or a transcript Actor) in an Apify task.
- Export straight to Excel from the dataset tab when you only need a one-off report.

#### Troubleshooting the Facebook Video Scraper

- The run ends with no rows: open the log. The Facebook Video Scraper writes one line per target saying what Facebook returned, for example a login wall or a missing item.
- Fewer rows than expected: the target may have fewer public items, or Facebook may stop serving more pages to logged-out visitors. The log names the reason.
- Slow run: large limits mean many pages; the Facebook Video Scraper waits briefly between pages so Facebook keeps answering. Split big jobs into several runs.
- Proxy errors: keep the RESIDENTIAL group. The Facebook Video Scraper already switches to a fresh IP when one is blocked.
- Free plan stops at 30 rows: that is the free-plan cap of the Facebook Video Scraper; any paid Apify plan removes it.

#### What changed in this version of the Facebook Video Scraper

- Rebuilt in October 2026 on Facebook's logged-out web endpoints; every token, query id and cursor is read at run time.
- Pay-per-event pricing (one event per row) replaces the old monthly rental; free-plan users can test with 30 rows per run.
- Residential proxy by default, with automatic switch to a fresh IP when Facebook blocks one.

#### Is it legal to use the Facebook Video Scraper?

The Facebook Video Scraper reads only data that Facebook shows to any logged-out visitor. It never logs in and never touches private content. Personal data may still be in public posts, so check GDPR and the other laws that apply to you before you store or reuse it, and respect Facebook's terms.

### Related scrapers

| Actor | Link |
|---|---|
| Facebook Posts Scraper | [neuro-scraper/facebook-posts-scarper](https://apify.com/neuro-scraper/facebook-posts-scarper) |
| Facebook Reels Scraper | [neuro-scraper/facebook-reels-scraper](https://apify.com/neuro-scraper/facebook-reels-scraper) |
| Facebook Comments Scraper | [neuro-scraper/facebook-comments-scraper](https://apify.com/neuro-scraper/facebook-comments-scraper) |
| Facebook Video Details Scraper | [neuro-scraper/facebook-video-details-scraper](https://apify.com/neuro-scraper/facebook-video-details-scraper) |
| Facebook Video Downloader | [neuro-scraper/facebook-video-downloader](https://apify.com/neuro-scraper/facebook-video-downloader) |
| Facebook Reels Downloader | [neuro-scraper/facebook-reels-downloader](https://apify.com/neuro-scraper/facebook-reels-downloader) |
| Facebook Transcript Scraper | [neuro-scraper/facebook-transcript-scraper](https://apify.com/neuro-scraper/facebook-transcript-scraper) |
| Facebook Photos Scraper | [neuro-scraper/facebook-photo-posts-scraper](https://apify.com/neuro-scraper/facebook-photo-posts-scraper) |
| Facebook Reels Scraper Advanced | [neuro-scraper/facebook-reels-scraper-advanced](https://apify.com/neuro-scraper/facebook-reels-scraper-advanced) |
| Facebook Ads Library Scraper | [neuro-scraper/facebook-image-photos-downloader](https://apify.com/neuro-scraper/facebook-image-photos-downloader) |
| Facebook Pages Scraper | [neuro-scraper/facebook-reels-downloader-and-facebook-video-downloader](https://apify.com/neuro-scraper/facebook-reels-downloader-and-facebook-video-downloader) |
| Facebook Marketplace Scraper | [neuro-scraper/facebook-video-posts-scraper](https://apify.com/neuro-scraper/facebook-video-posts-scraper) |

### Leave a review

If the Facebook Video Scraper saved you time, please leave a star rating and a short review on its Apify page. Reviews help other users find the Facebook Video Scraper and tell us what to improve next.

### Frequently asked questions

#### How does the Facebook Video Scraper get the download links?

With "Include MP4 links + views" on, the Facebook Video Scraper opens each video once more and reads its HD/SD links.

#### Does the Facebook Video Scraper need my Facebook login?

No. The Facebook Video Scraper works logged out and never asks for your password or cookies. It reads only what Facebook shows to any visitor.

#### Do I need my own proxy for the Facebook Video Scraper?

No. The Facebook Video Scraper uses Apify residential proxies by default and switches to a fresh IP when Facebook blocks one. You can choose another proxy in the input.

#### What formats can I export from the Facebook Video Scraper?

JSON, CSV, Excel, XML, HTML and RSS from the dataset tab, or any format through the Apify API, webhooks and integrations.

#### How fast is the Facebook Video Scraper?

In the test runs above the Facebook Video Scraper took between 8 and 16 seconds per run. Speed depends on how many items you ask for and on the proxy.

#### Why did the Facebook Video Scraper return fewer rows than I asked for?

The Facebook Video Scraper stops when Facebook has nothing more to show logged out, when your limit is reached, or when the free-plan cap of 30 rows applies. The run log always says which one happened.

#### Can I schedule the Facebook Video Scraper?

Yes. Create a schedule in Apify Console to run the Facebook Video Scraper daily or hourly and send the results to Google Sheets, Make, Zapier or n8n through an integration.

#### Can the Facebook Video Scraper read private accounts or private groups?

No. The Facebook Video Scraper reads public data only. Private content needs a login, and the Facebook Video Scraper never logs in.

#### What happens when Facebook changes its website?

The Facebook Video Scraper reads every key it needs from Facebook at run time, so routine changes are picked up automatically. If something can no longer be read, the log says so instead of returning wrong data.

#### Can I use the Facebook Video Scraper with Make, Zapier or n8n?

Yes. Add the Facebook Video Scraper as an Apify step in Make, Zapier or n8n, or send a webhook when the run finishes and fetch the dataset items from the Apify API.

#### Does the Facebook Video Scraper work in every country?

The Facebook Video Scraper reads Facebook through residential proxies that rotate across countries. Content that Facebook restricts by country follows those rules.

#### How do I collect only new items with the Facebook Video Scraper?

Schedule the Facebook Video Scraper and keep the item ids from earlier runs. Every row has a stable id, so a simple de-duplication against your previous export keeps only the new ones.

#### Can the Facebook Video Scraper process many targets in one run?

Yes. Put as many targets as you like in the input; the Facebook Video Scraper handles them one after another and a failing target never stops the others.

# Actor input Schema

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

Page usernames (NASA), page URLs (https://www.facebook.com/NASA) or profile.php?id= links. Video links are read directly.

## `maxItems` (type: `integer`):

Newest videos per page (paginated).

## `includeDownloadUrls` (type: `boolean`):

Opens each video once more for HD/SD links, view count and caption tracks.

## `maxTotalItems` (type: `integer`):

Stops the whole run after this many dataset rows.

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

Facebook limits logged-out visitors per IP address. Residential proxies (the default) give the most reliable results; the Actor switches to a fresh IP when Facebook blocks one.

## Actor input object example

```json
{
  "startUrls": [
    "NASA"
  ],
  "maxItems": 20,
  "includeDownloadUrls": false,
  "maxTotalItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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": [
        "NASA"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/facebook-video-scraper-pro").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": ["NASA"],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/facebook-video-scraper-pro").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": [
    "NASA"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call neuro-scraper/facebook-video-scraper-pro --silent --output-dataset

```

## MCP server setup

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

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/bMGVf9PWb93LeNPtZ/builds/zpXQwDcKmlg5fj0VK/openapi.json
