Facebook Media Downloader avatar

Facebook Media Downloader

Pricing

from $1.70 / 1,000 media links

Go to Apify Store
Facebook Media Downloader

Facebook Media Downloader

Get direct source-hosted links for known public Facebook videos, reels, and photos. Export available media variants, captions, author details, and engagement counts when Facebook exposes them, plus one outcome for each accepted URL.

Pricing

from $1.70 / 1,000 media links

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

71

Total users

15

Monthly active users

7 days ago

Last modified

Security

Limited permissions

Share

Facebook Media Downloader helps researchers, creators, and teams resolve known public Facebook videos, reels, and photos. It returns direct source-hosted links, available media variants, public details, and one success or failure outcome for each accepted URL.

📊 Facebook media data

Saved media

Each row in Media results is one public Facebook media item saved from the first eligible occurrence of a target. A post URL can save one row for each public photo in that post, with the post's caption, author, and counts. Repeated references to the same source item are ignored after that first occurrence. A row includes source links, available public details, media variants, and a duration only when trusted source data agrees.

Run steps

  1. Add one or more known public Facebook video, reel, photo, or post URLs.
  2. Pick the preferred video quality.
  3. Start the Actor.
  4. Open Media results for saved media. Open the TARGET-OUTCOMES record in the run's default key-value store for one outcome per accepted URL.

Access limits

The Actor does not search Facebook or crawl Pages, profiles, groups, albums, or stories. It resolves only the known public media URLs you provide.

⚙️ Input

Input fields

FieldTypeWhat it does
urlsstring arrayAccepts 1 to 100 known public Facebook video, reel, photo, post, mobile, or share URLs, plus fb.watch short links.
preferredQualitystringPicks best, hd, or sd for the main video link. If that quality is unavailable, the best available quality is used.

Example input

This is the public input from a successful current beta run:

{
"urls": [
"https://www.facebook.com/watch?v=1358040539510776"
],
"preferredQuality": "best"
}

🧾 Output

Output fields

Each saved row has the same shape for a video, reel, or photo.

FieldTypeWhat it does
facebookIdstringGives the Facebook media ID.
mediaTypestringSays whether the item is a video, reel, or photo.
sourceUrlstring or nullGives the canonical Facebook page when known.
titlestring or nullGives the video or reel title when Facebook shows one.
captionstring or nullGives the public caption or description when exposed.
authorNamestring or nullGives the public author or Page name when exposed.
authorUrlstring or nullGives the public author or Page URL when exposed.
publishedAtstring or nullGives the source publish time when exposed.
thumbnailUrlstring or nullGives a direct thumbnail link when exposed.
downloadUrlstringGives the main direct media link for your quality choice.
qualitystringGives the quality label for downloadUrl.
formatstring or nullGives the file format for downloadUrl when known, such as mp4.
durationSecondsnumber or nullGives video length in seconds when trusted source data agrees. It is null when the value is missing or conflicts.
expiresAtstring or nullGives the time the main link may expire when Facebook exposes it.
downloadLinksarrayLists every direct video and audio variant of this same item. Variants of other Facebook videos are not included.
downloadLinks[].urlstringGives the direct source URL for this variant.
downloadLinks[].qualitystringGives its source quality label, such as HD, SD, or 720p.
downloadLinks[].formatstring or nullGives its file format when known.
downloadLinks[].mimeTypestring or nullGives the media type Facebook states, such as video/mp4 for video or audio/mp4 for a separate audio track.
downloadLinks[].codecstring or nullGives the codec Facebook states when known.
downloadLinks[].widthinteger or nullGives its width in pixels when known.
downloadLinks[].heightinteger or nullGives its height in pixels when known.
downloadLinks[].bitrateinteger or nullGives its bitrate when exposed.
downloadLinks[].durationSecondsnumber or nullGives its length in seconds when trusted source data agrees.
manifestUrlstring or nullLinks to a copy of the video's DASH streaming manifest (MPD file), saved in the run's key-value store when Facebook provides one.
engagementobjectHolds public engagement counts when exposed.
engagement.reactionCountinteger or nullGives known public reactions.
engagement.reactionCountsobjectHolds counts for each reaction type when Facebook exposes them.
engagement.reactionCounts.likeinteger or nullGives known Like reactions.
engagement.reactionCounts.loveinteger or nullGives known Love reactions.
engagement.reactionCounts.careinteger or nullGives known Care reactions.
engagement.reactionCounts.hahainteger or nullGives known Haha reactions.
engagement.reactionCounts.wowinteger or nullGives known Wow reactions.
engagement.reactionCounts.sadinteger or nullGives known Sad reactions.
engagement.reactionCounts.angryinteger or nullGives known Angry reactions.
engagement.commentCountinteger or nullGives known public comments.
engagement.viewCountinteger or nullGives known public views.
engagement.playCountinteger or nullGives known public plays.
engagement.shareCountstring or nullGives the public share count as Facebook shows it. It is exact below 1,000 and rounded above, such as 2.4K.

Example media row (shortened)

This is a genuine row from a successful current-beta run. The row is shortened. It keeps 4 of its 11 variants, and the "..." value marks the omitted variants.

{
"facebookId": "1358040539510776",
"mediaType": "video",
"sourceUrl": "https://www.facebook.com/reel/1358040539510776/",
"title": null,
"caption": "@jackedjumper is bringing viewers directly into the game, capturing high-energy beach volleyball matches from his first-person perspective with Oakley Meta glasses and sharing Reels of his most intense rallies. While on the court he uses Meta AI via his glasses to stay updated on the time, the weather, and to quickly cue up playlists hands-free. Follow @jackedjumper to see the volleyball court from a new perspective.",
"authorName": "Meta",
"authorUrl": "https://www.facebook.com/Meta",
"publishedAt": "2026-06-15T13:55:39.000Z",
"thumbnailUrl": "https://scontent-dfw5-1.xx.fbcdn.net/v/t15.5256-10/724194478_1385363970445175_5489718404653530364_n.jpg?stp=dst-jpg_tt6&cstp=mx1080x1920&ctp=s960x960&_nc_cat=105&ccb=1-7&_nc_sid=be8305&_nc_ohc=5RgUVi5W4I4Q7kNvwGOzYo7&_nc_oc=AdrPVmHKuwsn71CG7bNO1c1UL-ws6HKxBq5KZPOCvgHy9967mXDKNL19PJVRY-tymXI&_nc_zt=23&_nc_ht=scontent-dfw5-1.xx&_nc_gid=A5NPpe5wqaOINkyRKtP1gQ&_nc_ss=70289&oh=00_AQSO79-u4HTESwq_Atl-zdGIsY9cPOVYFxAxMEZ2WBYcDQ&oe=6AEA51D5",
"downloadUrl": "https://video-dfw6-1.xx.fbcdn.net/o1/v/t2/f2/m412/AQOoSdp-4c110y3ApLpYVQB6uwXZ2U7WHiGO1mhewEhbNUAYT2Of7ybYtmHTaNSJtRVJVdbK0F8CQ6Zu1dpU20jHu384cR3JrRhTcmpPfywF1A.mp4?_nc_cat=103&_nc_sid=5e9851&_nc_ht=video-dfw6-1.xx.fbcdn.net&_nc_ohc=LEVdyTqRIS4Q7kNvwFBaDpY&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5GQUNFQk9PSy4uQzMuMTA4MC5kYXNoX2gyNjQtYmFzaWMtZ2VuMl8xMDgwcCIsInhwdl9hc3NldF9pZCI6MTA0ODQyMzcyNzg0NDc1NCwiYXNzZXRfYWdlX2RheXMiOjEzNiwidmlfdXNlY2FzZV9pZCI6MTA4ODQsImR1cmF0aW9uX3MiOjE0LCJ1cmxnZW5fc291cmNlIjoid3d3In0%3D&ccb=17-1&vs=f6437a0bcd4fc163&_nc_vs=HBksFQIYRWZiX3Blcm1hbmVudC9DNjQzREE2OEI5NEUyQ0IwNjE2Q0UwOEVGNzNGNEU4MV9tdF8wX3ZpZGVvX2Rhc2hpbml0Lm1wNBUAAsgBEgAVAhhAZmJfcGVybWFuZW50L0Y4NDg3OTRBOUQ2RjVDNEYzNjQzN0FFNUMyMTUzRkFFX2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACaktvq9peLcAxUCKAJDMywXQCxU_fO2RaIYGmRhc2hfaDI2NC1iYXNpYy1nZW4yXzEwODBwEQB1AmWIqgEA&_nc_gid=A5NPpe5wqaOINkyRKtP1gQ&_nc_ss=70289&_nc_zt=28&oh=00_AQTib4yuZqtpJwVB47hW6jj0xUn_FFsEjZkj-Br3Hqk2jg&oe=6AEA7759&bitrate=4082158&tag=dash_h264-basic-gen2_1080p",
"quality": "HD",
"format": "mp4",
"durationSeconds": 14.166,
"expiresAt": "2026-11-04T00:07:53.000Z",
"downloadLinks": [
{
"url": "https://video-dfw6-1.xx.fbcdn.net/o1/v/t2/f2/m412/AQOoSdp-4c110y3ApLpYVQB6uwXZ2U7WHiGO1mhewEhbNUAYT2Of7ybYtmHTaNSJtRVJVdbK0F8CQ6Zu1dpU20jHu384cR3JrRhTcmpPfywF1A.mp4?_nc_cat=103&_nc_sid=5e9851&_nc_ht=video-dfw6-1.xx.fbcdn.net&_nc_ohc=LEVdyTqRIS4Q7kNvwFBaDpY&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5GQUNFQk9PSy4uQzMuMTA4MC5kYXNoX2gyNjQtYmFzaWMtZ2VuMl8xMDgwcCIsInhwdl9hc3NldF9pZCI6MTA0ODQyMzcyNzg0NDc1NCwiYXNzZXRfYWdlX2RheXMiOjEzNiwidmlfdXNlY2FzZV9pZCI6MTA4ODQsImR1cmF0aW9uX3MiOjE0LCJ1cmxnZW5fc291cmNlIjoid3d3In0%3D&ccb=17-1&vs=f6437a0bcd4fc163&_nc_vs=HBksFQIYRWZiX3Blcm1hbmVudC9DNjQzREE2OEI5NEUyQ0IwNjE2Q0UwOEVGNzNGNEU4MV9tdF8wX3ZpZGVvX2Rhc2hpbml0Lm1wNBUAAsgBEgAVAhhAZmJfcGVybWFuZW50L0Y4NDg3OTRBOUQ2RjVDNEYzNjQzN0FFNUMyMTUzRkFFX2F1ZGlvX2Rhc2hpbml0Lm1wNBUCAsgBEgAoABgAGwKIB3VzZV9vaWwBMRJwcm9ncmVzc2l2ZV9yZWNpcGUBMRUAACaktvq9peLcAxUCKAJDMywXQCxU_fO2RaIYGmRhc2hfaDI2NC1iYXNpYy1nZW4yXzEwODBwEQB1AmWIqgEA&_nc_gid=A5NPpe5wqaOINkyRKtP1gQ&_nc_ss=70289&_nc_zt=28&oh=00_AQTib4yuZqtpJwVB47hW6jj0xUn_FFsEjZkj-Br3Hqk2jg&oe=6AEA7759&bitrate=4082158&tag=dash_h264-basic-gen2_1080p",
"quality": "HD",
"format": "mp4",
"mimeType": null,
"codec": null,
"width": null,
"height": null,
"bitrate": 4082158,
"durationSeconds": 14.166
},
{
"url": "https://video-dfw5-2.xx.fbcdn.net/o1/v/t2/f2/m412/AQNgSUpuUYXNd64vdzR4POlMUCOop3fuKyk6SAb0kvRxIAdfCB-wEdGv4Xw6xwMjIBtt1pjj5AkI8vevgoF12IScp1TKbqOvo-RnA3F_ag.mp4?_nc_cat=100&_nc_sid=8bf8fe&_nc_ht=video-dfw5-2.xx.fbcdn.net&_nc_ohc=wCNXw5iXoZoQ7kNvwHU0k1v&efg=eyJ2ZW5jb2RlX3RhZyI6Inhwdl9wcm9ncmVzc2l2ZS5GQUNFQk9PSy4uQzMuMzYwLnN2ZV9zZCIsInhwdl9hc3NldF9pZCI6MTA0ODQyMzcyNzg0NDc1NCwiYXNzZXRfYWdlX2RheXMiOjEzNiwidmlfdXNlY2FzZV9pZCI6MTA4ODQsImR1cmF0aW9uX3MiOjE0LCJ1cmxnZW5fc291cmNlIjoid3d3In0%3D&ccb=17-1&_nc_gid=A5NPpe5wqaOINkyRKtP1gQ&_nc_ss=70289&_nc_zt=28&oh=00_AQSSVHg5LQc6TSyN3XlZEM-gxKRFcdgkLsH4FdrPEHHV8A&oe=6AEA6B36&bitrate=606709&tag=sve_sd",
"quality": "SD",
"format": "mp4",
"mimeType": null,
"codec": null,
"width": null,
"height": null,
"bitrate": 606709,
"durationSeconds": 14.166
},
{
"url": "https://video-dfw5-2.xx.fbcdn.net/o1/v/t2/f2/m412/AQMme5a8CKLEw7Uxc8LskyqdEgreJ1oSRkwml3zHkcx1n35lK0-cfP-cKFC7Xp9a47BrRYFJ_u1lyA-iVGcNOcoB5ycFr1Jx-qrhs7g.mp4?_nc_cat=100&_nc_sid=9ca052&_nc_ht=video-dfw5-2.xx.fbcdn.net&_nc_ohc=0PIFd7FMbqEQ7kNvwF7rGTG&efg=eyJ2ZW5jb2RlX3RhZyI6ImRhc2hfcjJhdjEtcjFnZW4ydnA5X3E5MCIsInZpZGVvX2lkIjoxMzU4MDQwNTM5NTEwNzc2LCJvaWxfdXJsZ2VuX2FwcF9pZCI6MCwiY2xpZW50X25hbWUiOiJ1bmtub3duIiwieHB2X2Fzc2V0X2lkIjoxMDQ4NDIzNzI3ODQ0NzU0LCJhc3NldF9hZ2VfZGF5cyI6MTM2LCJ2aV91c2VjYXNlX2lkIjoxMDg4NCwiZHVyYXRpb25fcyI6MTQsImJpdHJhdGUiOjE4NDY3NDEsInVybGdlbl9zb3VyY2UiOiJ3d3cifQ%3D%3D&ccb=17-1&_nc_gid=A5NPpe5wqaOINkyRKtP1gQ&_nc_ss=70289&_nc_zt=28&oh=00_AQT7hgCdqbsjiNOiqEYuu4Z8VgnJSoU4MTmGku20ntda7w&oe=6AEA5AD5",
"quality": "1080p",
"format": "mp4",
"mimeType": "video/mp4",
"codec": "av01.0.08M.08.0.111.01.01.01.0",
"width": 1080,
"height": 1920,
"bitrate": 1846741,
"durationSeconds": 14.166
},
{
"url": "https://video-dfw6-2.xx.fbcdn.net/o1/v/t2/f2/m412/AQMkVq4VFdzkhOEmwnMCYyKDYfD6el8UAOoET7gPHXI-0Bhr0F18JUBcb3teb_V3dLF4d9ZCXs15OsDbfExiWlnBVQR7dlBZIRhNSQQ.mp4?_nc_cat=110&_nc_sid=9ca052&_nc_ht=video-dfw6-2.xx.fbcdn.net&_nc_ohc=I-u9TsG-P5AQ7kNvwGlrV2X&efg=eyJ2ZW5jb2RlX3RhZyI6ImRhc2hfbG5faGVhYWNfdmJyM19hdWRpbyIsInZpZGVvX2lkIjoxMzU4MDQwNTM5NTEwNzc2LCJvaWxfdXJsZ2VuX2FwcF9pZCI6MCwiY2xpZW50X25hbWUiOiJ1bmtub3duIiwieHB2X2Fzc2V0X2lkIjoxMDQ4NDIzNzI3ODQ0NzU0LCJhc3NldF9hZ2VfZGF5cyI6MTM2LCJ2aV91c2VjYXNlX2lkIjoxMDg4NCwiZHVyYXRpb25fcyI6MTQsImJpdHJhdGUiOjc2NjA4LCJ1cmxnZW5fc291cmNlIjoid3d3In0%3D&ccb=17-1&_nc_gid=A5NPpe5wqaOINkyRKtP1gQ&_nc_ss=70289&_nc_zt=28&oh=00_AQR50d1OVhoBaQF0RzJBPVbcZxRjzvgvqdGezk9ak_xPDg&oe=6AEA519B",
"quality": "unknown",
"format": "mp4",
"mimeType": "audio/mp4",
"codec": "mp4a.40.5",
"width": null,
"height": null,
"bitrate": 76072,
"durationSeconds": 14.166
},
"..."
],
"manifestUrl": "https://api.apify.com/v2/key-value-stores/yFuYO6oE5moXLlT5O/records/manifest-1358040539510776.mpd?signature=1LNVPxv6gXqd9DnqnjRBt",
"engagement": {
"reactionCount": 4300,
"reactionCounts": {
"like": 3782,
"love": 406,
"care": 60,
"haha": 10,
"wow": 33,
"sad": 1,
"angry": 8
},
"commentCount": 843,
"viewCount": 191576,
"playCount": 558693,
"shareCount": null
}
}

Target outcomes

Every accepted URL gets one report, even when no media row is saved. The Actor saves these reports in the run's default key-value store under the exact record name TARGET-OUTCOMES. Open the run's Key-value store and select that record.

The report uses the accepted URL, a boolean success value, the known processing stage, and a short reason.

For an unresolved target, the report points to the known stage. The Actor marks content unavailable only when Facebook says the video is unavailable or shows it only to signed-in adults. Otherwise, it gives the narrower known failure and does not guess.

The run still succeeds when some targets fail. The run ends as failed only when no row is saved and Facebook could not provide a usable page for every target after the allowed attempts. The TARGET-OUTCOMES record is still saved in that case.

FieldTypeWhat it does
urlstringIdentifies the accepted Facebook URL.
stagestringNames the stage reached: validation, fetch, redirect, unavailable, parsing, spending-limit, or success.
successbooleanSays whether the target succeeded (true) or failed (false).
reasonstringGives the known success or failure reason without guessing that content is unavailable.

💳 Pricing

This Actor uses pay-per-event pricing. You pay for each public video, reel, or photo saved with a direct source link. A target that produces no saved media is not charged. The saved DASH manifest copy is part of the same media charge.

🔌 Integrations

Use it in Apify Console or through the Apify API. You can also schedule runs, send webhooks, or connect Apify integrations to the dataset and the TARGET-OUTCOMES key-value-store record.

❓ FAQ

Why did my accepted URL return no media?

Open the TARGET-OUTCOMES record in the run's default key-value store. It tells you whether validation, fetching, redirects, or media parsing failed, or whether Facebook said the video is unavailable. A post that has only links or text and no public photo or video gets a failed report, but the run does not fail. Some failures are temporary, so running the same URL again can work.

What happens when the same media appears more than once?

The Actor saves the first eligible match and ignores later references to the same source item. The saved row shows the first match. It does not combine later URLs or handles into that row.

Can it download private Facebook videos?

No. It works with publicly reachable media and does not bypass private, friends-only, closed-group, deleted, or login-only access limits.

Does it need a Facebook login?

No. It resolves known public Facebook URLs without an interactive Facebook login.

Is this a Facebook video downloader?

It is an Apify Actor. Run it in Apify Console or through the Apify API, then add known public Facebook video, reel, photo, or post URLs.

Can it find Facebook videos by keyword?

No. Add the known public video, reel, photo, or post URLs you want to resolve. The Actor does not search Facebook or crawl Pages, profiles, groups, albums, or stories.

Does it store the media file?

No. It returns source-hosted Facebook links and does not copy the video or photo file. It saves only a copy of the DASH manifest when Facebook provides one. Facebook may rotate or expire the links, so use them soon and run the Actor again when you need a fresh link.

Can I use it from an app or workflow?

Yes. Use the Apify API, schedules, webhooks, or Apify integrations with the dataset and target report.

No. The Actor reads only the media item that matches the submitted URL. Every link in downloadLinks is a variant of that same item.

Why did my whole run fail?

The run fails only when no row is saved and Facebook could not provide a usable page for any target after the allowed attempts. You are not charged for those targets. Try the run again later.

Can I choose HD or SD?

Yes. The choice sets the main video link. If that quality is missing, the Actor uses the best available one and keeps the variants it found.

When is duration empty?

The Actor returns durationSeconds only when trusted source data agrees. If the value is missing or conflicts, it returns null.

Does “without watermark” mean the Actor edits the file?

No. It returns the source URL Facebook exposes. It does not remove marks, transform files, or transcode media.

📝 Changelog

v4.0 (03-11-2026)

  • urls now takes a list of objects such as { "url": "https://www.facebook.com/watch?v=1358040539510776" }, not plain strings. Each URL must be a complete link that starts with https://. If you send plain strings through the API or a task, change your input to this object form.
  • Adds support for public Facebook post URLs. A post can save one row for each public photo or video in it, with the post's caption, author, and counts. A post with no public photo or video gets a failed report, but the run does not fail.
  • Share links that open a public post now return that post's media.
  • Adds support for fb.watch short links.
  • Lowers the price per media item.

v3.0 (30-10-2026)

  • Removes the downloadAvailable field from media rows. It was always true on saved rows, so it gave no information. There is no replacement.
  • downloadUrl and downloadLinks now hold only direct video and audio files. The DASH streaming manifest (MPD file) moves to the new manifestUrl field, which links to a saved copy of the manifest. If you read manifests from downloadUrl or downloadLinks, read manifestUrl instead.
  • downloadLinks now lists only links for the submitted video. Links for other Facebook videos no longer appear in a row.
  • Adds codec and mimeType to each item in downloadLinks when Facebook states them.
  • Adds engagement.shareCount as the share count Facebook shows, such as 2.4K.
  • Reports a video Facebook says is not available, such as a deleted or private one, without failing the run.
  • Reliability improvements.

v2.0 (07-09-2026)

  • Removes the engagement.shareCount field from media rows. There is no replacement.
  • Documents TARGET-OUTCOMES in the run's default key-value store as the supported place for one outcome per accepted URL.

v1.2

  • Reports the matching format when Facebook provides a direct media file or DASH manifest.
  • Adds public counts for individual reaction types when Facebook exposes them.

v1.1

  • Added public photo support.
  • Added a target outcome report for every accepted URL.
  • Added known stages for fetching, redirects, source access, parsing, and limit failures.

v1.0

  • Simplified output rows to direct Facebook video and reel media links.
  • Removed Apify-hosted media copies.
  • Lowered media item pricing.

v0.1

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré