Facebook Reels Scraper | Play Counts, MP4 | $3/1K
Pricing
from $3.00 / 1,000 reels
Facebook Reels Scraper | Play Counts, MP4 | $3/1K
Every reel on any public Facebook page, newest first. Play counts, caption, duration, audio, owner and HD MP4 URL on every row, plus reaction, comment and share counts on the latest reels. Follows the reels cursor for full history. Date cut-off, no login. $3 per 1,000 reels.
Pricing
from $3.00 / 1,000 reels
Rating
0.0
(0)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
21
Total users
17
Monthly active users
6 days ago
Last modified
Categories
Share
Facebook Reels Scraper

Give it a Facebook page, get its whole reel history back, newest first — play counts, caption, creation date, duration, audio track, owner, HD and SD video URLs, and the page's own name and follower count. The most recent reels also carry the reactions, comments and shares most reel scrapers leave blank. One row per reel.
| Input | Rows emitted |
|---|---|
https://www.facebook.com/9GAGCute | one row per reel, as deep as resultsLimit asks |
https://www.facebook.com/LeonardoDiCaprio | same, for that page |
| a page with no public reels | empty dataset for that page (logged, not charged) |
Pure HTTP over a residential proxy. No browser, no login, no cookies, no third-party unlocker.
Why Use This Scraper?
Two things break most Facebook reel scrapers: Facebook hands a login wall to data-centre IPs, so they return nothing, and even when they do return reels they skip the engagement counts. This runs over a residential proxy by default, so it gets the real page — and it recovers the reaction, comment and share numbers from the page's own data. Private or empty pages leave the dataset clean (no filler error rows); a real fetch outage still fails the run.
How It Works

Each page URL is normalised to its reels tab and fetched over a residential proxy. The reels tab is server-rendered, so the HTML already carries the page's most recent reels as structured data. The Actor parses each reel and joins back the reaction, comment and share counts Facebook normalises into a separate part of the response.
That HTML covers only the first ~10 reels. It also embeds the reels connection's own id and cursor,
so the Actor pages the same connection ten at a time from there until it reaches your
resultsLimit, the page runs out of reels, or your date cut-off is passed — at no extra page fetch.
Rows from those deeper pages carry every field except the engagement counts, which Facebook only
publishes in the first response; each row says which source it came from in engagementSource.
A page that returns no public reels is skipped and logged; it does not write an error object into the dataset.
Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
startUrls | array | Yes | — | Facebook page/profile URLs. Main URL, handle, or reels-tab URL all work. |
resultsLimit | integer | No | 20 | Max reels per page, newest first. Facebook serves 10 per request; the run follows the cursor until it has this many. |
onlyPostsNewerThan | string | No | — | Keep only reels created on/after this date (ISO). Older reels dropped, not charged. |
Example input
{"startUrls": [{ "url": "https://www.facebook.com/9GAGCute" }],"resultsLimit": 20}
Output Schema
One row per reel, page context denormalised onto each row so a spreadsheet needs no second lookup:
{"reelUrl": "https://www.facebook.com/reel/1310318585490776","reelId": "1310318585490776","caption": "meow code crashing","createdAt": "2026-08-25T12:55:49.000Z", // ISO 8601"createdTimestamp": 1787662549, // epoch seconds, as Facebook gives it"postId": "1656751975822226","reactionsCount": 838, // null on rows past the first page — see engagementSource"commentsCount": 15,"sharesCount": 80, // exact when Facebook exposes a plain integer"sharesText": "80", // Facebook's own label, e.g. "2.6K", when that is all it gives"engagementSource": "reels-tab", // "reels-tab" = has engagement, "pagination" = does not"playCountReduced": "321K", // Facebook's own rounded label"playCountApprox": 321000, // that label parsed — APPROXIMATE, see below"durationMs": 12138,"durationSeconds": 12.1,"width": 1080,"height": 1920,"thumbnailUrl": "https://scontent.xx.fbcdn.net/v/t15.5256-10/...","videoUrl": "https://video.xx.fbcdn.net/o1/v/t2/f2/...mp4", // direct, time-limited"videoUrlHd": "https://video.xx.fbcdn.net/o1/v/t2/f2/m366/...mp4","videoUrlSd": "https://video.xx.fbcdn.net/o1/v/t2/f2/m412/...mp4","ownerId": "100077223652881","ownerName": "9GAG Cute","ownerUrl": "https://www.facebook.com/9GAGCute","ownerVerified": true,"ownerType": "FACEBOOK_USER","isReshare": false,"reshareCreatorName": "9GAG Cute","trackTitle": null, // only where Facebook names a track"soundtrackId": null,"soundtrackType": null,"pageUrl": "https://www.facebook.com/9GAGCute","pageName": "9GAG Cute","pageId": "100077223652881","pageFollowerCountText": "3.7M", // Facebook's own rendered label"scrapedAt": "2026-08-29T13:56:46.713Z"}
Soft misses (not written to the dataset)
Private, restricted, empty, or out-of-range pages are logged and not charged. They do not appear as dataset rows — the dataset only contains reel records.
What Makes This Richer Than the Competition
Built from the open complaints on other Facebook reel scrapers — missing likes/comments, "no results without login", and "returns success with no stats":
| Capability | Typical reel scraper | This Actor |
|---|---|---|
| Reel URL, caption, creation date | yes | yes |
| Full reel history, not just page one | rarely | yes, follows the cursor |
| Play count on every row | often blank | yes |
| Reactions count | often blank | yes, on the most recent reels |
| Comments count | often blank | yes, on the most recent reels |
| Shares | no | yes |
| Direct video URL | sometimes | yes |
| Duration + thumbnail | sometimes | yes |
| HD and SD video URLs | sometimes | yes, both |
| Owner name, URL, verified badge | no | yes |
| Audio track, where Facebook names one | no | yes |
| Page name + follower count | no | yes, on every row |
| Works from a data-centre run | no, login wall → empty | yes, residential by default |
| Empty / private page | silent empty or fake success | skipped + logged, dataset stays reel-only |
| Bad page named in logs, not charged | no | yes |
Pricing
Pay per event — you are charged per reel returned, never for pages that had no public reels.
| Event | When it fires | Rate |
|---|---|---|
| Actor start | Once per run | $0.001 |
| Reel | Each reel row delivered | from $0.003 |
Private, empty, or out-of-range pages are never charged.
Notes & Limitations
Reels come back newest first, as deep as resultsLimit asks. Facebook serves 10 per request, so
30 reels means three requests; the run stops early when the page runs out or your date cut-off is
passed.
Engagement counts cover the most recent reels only. Reactions, comments and shares live in
normalized feedback blocks that Facebook includes in the reels-tab HTML but omits from the
pagination response, so rows past roughly the first 10 have them null. Every row states which it
is in engagementSource (reels-tab or pagination), so this is visible in the data rather than
something to infer from a column of nulls. playCountReduced and playCountApprox, by contrast,
are populated on every row.
playCountApprox is approximate by construction: logged out, Facebook publishes only its
rounded display figure, so "321K" is anything from 320,500 to 321,499. Do not sum these and call
the total exact.
videoUrl is a direct, time-limited Facebook CDN link — fetch or store the file promptly, as
the URL expires. pageFollowerCountText and sharesText are Facebook's own rounded labels
(e.g. "3.7M", "2.6K"); reactionsCount and commentsCount are exact integers.
FAQ
Do I need a Facebook account, login, or cookies? No. Nothing is authenticated. The Actor reads the same public reels a logged-out visitor sees.
Why do other reel scrapers return nothing for me? Facebook serves a login wall to data-centre IPs. This Actor uses a residential proxy by default, so it gets the real page.
Can I get more than ~10 reels per page?
Yes. Set resultsLimit to what you need — the run follows the reels cursor ten at a time until it
reaches that number, the page runs out, or your date cut-off is passed.
Do I get likes and comments?
On the page's most recent reels, yes — reactionsCount and commentsCount, exact. Facebook only
publishes those counts in the first response and omits them from the pagination it serves for older
reels, so rows beyond roughly the first 10 carry null there. Each row says which it is in
engagementSource, and playCountReduced/playCountApprox are populated on every row regardless.
Why is playCountApprox "approximate"?
Because logged out, Facebook publishes only the rounded label — "321K", not 321,438. There is no
exact figure in the response to return. Any actor promising exact logged-out play counts is not
reading them from this source.
What if a run returns nothing? It exits FAILED with a reason rather than reporting success with an empty dataset — unless every requested page was genuinely reel-less, which exits SUCCEEDED with a row per page explaining why.
🤖 For AI Agents & LLM Apps
Purpose: scrape a Facebook page's reels with engagement. Give it page URLs, get one flat row per reel including reactions, comments and shares.
Minimal tested input:
{ "startUrls": [{ "url": "https://www.facebook.com/9GAGCute" }], "resultsLimit": 20 }
Output fields (flat, one row per reel): reelUrl, reelId, caption, createdAt,
createdTimestamp, postId, playCountReduced, playCountApprox, engagementSource,
reactionsCount, commentsCount, sharesCount, sharesText, width, height,
videoUrlHd, videoUrlSd, ownerName, ownerUrl, ownerVerified, ownerType,
isReshare, reshareCreatorName, trackTitle, soundtrackId, soundtrackType,
durationMs, durationSeconds, thumbnailUrl, videoUrl, ownerId, pageUrl,
pageName, pageId, pageFollowerCountText, scrapedAt.
Billing: one reel event per reel row, plus one actor start. Pages with no public reels are
not charged and do not appear in the dataset.
Behaviour worth knowing: returns reels newest-first as deep as resultsLimit asks, ten per
request. engagementSource tells you whether a row has engagement counts: "reels-tab" rows do,
"pagination" rows have reactionsCount/commentsCount/sharesCount null because Facebook
omits them from the pagination response — that is not a scrape failure. playCountApprox is parsed
from Facebook's rounded label, so never present it as exact or sum it into an exact total;
reactionsCount/commentsCount are exact integers while sharesText/pageFollowerCountText
are Facebook's rounded labels; videoUrl is a direct time-limited CDN link; an empty run fails
loudly unless every page was genuinely reel-less.
⚠️ Disclaimer
This Actor collects only publicly available information from Facebook — the same reels any logged-out visitor can see. It does not log in, use cookies, or access private content. You are responsible for using the output in line with Facebook's terms and applicable data protection law, including GDPR where personal data is involved.
SEO Keywords
facebook reels scraper, facebook reels api, scrape facebook reels, facebook video scraper, facebook reels views, facebook reels likes comments, facebook page reels, facebook reels downloader, facebook reels engagement, facebook short video scraper, facebook reels data export, facebook reels metadata