Free Video Extractor API

One GET request turns a public TikTok, Facebook, X, Pinterest, Reddit, Threads, Snapchat or LinkedIn post into clean JSON: video URL, thumbnail, title, author and duration. Free, no sign-up, no API key.

GET https://www.savereelsfast.com/api/public/extract?url=<link to a public post>

What the API Does

SaveReelsFast's free video extractor API is the same engine that runs the downloader on this site, opened up for developers. Send it the link of a public social media post and it answers with the post's direct video file URL, its cover image, caption, author, duration and, where the platform has one, a separate audio track. It is a simple way to add a social media download feature, a link preview or a media archive tool to your own app without maintaining scrapers for eight different platforms.

There is nothing to install and no account to create. It is a plain HTTPS endpoint that returns JSON, so it works from any language that can make a web request: Node.js, Python, PHP, Go, Ruby or a shell script with curl.

Quickstart

Make a GET request to the endpoint below with the post's link in the url query parameter, URL-encoded. That's the whole integration. A successful answer has success set to true and the media details in data; a failed one has success set to false and an error object with a stable code and a readable message.

Call the API from your server, not from a browser: it sends no CORS headers, so web pages on other sites can't call it directly. Cache the answers you get, because the same post gives the same result for a while, and every cached answer saves one of your daily requests.

Supported Platforms

The public API covers TikTok, Facebook (videos, Reels and fb.watch links), X (Twitter), Pinterest (video pins and pin.it links), Reddit (posts, share links and v.redd.it), Threads, Snapchat Spotlight and LinkedIn. Only public posts can be read: anything that needs a login, such as private accounts, friends-only posts or private groups, returns PRIVATE_CONTENT.

Instagram and YouTube are not part of the free API at the moment. Looking them up costs this site paid proxy traffic, which is reserved for visitors of the website. Links from them return UNSUPPORTED_PLATFORM, so you can handle them cleanly instead of guessing.

Rate Limits

Each IP address can make 50 requests per day, and no more than 20 in any one minute, with no key needed. Every answer carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers (the reset is a Unix timestamp in seconds), and a 429 answer adds a Retry-After header telling you how many seconds to wait.

Optional free API keys with a higher daily allowance are planned; until then, the per-IP limit applies to everyone. If you need more for a real project, contact us through the site and tell us what you are building.

Using the Video URL

video_url is the platform's own CDN link to the file, not a copy on our servers. These links are signed and usually expire after a few hours, so fetch the file soon after the lookup or look the post up again later instead of storing the link. Some CDNs, TikTok's for example, also check the Referer header and expect the platform's own site.

audio_url is set only when the platform serves the sound as a separate file (Reddit often does, because its MP4s carry no sound). items lists every video or image when a post has several, such as a multi-video post on X; for a single video it is empty and the top-level fields describe it.

Response Format

{
  "success": true,
  "data": {
    "platform": "tiktok",
    "id": "7212345678901234567",
    "title": "Morning routine in 30 seconds",
    "caption": "Morning routine in 30 seconds #routine #morning",
    "author": "someone",
    "duration": 31.2,
    "thumbnail": "https://p16-sign.tiktokcdn.com/...jpeg",
    "video_url": "https://v16-webapp.tiktok.com/...mp4",
    "audio_url": null,
    "quality": "1080p",
    "items": []
  }
}
{
  "success": false,
  "error": {
    "code": "RATE_LIMITED",
    "message": "Rate limit reached: 50 requests per day per IP (and 20 per minute)."
  }
}

Error Codes

HTTPCodeMeaning
400INVALID_URLThe url parameter is missing or isn't a link to a single post.
403PRIVATE_CONTENTThe post is private, age-restricted or needs a login.
404UNSUPPORTED_PLATFORMThe link is from a platform the public API doesn't cover (including Instagram and YouTube for now).
422NO_VIDEOThe post exists but has no video, for example a text-only post.
429RATE_LIMITEDDaily or per-minute limit reached. See Retry-After.
503EXTRACTION_FAILEDThe platform didn't answer in time or refused the lookup. Retry later.

Code Examples

JavaScript (Node.js 18+)

const endpoint = "https://www.savereelsfast.com/api/public/extract";
const link = "https://x.com/captainamerica/status/719944021058060289";

const res = await fetch(`${endpoint}?url=${encodeURIComponent(link)}`);
const body = await res.json();

if (body.success) {
  console.log(body.data.title, body.data.video_url);
} else {
  console.error(res.status, body.error.code, body.error.message);
}

Python (requests)

import requests

ENDPOINT = "https://www.savereelsfast.com/api/public/extract"
link = "https://x.com/captainamerica/status/719944021058060289"

res = requests.get(ENDPOINT, params={"url": link}, timeout=30)
body = res.json()

if body["success"]:
    print(body["data"]["title"], body["data"]["video_url"])
else:
    print(res.status_code, body["error"]["code"], body["error"]["message"])

PHP

<?php
$endpoint = "https://www.savereelsfast.com/api/public/extract";
$link = "https://x.com/captainamerica/status/719944021058060289";

$ch = curl_init($endpoint . "?url=" . urlencode($link));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$body = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($body["success"]) {
    echo $body["data"]["title"] . " " . $body["data"]["video_url"] . PHP_EOL;
} else {
    echo $status . " " . $body["error"]["code"] . ": " . $body["error"]["message"] . PHP_EOL;
}

Frequently Asked Questions

50 requests per day per IP address, and at most 20 per minute, with no API key. Each answer reports what's left in the X-RateLimit headers, and a 429 answer says how long to wait in Retry-After.

Cookies, analytics and ads

We use Google Analytics to see which pages are useful, and an advertising partner to show ads that keep the tool free. Both set cookies only if you accept, and the downloader works either way. Privacy policy

Use Telegram Bot