TikTok Downloader API: Clean Video + Sound in One Call
A TikTok downloader API does one job: URL in, clean media out. With the FastSaver API that is a single GET — the response carries the watermark-free MP4, the sound as a separate MP3, the cover image, the author and the duration. This post walks through what actually comes back, including the cases the happy-path docs skip: photo mode, short links, and the errors you will see in production.
the call
curl "https://api.fastsaver.io/v1/fetch?url=https://www.tiktok.com/@user/video/7234567890123456789" \
-H "X-Api-Key: YOUR_KEY"
Short share links work too. When a user pastes a vm.tiktok.com or vt.tiktok.com link, send it exactly as-is — the API resolves the redirect server-side. Do not expand short links yourself first: it costs you an extra round trip, and TikTok changes its redirect behaviour often enough that your expansion code becomes one more thing to maintain.
Auth, keys and limits are covered in the getting started guide; this post is only about what TikTok responses look like.
what the response contains
{
"platform": "tiktok",
"kind": "single",
"title": "this transition took 3 hours",
"author": "@username",
"thumbnail": "https://p16-sign.tiktokcdn-us.com/obj/cover-abc123~tplv.jpg",
"duration": 27,
"medias": [
{
"type": "video",
"quality": "auto",
"ext": "mp4",
"url": "https://v16m.tiktokcdn.com/a1b2c3/video/tos/...",
"size": 4821094
},
{
"type": "audio",
"quality": "audio",
"ext": "mp3",
"url": "https://sf16-ies-music.tiktokcdn.com/obj/7234567890.mp3"
}
]
}
Field by field:
- platform — always "tiktok" here. The same endpoint serves Instagram, YouTube and the rest, so one integration covers them all.
- kind — "single" for a normal video post, "album" for photo mode. Branch on this before you assume a video exists.
- title — the caption. It can be empty, so do not build filenames from it without a fallback.
- author — the creator handle. Useful for attribution or filenames.
- thumbnail — the cover image.
- duration — seconds. Present for videos, absent for photo posts.
- medias — the downloadable files. Each entry has a type (video, audio or image), an ext, a url, and a size in bytes when known — treat size as optional.
Two things make the TikTok response better than most. The MP4 is the source file, so there is no watermark to remove — it was never burned in, and nothing gets re-encoded. And the sound arrives as its own MP3 entry in the same response, so a "save this sound" feature costs you zero extra calls. If you want that without writing code, the sound-to-MP3 guide covers the web version.
photo mode and slideshows
TikTok photo posts come back with kind set to "album". The medias array then holds one image entry per slide, in order, each with its own url and a per-item thumbnail so you can render a picker before downloading anything. There is no duration, because there is no video. If your code assumes every TikTok is an MP4, photo posts are where it breaks — check kind first and you are covered.
errors you will actually see
Failures return a small JSON body instead of media:
{
"error": true,
"code": "unreachable",
"message": "this post is private or was removed"
}
Branch on code, show message. The codes worth handling for TikTok:
- unreachable — the post is private, deleted, or region-locked. Not retryable; tell the user.
- unsupported — the link is not from a supported platform, or not a post URL at all.
- invalid — malformed request; fix your input handling.
- rate_limited — HTTP 429 with a retry-after header. Successful responses include an x-ratelimit-remaining header, so you can slow down before you ever hit this.
- server_error — our side. Retry with backoff.
One more operational note: the media URLs point at TikTok CDN and are signed, which means they expire. Fetch when the user acts, download promptly, and never cache a download URL for later.
when TikTok breaks things
It will. TikTok changes URL signing and page structure several times a year, and every downloader on the internet breaks at the same moment. What matters is recovery time: API traffic is our canary, so extraction failures show up within minutes and fixes typically ship in hours, not weeks. On your side, treat a sudden spike of unreachable errors on links that worked yesterday as an upstream break — back off, retry later, and avoid marking those posts permanently failed in your own database.
API or the web downloader?
If you are saving the occasional video by hand, skip all of this — the web downloader is the same engine with a paste box, and the no-watermark guide walks through it. The API earns its keep when downloads are a feature of something you are building: a Telegram bot, an archive pipeline, a content tool. For ideas on that front, see what to build with a media download API.
Frequently asked questions
- Does the API remove the TikTok watermark?
- The video 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 resolves the redirect server-side, so you never need to expand vm.tiktok.com or vt.tiktok.com URLs yourself.
- How do photo-mode posts come back?
- With kind set to "album". The medias array holds one image entry per slide, in order, each with its own URL and thumbnail. There is no duration field on photo posts.
- Why did a public video return an unreachable error?
- Usually the post is private, deleted, or region-locked. If links that worked yesterday suddenly fail in bulk, TikTok changed something upstream — back off and retry; fixes typically ship within hours.
- Can it fetch private TikToks?
- No. Public posts only — any API claiming otherwise is selling you trouble.