Facebook Video Scraper
Pricing
from $2.99 / 1,000 results
Facebook Video Scraper
Pricing
from $2.99 / 1,000 results
Rating
0.0
(0)
Developer
Fertech
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Facebook Video & Reel Scraper
Give it Facebook video, reel or story URLs. Get back structured data with exact play and view counts — where the page shows one rounded figure and calls it "views".
No login, no cookies, no session tokens.
One flat rate, whatever Apify plan you are on. No plan ladder — see the pricing section of this listing for the current rate.
Why this one
Exact numbers, not rounded ones. Facebook's page rounds what it shows and hides the rest. On one real post:
| Facebook's page shows | This Actor returns | |
|---|---|---|
| Plays | "486K views" | 486,574 |
| Views | nothing at all | 306,796 |
| Reactions | "5K reactions" | 5,019 |
Plays and views are not the same number. Plays count replays. The figure Facebook labels "views" on the page is really the play count — the actual view count, 306,796 against 486,574 plays on that post, is not shown anywhere. Both come back, under their own names.
What you get
Feed it a list of Facebook video, reel or story URLs, get one structured record per video.
- Engagement: exact plays, views, reactions and comments
- Reactions: the type breakdown, not just the total
- Video: caption, hashtags, mentions, dimensions, publish time
- Owner: page or profile name, id, URL, picture
- Media: video and thumbnail URLs
Input
{"postURLs": ["https://www.facebook.com/reel/1234567890123456/","https://www.facebook.com/examplepage/videos/behind-the-scenes/1234567890123456/","https://fb.watch/ExampleAB1/","https://www.facebook.com/share/r/ExampleCD2/","https://m.facebook.com/story.php?story_fbid=pfbid0...&id=100000000000002"],"maxAttemptsPerUrl": 4}
Every URL shape Facebook hands out works — the app's share sheet, the
desktop address bar and the mobile site all produce different formats, and
all of them are accepted. Tracking parameters (mibextid, extid, ref)
are ignored, so the same post submitted in two forms is fetched, delivered
and charged once.
Output
One record per URL. Field names, types and shapes are exactly what the Actor emits; values are illustrative:
{"inputUrl": "https://www.facebook.com/reel/1234567890123456/","id": "1234567890123456","url": "https://www.facebook.com/watch/?v=1234567890123456","type": "Video","caption": "Behind the scenes from last weekend #liveshow #backstage #fyp","hashtags": ["liveshow", "backstage", "fyp"],"mentions": [],"reactionsCount": 5019,"topReactions": ["Like", "Love", "Haha", "Care", "Angry"],"commentsCount": 25,"playCount": 486574,"viewCount": 306796,"shareCount": null,"timestamp": "2026-09-08T09:01:34.000Z","ownerName": "Example Page","ownerId": "100000000000001","ownerUrl": "https://www.facebook.com/people/Example-Page/100000000000001/","ownerProfilePicUrl": "https://scontent.xx.fbcdn.net/...jpg","width": 720,"height": 1280,"videoUrl": "https://video.xx.fbcdn.net/...mp4","thumbnailUrl": "https://scontent.xx.fbcdn.net/...jpg"}
videoUrl and thumbnailUrl are signed and time-limited — download the
media rather than storing the link.
A number that is missing is null, never 0. A zero here always means a
real zero. shareCount is always null: Facebook publishes no share count on
this surface.
Errors
A URL that cannot be scraped still produces a record, carrying error and
errorDescription:
error | Meaning | Retried |
|---|---|---|
invalid-url | Not a Facebook video, reel or story URL | no |
unresolved-link | A share link could not be resolved to a video — its redirect failed, or it led somewhere that is not a video | no |
not-found | Removed, private, or never existed | no |
blocked | Facebook served no data for this video on any attempt | yes, and the exit IP is rotated once it has failed enough times |
unsupported-page | A page loaded but named no video | no |
network | Connection, TLS, timeout or proxy failure | yes |
Facebook rate-limits repeated requests from one IP. The Actor detects that and retries, dropping an exit IP once it has failed enough times, so this rarely reaches your dataset — and retries are not charged. You submit each URL once and pay once, whatever it takes.
Pricing: every submitted URL is charged once
See the pricing section of this listing for the current rate.
One URL in, one charge out.
Posts get removed, accounts go private, and Facebook rate-limits repeated requests. When a URL can't be scraped you get an error record instead of a video record, so you always know what happened to it — and it costs the same as a delivered one.
Retries and duplicates are not charged on top. You pay once per URL you submit, however many attempts it takes.
Requirements
Residential proxies are recommended. Facebook rate-limits repeated requests from one IP within seconds, so an unproxied run returns mostly empty pages.
The Actor uses Apify residential proxies by default, so there is nothing to configure — no proxy picker in the input form, though an API caller can still override it.
Residential proxies are not included in the Apify Free plan. On the Free plan this Actor stops with a clear message rather than spending your credit on requests that mostly cannot succeed.
Limitations
- Video content only. Photo posts, page feeds, profiles and groups are not supported.
- Comment text is not returned;
commentsCountis. shareCountis always null — Facebook publishes none.
Reading the run summary
Each run writes a summary to the log and to the key-value store, under
RUN_SUMMARY:
requested 200 | delivered 187 (93.5%) | unpaid 0 | notfound 8 | blocked-responses 42 | failed 5 | callbackErrors 0
| Field | What it counts |
|---|---|
requested | URLs you submitted |
delivered | URLs that produced a video record |
notfound | Removed, private or non-existent posts |
failed | URLs that ended in any other error record |
blocked-responses | Responses that were rate-limited — not URLs |
unpaid | URLs processed after the charge budget ran out |
callbackErrors | Rows that could not be written. Should always be 0 |
These do not sum to requested, and that is deliberate. Every URL ends
as exactly one of delivered, notfound or failed. blocked-responses
sits alongside them: one video rate-limited twice and then fetched adds 1 to
delivered and 2 to blocked-responses.
Using the API
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("YOUR_USERNAME/facebook-video-scraper").call(run_input={"postURLs": ["https://www.facebook.com/reel/1234567890123456/"],})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["playCount"], item["ownerName"])
Is scraping Facebook legal?
This Actor collects only publicly available data — information anyone can see without logging in. It does not access private accounts or login-walled content. You remain responsible for how you use the data, particularly regarding personal information and the GDPR. If you plan to process personal data, seek your own legal advice first.
Issues and requests
Found a bug, or want photo posts, page feeds or comment text supported? Open an issue on the Actor's Issues tab — feature demand genuinely drives what gets built next.