Facebook Page Reels Scraper — Facebook Reels API, Views, MP4 avatar

Facebook Page Reels Scraper — Facebook Reels API, Views, MP4

Pricing

from $1.00 / 1,000 reels

Go to Apify Store
Facebook Page Reels Scraper — Facebook Reels API, Views, MP4

Facebook Page Reels Scraper — Facebook Reels API, Views, MP4

Facebook page reels as rows: paste a page link and get views, duration, description, music, post date and a playable MP4 link — with an opt-in transcript per reel. No login, no cookies, exact limit. A page with no reels, a private page and a reel we cannot transcribe are never charged.

Pricing

from $1.00 / 1,000 reels

Rating

0.0

(0)

Developer

Steadyfetch Team

Steadyfetch Team

Maintained by Community

Actor stats

0

Bookmarked

42

Total users

22

Monthly active users

2 hours ago

Last modified

Share

Paste a reel link and get that reel. Paste a page link and get its reels. Most reel scrapers take a page and refuse the link you actually have; this one takes both, in the same run, in the same columns. One JSON row per reel: the reel ID and permalink, its description, the date it was posted, its duration in seconds, its view count, the music it uses, the page that posted it, a playable MP4 link and the moment that link expires — and, from a pasted reel link, the like, comment and share counts too. From $1.00 per 1,000 reels on the Business plan ($3.00 on the free plan), platform usage included, no start fee. You are charged only when a row lands in your dataset: a page with no reels, a page Facebook will not show without a login, a reel that is gone and a reel we could not transcribe all cost $0.

Coming back for fresh reels? A page posts reels in bursts — a few a week for most pages, several a day for publishers. To collect on a schedule, open Schedules in Apify Console, add this actor (or a task saved from it) with the same input — e.g. { "pages": ["ladbible"], "maxItems": 30 } — and pick how often. A re-run costs only what is new: a reel already delivered to your account is skipped, with no row and no charge, and the run keeps reading past the reels you already hold to find new ones; that memory lasts 90 days. With transcripts on, a reel you already have whose transcript never came back is handed over with the transcript bought for it — the reel is not charged again, the transcript is charged once. Weekly suits most pages; daily suits a publisher. More on how often this data changes.

Using an AI agent? Pin this actor in Apify's MCP server with one link: https://mcp.apify.com?tools=steadyfetch/facebook-reels-scraper

  • Actor id: steadyfetch/facebook-reels-scraper
  • Input: { "pages": ["ladbible"] } — the one field to set. Or { "reelUrls": ["https://www.facebook.com/reel/1234567890"] } for individual reels.
  • Cap the bill: set maxTotalChargeUsd on the run (a run option, not Actor input), e.g. 0.50 — the run stops when it reaches it.
  • Your cap is the cap. maxItems (default 30) caps the whole run — the run never delivers or bills a row past it, across every page and every link. If your input carries resultsLimit, limit or count instead — the names other reels scrapers use — the smallest of them is read as maxItems and one uncharged note row says so. Add maxTotalChargeUsd and the run stops at whichever comes first; rows already in hand ship, uncharged if they could not be billed. An ask past what this actor serves in one run — more than 2,000 rows, or a run clock outside 30-3,600 seconds — is never refused: the run starts, continues at the nearest end of the range, and one uncharged row names what you asked for and what bound it.

Just want to see it work? Click Start with nothing set and the run returns built-in sample rows — the exact output shape, read from nothing and charged nothing.

Want the spoken words too? Turn on Include transcript (includeTranscript) and every delivered reel is also transcribed — transcript, transcriptLanguage, transcriptDurationSeconds and timestamped transcriptSegments ride the same row, at $0.0075 per transcript actually produced.

What one row looks like

A real delivered row, built by this actor's own parser from a harvested page listing:

{
"reelId": "2430902544051423",
"postId": "1389159413245942",
"url": "https://www.facebook.com/reel/2430902544051423",
"description": "Who has the better snacks, England or Scotland? David Tennant decides ⚔️\n\n#davidtennant #england #scotland",
"createdAt": "2026-05-20T17:15:38.000Z",
"durationSeconds": 685.44,
"viewCount": 3000000,
"viewCountIsExact": false,
"pageName": "LADbible",
"pageId": "100064556895235",
"pageUrl": "https://www.facebook.com/LADbible",
"pageIsVerified": true,
"source": "page_feed",
"transcriptStatus": "not_requested",
"status": "delivered",
"charged": true
}

videoUrl, videoUrlExpiresAt and thumbnailUrl ride the same row — they are signed links that stop working after a few hours, so they are not reprinted here. From a pasted reel link the row also carries likeCount, commentCount, shareCount and the exact view count. Every column is listed in What you get, below; a reel that could not be delivered carries the same columns with null in them plus a status saying why, and no result fee.

What you put in

InputWhat it takes
pagesFacebook pages, one to a line — a page name (ladbible), a page slug, or a full page link. Public Facebook Pages only: most personal profiles cannot be read, so a personal profile's link comes back as page not found, with no result fee. The page's reels come back newest first, after any pinned reel.
reelUrlsIndividual reel links: facebook.com/reel/<id>, facebook.com/share/r/<code>, facebook.com/watch/?v=<id>, fb.watch/<code>, facebook.com/<page>/videos/<id>. Each returns its own row.
startUrlsOne list for both kinds, for moving over from another scraper. Every line is sorted into the right door before anything is bought, so a reel link never costs a page read and a page link never costs a lookup.
maxItemsThe hard ceiling on rows, split evenly across your pages. Default 30, up to 2,000 per run; ask for more and the run continues at 2,000 with one uncharged row saying so.
newerThan / olderThanA date window on the reel's own post date.
includeTranscriptThe spoken words, charged only when one was produced.
includeSeen · resumeFromDatasetIdRe-run the same pages without paying for reels you already have. With transcripts on, a reel you already have whose transcript never came is handed back with the transcript bought and nothing else charged.

Mix pages and reel links freely. A reel link put in the pages box is routed to the reel door automatically rather than refused, and one uncharged note row says so.

What you get

ColumnWhat it is
reelId · postId · urlThe reel's own ID, the post ID behind it, and the permalink you can open.
descriptionThe reel's text, as the page wrote it. Present on page listings and on pasted links alike.
createdAtWhen the reel was posted, ISO-8601 UTC, from Facebook's own creation time.
durationSecondsThe reel's length.
viewCountPlays, as Facebook publishes them.
likeCount · commentCount · shareCountNumbers on a row that came from a pasted reel link; explicit null on a row that came from a page listing — Facebook's reels feed does not carry them, and the row says so rather than buying a second read you did not ask for.
videoUrl · videoUrlExpiresAtA directly playable MP4 link, and the moment Facebook's signature on it stops working (about five days out).
thumbnailUrlThe reel's cover image.
musicTitle · musicArtistThe attached audio track where the reel has one.
pageName · pageId · pageUrl · pageIsVerifiedThe page that posted it.
sourcepage_feed or link — which door this row came through.
transcript · transcriptLanguage · transcriptDurationSeconds · transcriptSegments · transcriptStatus · transcriptReason · transcriptChargedThe transcript leg, always present, explicit null when there is no transcript and a reason that says which.
charged · chargedEvents · status · statusReason · retryableWhat billed, what happened, and whether a re-run is worth it.

What is null, and why. likeCount, commentCount and shareCount are on a row served by the reel-link door, because that is the only Facebook surface that publishes them. A page listing carries views and duration, so on those rows the three counts are null — the Facebook answer, not a scrape miss. Every column is present on every row: a value or null, never a column that comes and goes.

Column names are ours and they stay put. Facebook's wire is read in one place and renamed once, so a Facebook rename does not rename your columns, and a fixed-schema table or sheet never breaks on a new row.

What is never charged

  1. A page with no reels, a page that does not exist, and a page Facebook will not show without a login — each one ships as a labelled row that says which. Open the page in a private window to check it yourself. This actor reads public Facebook Pages and cannot read most personal profiles, so a personal profile's link — even one that opens for you in your browser — comes back as page not found.
  2. A pasted reel link Facebook answers is gone or private: one uncharged row saying so, never an empty run that looks like success.
  3. A read that failed on our side — a wall, a rate limit, a timeout: one uncharged row that says it is worth a re-run.
  4. Reels dropped by your own newerThan / olderThan window. They filter on the reel's own post date, after the listing, and the status line says how many were dropped.
  5. Reels beyond your maxItems cap, and reels your account already had. A page listing skips those (includeSeen off) and the next new reel takes its place; a reel you pasted a LINK to is one you named, and there is no next reel behind it, so it always comes back either way — marked repeat: true, with no result fee. One exception, and only with includeTranscript on: a reel your account already has whose transcript it never got comes back with the transcript bought for it. The reel is still never charged twice; the transcript is charged once, and the row says exactly that. A reel already answered as having no speech, no audio or being longer than the ceiling is never asked again.
  6. A transcript that could not be produced — no speech, music only, no audio track, an expired media link, a transcription failure, or a reel longer than 180 seconds. The reel row still delivers and still bills; the transcript does not.
  7. Starting a run. There is no start fee, per reel or per run.

Only today's reels?

Set newerThan — 2026-09-01, 1 Sep 2026, 7 days or yesterday. A date with slashes is read month first, as it always was (10/05/2026 is 5 October), and the run adds one uncharged note when it could be read the other way; writing it year first removes the doubt. A date the actor cannot read stops the run before anything is read, and nothing is charged. Page reels arrive newest first, so a daily run with the default limit catches everything posted since. The filter compares against the reel's creation time, which is on every row, and the status line reads back exactly what happened: listed 20, 13 older than your date were dropped (not charged), 7 delivered.

How often the data changes

A busy page posts reels daily; a quiet one posts monthly. viewCount keeps climbing for weeks after a reel is posted, so a weekly re-run on the same page is the cheapest way to watch a reel's reach — with includeSeen off you pay only for what is new, and the run keeps paging past the reels you already hold rather than stopping the moment it meets them. That memory is a key-value store in your own Apify account, so a run started with a scoped API token in restricted-access mode needs key-value store Read, Write and Create permission (or Actor runs set to Full access); without it the run says so on its status line and cannot skip what you already have (Write is what lets the run remember what it delivered; without it every run pays again). The videoUrl is a signed link and Facebook's signature expires about five days out (videoUrlExpiresAt tells you when), so download the MP4 in the same week you fetch the row.

Pricing

EventFree planBronzeSilverBusiness (Gold)
Reel — one row from a page listing$0.003$0.002$0.0015$0.001
Reel lookup — one row from a pasted reel link$0.012$0.008$0.006$0.005
Reel transcript — charged only when one was produced$0.015$0.010$0.0075$0.0075

A page listing row and a pasted-link row never both bill for the same reel: a row bills exactly one of Reel or Reel lookup, and chargedEvents on the row names which. Platform usage is included in all three; there is no start fee.

Your Apify plan decides which column you pay, and the run itself tells you which one it was. A run billed at the Apify free plan column says so on its own run page and names what the same run costs on a paid one — the plan is Apify's, not this actor's. Two things differ on the free plan column, and both only on a re-run of a page: that page is checked at most once an hour — a re-run inside the hour reads nothing, charges nothing, and its row says when the page was last checked ("checked at 08:41 UTC, nothing new since"); a run cut short by its time limit, your maximum cost per run or your item limit, or by Facebook not answering, is not that check, so the next run reads on — and one run reads at most 20 listing pages of reels your account already has, instead of 100. Two more differ for pasted reel links on the free plan column: a link to a reel your account already has comes back from its memory without being read again, so that row carries no like, comment or share counts (turn on includeSeen to read it in full, with no result fee); and a share link, which carries no reel number, is read once to learn which reel it is and remembered after that, at most 10 an hour that turn out to be reels your account already has — past that, the rest wait for the next hour on an uncharged row that says when, and the reel's own facebook.com/reel/ link is always matched without a read. And on the free plan column there is a daily allowance: one account reads from Facebook at most 30 times in any 24 hours (a listing page of about ten reels, or one pasted link, is one read — a full run of the default 30 reels), and all free plan accounts share a daily allowance on this actor that resets at midnight UTC; past either, the run stops cleanly, nothing more is read or charged, and each input it did not reach gets an uncharged row naming the reset time. Paid plans carry no daily allowance. On every plan, a re-run whose page has posted nothing since an earlier run read it to the end stops after the first listing page, with no row charged.

For a faster run, raise the memory. A run starts at 1 GB by default. With transcripts on, most of a run's time goes into pulling the sound out of each reel, and that step gets faster with more memory: at 1 GB a run gets through about twice as many reels a minute as at 512 MB, and 2 GB is faster still. Set Memory under Run options before you press Start. The price per reel is the same at any memory, because platform usage is already included.

Something not right?

Open the Issues tab on this actor with your run ID and the input you used, and it gets looked at. If it earned its keep, a rating helps other buyers find it, and saving the actor keeps it one click away.