100 free credits on signup · no card required

Facebook Download API

One URL in. Clean JSON out.

Send a public Facebook video or Reel URL to /v1/facebook/download and get back a direct link to the video file on Facebook's own CDN. The response is three fields and nothing else: the post id, the media URL, and a reminder that the link expires. 10 credits per video, and you do the fetching.

Credits 10 / video
Input ?url=
Cache 7d
GET · BEARER
Request composing…
Cached 7 days
media URLs ~1h
Works with your stack
cURL Python Node.js Zapier n8n Make MCP
One key · one credit balance · plain REST

The difference

Stop parsing markup. Start reading fields.

On the left, what a headless browser hands you. On the right, what the endpoint hands you.

Scraping it yourself raw HTML · every call
<div class="x1yztbdb x1n2onr6 xh8yej3" data-visualcompletion="ignore"><div class="x78zum5 xdt5ytf"><div dir="auto" class="xdj266r x11i5rnm x1mh8g0r">Weekend build: three settings we changed after your feedback</div></div><div class="x9f619 x1ja2u2z x78zum5"><span class="xt0b8zv x1jx94hy" aria-label="5.2K reactions"><i data-visualcompletion="css-img"></i></span><span class="x193iq5w">331 comments</span><span class="x1s688f">128 shares</span></div><abbr data-utime="1751630400" class="x1i10hfl">3d</abbr><script>requireLazy(["CometResourceScheduler"],function(f){f().schedule({"__bbox":{"require":[["adp_Comet...
×Class names rotate; your selectors break weekly ×Headless browsers, proxies, blocks to babysit ×Counts arrive as strings, not numbers
One GET request 3 typed fields
{
"data": {
"platform": "facebook",
"entity_id": "1093831344793765",
"media_url": "https://cdn.example/video/master.mp4?sig=...",
"mime_type": "video/mp4",
"expires_at": "2026-07-15T13:00:00Z",
"warning": "media_url is short-lived (max 1h) — download promptly or re-request."
},
"request_id": "req_01JZX4M8Q2TE9W"
}
Stable field names, documented nulls No proxies, no browser, no login session Counters are integers you can sort on

The payload

What comes back

{ data, meta?, request_id }
01 Resolve a URL, nothing else

One small object per call. There are no counters, no caption, no author block — this endpoint has a single job, which is to resolve a post URL into a playable file address. If you want the numbers attached to that same post, that is a separate call to the Facebook Post Stats API.

02 The link is Facebook's, not ours

The media URL points at Facebook's CDN, not at a copy we made. That is deliberate. A link we host would be a second copy of someone's video sitting on our infrastructure, and it would also mean lying to you about where the bytes come from. The cost of doing it the honest way is that the link is signed and short-lived.

03 No video means no row

If the post has no video in it, there is nothing to resolve. The normalizer requires a media URL to emit a row at all, so a photo album, a text status or a shared link produces zero items and an error rather than a half-filled object.

Field explorer Pick a key to see its type and the caveats.
string Always set Per item
note

Fixed reminder string that media_url is short-lived. Same text on every response; there for humans reading raw JSON, safe to drop in code.

{
"id": "…",
"media_url": "https://cdn.example/video/master.mp4?sig=...",
"note": "…"
}
Good fit

Reach for this when

  • Archiving the video posts from a Page you run, so your own creative library survives a Page being restricted or a post being taken down.
  • Feeding ad creative into your own analysis chain — frame sampling, OCR on the burned-in text, a model that scores hooks — where you need the actual file and not a description of it.
  • Compliance and brand-safety work: keeping a copy of a public post as it appeared on a given date, alongside a timestamp.
  • Building an internal review tool that plays competitor video without embedding Facebook's player and everything that ships with it.
Different job?

There's an endpoint for that

  • The post is a photo, an album, a status or a shared article. There is no file to hand you — and if you wanted the text and reaction counts, that is the Facebook Post Stats API.
  • You want what is said in the video rather than the video itself. There is a Facebook Transcript API, but transcription is switched off at launch and Facebook has no subtitle shortcut, so it returns 404 today — downloading the file and running your own speech-to-text is the working route. The TikTok Transcript API does return text.
  • You want every video a Page has posted. Start with the Facebook Page Posts API to enumerate the post URLs, then send the video ones through here one at a time.
  • You want the comment thread under the video — use the Facebook Comments API, which returns the comment text, author and like counts.

Pricing

Start free, pay for what comes back

One video resolves for 10 credits — about 5¢ on the monthly plan, 4.5¢ on annual. $5 covers roughly 100 downloads, and calls that error or find no video are never charged.

Estimate your bill
$29/ month
30 videos/day × 10 credits × 365 days = 109,500 credits/yr, or $348/yr on the annual plan plus 98 top-up blocks Whichever plan is cheaper for that volume, divided by 12.
30
102,000
Credits / yr 109,500
Plan Annual $54/yr
Per video

Estimate only, on a full-year basis. 10 credits per returned video. Monthly: $5 per 1,000 credits with $4/1,000 top-ups. Annual: $54 per 12,000 credits with $3/1,000 top-ups. We show whichever plan is cheaper for your annual volume, divided by 12. Failed calls are never charged; cache hits cost the same as fresh calls.

Free trial
100 credits

On signup, no card. Your key is on screen immediately.

Get your free API key
Monthly $5/mo 1,000 credits. Top-ups $4 per extra 1,000.
Annual $54/yr 12,000 credits. Top-ups $3 per extra 1,000.

Entry price, side by side

Cheapest way to start

Verified July 2026 from each vendor's live pricing page
ScraperSocial
$5 / mo 1,000 credits · 100 free credits, no card
Supadata
$5 / mo 300 credits, annual commitment · 100 free/mo
SocialKit
$29 / mo 12,000 credits · 20 free credits
Dumpling AI
$40 / mo Billed annually · free tier size unpublished
ScrapeCreators
$47 pack 25,000 credits, no subscription · 100 free once

Credits are not equivalent units across vendors — each meters differently. Price your own workload on both before deciding on entry price alone. At high volume, several of these are cheaper per credit than we are.

Engineering notes

Docs you can build on

We document exactly how every endpoint behaves — nulls, caching, billing — so what you ship on day one is still running in month six. No surprises, no support tickets.

Failed calls are never charged Public data only, no login session Built for parallel traffic

Facebook signs its CDN URLs with an expiry. Store media_url in a table and hand it to a worker that runs every fifteen minutes and you will see downloads fail for no visible reason. Store the post URL or the post id instead, call this endpoint, and fetch the bytes in the same process while the link is warm.

Fetch from a host that can reach the CDN directly. If your API call runs in one region and your download runs behind a proxy in another, expect rejections that look nothing like an expiry error.

Public video posts and public Reels resolve. Photo posts do not, because there is no video file to point at. Live streams are unreliable while they are still live and generally resolve once the replay is published.

A post whose video is a re-share of someone else's upload may resolve to the original file or to nothing, depending on how Facebook has stitched the share together. If you are archiving at scale, log the failures rather than assuming a uniform success rate across post types.

We read the same page an anonymous visitor sees. Videos in private Groups, on friends-only profiles, or restricted to an age or country gate are unreachable, and we do not attempt to get around any of that. The call returns an error, not a partial object.

Personal profile content is thinner than Page content across all our Facebook endpoints. If a URL you can open while logged in returns nothing here, open it in a private window first — that is usually the whole explanation.

Copyright in a video belongs to whoever made it. Keeping a copy of your own posts, or holding evidence of a public post for a compliance file, is one thing. Reuploading a competitor's ad to your own channel is a different thing and it is your legal exposure, not ours.

This endpoint sits in the near-immutable cache class, since a published video's file does not change. A repeated call for the same post inside the window returns in milliseconds and sets x-cache: hit, and it costs the same 10 credits as a fresh one.

The signed URL still ages independently of our cache, so if a cached media_url has already expired, pass fresh=true to force a re-resolve. Errors are never charged, so a failed probe costs you nothing; any successful call bills at least one credit.

Questions

Frequently asked

Call /v1/facebook/download with the public post or Reel URL and your API key. The response contains media_url, a direct link to the file on Facebook's CDN, which you fetch with your own HTTP client. No Facebook developer app, no Graph API permissions and no login are involved, because the endpoint reads the same public page you can open in a private browser window.

10 credits per video. Credits are $0.005 each on monthly billing and $0.0045 on annual, so a call is about 5 cents, and $5 covers roughly 100 videos. It costs more than a stats call because resolving media is heavier work upstream. Calls that error or return no video are not charged at all.

Because pushing large binaries through a JSON API is the wrong shape. A direct link means no file-size ceiling imposed by us, no double transfer, and a download your client can resume or stream. The tradeoff is that Facebook's link is signed and expires, so you need to fetch it right away rather than parking it in a database.

Facebook decides, and it does not publish the number, so we do not quote one either — our own response note says only that the link is short-lived. Any pipeline that downloads inside the same request cycle is fine; any pipeline that batches links overnight will fail. Persist the post id and re-resolve when you actually need the bytes — that pattern costs one extra call and removes a whole class of flaky failures.

Yes. Public Reel URLs resolve the same way ordinary video posts do, and come back with the same three fields. Photo posts, text statuses and shared links do not resolve, because the normalizer needs an actual video file to return a row. Those calls return an error rather than an object with a null media_url.

No. We read public content while logged out, with no session and no credentials, so anything behind a friends-only setting, a private Group, or a country or age restriction is simply not visible to us. The call errors out and is not billed. There is no flag or parameter that changes this, and there will not be one.

You get whatever file Facebook publishes on the public page. If the uploader burned a watermark into the video, it is in the file. If Facebook itself has stamped the copy it serves, that is also in the file, and it is a decision on their side that has changed before. We do not re-encode, strip or alter anything on the way through.

Next

Pairs well with

Full Facebook API reference →
/v1/facebook/stats
Facebook Stats API Reactions, comments and shares for a Facebook post or video. 5 cr / post
/v1/facebook/comments
Facebook Comments API Paginated comments on a Facebook post; charged per comment returned. 3 cr / comment
/v1/facebook/channel-posts
Facebook Channel Posts API Latest posts from a Facebook page with per-post metrics. 3 cr / post
/v1/instagram/download
Instagram Download API Resolves a downloadable media URL for an Instagram reel (URL expires within 1h). 40 cr / video

More Facebook endpoints

/v1/facebook/transcript Full transcript of a Facebook video with timestamped segments. 15 credits / video /v1/facebook/summary Short AI summary of a Facebook video, built on its transcript. 17 credits / video /v1/facebook/stats Reactions, comments and shares for a Facebook post or video. 5 credits / post /v1/facebook/comments Paginated comments on a Facebook post; charged per comment returned. 3 credits / comment /v1/facebook/page-stats Followers, likes and metadata for a Facebook page. 10 credits / page /v1/facebook/channel-posts Latest posts from a Facebook page with per-post metrics. 3 credits / post

Try the Facebook Download endpoint free

100 trial credits on signup — no card, key on screen immediately.

1 Sign up free no card · 30 seconds
2 Copy your key sk_live_...
3 GET the endpoint /v1/facebook/download
Get your free API key