# Facebook Reels Scraper - Bulk Reels & Metadata \[NO COOKIES] ✅ (`unseenuser/fb-reels`) Actor

Pull every public Reel from a Facebook page or profile: direct HD MP4 URLs, view counts, play time, thumbnails, audio track info and author details. No login, no cookies. 10 reels per request. Built for trend tracking, content research and bulk reel downloads.

- **URL**: https://apify.com/unseenuser/fb-reels.md
- **Developed by:** [Unseen User](https://apify.com/unseenuser) (community)
- **Categories:** Automation, Lead generation, Social media
- **Stats:** 4 total users, 3 monthly users, 100.0% runs succeeded, 3 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$4.50 / 1,000 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Facebook Reels Scraper (No Login)

**Scrape and download public Facebook Reels in one pass. `video_url` is a direct, playable MP4 link.**

Point this Actor at any public Facebook page or profile URL and get every Reel as structured data: direct HD video URLs, view count and play time, thumbnails, audio and music track info, and full author details (including verified status). No login. No cookies. No browser automation. Export as JSON, CSV, Excel, RSS, or pull via the Apify API.

This Actor returns 30+ fields per reel, not just metadata. View count **and** play time, audio track title, verified-author flag, the feedback id you need to fetch comments, the direct MP4 link, the thumbnail - everything that matters for short-form video analysis, in one structured row per reel.

> **`video_url` is time-limited.** Video links are signed Facebook CDN URLs and expire within hours. Download the bytes during the run, do not save the URL for later.

Target use cases: `facebook reels scraper`, `facebook reel downloader`, `scrape facebook reels`, `facebook video url`, `facebook reels api`, `facebook reel metadata`, `bulk facebook reels`, `facebook reel play count`, `facebook mp4 download`, `facebook reel audio scraper`, `facebook video extractor`.

---

### Table of contents

- [Free plan limit](#free-plan-limit)
- [Why this Actor](#why-this-actor)
- [Features](#features)
- [What this Actor does not do](#what-this-actor-does-not-do)
- [Quick start](#quick-start)
- [Inputs](#inputs)
- [Output - field reference](#output---field-reference)
- [Output - dataset views](#output---dataset-views)
- [Output - sample row](#output---sample-row)
- [Add-ons (billed per reel)](#add-ons-billed-per-reel)
- [Performance and expected runtime](#performance-and-expected-runtime)
- [Cost optimization tips](#cost-optimization-tips)
- [Use cases](#use-cases)
- [Integration examples](#integration-examples)
- [Scheduling and automation](#scheduling-and-automation)
- [Common errors and fixes](#common-errors-and-fixes)
- [FAQ](#faq)
- [Compliance and legal](#compliance-and-legal)
- [Build a Facebook video pipeline](#build-a-facebook-video-pipeline)
- [Related scrapers](#related-scrapers)
- [Support](#support)
- [Changelog](#changelog)
- [Complete Specification](#complete-specification) (Quick Reference, build spec, API reference, Terms of Service, Addendum, Implementation and Pre-Publish checklists)

---

### Free plan limit

Free Apify users get up to **50 results per run**. Paying users are not affected and receive results normally.

This limit was set by the Actor developer, not by Apify. To remove it and receive unlimited results, upgrade to any paid Apify plan: https://apify.com/pricing

When a free plan run hits the cap, the Actor finishes successfully (status `SUCCEEDED`) and the run's status message explains what happened. No error is raised, so the first 50 results are fully usable as normal.

---

### Why this Actor

- **Direct MP4 download.** `video_url` is a real, playable Facebook CDN link. Pipe it straight into ffmpeg, yt-dlp, a downloader, or a re-encoder. No second scrape required to find the video bytes.
- **Field depth.** View count **and** play time, audio track title, verified-author flag, thumbnail, feedback id, creation time, description, post and video ids - data the other Apify Reels scrapers leave on the table.
- **Batch economics.** 10 reels per request. Faster and cheaper paging than the 3-per-call post scrapers.
- **One-pass enrichment.** Optionally add likes, shares, HD/SD URLs, captions, and a transcript in the same run. No second Actor required.
- **No login, no cookies, no proxies to manage.** Fully public-data extraction. Nothing to configure beyond the input URL.
- **Resilient.** Per-source error isolation: one bad URL never kills the whole run. Failed rows are written to the dataset with an `error` field instead of crashing.
- **Dataset views out of the box.** Reels overview, Deep enrich, Transcripts, and Errors tabs in the Apify Console, each with the right columns and labels.
- **Live progress.** A built-in HTTP server exposes `/status` and `/healthz` while the Actor runs, viewable from the Apify Console Live view tab.

---

### Features

- Scrape every public Reel from any Facebook page or profile URL
- Multiple input URLs per run, processed sequentially with per-source error isolation
- 10 reels per upstream request, paginated automatically to the depth you specify
- Direct HD MP4 `video_url` on every reel
- Audio and music track metadata (`id`, `track_title`)
- Author details including verified status
- Thumbnail URLs
- View count and play time in milliseconds
- Feedback id - the fast-path input to the Facebook Comments Scraper
- Optional per-reel deep enrich: like count, comment count, share count, SD/HD URLs, video length, captions URL
- Optional per-reel transcript for reels under 2 minutes (longer reels are flagged and not billed)
- Streamed dataset output: rows appear in the Apify Console as they are produced
- 3 retries with exponential backoff on transient upstream errors (429, 502, 503, 504)
- Run summary and per-source reports written to the key-value store
- Live-view HTTP server with JSON status snapshot
- Free-plan cap of 50 results enforced cleanly (status SUCCEEDED, no error thrown)

---

### What this Actor does not do

Setting expectations up front:

- **It does not search Reels by keyword or hashtag.** It extracts reels from known page or profile URLs. Facebook does not expose a public video-search endpoint that this Actor can wrap.
- **It does not scrape comments.** Use the [Facebook Comments Scraper](https://apify.com/unseenuser/facebook-comments-scraper) and feed it the `feedback_id` from each reel for the fast path.
- **It does not download the video file itself.** It returns the direct MP4 URL. Pipe it into your downloader of choice (ffmpeg, yt-dlp, curl, wget, a Node/Python script). The URL is time-limited - download promptly.
- **It does not bypass private content.** Only public Reels on public pages or profiles. If the page is private or the Reel is gated, it will not appear in the output.
- **It does not log into Facebook.** No credentials, no cookies, no session.
- **It does not transcribe long videos.** The transcript add-on is hard-limited to reels under 2 minutes. Longer reels are flagged with `transcript_skipped_reason` and not billed.
- **It does not handle Stories, Live, photo posts, or Marketplace.** This Actor is Reels-only. Other Actors in the UnseenUser Facebook suite cover those.

---

### Quick start

1. Click **Try for free** on this Actor's page.
2. Paste one or more Facebook page or profile URLs into **Start URLs**. Example: `https://www.facebook.com/copperkettleyqr`
3. (Optional) Adjust **Max reels per source** (default 30, minimum 10).
4. (Optional) Toggle **Deep enrich** and/or **Fetch transcript**. Each is billed per reel - leave off if you do not need the extra fields.
5. Click **Run**.
6. Watch results stream in the **Output** tab. Switch between **Reels overview**, **Deep enrich**, **Transcripts**, and **Errors** views.
7. Export results as JSON, CSV, Excel, RSS, or pull them via the [Apify API](https://docs.apify.com/api/v2#/reference/datasets).

---

### Inputs

| Input | Type | Required | Default | Min | Description |
|---|---|---|---|---|---|
| `startUrls` | array of strings | yes | - | 1 item | One or more public Facebook page or profile URLs. Each URL is processed independently. |
| `maxReels` | integer | no | `30` | `10` | Stop after this many reels per source. Each upstream request returns 10, so values are effectively rounded up to the next multiple of 10. |
| `enrichReelDetails` | boolean | no | `false` | - | Adds likes, comments, shares, HD/SD URLs, captions to every reel. **Billed per reel.** |
| `fetchTranscript` | boolean | no | `false` | - | Adds caption text per reel for reels under 2 minutes. Longer reels are flagged and **not billed**. |

#### Input example - minimal

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

#### Input example - multi-source with add-ons

```json
{
  "startUrls": [
    "https://www.facebook.com/copperkettleyqr",
    "https://www.facebook.com/MrBeast",
    "https://www.facebook.com/nike"
  ],
  "maxReels": 100,
  "enrichReelDetails": true,
  "fetchTranscript": true
}
```

#### Accepted URL formats

The Actor accepts standard public Facebook page and profile URLs:

- `https://www.facebook.com/<page-username>`
- `https://www.facebook.com/<page-id>`
- `https://www.facebook.com/profile.php?id=<numeric-id>`
- URLs with locale prefixes (e.g. `https://www.facebook.com/en/...`)
- URLs with tracking parameters (stripped automatically by the upstream)

***

### Output - field reference

Every dataset row has this shape:

#### `reel` (always present, except on source-level errors where it is `null`)

| Field | Type | Description |
|---|---|---|
| `reel.source` | string | The source URL that produced this reel. |
| `reel.id` | string | Internal Facebook id. |
| `reel.post_id` | string | The post id this reel belongs to. |
| `reel.video_id` | string | The video id (also appears in `reel.url`). |
| `reel.url` | string | Canonical reel URL (`facebook.com/reel/<video_id>`). |
| `reel.creation_time` | string (ISO 8601) | When the reel was posted. |
| `reel.description` | string | Reel caption, including hashtags and mentions. |
| `reel.view_count` | integer | View count at fetch time. May be missing if Facebook hides it. |
| `reel.play_time_in_ms` | integer | Reel length in milliseconds. |
| `reel.feedback_id` | string | Base64-encoded id. Use this as the fast-path input to the Comments Scraper. |
| `reel.thumbnail` | string | Direct CDN URL to a thumbnail image (time-limited). |
| `reel.video_url` | string | **Direct MP4 video URL.** Time-limited - download promptly. |
| `reel.music.id` | string | Audio track id. |
| `reel.music.track_title` | string | Audio track title (often "Original audio" for creator-recorded sound). |
| `reel.author.id` | string | Author Facebook id. |
| `reel.author.name` | string | Author display name. |
| `reel.author.is_verified` | boolean | Whether the author has a verified badge. |
| `reel.author.url` | string | Author Facebook URL. |
| `reel.author.image` | string | Author profile picture URL (time-limited). |

#### `enrich` (only when `enrichReelDetails=true`)

| Field | Type | Description |
|---|---|---|
| `enrich.like_count` | integer | Total likes / reactions. |
| `enrich.comment_count` | integer | Total comments. |
| `enrich.share_count` | integer | Total shares. |
| `enrich.video.sd_url` | string | SD MP4 URL (time-limited). |
| `enrich.video.hd_url` | string | HD MP4 URL (time-limited). |
| `enrich.video.length_in_second` | number | Reel length in seconds. |
| `enrich.video.captions_url` | string | URL to the captions track, if any. |

#### `transcript` (only when `fetchTranscript=true` and reel is under 2 minutes)

| Field | Type | Description |
|---|---|---|
| `transcript` | string | Plain text transcript of the reel's audio. |
| `transcript_skipped_reason` | string | Present instead of `transcript` when the reel is too long or no transcript is available. Not billed. |
| `transcript_error` | string | Present if the transcript request itself failed. |

#### `_metadata` (always present)

| Field | Type | Description |
|---|---|---|
| `_metadata.fetched_at` | string (ISO 8601) | Server timestamp when the row was produced. |
| `_metadata.source_url` | string | The input URL this row belongs to. |
| `_metadata.page` | integer | Approximate pagination page (10 reels per page). |
| `_metadata.enrich_fetched` | boolean | Whether enrich data is attached to this row. |
| `_metadata.transcript_fetched` | boolean | Whether a non-empty transcript is attached. |

#### Error rows

If a source fails (invalid URL, upstream outage, etc.), a single row is written with `reel: null`, an `error` field describing the failure, and a `_metadata` block. The run still finishes with status `SUCCEEDED` so the rest of the dataset is usable.

***

### Output - dataset views

The Apify Console renders the dataset in four named tabs:

| View | What you see |
|---|---|
| **Reels overview** | Post id, video id, URL, created date, description, views, play time, thumbnail, direct MP4 URL, author, audio track, source URL. The day-to-day default. |
| **Deep enrich** | Post id, URL, like / comment / share counts, SD/HD URLs, length, captions URL. Only populated when `enrichReelDetails=true`. |
| **Transcripts** | Post id, URL, transcript text, skip reason if any. Only populated when `fetchTranscript=true`. |
| **Errors** | Source URL, page, error message, and (when relevant) post id / URL. Empty on healthy runs. |

You can also switch any view to the JSON renderer, or to the **All fields** view to see the full row.

***

### Output - sample row

```json
{
  "reel": {
    "source": "https://www.facebook.com/copperkettleyqr",
    "id": "UzpfSTEwMDA2NDAyNzI0Mjg0OTpWSzoxMTE0MjM1OTIwNjY0NDA4",
    "post_id": "1203161005161463",
    "video_id": "1114235920664408",
    "url": "https://www.facebook.com/reel/1114235920664408",
    "creation_time": "2025-09-13T20:51:28.000Z",
    "description": "#globetheatreregina #GrandOpeningGlobeTheatre #yqrfood",
    "view_count": 900,
    "play_time_in_ms": 22035,
    "feedback_id": "ZmVlZGJhY2s6MTIwMzE2MTAwNTE2MTQ2Mw==",
    "thumbnail": "https://scontent-...jpg",
    "video_url": "https://video-...mp4",
    "music": {
      "id": "1491450028648565",
      "track_title": "The Copper Kettle Restaurant Original audio"
    },
    "author": {
      "id": "100064027242849",
      "name": "The Copper Kettle Restaurant",
      "is_verified": false,
      "url": "https://www.facebook.com/copperkettleyqr",
      "image": "https://scontent-...jpg"
    }
  },
  "enrich": {
    "like_count": 12,
    "comment_count": 3,
    "share_count": 2,
    "video": {
      "sd_url": "https://video-...sd.mp4",
      "hd_url": "https://video-...hd.mp4",
      "length_in_second": 22,
      "captions_url": "https://scontent-...vtt"
    }
  },
  "transcript": "Welcome to the grand opening of the Globe Theatre Regina...",
  "_metadata": {
    "fetched_at": "2026-05-25T12:34:56.789Z",
    "source_url": "https://www.facebook.com/copperkettleyqr",
    "page": 2,
    "enrich_fetched": true,
    "transcript_fetched": true
  }
}
```

`enrich` only appears when `enrichReelDetails=true`. `transcript` only appears when `fetchTranscript=true` and the reel is under 2 minutes; longer reels are flagged with `transcript_skipped_reason` instead and not billed.

***

### Add-ons (billed per reel)

| Add-on | Toggle | What it adds | Billing |
|---|---|---|---|
| Deep enrich | `enrichReelDetails=true` | Likes, comments, shares, HD/SD URLs, video length, captions URL. | One extra unit per reel. |
| Transcript | `fetchTranscript=true` | Plain-text transcript for reels under 2 minutes. | One extra unit per **successful** transcript. Long reels are skipped and not billed. Empty results are not billed. |

> On a 300-reel run, each add-on adds up to 300 extra units. Leave them off unless you need the fields. The Actor logs a prominent cost warning at the start of any run with an add-on enabled.

***

### Performance and expected runtime

Rough guidance for a single source URL:

| Reels requested | Pagination calls | Typical runtime (no add-ons) | With both add-ons |
|---|---|---|---|
| 10 | 1 | ~3 s | ~8 s |
| 30 (default) | 3 | ~6 s | ~25 s |
| 100 | 10 | ~15 s | ~80 s |
| 500 | 50 | ~70 s | ~400 s |

Multiple input URLs are processed sequentially, so total runtime scales roughly linearly with the number of sources. Add-on calls run with limited concurrency (3 parallel per source batch) to balance speed and politeness.

Runtime varies with upstream latency, profile depth (some pages return fewer reels per page), and add-on hit rate.

***

### Cost optimization tips

- **Start without add-ons.** `enrichReelDetails` and `fetchTranscript` each add one call per reel. If you only need metadata + the direct video URL, leave them off.
- **Cap `maxReels` to what you actually need.** Every batch of 10 costs one unit. Pulling 500 when you only analyze the first 50 is wasted budget.
- **Use the `feedback_id` from this Actor as input to the Comments Scraper.** It is the fast path - skips the comments scraper's own resolution step.
- **For a deep but cheap pull on a single creator:** keep add-ons off, set `maxReels` high, and run once. You can always re-enrich a specific reel later with the per-post scraper.
- **For trend dashboards:** schedule a low-frequency run (daily / weekly) with `maxReels: 30`, then diff against your prior dataset to catch new reels only.
- **Free plan:** the 50-result cap puts a hard ceiling on per-run cost while you evaluate the Actor.

***

### Use cases

- **Trend and competitor tracking** - monitor a page's reel cadence, views, and play time over time
- **Content research** - study what short-form content performs for a given creator or brand
- **Creator and influencer analysis** - reel metadata, posting frequency, verified-author status
- **Short-form video datasets** - build structured datasets for ML, BI, or research workloads
- **Bulk download workflows** - feed the direct MP4 `video_url` into a downloader pipeline (subject to licensing)
- **Audio and trend research** - capture the music or audio track attached to each reel
- **Comment-pipeline seeding** - use `feedback_id` to feed the Comments Scraper without re-resolving each reel
- **Brand monitoring** - track reels mentioning your brand, products, or hashtags on a known page
- **Hashtag performance on a known page** - filter `reel.description` for `#tag` after the run
- **Content compliance review** - pull every reel from a brand page for legal or moderation review
- **Localization research** - identify which reels gain traction in specific markets via author profile data

***

### Integration examples

#### Pull the latest run's dataset via the Apify API

```bash
curl -s "https://api.apify.com/v2/datasets/<DATASET_ID>/items?clean=true&format=json" \
  -H "Authorization: Bearer <APIFY_TOKEN>"
```

#### Start a run programmatically (JavaScript)

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });

const run = await client.actor('unseenuser/facebook-reels-scraper').call({
    startUrls: ['https://www.facebook.com/copperkettleyqr'],
    maxReels: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} reels.`);
```

#### Start a run programmatically (Python)

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ["APIFY_TOKEN"])

run = client.actor("unseenuser/facebook-reels-scraper").call(run_input={
    "startUrls": ["https://www.facebook.com/copperkettleyqr"],
    "maxReels": 100,
})

items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(f"Got {len(items)} reels.")
```

#### Download every reel's MP4 via shell

```bash
## After the run, fetch the dataset as JSON and pipe each video_url through curl.
curl -s "https://api.apify.com/v2/datasets/<DATASET_ID>/items?clean=true&format=json" \
  -H "Authorization: Bearer <APIFY_TOKEN>" \
  | jq -r '.[] | select(.reel.video_url) | "\(.reel.video_id)\t\(.reel.video_url)"' \
  | while IFS=$'\t' read -r id url; do
      curl -L -o "${id}.mp4" "$url"
    done
```

> Remember the `video_url` is time-limited. Run this loop immediately after the Apify run finishes.

#### Webhook on run completion

In the Apify Console, open the Actor's **Integrations** tab and add a webhook to fire on `ACTOR.RUN.SUCCEEDED`. The webhook delivers the dataset id to your endpoint; pull items via the API call shown above.

***

### Scheduling and automation

The Actor pairs cleanly with Apify's built-in Scheduler:

1. Open the Actor's page on Apify.
2. Click **Create new task**, save your input.
3. Open the **Schedules** tab on your Apify account.
4. Create a schedule that runs the task on a cron expression (`0 6 * * *` for daily 6am UTC, for example).

Common cadences:

- **Daily news / brand monitoring:** `0 6 * * *`, `maxReels: 30`
- **Weekly competitor digest:** `0 9 * * 1`, `maxReels: 100`
- **Monthly archive snapshot:** `0 0 1 * *`, `maxReels: 1000`

Pipe the resulting dataset id into your downstream system via webhook or via a polling job that queries Apify's API.

***

### Common errors and fixes

| Symptom | Likely cause | Fix |
|---|---|---|
| `Input "startUrls" is required` | You left the input empty. | Add at least one Facebook page or profile URL. |
| Source row with `error: "Schema validation failed"` | An upstream field shape did not match the dataset schema. | Already fixed in current version - update to the latest build. |
| Run succeeded but only 50 results | You are on the free Apify plan. | Upgrade your Apify plan to lift the per-run cap. |
| `video_url` returns 403 or expired | The CDN signature expired. | Re-run the Actor; download immediately during the next run. |
| Empty output for a known-active page | The page may have been renamed, deleted, set to private, or geo-restricted. | Confirm the URL loads publicly in an incognito browser. |
| Long reel returned with `transcript_skipped_reason` | Reel is 2 minutes or longer. | The transcript add-on only supports short reels; this is by design and not billed. |
| Run hits the 5-minute Apify free-plan timeout | Large `maxReels` value on a slow profile. | Lower `maxReels`, or run several smaller jobs. |
| One source URL fails, others succeed | Per-source error isolation working as designed. | Inspect the **Errors** view for the failing URL and fix or remove it. |

***

### FAQ

**How many reels per run?**
As many as the profile has, up to your `maxReels` setting. Pagination is 10 reels per request. Free Apify users are capped at 50 results per run (see Free plan limit above).

**Does `video_url` expire?**
Yes. It is a signed, time-limited Facebook CDN URL. Download promptly. Expect expiry within hours.

**Pages and profiles both?**
Yes. Any public Facebook page or profile URL works. Both numeric IDs and vanity usernames are accepted.

**How is deep enrich billed?**
Per reel. One extra call per reel when `enrichReelDetails=true`. On a 100-reel run with enrich on, that is 100 extra units.

**What about reels over 2 minutes for transcript?**
Skipped and flagged in the row, not billed. Empty transcripts are also not billed.

**Can it search reels by keyword or hashtag?**
No. It extracts reels from a known page or profile URL. Facebook does not expose a public video-search endpoint.

**Can it pull comments?**
Not directly. Use the [Facebook Comments Scraper](https://apify.com/unseenuser/facebook-comments-scraper) and feed it the `feedback_id` from each reel.

**Can it pull photo posts, Stories, or Live?**
No. Reels only. Other Actors in the UnseenUser Facebook suite cover those.

**Does it download the MP4 files for me?**
No. It returns the direct MP4 URL. Pipe it into ffmpeg, yt-dlp, curl, or any HTTP downloader.

**Do I need a Facebook account?**
No. No login, no cookies, no session.

**Do I need an account on any third-party service?**
No. Only an Apify account.

**Is the output streamed or batched?**
Streamed. Rows appear in the Apify Console as the Actor produces them, not at the end.

**What happens if one input URL is bad?**
Per-source error isolation: a single error row is written for that source, and the rest of the run continues. The run still finishes with status `SUCCEEDED`.

**Can I use this for AI training?**
No. Meta's Terms prohibit AI training on Facebook data, and reels carry creator copyright plus separate music rights.

**What about minors?**
Facebook has many under-18 users, and reels may be created by or feature minors. Do not scrape data of users you know or suspect to be minors. See the Compliance section.

**Is this legal?**
This Actor accesses publicly visible Reel data. Your downstream use is your responsibility - see the Compliance section and the Terms of Service.

**Does it respect Meta's robots.txt or rate limits?**
The Actor calls a third-party API that handles upstream access. You are responsible for downstream use compliance.

**Can I get a refund if a run fails?**
Apify handles billing and refunds. The Actor writes failed sources as error rows, not as platform errors, so each call still counts. Read the Cost optimization tips above to keep runs cheap.

**How do I report a bug or request a feature?**
Use the Apify profile contact form: https://apify.com/UnseenUser

***

### Compliance and legal

- **Public, logged-off data only.** No login. No cookies. No private content.
- **Reels may feature identifiable people.** In your hands, that is personal data under GDPR, UK GDPR, CCPA, and Israel's Privacy Protection Law (including Amendment 13). You are the data controller. Apply data minimization, set retention limits, and honor data-subject access / deletion requests.
- **`video_url` is a capability, not a license.** Possession of a direct CDN URL is not authorization to rebroadcast, republish, mirror, or strip attribution. The creator holds video copyright, the captions are copyrighted, and any music in the audio track carries separate rights held by labels and publishers.
- **No minors.** Facebook has many under-18 users. Do not scrape, profile, or build products targeting reels of users you know or suspect to be under 18. Delete any data you discover relates to a minor unless you have valid parental consent. Creating or distributing sexualized content of minors is illegal everywhere and strictly prohibited.
- **No AI training** without separate licensing from the source platform and any music rights holders. Meta's Terms prohibit this; recent litigation (NYT v. OpenAI, Sony v. Stability AI) shows the risk.
- **No competing platforms.** Do not use this Actor's output to build a Facebook Reels mirror or replacement product, strip Facebook attribution, or facilitate music piracy.
- **Cease-and-desist protocol.** If Meta or a data subject contacts you regarding data obtained through this Actor, cease the contested use immediately and notify UnseenUser within 48 hours via https://apify.com/UnseenUser

See the [Complete Specification](#complete-specification) below for the full Terms of Service V4.0 and Actor-Specific Addendum. The Actor logs a one-line acceptance notice at the start of every run; running the Actor constitutes binding acceptance.

***

### Build a Facebook video pipeline

Pair this Actor with the rest of the UnseenUser Facebook suite:

- [Facebook Reel Transcript Scraper](https://apify.com/unseenuser/facebook-transcript-scraper) - transcribe the short reels you pull here.
- [Facebook Comments Scraper](https://apify.com/unseenuser/facebook-comments-scraper) - the reactions on those reels. Feed it the `feedback_id` for the fast path.
- [Facebook Pages Scraper](https://apify.com/unseenuser/facebook-pages-scraper) - the page behind the reels.
- [Facebook Profile Scraper](https://apify.com/unseenuser/facebook-profile-scraper) - the profile behind the reels.
- [Facebook Photos Scraper](https://apify.com/unseenuser/facebook-photos-scraper) - photo posts from the same page.
- [Facebook Marketplace Scraper](https://apify.com/unseenuser/facebook-marketplace-scraper) - Marketplace listings.

[See all 24 scrapers by unseenuser](https://apify.com/unseenuser)

***

### Related scrapers

Build a Facebook video pipeline:

- [Facebook Reel Transcript Scraper](https://apify.com/unseenuser/facebook-transcript-scraper) - transcribe the short reels you pull here
- [Facebook Comments Scraper](https://apify.com/unseenuser/facebook-comments-scraper) - the reactions on those reels
- [Facebook Pages Scraper](https://apify.com/unseenuser/facebook-pages-scraper) - the page behind the reels

[See all 24 scrapers by unseenuser](https://apify.com/unseenuser)

***

### Support

- **Questions, bug reports, feature requests:** open the contact form on the publisher profile - https://apify.com/UnseenUser
- **Cease-and-desist or legal notices:** same contact form, within 48 hours per the Terms.
- **Apify platform questions** (billing, plans, account, scheduling): https://help.apify.com

***

### Changelog

| Version | Date | Notes |
|---|---|---|
| 1.0 | 2026-05-05 | Initial public release. Reels endpoint + optional deep-enrich and transcript add-ons. Free-plan cap of 50 results. Dataset views, key-value store schema, live-view OpenAPI schema. Complete specification (Quick Reference, build spec, API reference, Terms of Service V4.0, Actor-Specific Addendum, implementation and pre-publish checklists) inlined below. |

***

### Complete Specification

The following is the complete specification document for this Actor, included verbatim. It contains everything in the Apify Store listing - public README content, full Terms of Service, the Actor-Specific Addendum, the build specification, the API reference, the pricing model, and the implementation and pre-publish checklists.

***

## Facebook Reels Scraper (No Login)

> **Scrape public Facebook Reels from any page or profile - direct HD video URLs, view counts, play time, thumbnails, audio and author. No login. JSON/CSV/Excel.**

> **Tier:** Tier 1 - Build Now (field-rich, direct MP4 URLs, favorable 10-per-call economics)

***

### Quick Reference

| Property | Value |
|---|---|
| **Public Name (Apify Title)** | `Facebook Reels Scraper (No Login)` |
| **Apify Slug** | `UnseenUser/facebook-reels-scraper` |
| **Short Description (160 chars)** | Scrape public Facebook Reels from any page or profile - direct HD video URLs, view counts, play time, thumbnails, audio and author. No login. JSON/CSV/Excel. |
| **API Provider** | [Scrape Creators](https://scrapecreators.com) |
| **API Base URL** | `https://api.scrapecreators.com` |
| **Endpoints Wrapped** | `3 endpoints` (reels core + optional per-reel enrich + optional transcript) |
| **Endpoints List** | `/v1/facebook/profile/reels (core) + /v1/facebook/post (enrich) + /v1/facebook/post/transcript (add-on)` |
| **Authentication** | `x-api-key` header -> environment variable `SCRAPECREATORS_API_KEY` |
| **API Cost** | 1 credit per request; reels endpoint returns 10 reels per credit; enrich/transcript billed per reel |
| **Effective Date** | May 5, 2026 |
| **Keywords** | `facebook reels scraper`, `reel video url`, `mp4 download`, `view count`, `short form video`, `no login facebook` |

#### Endpoints Wrapped

| Endpoint | Purpose | Credits | Official Documentation |
|---|---|---|---|
| `GET /v1/facebook/profile/reels` | Page/profile reels (10 per request; `next_page_id` + `cursor`) | 1 credit / request | https://docs.scrapecreators.com (Facebook section) |
| `GET /v1/facebook/post` | Per-reel deep enrich (likes/shares/HD URLs/captions) | 1 credit / request | https://docs.scrapecreators.com (Facebook section) |
| `GET /v1/facebook/post/transcript` | Reel caption text (add-on; under 2 minutes only) | 1 credit / request | https://docs.scrapecreators.com (Facebook section) |

***

## Part 1: Public-Facing README (paste into Apify Store listing)

### Why This Actor?

Combined-endpoint actor: input a Facebook page or profile URL and pull every public Reel - direct MP4 video URLs, view counts, play time, thumbnails, audio/music track info and author details (including verified status). Paginate 10 reels per request as deep as the profile goes. Optionally deep-enrich each reel (likes, shares, HD/SD URLs, captions) or fetch a short reel's transcript in the same run. No login, no cookies. The `video_url` is a direct, time-limited MP4 link - good for download workflows, but it expires, so download promptly. This extracts Reels from a known page or profile; it does NOT search videos by keyword or hashtag (Scrape Creators has no Facebook video-search endpoint).

### Use Cases

- **Trend and competitor tracking** - monitor a page's reel output, views and play time
- **Content research** - study what short-form content performs for a creator or brand
- **Creator and influencer analysis** - pull reel metadata and verified-author status
- **Short-form video datasets** - build structured datasets of reel metadata
- **Bulk download workflows** - use the direct MP4 `video_url` for download pipelines (subject to licensing)
- **Audio/trend research** - capture the music/audio track attached to each reel

### Quick Start

1. Click **Try for free** on this Actor's page
2. Enter the required identifier (see Inputs Overview below)
3. Run the Actor
4. Download results as JSON, CSV, or XLSX, or pull via Apify API

### Inputs Overview

| Input | Type | Required | Description | Example/Allowed Values |
|---|---|---|---|---|
| `startUrls` | array of strings | yes | One or more public Facebook page or profile URLs to pull Reels from | `https://www.facebook.com/copperkettleyqr` |
| `maxReels` | integer | no | Stop after this many reels per source. Each API call returns 10. Default 30, minimum 10 | `30` |
| `enrichReelDetails` | boolean | no | **COST WARNING: billed per reel.** Calls the single-post endpoint per reel for likes, shares, HD/SD URLs, captions. | `false` |
| `fetchTranscript` | boolean | no | **COST WARNING: billed per reel.** Adds caption text per reel. Only returns for reels under 2 minutes. | `false` |

### Pricing

Pay-per-event model on Apify. The reels endpoint returns 10 reels per credit, which makes baseline extraction cheap. Deep enrich and transcript are per-reel add-ons (one extra call per reel).

**Pricing tier hint:** Anchor reel extraction around the category's competitive band, undercutting the flagship while staying above the floor. The 10-reels-per-call economics mean one credit yields ten billed reels - healthy margin at a low per-reel price.

> **Cost Warning:** `enrichReelDetails=true` and `fetchTranscript=true` each add one call per reel. On a 300-reel run that is up to 300 extra calls each. Leave them off unless you need the extra fields.

> **Note on `video_url`:** it is a time-limited Facebook CDN link. Download promptly; expect it to expire.

See exact per-event pricing on the Actor's Apify page.

### FAQ

**Q: Is this legal?**
A: This Actor wraps Scrape Creators endpoints that handle the underlying data collection. Your downstream use of the data is your responsibility - see the full Terms of Service and the Actor-Specific Addendum (Part 4) for details.

**Q: Do I need a Scrape Creators account?**
A: No. UnseenUser holds the Scrape Creators credentials. You only need an Apify account.

**Q: What about Facebook's anti-scraping enforcement?**
A: Meta's Terms restrict automated extraction. Scrape Creators handles the data collection - they bear the responsibility for their architecture's lawfulness. Your downstream use must comply with Meta's Terms.

**Q: What if Meta sends a cease-and-desist?**
A: Notify UnseenUser within 48 hours via the Apify profile contact form (apify.com/UnseenUser) and cease using this Actor immediately.

**Q: Can I use this data to train AI?**
A: NO. Meta's Terms prohibit AI training on Facebook data, and reels carry creator copyright plus separate music rights. See Part 4, Sections H and I.

**Q: What about minors?**
A: Facebook has many under-18 users, and reels may be created by or feature minors. This Actor's Terms strictly prohibit using data of users you know or suspect are minors. See Part 4 for details.

**Q: Can I redistribute the videos?**
A: Almost certainly NO. The `video_url` is a direct CDN link, but possessing it does not grant rebroadcast or republish rights - the creator holds copyright and any music carries separate rights. See Part 4, Section G.

**Q: How long is the `video_url` valid?**
A: It is a signed, time-limited Facebook CDN link. Download promptly; expect expiry within hours.

**Q: Can it search reels by keyword or hashtag?**
A: No. It extracts reels from a known page or profile. Scrape Creators has no Facebook video-search endpoint.

**Q: When should I enable deep enrich or transcript?**
A: Enable deep enrich only when you need likes/shares/HD URLs/captions; enable transcript only for short reels where you want caption text. Both are billed per reel.

### Technical Details

- API: Scrape Creators (`https://api.scrapecreators.com`)
- Auth: `x-api-key` header
- Output: streamed via Apify dataset
- Format: JSON, CSV, XLSX, or via Apify API
- Retries: 3 with exponential backoff on 429/502/503/504
- No rate limit stated by Scrape Creators ("scrape as fast as you want")
- Pagination: carry BOTH `next_page_id` and `cursor` forward each loop (10 reels per request)
- `video_url` is a time-limited Facebook CDN MP4 link

***

## Part 2: Build Specification (for Claude Code)

### Build Specification

```
Build an Apify actor in Node.js (TypeScript) called "facebook-reels-scraper".

Combined: /v1/facebook/profile/reels (core) + /v1/facebook/post (enrich) + /v1/facebook/post/transcript (add-on)

Auth: x-api-key header -> loaded from environment variable SCRAPECREATORS_API_KEY.

INPUT_SCHEMA.json:
- startUrls (array of strings, REQUIRED) - page / profile URLs
- maxReels (integer, default 30, minimum 10)
- enrichReelDetails (boolean, default false) - billed per reel
- fetchTranscript (boolean, default false) - billed per reel; reels under 2 min only

Behavior:
1. Validate input - fail fast with helpful error messages (startUrls non-empty).
2. STEP 1 (reels): For each source URL, call /v1/facebook/profile/reels. Returns 10 reels
   per request. Paginate by carrying BOTH next_page_id AND cursor forward each loop.
   Stop at maxReels or when pagination tokens are missing.
3. STEP 2 (enrich, optional and gated): If enrichReelDetails=true, for each reel call
   /v1/facebook/post for like_count, comment_count, share_count, video.sd_url, video.hd_url,
   video.length_in_second, video.captions_url.
4. STEP 3 (transcript, optional and gated): If fetchTranscript=true, call
   /v1/facebook/post/transcript per reel. Only returns for reels under 2 minutes; guard with
   length_in_second when available, skip + flag longer reels, and do NOT bill empty transcripts.
5. Stream one row per reel via Actor.pushData(). Surface `video_url` prominently.
6. Include _metadata field per row: { fetched_at, source_url, page, enrich_fetched, transcript_fetched }
7. Process startUrls sequentially with per-source error isolation.

Retries: 3 with exponential backoff (1s, 2s, 4s) on 429, 502, 503, 504.
Concurrency: 1 within reels pagination; enrich/transcript can run 2-3 parallel per reel batch.
User-Agent: OpusScale-Apify/1.0
```

### API Reference - Verified from Official Documentation

> Endpoint facts sourced from docs.scrapecreators.com (Facebook section). The reels response is sample-verified; the enrich (`/post`) and transcript endpoints follow the documented pattern.

#### Endpoint: Profile Reels - VERIFIED

**`GET https://api.scrapecreators.com/v1/facebook/profile/reels`** - 1 credit

##### Authentication

| Header | Value | Required |
|---|---|---|
| `x-api-key` | Your Scrape Creators key | Required |

##### Query Parameters

| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | string | yes | Public page / profile URL | `https://www.facebook.com/copperkettleyqr` |
| `next_page_id` | string | no | Pagination (carry forward with cursor) | from prior response |
| `cursor` | string | no | Pagination (carry forward with next\_page\_id) | from prior response |

##### Response 200 - Sample (verified from official docs)

```json
{
  "source": "https://www.facebook.com/copperkettleyqr",
  "id": "UzpfSTEwMDA2NDAyNzI0Mjg0OTpWSzoxMTE0MjM1OTIwNjY0NDA4",
  "post_id": "1203161005161463",
  "video_id": "1114235920664408",
  "url": "https://www.facebook.com/reel/1114235920664408",
  "creation_time": "2025-09-13T20:51:28.000Z",
  "description": "#globetheatreregina #GrandOpeningGlobeTheatre #yqrfood",
  "view_count": 900,
  "play_time_in_ms": 22035,
  "feedback_id": "ZmVlZGJhY2s6MTIwMzE2MTAwNTE2MTQ2Mw==",
  "thumbnail": "https://scontent-...jpg",
  "video_url": "https://video-...mp4",
  "music": { "id": "1491450028648565", "track_title": "The Copper Kettle Restaurant Original audio" },
  "author": {
    "id": "100064027242849",
    "name": "The Copper Kettle Restaurant",
    "is_verified": false,
    "url": "https://www.facebook.com/copperkettleyqr",
    "image": "https://scontent-...jpg"
  }
}
```

Top-level `next_page_id` and `cursor` drive pagination (carry BOTH forward).

##### Response Field Reference

- `video_url` (string) - direct, time-limited CDN MP4 link
- `view_count`, `play_time_in_ms` - engagement
- `music` (object) - `id`, `track_title` (audio metadata)
- `author` (object) - `id`, `name`, `is_verified`, `url`, `image`
- `feedback_id` (string) - usable as the fast-path input to the Comments actor

#### Endpoint: Post (per-reel enrich) - VERIFIED (endpoint pattern)

**`GET https://api.scrapecreators.com/v1/facebook/post`** - 1 credit

**Source:** https://docs.scrapecreators.com (Facebook section)

When `enrichReelDetails=true`, adds `like_count`, `comment_count`, `share_count`, `video.sd_url`, `video.hd_url`, `video.length_in_second`, `video.captions_url`.

#### Endpoint: Post Transcript (add-on) - VERIFIED (endpoint pattern)

**`GET https://api.scrapecreators.com/v1/facebook/post/transcript`** - 1 credit

**Source:** https://docs.scrapecreators.com (Facebook section)

When `fetchTranscript=true`, adds `transcript` (plain text). Only returns for reels under 2 minutes; guard with `length_in_second`, skip and flag longer reels, and do not bill empty transcripts.

#### Combined Output Structure (this Actor's contribution)

This Actor streams one dataset row per reel, enriched in place when the add-ons are enabled:

```json
{
  "reel": { /* full reel object incl. video_url, music, author */ },
  "enrich": { /* like_count, share_count, hd_url... present only when enrichReelDetails=true */ },
  "transcript": "plain text... present only when fetchTranscript=true and reel < 2 min",
  "_metadata": {
    "fetched_at": "2026-05-25T12:34:56.789Z",
    "source_url": "https://www.facebook.com/copperkettleyqr",
    "page": 2,
    "enrich_fetched": false,
    "transcript_fetched": false
  }
}
```

### Pricing Strategy (pay-per-event)

Configure pay-per-event in Apify console. The 10-reels-per-credit economics support a low per-reel price with healthy margin.

| Tier | Trigger | Suggested Apify Price | Rationale |
|---|---|---|---|
| **Reel scraped** | per reel | **$4/1k** | Undercuts the $5 flagship; matches the $4.5 competitive floor |
| **Deep enrich (add-on)** | `enrichReelDetails` | $5/1k | Adds likes/shares/HD URLs/captions |
| **Transcript (add-on)** | `fetchTranscript` | $4/1k | Billed only when a transcript returns |

**Important:** display the add-on costs prominently in the Apify Actor description so users don't accidentally trigger one extra call per reel on large runs.

### Tags (actor.json)

```
categories: ["SOCIAL_MEDIA", "VIDEOS"]
keywords: ['facebook reels scraper', 'reel video url', 'mp4 download', 'view count', 'short form video', 'no login facebook']
```

### Important Notes for Claude Code

1. Never log the API key in error messages or run logs
2. Emit failed requests as dataset rows with `error` field - do NOT crash the whole run
3. Include `_metadata` field per row: `{ fetched_at, source_url, page, enrich_fetched, transcript_fetched }`
4. For multiple sources per run, process sequentially with per-source error isolation
5. Log a one-line acceptance notice at start of every run:
   ```
   This Actor is governed by UnseenUser's Terms of Service V4.0.
   Running this Actor constitutes binding acceptance.
   ```
6. **Critical pagination note:** carry BOTH `next_page_id` AND `cursor` forward each loop; stop at `maxReels` or when tokens are missing. (10 reels per request.)
7. **Surface `video_url` prominently** and document its expiry in the README (time-limited CDN link).
8. **Enrich + transcript add-ons** gated behind toggles and billed per reel; skip the calls entirely when disabled.
9. **Transcript add-on** guards the under-2-minute limit (skip + flag longer reels); do NOT bill empty transcripts.
10. **COST WARNING:** when `enrichReelDetails=true` or `fetchTranscript=true`, log a prominent warning at start of run:
    ```
    Per-reel add-on enabled. Each reel triggers one extra call (1 credit).
    Expected extra credits for ~{n} reels: ~{n} per enabled add-on.
    ```

***

## Apify Actor - Terms of Service

**Version:** 4.0
**Effective Date:** May 5, 2026

***

### 0. ACCEPTANCE BY USE - IMPORTANT

**Read this section first.**

These Terms of Service ("Terms") form a binding legal agreement between you ("User," "you," "your") and UnseenUser, the Publisher of this Apify actor ("UnseenUser," "the Publisher," "we," "us," "our").

#### 0.1 How You Accept These Terms

You accept these Terms by **any of the following actions**, each of which constitutes a clear, affirmative act of acceptance:

- (a) **Running the Actor** - Initiating any execution of the Actor on the Apify platform
- (b) **Using any output** returned by the Actor for any purpose
- (c) **Continuing to access** the Actor's listing or documentation after these Terms are visible

#### 0.2 Continuing Acceptance

Each time you run the Actor or use its outputs, you reaffirm your acceptance of the then-current Terms. If you do not agree to these Terms or any subsequent update, you must stop using the Actor immediately.

#### 0.3 No Anonymous Acceptance

You cannot disclaim acceptance by:

- Failing to read these Terms before running the Actor
- Running the Actor through automated systems
- Sharing your Apify account with others who may not have read these Terms

By the act of running the Actor on Apify, you bind yourself, your organization (if applicable), and any individuals or systems acting on your behalf or under your authority.

#### 0.4 If You Do Not Accept

**If you do not agree to these Terms, you must not run the Actor.** No use is authorized without acceptance.

***

### PREAMBLE - UNDERSTANDING THE ARCHITECTURE

Before using the Actor, please understand the technical architecture of the service:

#### The Data Flow

You (User) -> Apify Platform -> Actor (software) -> Third-Party API -> Source Platform
You (User) <- Apify Platform <- Actor (software) <- Third-Party API

#### What Each Party Does

- **You (the User):** Run the Actor on the Apify platform with input parameters you choose
- **Apify:** Operates the cloud infrastructure that hosts and executes Actors. Apify is a Czech-incorporated company (Apify Technologies s.r.o.) governed by its own Terms of Service.
- **The Publisher (us):** Publishes software code (the Actor) on Apify's platform. The Actor is a thin wrapper that translates your input into requests to a third-party API and returns the API's responses to you. **The Publisher does not operate scraping infrastructure. The Publisher does not store or retain data returned by the Actor. The Publisher does not see, log, or process the personal data of any individuals returned in the Actor's outputs beyond what is incidental to passing the data through.**
- **Third-Party API Provider:** HarvestAPI (https://harvest-api.com) or Scrape Creators (https://scrapecreators.com). These are independent third-party companies that operate scraping infrastructure and return data from source platforms.
- **Source Platform:** LinkedIn, TikTok, YouTube, Reddit, Linktree, etc. These are the platforms whose publicly visible data is accessed by the Third-Party API Providers.

#### Why This Matters

Your relationship with the Publisher is that of a **software user** to a **software vendor**. The Publisher has the responsibilities of a software vendor (functional code, accurate documentation) and the limits of one (the Publisher is not responsible for how you use the data you obtain).

***

These Terms operate alongside but do not replace:

- Apify's Terms of Service and Acceptable Use Policy (governing your relationship with Apify)
- HarvestAPI Terms of Service and Scrape Creators Terms of Service (governing the underlying data infrastructure)
- Source Platform terms (LinkedIn, TikTok, etc.) governing the public data accessed
- Applicable law in your jurisdiction and the jurisdictions of data subjects

These Terms incorporate the actor-specific addendum published in each Actor's individual listing ("Addendum"). In the event of a conflict, the more restrictive provision applies.

***

### 1. NATURE OF THE SERVICE

#### 1.1 What the Actor Is

The Actor is a software program published on the Apify platform. Each Actor:

- (a) Accepts structured input from you on the Apify platform
- (b) Translates that input into HTTP requests to a third-party API operated by HarvestAPI or Scrape Creators
- (c) Receives HTTP responses from that third-party API
- (d) Returns the response data to you in a structured format on the Apify platform

The Actor's source code is hosted on Apify's infrastructure. The Actor runs in Apify's cloud, not on the Publisher's servers. The Publisher operates no servers running the Actor.

#### 1.2 What the Actor Is Not

The Actor is **not**:

- (a) A scraping tool - the Publisher does not operate scraping infrastructure, proxies, headless browsers, or fake accounts
- (b) A direct connection to any source platform - connections to source platforms are made by HarvestAPI / Scrape Creators
- (c) A data storage or data retention service - the Publisher does not maintain a database of any data the Actor returns
- (d) A licensed access channel to LinkedIn, TikTok, YouTube, Reddit, X (Twitter), Meta, Linktree, or any other source platform
- (e) Affiliated with, endorsed by, sponsored by, or authorized by any source platform

#### 1.3 The Publisher's Limited Role

The Publisher's role is limited to:

- (a) Designing and writing the Actor's source code
- (b) Publishing the Actor on the Apify Store
- (c) Maintaining the Actor (updating it when API providers change schemas)
- (d) Providing documentation and customer support via Apify's contact mechanism

The Publisher is a software vendor, similar to a developer who publishes an app on the Apple App Store or Google Play Store. The Publisher is not a data provider, data broker, data processor, or data controller for purposes of GDPR, CCPA, Israel's Privacy Protection Law, or equivalent.

#### 1.4 The Third-Party API Providers' Role

HarvestAPI (https://harvest-api.com) and Scrape Creators (https://scrapecreators.com) are independent third-party companies. They:

- (a) Operate the actual data scraping infrastructure
- (b) Maintain relationships with source platforms (or accept the operational risk of accessing public data without such relationships)
- (c) Are themselves Apify publishers (HarvestAPI publishes 9+ actors directly; Scrape Creators publishes 10+)
- (d) Provide their own Terms of Service governing their operations
- (e) Are responsible for compliance obligations relating to the data collection itself

The Publisher is a customer of these providers. The Publisher is not their agent, partner, or representative.

***

### 2. WHO MAY USE THE ACTOR

#### 2.1 Eligibility

You may use the Actor only if:

- (a) You are at least 18 years old or the age of majority in your jurisdiction
- (b) You have legal capacity to enter into binding contracts
- (c) You are not located in or resident of a country subject to comprehensive sanctions by the United States, European Union, United Kingdom, or Israel
- (d) You are not on any prohibited persons list

#### 2.2 User Representations

By using any Actor, you represent and warrant that:

- (a) **Truthful identity:** Information you provide about your identity and intended use is accurate
- (b) **Lawful intent:** Your intended use complies with applicable law in your jurisdiction
- (c) **Source platform compliance:** You will independently comply with the Terms of Service of any source platform whose data you obtain through the Actor
- (d) **Data subject rights:** Where Actor outputs include personal data, you will respect data subject rights under applicable law
- (e) **No prohibited use:** You will not use the Actor for any of the purposes prohibited in Section 4

These representations are continuous - they must remain true throughout your use.

***

### 3. PERMITTED USES

The Actor may be used for any lawful purpose, including:

- Market research and competitive analysis
- Academic research
- Journalism and investigative reporting
- Internal business intelligence
- Brand monitoring
- Recruitment research where consistent with applicable employment law
- Building products that further process publicly available information lawfully

Specific permitted uses for each Actor are described in that Actor's individual listing and Addendum.

***

### 4. PROHIBITED USES

You may not use the Actor for any of the following:

#### 4.1 Illegal Activity

Activity illegal under the law of your jurisdiction, the User's jurisdiction, or the jurisdiction of any data subjects.

#### 4.2 Harassment, Stalking, and Personal Targeting

- Compiling profiles for harassment, stalking, or doxxing
- Tracking individuals' movements or activities without their knowledge
- Building profiles of journalists, activists, dissidents, or vulnerable populations for retaliatory purposes

#### 4.3 Discrimination

- Using outputs for discriminatory employment, lending, housing, or insurance decisions based on protected characteristics
- Building lists for discriminatory purposes

#### 4.4 Spam and Unsolicited Commercial Communication

- Sending unsolicited marketing in violation of CAN-SPAM, CASL, GDPR, PECR, Israeli Anti-Spam Law (Section 30A of the Communications Law), or equivalent laws
- Building "lead lists" from scraped contacts without proper consent infrastructure
- Reselling contact data for spam purposes

#### 4.5 Fraud and Deception

- Identity theft or impersonation
- Generation of fake reviews, testimonials, or coordinated inauthentic behavior
- Election interference or political disinformation
- Securities fraud

#### 4.6 Source Platform Abuse

- Using outputs to circumvent technical protection measures of source platforms
- Creating fake accounts on source platforms based on Actor outputs
- Vote manipulation, engagement manipulation, or platform algorithm gaming
- Building services that competitively substitute for source platforms

#### 4.7 Reselling the Actor's Service

- Reselling raw Actor outputs as your own data product or scraping-as-a-service
- Sharing your Apify credentials to provide third parties indirect access
- Building competing API services using Actor outputs

#### 4.8 AI Training Without Authorization

- Using Actor outputs as training data for commercial AI/ML models without separate licensing authority from the source platform

#### 4.9 Sensitive Targeting

- Specifically targeting or profiling based on health conditions, sexual orientation, religious beliefs, political opinions, or other sensitive characteristics
- Targeting children under 16 (or local age of consent for data processing)

#### 4.10 Privacy Law Violations

- Processing personal data of EU/UK/California/Israeli residents without complying with applicable privacy law
- Failing to honor data subject access, deletion, or objection requests
- Processing data for purposes incompatible with its publication context

***

### 5. SOURCE PLATFORM TERMS - YOUR RESPONSIBILITY

#### 5.1 Acknowledgment

The Actor accesses publicly visible data on third-party platforms ("Source Platforms") through the Third-Party API Providers (HarvestAPI / Scrape Creators). Source Platforms include LinkedIn, TikTok, YouTube, Reddit, X (Twitter), Meta/Facebook, Linktree, Komi, Pillar, Linkbio, Linkme, and Amazon.

#### 5.2 Your Sole Responsibility

You acknowledge:

- (a) **You are solely responsible for ensuring your downstream use of data obtained through the Actor complies with the Source Platform's Terms of Service**
- (b) The Publisher makes no representation that any specific use is permitted under any Source Platform's terms
- (c) The Third-Party API Providers, not the Publisher, bear responsibility for the lawfulness of the data collection itself
- (d) You should review Source Platform terms before commercial use:
  - LinkedIn: https://www.linkedin.com/legal/user-agreement
  - TikTok: https://www.tiktok.com/legal/page/global/terms-of-service/en
  - YouTube: https://www.youtube.com/static?template=terms
  - X: https://twitter.com/en/tos
  - Reddit: https://www.redditinc.com/policies/user-agreement
  - Meta: https://www.facebook.com/legal/terms
  - Linktree: https://linktr.ee/s/terms/

#### 5.3 Cease-and-Desist Compliance

If you receive a cease-and-desist letter or other legal demand from a Source Platform regarding your use of Actor outputs, you must:

- (a) Cease the contested use immediately
- (b) Notify UnseenUser within 48 hours via UnseenUser's Apify profile contact form (https://apify.com/UnseenUser)
- (c) Cooperate with the Publisher as needed to mitigate
- (d) Not assert against the Publisher any claim arising from your inability to use the Actor for that Source Platform

***

### 6. DATA PROTECTION - REFLECTING ACTUAL ARCHITECTURE

#### 6.1 Roles Under Privacy Law

For purposes of GDPR, UK GDPR, CCPA, Israel's Privacy Protection Law (PPL) including Amendment 13, and equivalents:

- **You (the User) are the Data Controller** of any personal data you obtain through the Actor and subsequently process for your own purposes
- **HarvestAPI and Scrape Creators** are the entities that collect data from source platforms - they bear the responsibilities of data processors or controllers (depending on context) for the collection itself
- **The Publisher acts solely as a software vendor**, not as a data controller or processor, because the Publisher does not store, retain, or substantively process personal data - the Actor merely passes API responses through

#### 6.2 No Data Retention by the Publisher

The Publisher confirms:

- (a) The Publisher does not maintain a database of personal data obtained through the Actor
- (b) The Actor passes data from the Third-Party API directly to you on the Apify platform - data does not flow through the Publisher's infrastructure
- (c) Apify's standard execution and operational logging may include limited information about Actor runs (input parameters, run duration, data volume) - this is governed by Apify's own privacy practices
- (d) The Publisher does not access, view, or analyze your Actor outputs except as needed for technical support if you specifically share them with the Publisher

#### 6.3 Your Obligations as Data Controller

Where your use of the Actor involves processing personal data, you are responsible for:

- (a) Establishing a lawful basis for your processing (consent, legitimate interest with documented balancing test, contract, etc.)
- (b) Providing transparent notice to data subjects as required by applicable law
- (c) Honoring data subject access, rectification, erasure, restriction, and portability requests
- (d) Implementing appropriate security measures
- (e) Conducting Data Protection Impact Assessments where required
- (f) Appointing a Data Protection Officer if your operations require one
- (g) Registering databases with applicable supervisory authorities
- (h) Honoring opt-out requests for direct marketing
- (i) Cross-border transfer safeguards where data crosses borders

#### 6.4 Israel's Amendment 13 - User Compliance

If your use of the Actor involves Israeli residents' personal data, you must comply with the Privacy Protection Law as amended (Amendment 13, effective August 14, 2025). These obligations are yours as the data controller, not the Publisher's as the software vendor.

#### 6.5 Sensitive Data Targeting Restrictions

You will not use the Actor to specifically target, profile, or build datasets focused on:

- Health or medical conditions
- Religious beliefs
- Political opinions
- Sexual orientation or gender identity
- Genetic or biometric data
- Criminal history
- Children under 16

***

### 7. INTELLECTUAL PROPERTY

#### 7.1 Actor Code

The Actor's source code, schemas, documentation, and branding are owned by the Publisher. You receive a limited, non-exclusive, non-transferable, revocable license to use the Actor for permitted purposes during your active subscription/run with Apify.

#### 7.2 Output Data

The Publisher claims no ownership over the public data the Actor returns. Source Platforms may have copyright, database rights, or other rights in their data; data subjects may have copyright in user-generated content. Your use of output data must respect these rights independently.

#### 7.3 Restrictions

You may not reverse engineer, decompile, or reuse the Actor's code in a competing actor.

#### 7.4 Feedback

Feedback you provide may be used by the Publisher to improve products without compensation to you.

***

### 8. PRICING AND PAYMENT

#### 8.1 Apify Platform Billing

Pricing is administered through Apify's pricing models. Apify processes all payments. Apify's payment terms govern refunds and disputes.

#### 8.2 Pricing Changes

The Publisher may change Actor pricing with at least 14 days' notice via the Actor's Apify listing.

#### 8.3 No Refunds for Misuse

If your access is suspended or terminated for breach of these Terms, you forfeit any unused balance and are not entitled to refunds.

***

### 9. SERVICE AVAILABILITY AND CHANGES

#### 9.1 No Uptime Guarantee

The Actor depends on:

- (a) The Apify platform
- (b) Underlying API providers (HarvestAPI, Scrape Creators)
- (c) Source Platforms' continued public accessibility

Any of these may change behavior, restrict access, or become unavailable without notice. The Publisher makes no uptime guarantees.

#### 9.2 Service Discontinuation

The Publisher may discontinue any Actor at any time. Reasonable notice will be provided when feasible.

***

### 10. DISCLAIMERS

#### 10.1 "AS IS" Service

THE ACTOR IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTIES OF ANY KIND, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR PURPOSE, NON-INFRINGEMENT, OR ACCURACY OF DATA.

#### 10.2 No Representation of Lawfulness

The Publisher makes no representation that your specific use of the Actor or the data it returns is lawful in your jurisdiction or under any Source Platform's terms. The burden of determining lawfulness for your use case is yours.

#### 10.3 No Endorsement of Source Content

Content returned by the Actor was created by third parties. The Publisher does not endorse, verify, or take responsibility for it.

***

### 11. LIMITATION OF LIABILITY

#### 11.1 Aggregate Liability Cap

TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL THE AGGREGATE LIABILITY OF THE PUBLISHER FOR ALL CLAIMS RELATING TO THE ACTOR EXCEED THE GREATER OF:

- (a) ONE HUNDRED U.S. DOLLARS (US $100), OR
- (b) THE AMOUNTS YOU PAID THROUGH APIFY FOR USE OF THE ACTOR IN THE THREE (3) MONTHS IMMEDIATELY PRECEDING THE EVENT

#### 11.2 Excluded Damages

THE PUBLISHER IS NOT LIABLE FOR INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, OR FOR LOSS OF PROFITS, REVENUE, OR DATA, EVEN IF ADVISED OF THE POSSIBILITY.

#### 11.3 Time Limit

Any claim must be brought within one (1) year of the event.

***

### 12. INDEMNIFICATION

#### 12.1 Your Indemnification of the Publisher

You agree to defend, indemnify, and hold harmless the Publisher from any:

- Claims arising from your use of the Actor
- Claims arising from your violation of these Terms
- Claims arising from your violation of any law (including privacy law)
- Claims arising from your violation of any Source Platform's Terms of Service
- Claims arising from your processing of personal data obtained through the Actor
- Reasonable attorneys' fees and costs of defending such claims

#### 12.2 Defense

The Publisher may assume defense at your expense. You will cooperate with the Publisher's defense.

#### 12.3 Scope

The indemnification covers reasonable, foreseeable third-party claims arising from your use. It does not extend to:

- Claims arising from the Publisher's gross negligence or willful misconduct
- Claims regarding the Actor's source code itself (those are the Publisher's responsibility)
- Claims regarding the Third-Party API Provider's data collection (those are their responsibility)

***

### 13. SUSPENSION AND TERMINATION

#### 13.1 Termination by the Publisher

The Publisher may terminate your access for material breach, illegal use, breach of warranty, or upon credible legal demand.

#### 13.2 Effects of Termination

Your license ends, you must cease use, and applicable provisions survive.

#### 13.3 Termination by You

You may stop using the Actor at any time on Apify.

***

### 14. DISPUTE RESOLUTION

#### 14.1 Informal Resolution First

Send a detailed written description of the dispute via UnseenUser's Apify profile contact form (https://apify.com/UnseenUser) and wait 60 days for resolution attempt before any formal claim.

#### 14.2 Governing Law

These Terms are governed by the substantive laws of the State of Israel, without regard to conflict of law principles.

#### 14.3 Exclusive Jurisdiction

Any dispute shall be brought exclusively in the competent civil courts of Tel Aviv-Jaffa, Israel.

#### 14.4 No Class Actions

You agree to bring claims only in your individual capacity.

#### 14.5 Attorneys' Fees

The prevailing party recovers reasonable attorneys' fees.

***

### 15. MISCELLANEOUS

#### 15.1 Entire Agreement

These Terms (with Addendum and incorporated documents) are the entire agreement.

#### 15.2 Severability

Unenforceable provisions are reformed to the minimum extent or severed.

#### 15.3 Assignment

You may not assign without the Publisher's consent. The Publisher may assign to affiliates, successors, or acquirers.

#### 15.4 Force Majeure

Neither party is liable for failure due to events beyond reasonable control, including changes by Source Platforms or Third-Party API Providers, or actions by Apify.

#### 15.5 Third-Party Beneficiaries

Apify, HarvestAPI, and Scrape Creators are intended third-party beneficiaries of Sections 4 (Prohibited Uses), 5 (Source Platform Compliance), and 12 (Indemnification).

#### 15.6 Survival

Sections 0 (Acceptance), 4, 5, 6, 7, 10, 11, 12, 14, and 15 survive termination.

#### 15.7 Language

English controls. Translations are for convenience only.

#### 15.8 Publisher Identification for Legal Process

The Publisher operates on the Apify platform under the username **UnseenUser** (apify.com/UnseenUser). The Publisher is a registered legal entity. Upon receipt of valid legal process (subpoena, court order, or equivalent) directed through Apify's official channels, the Publisher's full legal identity may be disclosed as required by law. This Section ensures that you have a valid path to legal recourse if needed.

***

### 16. ACKNOWLEDGMENT

By using any Actor, you acknowledge that:

- (a) You have read these Terms
- (b) You understand the architecture: you are using software (the Actor) on Apify's platform that calls third-party APIs
- (c) You accept responsibility for your use, including for compliance with Source Platform terms
- (d) Your indemnification obligations cover third-party claims arising from your use
- (e) Disputes are resolved in Israeli courts
- (f) The Publisher's identity, while not publicly disclosed in this listing, can be obtained through valid legal process via Apify

For questions, use UnseenUser's Apify profile contact form (https://apify.com/UnseenUser) before running the Actor.

***

### APPENDIX - Document Version History

| Version | Date | Summary |
|---------|------|---------|
| 1.0 | May 5, 2026 | Initial publication |
| 2.0 | May 5, 2026 | Hardened (over-broad - treated User as data broker) |
| 3.0 | May 5, 2026 | Architecturally accurate - Publisher as software vendor |
| 4.0 | May 5, 2026 | **Anonymous Publisher.** All personally identifying information removed. Acceptance-by-Use mechanism formalized. |

***

*These Terms reflect best practices for anonymous Apify actor publishing as of May 2026. Not a substitute for legal advice. Consult qualified Israeli commercial counsel before deploying.*

***

## Part 4: Actor-Specific Terms of Service Addendum

### Actor-Specific ToS Addendum - Facebook Reels Scraper

This addendum supplements the Master Terms of Service V4.0. By running this Actor, you accept both the Master ToS and this addendum.

#### A. Architectural Disclosure

This Actor is a software wrapper. It accepts your input parameters, calls up to THREE Scrape Creators endpoints (`/v1/facebook/profile/reels` for the reel list, and optionally `/v1/facebook/post` for per-reel enrichment and `/v1/facebook/post/transcript` for captions), combines the results into a structured output, and returns the combined data to you on the Apify platform. UnseenUser does not store, log, or substantively process the data returned. The data flows from Scrape Creators through Apify's runtime directly to you.

#### B. Nature of Data Returned

This Actor returns Facebook Reel data: reel and video IDs, URL, creation time, description, view count, play time, a thumbnail, a direct time-limited MP4 `video_url`, audio/music track metadata, and author details (id, name, verified status, URL, image). When enabled it adds like/comment/share counts, HD/SD URLs and captions, and a short-reel transcript.

Reels frequently feature identifiable people. Where the output includes individuals' images, names, voices, or content authored by them, that constitutes **personal data** subject to GDPR, CCPA, Israeli Privacy Protection Law (including Amendment 13), and equivalent privacy laws in your downstream processing - but **only in your hands as the data controller**, not in UnseenUser's hands as the software vendor.

#### C. Permitted Use Cases

You may use this Actor for the following purposes (non-exhaustive list):

- **Trend and competitor tracking** - reel output, views and play time
- **Content research** - what short-form content performs
- **Creator and influencer analysis** - reel metadata and verified-author status
- **Short-form video datasets** - structured metadata datasets
- **Download workflows** - the direct MP4 `video_url`, subject to licensing
- **Audio/trend research** - the music/audio track attached to each reel

#### D. Specifically Prohibited Uses

In addition to Master ToS Section 4 prohibitions, you may NOT:

- Rebroadcast, republish, or redistribute reel videos in a way that competes with Facebook or infringes creator copyright
- Use the `video_url` to mirror or aggregate reels into a competing "Facebook reels" product
- Strip creator or platform attribution from reel content
- Download and republish copyrighted music from reel audio metadata, or facilitate music piracy
- Train commercial AI/ML models on reel video, captions, or audio without separate licensing authority
- Use reel content to create deepfakes or non-consensual media of identifiable people

#### E. Platform Terms of Service Considerations

Meta's Terms of Service prohibit automated extraction. Meta has aggressively litigated against scrapers (Meta v. BrandTotal - settled with permanent injunction; Meta v. Octopus Data; Meta v. Bright Data - pending). Facebook's Terms of Service prohibit automated extraction. This Actor accesses publicly visible reel data via Scrape Creators - Scrape Creators bears responsibility for the lawfulness of the data collection. Your downstream use must independently comply with Meta's Terms of Service.

If Meta issues a cease-and-desist regarding data obtained via this Actor, notify UnseenUser within 48 hours via the Apify profile contact form (apify.com/UnseenUser) and cease your use immediately.

#### F. Combined-Endpoint Data Sensitivity

This Actor combines up to three endpoints in one run. The combination yields data that is richer and more sensitive than any one alone: the reel list plus enriched engagement plus a transcript builds a near-complete record of a creator's short-form output and its performance. Use the combined output thoughtfully - do not sell it as a product, do not build a "Facebook reels replacement," and use it for your own internal research and workflows.

#### G. Direct Video URLs - Capability, Not Authorization to Use

This Actor returns a direct, time-limited MP4 `video_url` from Facebook's CDN. **Possession of this URL does NOT grant you** the right to rebroadcast the video, the right to republish or redistribute it, the right to remove attribution or claim ownership, or a waiver of the creator's (or music rights holders') copyright. You are getting the same video stream a normal viewer would receive, just as a direct link. The underlying content and rights are unchanged. Rebroadcasting triggers separate rights for the creator (performance), the music (if any plays), and Facebook (platform rights).

#### H. Content Copyright - Video, Caption, and Music Layers

Reel content is multi-layered copyright:

- **Video** - copyrighted by the creator
- **Captions / description** - copyrighted by the creator
- **Music / audio** - copyrighted by music rights holders separately

You may analyze reels and quote short excerpts with attribution (typically fair use), and use aggregated metrics (counts, play time - facts). You may NOT republish full videos as your own, strip attribution, build competing platforms, or use the content beyond analysis without explicit licensing from the creator and any music rights holders.

#### I. Music Copyright - HIGHEST ENFORCEMENT RISK

Music rights holders (Universal Music Group, Sony Music, Warner Music) enforce copyright more aggressively than any other content category. Sony has sued Stability AI specifically over music training data; UMG sued Anthropic over song lyrics. You may NOT download and republish copyrighted music from reel audio metadata, use reel data to facilitate music piracy, train AI on music data extracted via this Actor, or build a "Facebook reel music" search engine. Treat any reel audio as separately licensed content.

#### J. AI Training - Special Notice

Meta's Terms of Service prohibit using Facebook data to train AI/ML models without authorization. Reel video, captions and audio are no exception. The Publisher (UnseenUser) does NOT authorize, and has no ability to authorize, AI training use. Recent litigation (NYT v. OpenAI, Andersen v. Stability AI, Sony v. Stability AI over music) shows AI training on platform and music content is heavily contested. Get proper licensing or do not train on this data. Your AI training use is your own legal exposure.

#### K. Personal Data and Deepfake / Non-Consensual Distribution

Reels often feature identifiable people. Do NOT use this Actor's output to create deepfakes, face-swapped media, or any non-consensual depiction of an identifiable person, and do not build datasets that track specific individuals across their reels. Where reel content is personal data, apply data minimization, set retention limits, and honor data subject rights.

#### L. Minor Protection - CRITICAL

Facebook has a significant under-18 user population, and reels may be created by or feature minors. You MUST:

- NOT use this Actor to scrape reels of users you know or suspect are minors
- NOT use this Actor for any product or service targeted at minors without parental-consent mechanisms compliant with COPPA (US), GDPR Article 8 (EU), and Israeli Privacy Law (heightened sensitivity for minors)
- DELETE any data you discover relates to a minor unless you have valid parental consent

If a reel's content or author suggests the subject is under 18, treat the data as belonging to a minor by default. This restriction is non-negotiable - and creating or distributing sexualized content of minors is illegal everywhere and strictly prohibited.

#### M. Data Subject Rights and Cease-and-Desist Protocol

Individuals featured in reels have rights under GDPR / CCPA / Israeli Privacy Law: access, deletion, objection, rectification, and portability. Honor these with a typical 30-day SLA.

If a data subject contacts YOU directly demanding deletion, honor it promptly, do NOT route them to UnseenUser (the software vendor is not the data controller), you may suggest they contact Meta directly since the data originates there, and document the request and your response. If Meta, Scrape Creators, or a regulator contacts UnseenUser regarding your use, UnseenUser will notify Apify per Master ToS Section 8, may suspend access pending investigation, and you agree to provide documentation of your lawful basis on reasonable request.

***

## Part 5: Implementation Checklist for Claude Code

When building this Actor, ensure:

- \[ ] Code is written in Node.js (TypeScript preferred)
- \[ ] Authentication uses `x-api-key` header from `SCRAPECREATORS_API_KEY` env variable (never hardcoded)
- \[ ] All endpoints are implemented with proper error handling
- \[ ] Input validation: required fields fail fast with clear error messages
- \[ ] Pagination respects max\_\* inputs strictly
- \[ ] Retry logic: 3 retries with exponential backoff (1s, 2s, 4s) on 429/502/503/504
- \[ ] Output uses `Actor.pushData()` to stream each result
- \[ ] Each row includes `_metadata`: `{ fetched_at, source_url, page, enrich_fetched, transcript_fetched }`
- \[ ] Failed requests emitted as dataset rows with `error` field - don't crash on individual failures
- \[ ] User-Agent header set to: `OpusScale-Apify/1.0`
- \[ ] INPUT\_SCHEMA.json includes all input fields with proper validation
- \[ ] README.md (matching Part 1 + Part 3 + Part 4 content) is committed
- \[ ] actor.json includes categories and keywords per Part 2
- \[ ] Pricing per-event configured in Apify console with appropriate margin
- \[ ] Acceptance-by-Use notice logged at start of every run
- \[ ] No personal information about UnseenUser in code or output
- \[ ] All references use "UnseenUser" or "the Publisher" (V4 anonymous framing)
- \[ ] **Pagination loop carrying BOTH `next_page_id` and `cursor`**; stop on `maxReels` or missing tokens (10 reels per request)
- \[ ] **`video_url` surfaced prominently**; expiry documented in README
- \[ ] **Enrich + transcript add-ons** gated and billed per reel; skipped when off
- \[ ] **Transcript guards the under-2-minute limit** (skip + flag longer reels); empties not billed
- \[ ] **Cost warning logged** at start of run when a per-reel add-on is enabled
- \[ ] Per-source error isolation in multi-source runs

***

## Part 6: Pre-Publish Checklist on Apify

Before clicking "Publish":

- \[ ] Test runs succeed with default inputs (try `https://www.facebook.com/copperkettleyqr`)
- \[ ] Test with invalid inputs - clear error messages, no crash
- \[ ] Test pagination - verify it stops at `maxReels` and when pagination tokens are missing
- \[ ] Test `enrichReelDetails=true` - verify cost warning and one extra call per reel
- \[ ] Test `fetchTranscript=true` - long reel is skipped/flagged and NOT billed
- \[ ] Test a profile with no reels (empty case) - emits cleanly, does not crash
- \[ ] Verify `video_url` appears prominently and the README documents its expiry
- \[ ] Output schema matches what the README documents
- \[ ] Pricing per-event configured in Apify console (reel + enrich + transcript tiers)
- \[ ] Apify "Title" field set to: `Facebook Reels Scraper (No Login)`
- \[ ] Apify "Short Description" set to: `Scrape public Facebook Reels from any page or profile - direct HD video URLs, view counts, play time, thumbnails, audio and author. No login. JSON/CSV/Excel.`
- \[ ] Apify "README" tab populated with content from Part 1 + Part 3 + Part 4
- \[ ] Cover image uploaded (1920x1080 PNG, no Publisher branding)
- \[ ] Categories and keywords entered per Part 2
- \[ ] Tested the Apify contact form on UnseenUser's profile (this is the official legal channel)

***

**Document Version:** 4.0 (anonymous Publisher, UnseenUser identified)
**Last Updated:** May 5, 2026
**Master ToS Version:** 4.0
**Document Status:** Ready for Claude Code execution

**Multi-Endpoint Actor Note:** This actor combines 3 Scrape Creators endpoints (`/v1/facebook/profile/reels` + `/v1/facebook/post` + `/v1/facebook/post/transcript`) in a single run. For single-endpoint variants, see other actors in the `UnseenUser/` Facebook suite.

**Facebook Suite Notes:** This actor is part of the UnseenUser Facebook actor suite. Companion actors:

- `UnseenUser/facebook-transcript-scraper` - wraps `/v1/facebook/post/transcript` (standalone caption extraction)
- `UnseenUser/facebook-comments-scraper` - wraps `/v1/facebook/post/comments` + replies (the reel `feedback_id` feeds its fast path)
- `UnseenUser/facebook-pages-scraper`, `UnseenUser/facebook-profile-scraper`, `UnseenUser/facebook-photos-scraper`, `UnseenUser/facebook-marketplace-scraper`

***

*This is the complete safety + build specification for this Actor.*

# Actor input Schema

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

One or more public Facebook page or profile URLs to pull Reels from.

## `maxReels` (type: `integer`):

Stop after this many reels per source. Each underlying request returns 10 reels.

## `enrichReelDetails` (type: `boolean`):

Adds likes, comments, shares, HD/SD URLs and captions to every reel. COST WARNING: each reel triggers one extra call.

## `fetchTranscript` (type: `boolean`):

Adds caption text per reel. Only returns for reels under 2 minutes; longer reels are skipped and flagged, not billed. COST WARNING: each successful transcript triggers one extra call.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/copperkettleyqr"
  ],
  "maxReels": 30,
  "enrichReelDetails": false,
  "fetchTranscript": false
}
```

# 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/copperkettleyqr"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("unseenuser/fb-reels").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/copperkettleyqr"] }

# Run the Actor and wait for it to finish
run = client.actor("unseenuser/fb-reels").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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/copperkettleyqr"
  ]
}' |
apify call unseenuser/fb-reels --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=unseenuser/fb-reels",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Facebook Reels Scraper - Bulk Reels & Metadata [NO COOKIES] ✅",
        "description": "Pull every public Reel from a Facebook page or profile: direct HD MP4 URLs, view counts, play time, thumbnails, audio track info and author details. No login, no cookies. 10 reels per request. Built for trend tracking, content research and bulk reel downloads.",
        "version": "0.0",
        "x-build-id": "XvtnlfkD37hxzsmXF"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/unseenuser~fb-reels/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-unseenuser-fb-reels",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/unseenuser~fb-reels/runs": {
            "post": {
                "operationId": "runs-sync-unseenuser-fb-reels",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/unseenuser~fb-reels/run-sync": {
            "post": {
                "operationId": "run-sync-unseenuser-fb-reels",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Start URLs",
                        "minItems": 1,
                        "type": "array",
                        "description": "One or more public Facebook page or profile URLs to pull Reels from.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxReels": {
                        "title": "Max reels per source",
                        "minimum": 10,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Stop after this many reels per source. Each underlying request returns 10 reels.",
                        "default": 30
                    },
                    "enrichReelDetails": {
                        "title": "Deep enrich each reel (billed per reel)",
                        "type": "boolean",
                        "description": "Adds likes, comments, shares, HD/SD URLs and captions to every reel. COST WARNING: each reel triggers one extra call.",
                        "default": false
                    },
                    "fetchTranscript": {
                        "title": "Fetch reel transcript (billed per reel, under-2-minute reels only)",
                        "type": "boolean",
                        "description": "Adds caption text per reel. Only returns for reels under 2 minutes; longer reels are skipped and flagged, not billed. COST WARNING: each successful transcript triggers one extra call.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
