One URL in. Clean JSON out.
This endpoint is currently blocked and does not return a media URL. TikTok stopped exposing platform-CDN video links in the places we read, so calls return an error while the media pipeline is rebuilt around our own storage. Failed calls are never charged, so nothing you send here costs you anything today — but nothing works either, and we would rather say that on the page than take your credits.
Availability: Temporarily unavailable: TikTok stopped exposing platform-CDN media URLs and this endpoint currently returns an error while we rebuild the media pipeline. Failed calls are never charged.
The difference
On the left, what a headless browser hands you. On the right, what the endpoint hands you.
<div class="css-1qb2n7d-DivItemContainer e148ts220" data-e2e="recommend-list-item"><div class="css-x6y88p-DivContainer"><a class="css-1g95xhm-AVideoContainer" href="/@tiktok/video/7231338487075638570"><video src="blob:https://www.tiktok.com/8f3a..."></video></a></div><div class="css-1f5bbrz-DivCardFooter"><strong data-e2e="video-views" class="css-ws4x78">1.2M</strong><strong data-e2e="like-count">88.4K</strong><strong data-e2e="comment-count">2,314</strong></div><h3 class="css-1yy6f0h">Behind the scenes of our new feature</h3><script id="__UNIVERSAL_DATA_FOR_REHYDRATION__" type="application/json">{"__DEFAULT_SCOPE__":{"webapp.video-detail"... {"data": {"platform": "tiktok","entity_id": "7231338487075638570","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"}
The payload
When it works, the response is deliberately small: the video id, one direct media URL, the runtime in seconds, and a short note reminding you the link expires. It is not a stats call and it does not hand you a file. You get a URL and you are expected to fetch it yourself, immediately, with your own HTTP client.
Right now that object is not produced. The normalizer requires a media URL that lives on the platform's own CDN, and it rejects anything hosted by an intermediary — a vendor-hosted copy is not a real download and shipping one would mean handing you a link we do not control. With no qualifying URL in the upstream payload, the endpoint yields zero items and the request fails.
The fields below are documented so you can write your integration against the eventual shape. Treat them as a contract we intend to honour, not as behaviour you can rely on this week.
Fixed human-readable warning that media_url is short-lived. Present on every successful response; safe to ignore in code.
Pricing
When it worked, one video was 7 credits — about 3.5¢ on the monthly plan, roughly 143 videos per $5. While the endpoint is blocked every call errors, and failed calls are never charged.
Estimate only, on a full-year basis. 7 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.
Entry price, side by side
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
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.
The upstream video payload no longer carries a platform-CDN address. The fields that used to hold it come back empty, and the only media link available is a copy hosted by an intermediary. We refuse to return that: it is not TikTok's file, it is not durable, and passing it through would misrepresent where your bytes come from.
The fix is to proxy media through our own storage so the URL we hand you is one we actually operate. That work is underway. Until it ships, every call to /v1/tiktok/download returns an error, and the error costs you 0 credits.
There is no ETA on this page because we have been wrong about ETAs before. Check the endpoint again rather than trusting a date we printed in marketing copy.
Assume the signed link is dead within minutes. Do not store media_url in a database and fetch it from a nightly job — store the video id, call again, download in the same process. Any architecture that puts hours between the API response and the GET will fail intermittently and look like our bug.
If your download runs on a different host from your API call, make sure that host can reach the CDN directly. A link issued to one network and used from another can be rejected.
We read the same public video page you can open logged out. Private videos, deleted videos and region-restricted videos are unreachable, and we do not attempt to work around that. We also make no claim about whether the returned file carries a watermark — that is decided by what TikTok publishes, not by us.
Downloading a video does not give you the right to republish it. Copyright in the video belongs to whoever made it. Archiving your own content or keeping evidence is one thing; reuploading someone else's clip is your legal problem, not ours.
This endpoint sits in the near-immutable cache class, because a video's file does not change once posted. That is the right classification for the metadata and the wrong one for a signed URL, which is why a cached hit would still need a fresh link. It is another reason the rebuild routes media through storage we control rather than caching a link that rots.
Errors are not cached and not charged, so retrying while the endpoint is blocked is harmless and pointless in equal measure.
Questions
No. TikTok stopped exposing platform-CDN media URLs where we read them, so the endpoint returns an error instead of a link. We have left the page and the documented response shape up so you can build against it, but do not plan a launch around it. Failed calls are never charged, so testing it costs you nothing beyond the round trip.
7 credits per video when it works. Credits are $0.005 each on monthly billing and $0.0045 on annual, so roughly 3.5 cents a video. It costs more than the stats call because fetching video is heavier work upstream. While the endpoint is blocked you are charged nothing at all, because errors are never billed.
We make no promise either way. The endpoint returns whatever file the public page exposes; whether that copy carries a watermark is TikTok's decision and it has changed more than once. Anyone guaranteeing a permanently watermark-free file is describing a behaviour they do not control. This is moot at the moment anyway, since the endpoint is returning errors.
Because streaming large binaries through a JSON API is a bad shape for both of us. You get a direct link and fetch it with your own client, which means no size ceiling from us, no double transfer, and a download you can resume. The tradeoff is that the link is short-lived, so fetch it immediately rather than storing it for later.
Yes. The TikTok Transcript API is unaffected. It reads TikTok's caption track and returns the spoken words as plain text — flat text, not timed segments — so anything you were planning to build on top of downloaded audio can usually be built on the transcript instead. If you need the visual frames rather than the words, there is no substitute and you will have to wait.
No. We read public pages logged out, with no session and no credentials. If a video is private, deleted or blocked in the region we read from, it is not reachable and the call returns an error rather than a partial result. That limit is deliberate and will still apply once the media pipeline is rebuilt.
Nothing is deducted. Billing happens on a successful, non-empty response, so an error or a zero-item result is free. That policy is why we can leave a blocked endpoint live without it being a trap: you can call it, see it fail, and move on without a line on your invoice.
Next
100 trial credits on signup — no card, key on screen immediately.