TikTok Downloader API: Clean Video + Sound in One Call

One GET returns the watermark-free MP4, the sound as mp3 and the cover image. Here is what actually comes back, including photo mode and the errors you will see in production.

auth

Send your key as an X-Api-Key header on every request. Keys come from api.fastsaver.io. Never ship the key inside a mobile app; proxy through your backend. Key handling and the full setup are in the getting started guide.

the call

curl "https://api.fastsaver.io/v1/fetch?url=https%3A%2F%2Fwww.tiktok.com%2F%40user%2Fvideo%2F7234567890123456789" \
  -H "X-Api-Key: YOUR_KEY"
const res = await fetch(
  'https://api.fastsaver.io/v1/fetch?url=' + encodeURIComponent(link),
  { headers: { 'X-Api-Key': process.env.FASTSAVER_KEY } }
);
const data = await res.json();
r = requests.get(
    'https://api.fastsaver.io/v1/fetch',
    params={'url': link},
    headers={'X-Api-Key': os.environ['FASTSAVER_KEY']},
)
data = r.json()

Short links work too. Send vm.tiktok.com or vt.tiktok.com links exactly as pasted; the API follows the redirect. Expanding them yourself is one more thing to maintain.

the response

{
  "ok": true,
  "id": "7234567890123456789",
  "source": "tiktok",
  "type": "video",
  "download_url": "https://…/video.mp4",
  "thumbnail_url": "https://…/cover.jpg",
  "width": 1080,
  "height": 1920,
  "duration": 27,
  "caption": "this transition took 3 hours",
  "music_url": "https://…/sound.mp3"
}
  • source is always "tiktok" here. The same endpoint serves Instagram, Facebook, X and Pinterest, so one integration covers them all.
  • download_url is the source MP4. The watermark was never burned in, and nothing is re-encoded.
  • music_url is the sound as mp3. A save-this-sound feature costs you no extra call.
  • caption can be empty. Build filenames from it with a fallback.
  • duration is seconds. width, height and thumbnail_url are enough for a preview card.

Download links are short-lived. Fetch when the user acts and download promptly. Never cache a link for later; re-fetch the post instead.

photo mode

Photo posts and slideshows come back with type set to "album". The slides live in items[], in order:

"items": [
  { "type": "image", "download_url": "https://…/1.jpg", "thumbnail_url": "https://…/1_t.jpg", "width": 1080, "height": 1440 },
  { "type": "image", "download_url": "https://…/2.jpg", "thumbnail_url": "https://…/2_t.jpg", "width": 1080, "height": 1440 }
]

Each slide is a full-size image, and there is no duration. Use thumbnail_url to render a picker before downloading anything. If your code assumes every TikTok is an MP4, this is where it breaks. Check type first, then read download_url or items[].

errors

Failures return a small JSON body instead of media. Branch on ok, show detail.

{ "ok": false, "detail": "fetch.failed" }
  • 401: missing or wrong key.
  • 400: bad url, or no credits left.
  • 429: too many requests this minute. Wait, then retry.
  • fetch.failed: private, removed or region-locked. Not retryable.

TikTok changes its URL signing a few times a year, and every downloader breaks at once. If links that worked yesterday fail in bulk, that is upstream. Back off and retry later. Do not mark those posts as permanently failed in your database.

credits and pricing

New keys get 1,000 free credits. Paid plans start at $9/month, see pricing. Saving one video by hand? The web downloader is the same engine with a paste box. The sound guide covers the mp3 button. Building something bigger? See what to build with a download API.

frequently asked questions

Does the API remove the TikTok watermark?
download_url points at the clean source file, which never had the watermark burned in. Nothing is re-encoded, so quality matches the original upload.
Do vm.tiktok.com short links work?
Yes. Send the short link exactly as pasted. The API follows the redirect, so you never expand vm.tiktok.com or vt.tiktok.com links yourself.
How do photo-mode posts come back?
With type set to "album". items[] holds one image entry per slide, in order, each with its own download_url, thumbnail_url, width and height. No duration.
Can it fetch private TikToks?
No. Public posts only. Private, removed and region-locked posts return ok false with detail fetch.failed. Any API claiming otherwise is selling you trouble.