Facebook Reels Scraper | Play Counts, MP4 | $3/1K avatar

Facebook Reels Scraper | Play Counts, MP4 | $3/1K

Pricing

from $3.00 / 1,000 reels

Go to Apify Store
Facebook Reels Scraper | Play Counts, MP4 | $3/1K

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

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

21

Total users

17

Monthly active users

6 days ago

Last modified

Share

Facebook Reels Scraper

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.

InputRows emitted
https://www.facebook.com/9GAGCuteone row per reel, as deep as resultsLimit asks
https://www.facebook.com/LeonardoDiCapriosame, for that page
a page with no public reelsempty 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

How the Facebook Reels Scraper 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

FieldTypeRequiredDefaultNotes
startUrlsarrayYes—Facebook page/profile URLs. Main URL, handle, or reels-tab URL all work.
resultsLimitintegerNo20Max reels per page, newest first. Facebook serves 10 per request; the run follows the cursor until it has this many.
onlyPostsNewerThanstringNo—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":

CapabilityTypical reel scraperThis Actor
Reel URL, caption, creation dateyesyes
Full reel history, not just page onerarelyyes, follows the cursor
Play count on every rowoften blankyes
Reactions countoften blankyes, on the most recent reels
Comments countoften blankyes, on the most recent reels
Sharesnoyes
Direct video URLsometimesyes
Duration + thumbnailsometimesyes
HD and SD video URLssometimesyes, both
Owner name, URL, verified badgenoyes
Audio track, where Facebook names onenoyes
Page name + follower countnoyes, on every row
Works from a data-centre runno, login wall → emptyyes, residential by default
Empty / private pagesilent empty or fake successskipped + logged, dataset stays reel-only
Bad page named in logs, not chargednoyes

Pricing

Pay per event — you are charged per reel returned, never for pages that had no public reels.

EventWhen it firesRate
Actor startOnce per run$0.001
ReelEach reel row deliveredfrom $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