Facebook Reels Scraper
Scrape public Facebook Page Reels: views, reactions, comments, shares, captions, hashtags, duration and MP4 links. No login needed. $0.35/1k.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
startUrls,resultsLimit,onlyPostsNewerThan(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.00035 per reel = $0.35 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Reel | One Facebook reel delivered to your dataset, with its reel link, video file URL, thumbnails, caption and hashtags, posting time, duration, frame size, soundtrack and its view, reaction, comment and share counts. Sample rows, diagnostics, duplicates and reels removed by your date filter are never charged. | $0.00035 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-16, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
startUrls | Public Facebook Page URLs, one per line. A bare handle (9gag), a Reels-tab URL, a /pg/ URL, a /p/ URL and a profile.php?id= URL all work. Up to 50 Pages per run. A single /reel/ link is not a Page - give the Page it belongs to. | array |
resultsLimit | How many recent reels to take from each Page, newest first. Default 50; raise it up to 200 for a deeper crawl. The first render returns 10 reels and the rest are paginated, so a higher number costs more time but works. | integer |
onlyPostsNewerThan | Optional. Drop reels older than this. Accepts 2026-08-01, a full ISO timestamp, an epoch, or a relative window such as "7 days". Filtering is free - dropped reels are never charged. | string |
onlyPostsOlderThan | Optional. Drop reels newer than this. Same formats as above. Also free. | string |
proxyUrls | Leave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port. | array |
sessionCookies | Optional. Reels tabs are read without an account. If Pages start coming back blocked, paste your own cookie here, and the run uses it for the Pages that need one. In Chrome: open facebook.com while signed in, press F12, then Application > Cookies > https://www.facebook.com, and paste the values as "c_user=…; xs=…". One line per account. Treat these like a password: anyone with them can act as that account, and Facebook may sign the session out or restrict the account for automated use. | array |
What you get
A structured dataset — each result includes fields like:
inputUrlpageNamepageIdpageUrlpageIsVerifiedpageProfilePicturereelIdreelUrlpostIdvideoUrlthumbnailUrlpreviewImageUrlcaptioncaptionLengthExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
1 ready-to-run use cases
Facebook Page Reels - Latest
Get the latest Reels from a public Facebook Page: caption, video link, date, views, reactions and comments. No login.
Related tools in Social Media Scrapers
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
Instagram Post Scraper
Scrape Instagram posts and reels by link or shortcode. Rows carry caption, likes, comments, publish time, carousel media, hashtags. No login. $0.18 per 1,000.
Instagram Profile Scraper
Scrape Instagram profiles from handles or URLs. Get the bio, exact follower and post counts, verified flag, category and bio links. $0.70 per 1,000.
Instagram Reel Scraper
Scrape reels from any public Instagram profile. Play counts, likes, comments, captions, duration, MP4 and cover links, audio. $0.35 per 1,000 reels.
LinkedIn Post Search Scraper
Scrape public LinkedIn posts by keyword: author, text, exact date, reactions, comments and post URL. No login or cookies. $0.90 per 1,000 posts.
LinkedIn Profile Search Scraper
Find public LinkedIn profiles by keyword, title, company, school or location: name, headline, role, profile URL. No login. $0.50 per 1,000.
YouTube Shorts Scraper
Scrape YouTube Shorts by channel or keyword. Titles, ids, URLs, exact views and likes, publish dates, thumbnails. No API key. $0.40/1k.
Where this tool sits
- Categories
- Social Media Scrapers
Facebook Reels Scraper: every reel a public Page has posted, not just the visible ten
Give it Page links and you get their reels back, newest first: the reel link, the video file, the thumbnail, the caption and hashtags, the length, the posting time and the counts underneath.
The Reels tab on a Page shows ten and stops. This keeps going, up to 200 per Page. The honest part is the counts: reactions and comments come back exact, while views and shares are rounded by Facebook before anyone can read them, so 65K is as precise as the public page gets.
| Input | Page links or handles, up to 50 per run |
| Output | One row per reel |
| Ceiling | 200 reels per Page |
| Account needed | None from you |
| Price | $0.35 per 1,000 reels, flat on every plan |
🔍 What Facebook Reels Scraper does
It opens the Page's Reels tab as a signed-out visitor sees it, takes the first batch out of the data already in the page, then pages for the rest until it reaches your limit or the Page runs out.
The same reel found through two spellings of the same Page is delivered once and charged once, keyed on the Page and reel ids together. Hashtags are pulled out of the caption for you, without the #.
Give it the Page, not a single reel. A /reel/<id> link on its own is rejected with an explanation, because there is no Page in it to walk.
📥 What you give it
{
"startUrls": ["https://www.facebook.com/9gag"],
"resultsLimit": 50,
"onlyPostsNewerThan": "30 days"
}
| Field | Default | What it is |
|---|---|---|
startUrls | none | Page links, one per line. A bare handle like 9gag, a Reels-tab link, a /pg/ link, a /p/ link and a profile.php?id= link all resolve. First 50 per run. |
resultsLimit | 50 | Reels per Page, newest first. 1 to 200. The first read returns ten and the rest are paged, so a high number costs more time but works. |
onlyPostsNewerThan | none | Drop reels older than this. A date (2026-08-01), a full timestamp, an epoch, or a window like 7 days. Dropped reels are never charged. |
onlyPostsOlderThan | none | The other end of the window, same formats. Use both to pull one month. |
proxyUrls | none | Optional. One URL per line if you want the traffic to leave through servers you already pay for. |
sessionCookies | none | Optional, and most runs never touch it. Your own c_user and xs pair, so heavy runs use your account's own rate limit. Treat the values like a password. |
Run it with empty input and you get one labelled sample row, free, so you can see the shape before you spend anything.
📤 What you get back
A real row from a real run, with the preview link trimmed:
{
"ok": true,
"charged": true,
"recordType": "reel",
"inputUrl": "https://www.facebook.com/9gag",
"pageName": "9GAG",
"pageId": "100064681269092",
"pageUrl": "https://www.facebook.com/9gag/",
"pageIsVerified": true,
"reelId": "1613424853508131",
"reelUrl": "https://www.facebook.com/reel/1613424853508131",
"postId": "1566435732189121",
"videoUrl": "https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=1613424853508131",
"thumbnailUrl": "https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=1613424853508131&get_thumbnail=1",
"previewImageUrl": "https://scontent-lax3-2.xx.fbcdn.net/v/t15.5256-10/806072546_158021194...",
"caption": "\"not you!\" #9gag #blackdog",
"captionLength": 26,
"hashtags": ["9gag", "blackdog"],
"time": "2026-09-20T23:33:01.000Z",
"timestamp": 1789947181,
"viewCount": 65000,
"viewCountText": "65K",
"reactionsCount": 1226,
"commentsCount": 17,
"sharesCount": 49,
"sharesCountText": "49",
"durationMs": 26965,
"durationSeconds": 26.965,
"width": 1080,
"height": 1920,
"aspectRatio": 0.5625,
"audioTitle": "9GAG · Original audio",
"audioIsOriginal": true,
"isReshare": false,
"isSponsored": false,
"scrapedAt": "2026-09-21T01:25:04.740Z"
}
| Field | What it is |
|---|---|
reelId, reelUrl, postId | Your key, the public /reel/ permalink, and the underlying post id. |
videoUrl | The video file. Where Facebook publishes a direct link you get that one. Otherwise it is a lookaside.fbsbx.com link, which serves the MP4 to crawlers rather than to a browser tab, so it may not play if you just paste it into one. |
thumbnailUrl, previewImageUrl | The cover image. previewImageUrl is a signed link that expires, so fetch anything you mean to keep. |
caption, captionLength, hashtags | The caption as written, its length, and the tags parsed out of it without the #. |
viewCount, viewCountText | Plays. viewCountText is Facebook's own display string ("65K") and viewCount is that string as a number, so 65000 is rounded, not exact. |
reactionsCount, commentsCount | Exact, straight from the counters. null when Facebook does not publish them on that reel. |
sharesCount, sharesCountText | Shares, rounded the same way views are. |
durationMs, durationSeconds, width, height, aspectRatio | Length and geometry of the video. |
audioTitle, audioIsOriginal, isReshare, isSponsored | The audio track and whether it is the Page's own, plus whether the reel is a reshare or a paid placement. |
time, timestamp, scrapedAt | When it was posted, in ISO and epoch seconds, and when the row was read. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| A reel | ok: true and charged: true | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
Filter on charged == true and you have your data. That flag is what separates real rows from the sample and the diagnostics, not a receipt.
errorCode | What happened |
|---|---|
BAD_INPUT | Not a Page link. A single /reel/ link lands here. |
NOT_FOUND | No public Page at that link. |
NO_REELS | The Page has no Reels tab, or nothing inside your date window. The row carries the filtered count. |
BLOCKED | Facebook served something with no Page in it. Re-running usually clears it. |
PARTIAL | Paging stopped early. The row says how many reels were delivered first, and those are the only ones charged. |
NETWORK | Facebook could not be reached. |
TIME_BUDGET | The run ran out of time before reaching that Page. |
PROXY_INPUT_ADJUSTED | A proxyConfiguration setting this Actor does not use was dropped. The run carried on. |
CHARGE_ERROR | A billing event could not be recorded. Told to you rather than hidden. |
UNEXPECTED_ERROR | Anything else, with the message attached. |
One quirk of the Console's Overview table: it shows the Page, the links and the caption, so the posting time, the counts and the duration read as missing there. Open the row or download the JSON and they are all present.
▶️ How to run it
1. Open Facebook Reels Scraper and click Try for free. 2. Put your Pages into Facebook Page URLs, one per line. 3. Set Reels per Page. Start at 50 and raise it once you have seen the output. 4. Click Start. 5. Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.
💰 How much does it cost?
$0.35 per 1,000 reels. The same rate on every Apify plan, no volume tiers.
You pay for reels that come back with data. The sample row, every diagnostic row, reels dropped by your date filters and the same reel reached twice through two spellings of a Page are not charged, and neither is a Page with no reels on it.
💡 What people use it for
- Watching what a competitor is shipping to Reels each week, with view counts attached.
- Finding the format that travels: sort a Page's 200 newest reels by
viewCountand look at
durationSeconds on the top ten.
- Building a caption and hashtag set from Pages in one niche, ready for a spreadsheet.
- Keeping an archive of your own Page's reels, thumbnails and video links included.
🚧 What it does not do
- Views and shares are rounded.
65Kis what Facebook publishes, so65000is what you get.
Reactions and comments are exact.
- No comment text. You get the comment count. The comments themselves are a separate Actor,
linked below.
- Public Pages only. Private, age-restricted and country-restricted Pages show a signed-out
visitor nothing, and come back as an uncharged diagnostic row.
- A reel with no date on it stays in. If Facebook publishes no timestamp for a reel, a date
window cannot judge it, so it is delivered and charged. Those rows sort last, after every dated reel that matched.
- 200 reels per Page. Past that the Page stops paging for a signed-out reader.
- The video link can expire or refuse a browser. Fetch the file if you want to keep it.
- Nothing is translated. Captions come back in the language they were written in.
🧭 Which Facebook scraper do you need?
| If you want | Use |
|---|---|
| Reels from a Page, past the visible ten | This one |
| Ordinary posts from a Page, with photos and links | Facebook Posts Scraper |
| The comments under a reel or post | Facebook Comments Scraper |
| Posts from a public group | Facebook Groups Scraper |
| The website, email and phone on a Page | Facebook Page Contact Info Scraper |
❓ Questions people ask
Do I need a Facebook account? No. Public Pages read fine without one. sessionCookies is there for people running heavily who would rather use their own account's rate limit.
Can I scrape one reel by its link? Not here. Give the Page it sits on and filter the rows.
Why is viewCount a round number? Because viewCountText is, and that display string is the only play count Facebook publishes. Nobody can give you the exact figure from a public page.
Why did a Page return nothing? It has no Reels tab, everything is outside your date window, or it is restricted to signed-in visitors. The diagnostic row says which.
Is scraping Facebook legal? This reads public Pages only, never private content. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
Can I run it on a schedule? Yes, on Apify's scheduler, or start it from the API and read the dataset when it finishes.
🆘 If something breaks
Open the Issues tab on the actor page. Paste the Page link you used and the run ID, and the log is enough for us to see what happened.