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

Scrape public Facebook Reels from Pages, profiles or direct Reel URLs. One row per Reel: caption, hashtags, mentions, plays, reactions, comments, shares, creator details, thumbnail, HD/SD video URLs, audio/music metadata and subtitle tracks. No Facebook login or cookies.

- **URL**: https://apify.com/coregent/facebook-reels-scraper.md
- **Developed by:** [Delowar Munna](https://apify.com/coregent) (community)
- **Stats:** 37 total users, 13 monthly users, 98.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 reel results

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 Reels Scraper

![Facebook Reels Scraper](https://raw.githubusercontent.com/coregentdevspace/facebook-reels-scraper-assets/main/thumbnail-facebook-reels-scraper.png)

Scrape public **Facebook Reels** from Pages, profiles or direct Reel URLs. Get one clean row per
Reel with the caption, hashtags and mentions, publish time, duration, plays, reactions, comments and
shares, creator details, thumbnail, direct **HD/SD video URLs**, **audio / music** metadata and
native **subtitle tracks**. Export as JSON, CSV or Excel. **No Facebook login, cookies or session
needed.**

> 💬 **Need the comments on these Reels?** Pass the `reelUrl` values from this Actor's output to
> **[Facebook Comments Scraper](https://apify.com/coregent/facebook-comments-scraper)** — every public
> comment and reply as one row each, also with no login. See [Scrape a Reel's comments](#scrape-a-reels-comments).

***

### What does it scrape?

| You paste | You get |
|---|---|
| A Page or profile — `https://www.facebook.com/natgeo`, its `/reels/` tab, `profile.php?id=…`, or just `natgeo` | Its public Reels, **newest first**, up to your per-source limit |
| A Reel — `/reel/<id>` or `/<page>/videos/<id>` (share links accepted too — see FAQ) | That one Reel |

Mix both in one run. Each input is detected automatically — you never choose a mode.

***

### Quick start

```json
{
  "startUrls": ["https://www.facebook.com/natgeo/reels/"],
  "resultsLimit": 100
}
```

#### One Reel

```json
{
  "startUrls": ["https://www.facebook.com/reel/1468011281530429"]
}
```

#### Several Pages at once

```json
{
  "startUrls": [
    "https://www.facebook.com/natgeo",
    "https://www.facebook.com/bbcnews",
    "9gag",
    "https://www.facebook.com/profile.php?id=4"
  ],
  "resultsLimit": 50
}
```

#### Monitoring — only Reels from the last 30 days

```json
{
  "startUrls": [
    "https://www.facebook.com/NatGeo",
    "https://www.facebook.com/bbcnews"
  ],
  "resultsLimit": 500,
  "reelsNewerThan": "30 days",
  "includeVideoUrls": true,
  "includeAudio": true,
  "includeSubtitles": true
}
```

The Reels tab is newest-first, so the Actor **stops paging** a Page as soon as its Reels are older
than your limit. You don't pay — in time or money — for history you didn't ask for.

***

### Input

| Field | Default | What it does |
|---|---|---|
| `startUrls` | — | Pages, profiles, usernames and/or Reel URLs. Required. |
| `resultsLimit` | `100` | Maximum Reels saved **per Page/profile**. A Reel URL always returns at most one. |
| `reelsNewerThan` | empty | `"24 hours"`, `"7 days"`, `"30 days"`, `"2 weeks"`, or a date like `"2026-09-01"`. Applies to Page/profile inputs; a Reel URL you paste directly is always returned. |
| `includeVideoUrls` | `true` | Direct HD and SD `.mp4` URLs. |
| `includeAudio` | `true` | Soundtrack title, artist, type (library music or the creator's own sound), audio id. |
| `includeSubtitles` | `true` | Native caption tracks (`.srt` URLs with language). |
| `includeUnavailableRows` | `false` | Add an empty, **uncharged** row for each input that returned nothing, with a `status` saying why. |
| `proxyConfiguration` | Apify Proxy | See [Proxy policy](#-proxy-policy). |

#### Supported URL forms

```
https://www.facebook.com/natgeo                    Page (fetched as its Reels tab)
https://www.facebook.com/natgeo/reels/             Reels tab
https://m.facebook.com/natgeo  · web.facebook.com  mobile / web hosts are normalised
https://www.facebook.com/profile.php?id=4          profile by numeric id
https://www.facebook.com/people/Name/1000…/        profile without a username
natgeo  ·  @natgeo                                 bare username
https://www.facebook.com/reel/1468011281530429     a Reel
https://www.facebook.com/share/r/<token>/          a Reel share link (see FAQ)
https://fb.watch/<token>/                          a short video link (see FAQ)
https://www.facebook.com/natgeo/videos/<slug>/<id>/  a Reel's long-form link
```

Rejected, with the reason in the log: non-Facebook URLs, Facebook **groups** (not readable without
logging in), and post or photo URLs (they are not Reels — use
[Facebook Posts Scraper](https://apify.com/coregent/facebook-posts-scraper) for those).

***

### Output

One row per unique Reel. The dataset has three views — **Reels**, **Engagement** and **Media &
audio** — and every field is also in the full JSON.

![Reels table view](https://raw.githubusercontent.com/coregentdevspace/facebook-reels-scraper-assets/main/facebook-reels-scraper-output-reals-table-view.png)

The samples below are one real Reel from a platform run on `https://www.facebook.com/natgeo/reels/`
(long fbcdn URLs shortened with `…`).

#### Reels view

```json
{
  "thumbnailUrl": "https://scontent-ord5-2.xx.fbcdn.net/….jpg?…",
  "reelUrl": "https://www.facebook.com/reel/1630829815361367",
  "creatorName": "National Geographic",
  "publishedAt": "2026-10-01T19:00:51.000Z",
  "caption": "Presented by ROLEX . It's not easy to find water in one of Africa's driest landscapes, but flying saucer beetles have a …",
  "playsCount": 307000,
  "reactionsCount": 2177,
  "commentsCount": 13,
  "sharesCount": 44,
  "durationSeconds": 29.546,
  "hashtags": ["#Rolex", "#PerpetualPlanet", "#AfricaEarthsWildHome"],
  "inputUrl": "https://www.facebook.com/natgeo/reels/",
  "status": "SUCCESS"
}
```

#### Engagement view

```json
{
  "reelUrl": "https://www.facebook.com/reel/1630829815361367",
  "creatorName": "National Geographic",
  "creatorFollowersCount": 51305133,
  "publishedAt": "2026-10-01T19:00:51.000Z",
  "playsCount": 307000,
  "playsCountText": "307K",
  "playsCountIsExact": false,
  "reactionsCount": 2177,
  "commentsCount": 13,
  "sharesCount": 44,
  "sharesCountIsExact": true,
  "durationSeconds": 29.546
}
```

#### Media & audio view

```json
{
  "thumbnailUrl": "https://scontent-ord5-2.xx.fbcdn.net/….jpg?…",
  "reelUrl": "https://www.facebook.com/reel/1630829815361367",
  "videoUrlHd": "https://video-ord5-1.xx.fbcdn.net/….mp4?…",
  "videoUrlSd": "https://video-ord5-1.xx.fbcdn.net/….mp4?…",
  "videoUrlExpiresAt": "2026-10-10T21:12:08.000Z",
  "width": 1080,
  "height": 1920,
  "durationSeconds": 29.546,
  "audioTitle": "Flying Saucer Beetle (From \"Africa Earth's Wild Home\"/Score)",
  "audioArtist": "Pinar Toprak",
  "isOriginalAudio": true,
  "subtitleLanguages": null
}
```

#### Full record

```json
{
  "type": "reel",
  "reelId": "1630829815361367",
  "reelUrl": "https://www.facebook.com/reel/1630829815361367",
  "topLevelUrl": null,
  "postId": "1677964520367638",
  "caption": "Presented by ROLEX . It's not easy to find water in one of Africa's driest landscapes, but flying saucer beetles have a clever way to keep themselves hydrated. …",
  "hashtags": ["#Rolex", "#PerpetualPlanet", "#AfricaEarthsWildHome"],
  "mentions": [
    { "name": "ROLEX", "id": "100064636664044", "url": "https://www.facebook.com/rolex" }
  ],
  "publishedAt": "2026-10-01T19:00:51.000Z",
  "durationSeconds": 29.546,
  "playsCount": 307000,
  "playsCountIsExact": false,
  "playsCountText": "307K",
  "reactionsCount": 2177,
  "commentsCount": 13,
  "sharesCount": 44,
  "sharesCountIsExact": true,
  "width": 1080,
  "height": 1920,
  "thumbnailUrl": "https://scontent-ord5-2.xx.fbcdn.net/….jpg?…",
  "videoUrlHd": "https://video-ord5-1.xx.fbcdn.net/….mp4?…",
  "videoUrlSd": "https://video-ord5-1.xx.fbcdn.net/….mp4?…",
  "videoUrlExpiresAt": "2026-10-10T21:12:08.000Z",
  "audio": {
    "id": "1808718663473945",
    "type": "LIBRARY_MUSIC",
    "title": "Flying Saucer Beetle (From \"Africa Earth's Wild Home\"/Score)",
    "artist": "Pinar Toprak",
    "trackTitle": "Pinar Toprak · Flying Saucer Beetle (From \"Africa Earth's Wild Home\"/Score)",
    "isOriginalAudio": true,
    "albumArtUrl": "https://scontent-ord5-1.xx.fbcdn.net/….jpg?…",
    "url": null
  },
  "subtitles": [],
  "creator": {
    "id": "100044623170418",
    "name": "National Geographic",
    "username": "natgeo",
    "url": "https://www.facebook.com/natgeo",
    "pageId": "23497828950",
    "profilePictureUrl": "https://scontent-ord5-2.xx.fbcdn.net/….jpg?…",
    "verified": true,
    "followersCount": 51305133
  },
  "isReshare": false,
  "creatorId": "100044623170418",
  "creatorName": "National Geographic",
  "creatorUsername": "natgeo",
  "creatorUrl": "https://www.facebook.com/natgeo",
  "creatorFollowersCount": 51305133,
  "creatorVerified": true,
  "audioId": "1808718663473945",
  "audioTitle": "Flying Saucer Beetle (From \"Africa Earth's Wild Home\"/Score)",
  "audioArtist": "Pinar Toprak",
  "audioUrl": null,
  "isOriginalAudio": true,
  "subtitleLanguages": null,
  "inputUrl": "https://www.facebook.com/natgeo/reels/",
  "targetType": "REELS_TAB",
  "scrapedAt": "2026-10-06T10:02:55.904Z",
  "status": "SUCCESS"
}
```

A Reel with native captions lists one entry per track (this one, from the same run, had nine
languages — `subtitleLanguages: "es_LA, id_ID, hi_IN, vi_VN, pt_PT, th_TH, ur_PK, ta_IN, te_IN"`):

```json
{
  "language": "es_LA",
  "languageName": "Español",
  "url": "https://scontent-ord5-1.xx.fbcdn.net/….srt?…",
  "creationMethod": "Traducido automáticamente",
  "isDefault": false
}
```

The flat `creator*`, `audio*` and `subtitleLanguages` columns repeat the nested objects so the
dataset opens cleanly in Excel, Google Sheets, SQL or pandas. Missing values are always `null` (or
`[]` for lists) — never invented, never `0` for "unknown".

***

### FAQ

#### Can I paste a Page or profile URL?

Yes — or just the username. The Actor reads the Page's public **Reels tab**, newest first, and pages
through it until it reaches your `resultsLimit`, your `reelsNewerThan` date, or the end of the tab.

#### Can I paste an individual Reel URL?

Yes. `/reel/<id>` and `/videos/<id>` links are the most reliable form. Share links (`/share/r/…`,
`fb.watch/…`) are accepted too: the Actor follows Facebook's redirect to the Reel it points at. If a
share link comes back as `REEL_NOT_FOUND`, open it in a browser and paste the `/reel/<id>` address it
lands on instead. Each Reel URL returns exactly one Reel. A Reel page on Facebook also shows suggested Reels by other creators —
those are **not** returned or charged.

#### Do I need to log in or provide cookies?

No. The Actor only reads what Facebook shows a logged-out visitor. It never asks for credentials,
cookies, a session or an access token.

#### Are play counts exact?

**No — and this README won't pretend otherwise.** Facebook shows logged-out visitors a rounded play
count ("140K", "1.4M") and publishes no exact figure. You get it three ways: `playsCount` (a number
you can sort and filter: 140000), `playsCountText` (exactly what Facebook showed: "140K") and
`playsCountIsExact` (false whenever the figure is rounded). **Reactions and comments are exact.**
Shares are exact below 1,000 and rounded above (`sharesCountIsExact` tells you which).

#### Are comments, reactions and shares returned?

The **counts** are — on every Reel. For the comment **text**, see
[Scrape a Reel's comments](#scrape-a-reels-comments).

#### Are HD/SD video URLs included? Do they expire?

Yes, both, on every Reel we have seen. They are **temporary signed URLs** — Facebook sets an expiry
(currently about four days), returned as `videoUrlExpiresAt`. Download soon after the run, or re-run
to get fresh URLs. The Actor never downloads or stores video files itself.

#### Is audio / music metadata included?

When Facebook publishes it: the track title and artist (e.g. "Pinar Toprak · Flying Saucer Beetle"),
the audio id, and the audio `type` — `LIBRARY_MUSIC` for a track from Facebook's music library,
`CUSTOM_AUDIO` for sound the creator uploaded (shown as "<creator> · Original audio").
`isOriginalAudio` is Facebook's own flag, passed through as-is; it can be `true` on a library track
too, so use `audio.type` to tell licensed music from a creator's own sound. Many Reels carry no
soundtrack metadata at all — then `audio` is `null`. The Actor never identifies music by listening
to it.

#### Are subtitles included?

When the Reel has native caption tracks, yes — the `.srt` URL for each language, its language code,
and Facebook's own label for how it was made (for example "Auto-generated" or an auto-translation).
No speech-to-text is ever run, so a Reel without captions has `subtitles: []`.

#### Can I limit Reels by date?

Yes, with `reelsNewerThan`. Because the tab is newest-first, the Actor stops early instead of reading
the whole history. A Reel you paste directly is always returned, whatever its date.

#### Can I process many Pages in one run?

Yes. Add as many as you like to `startUrls`; `resultsLimit` applies to each one separately. One
failing input never stops the others, and the log lists the outcome of every input.

#### What happens with private profiles, deleted Reels or Pages with no Reels?

Nothing is charged for them. Each input's outcome is logged and stored in `RUN_SUMMARY.perInput`:
`SUCCESS`, `NO_REELS`, `PROFILE_NOT_FOUND`, `REEL_NOT_FOUND`, `PRIVATE_OR_LOGIN_REQUIRED`,
`RATE_LIMITED`, `BLOCKED`, `PARTIAL_RESULT`, `TEMPORARY_FACEBOOK_ERROR`, `INVALID_URL` or
`UNSUPPORTED_INPUT`. Switch on `includeUnavailableRows` to also get them as empty rows in the dataset.
Anything that was blocked or cut short (rather than missing) is saved as a ready-to-run
`RETRY_INPUT` record.

#### Why did a Page return fewer Reels than I asked for?

Usually because it has fewer Reels, or your date limit stopped it. If Facebook rate-limits the tab's
pagination, you still get every Reel collected up to that point (at least the 10 the tab shows
first), the input is marked `PARTIAL_RESULT`, and it is written to `RETRY_INPUT`.

#### How is pricing calculated?

Pay per result: you pay **once per unique Reel returned with data**. You don't pay for inputs,
profile lookups, retries, pagination, audio or subtitle metadata, duplicates, Reels outside your date
limit, or anything that failed. A Reel found on a Page's tab **and** pasted as a URL is charged once.
See the **Pricing** tab for the current rate — this README deliberately doesn't quote figures, so it
can never disagree with the live price.

Example: 3 Pages × `resultsLimit: 50` returns up to 150 Reels, so you pay for at most 150 results —
fewer if a Page has fewer Reels or your date limit stops it.

#### Can I call it by API or MCP?

Yes — like every Apify Actor, it can be run through the Apify API, the JavaScript/Python clients,
webhooks, schedules and integrations, and from AI agents via Apify's MCP server:

```bash
curl -X POST "https://api.apify.com/v2/acts/coregent~facebook-reels-scraper/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":["https://www.facebook.com/natgeo/reels/"],"resultsLimit":20}'
```

***

### Scrape a Reel's comments

This Actor returns comment **counts**. For the comments themselves, chain it into
[Facebook Comments Scraper](https://apify.com/coregent/facebook-comments-scraper):

```
Facebook Reels Scraper  →  reelUrl  →  Facebook Comments Scraper
```

```json
{
  "startUrls": [
    "https://www.facebook.com/reel/1468011281530429",
    "https://www.facebook.com/reel/1591050269166108"
  ]
}
```

Related Actors: [Facebook Posts Scraper](https://apify.com/coregent/facebook-posts-scraper) for a
Page's ordinary posts, and [Facebook Search Scraper](https://apify.com/coregent/facebook-search-scraper)
to discover Pages to feed into this one.

***

#### 🚦 Proxy policy

Use **Apify Datacenter** proxy (the default) or **no proxy** for normal runs.

**Apify Residential proxy is not supported.** The Actor fails at startup if `apifyProxyGroups`
includes `RESIDENTIAL`. Reel pages are large, and on pay-per-event Actors residential bandwidth is
billed to the developer rather than the run user, so a single bandwidth-heavy run could cost more
than its results earn.

If you genuinely need residential routing, supply your own provider in the proxy editor's **Custom
proxy URLs** field — that traffic goes through your provider, not Apify, and is fully honoured:

```
http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777
```

***

### Limitations

- **Public Reels only.** Private, friends-only, region-restricted and deleted Reels are not
  accessible, and the Actor does not try to get around that.
- **Plays are rounded** by Facebook (see the FAQ). Shares above 1,000 are rounded too.
- **Video URLs expire** after a few days.
- **Follower counts** are filled in for Reels collected from the creator's own Page/profile. A Reel
  pasted on its own carries no follower count unless the same run also reads that creator's Page.
- `topLevelUrl` (the Reel's long `/videos/<slug>/<id>/` link) is returned for Reels pasted as URLs;
  Reels read from a tab have `reelUrl`, which works everywhere.
- `audio.url` is always `null`: Facebook does not publish a public audio-page link.
- Facebook can change its pages at any time. Every run's `RUN_SUMMARY` reports field availability
  rates (video URLs, audio, subtitles) so a change shows up quickly.

***

### Compliance and privacy

This is an unofficial tool and is **not affiliated with, endorsed by or sponsored by Meta or
Facebook**. It processes only content Facebook shows to any logged-out visitor, and does not collect
credentials, harvest cookies, bypass privacy settings or automate any account. Public creator
information can still be personal data: you are responsible for using the results lawfully
(including GDPR and similar laws and Facebook's terms), and you should collect only what you need.

# Actor input Schema

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

Public Facebook Pages, profiles or Reels — mix them freely; each one is detected automatically. A Page/profile (https://www.facebook.com/natgeo, its /reels/ tab, profile.php?id=…, or just the username) returns its public Reels, newest first. A Reel URL (/reel/<id> or a /videos/<id> link — most reliable; /share/r/… and fb.watch/… share links are followed through Facebook's redirect) returns that one Reel. Facebook groups, posts and photos are not Reels and are rejected with a reason.

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

How many Reels to save from EACH Page/profile input, newest first. A direct Reel URL always returns at most one Reel. You pay only for the Reels you receive.

## `reelsNewerThan` (type: `string`):

Only Reels published after this point, e.g. "24 hours", "7 days", "30 days" or a date such as "2026-09-01". The Reels tab is newest-first, so the Actor stops paging a Page/profile as soon as its Reels are older than this — useful for monitoring. Applies to Page/profile inputs; a Reel URL you supply directly is always returned. Leave empty for no date limit.

## `includeVideoUrls` (type: `boolean`):

Return the direct HD and SD .mp4 URLs Facebook serves for each Reel. They are temporary (see videoUrlExpiresAt). Turn off if you only need metadata. Never charged separately.

## `includeAudio` (type: `boolean`):

Return the Reel's soundtrack as Facebook shows it: title, artist, type (library music or the creator's own sound) and the audio id. Never charged separately.

## `includeSubtitles` (type: `boolean`):

Return the native caption tracks (.srt URLs with language) Facebook publishes for a Reel, where it publishes any. No speech-to-text is run. Never charged separately.

## `includeUnavailableRows` (type: `boolean`):

Add one empty row per input that returned nothing (deleted Reel, unknown profile, no Reels, blocked), with a status saying why. These rows are never charged. Off by default so the dataset contains only Reels; the reasons are always in the log and the RUN_SUMMARY record.

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

Apify Proxy (datacenter) is used by default. Apify RESIDENTIAL proxy is not supported and the run fails if it is selected — supply your own residential provider under Custom proxy URLs instead.

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

Log each input's detected target type and every failed request.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/natgeo/reels/"
  ],
  "resultsLimit": 20,
  "reelsNewerThan": "",
  "includeVideoUrls": true,
  "includeAudio": true,
  "includeSubtitles": true,
  "includeUnavailableRows": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "debug": false
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `engagement` (type: `string`):

No description

## `media` (type: `string`):

No description

## `runSummary` (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 = {
    "startUrls": [
        "https://www.facebook.com/natgeo/reels/"
    ],
    "resultsLimit": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("coregent/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/natgeo/reels/"],
    "resultsLimit": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("coregent/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/natgeo/reels/"
  ],
  "resultsLimit": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call coregent/facebook-reels-scraper --silent --output-dataset

```

## MCP server setup

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