TikTok Video Downloader - Short Links & Multi-Cloud Storage avatar

TikTok Video Downloader - Short Links & Multi-Cloud Storage

Pricing

$3.00 / 1,000 download videos

Go to Apify Store
TikTok Video Downloader - Short Links & Multi-Cloud Storage

TikTok Video Downloader - Short Links & Multi-Cloud Storage

$3 per 1,000 TikTok videos, or $0.003 each. Downloads from post URLs, photo posts, and short links, for content teams, compliance teams, and ML pipelines. Re-hosts to Apify, AWS S3, Google Cloud, DigitalOcean, or Azure storage.

Pricing

$3.00 / 1,000 download videos

Rating

5.0

(14)

Developer

epctex

epctex

Maintained by Community

Actor stats

40

Bookmarked

889

Total users

24

Monthly active users

6 hours ago

Last modified

Share

TikTok Video Downloader

TikTok Video Downloader is a commercial-grade utility actor built for teams that need TikTok videos downloaded and re-hosted reliably, without maintaining scraping or storage infrastructure in-house. Give it TikTok post URLs — or short links you haven't even expanded yet — and it resolves each one, downloads the video, and delivers a stable link to the storage of your choice.

The actor is designed around a single operating mode: direct URL resolution. Every entry in startUrls is processed independently within the same job, so a run can mix canonical post URLs, short links, and photo-mode posts, with each one reported on its own dataset row regardless of the outcome.

TikTok Video Downloader Capabilities

The actor supports the following features:

  • Download by URL — Accepts canonical TikTok post URLs (tiktok.com/@user/video/{id}) and short links (vt.tiktok.com, vm.tiktok.com, tiktok.com/t/…), resolved automatically.
  • Multi-cloud storage — Deliver to Apify's built-in key-value store with zero setup, or bring your own AWS S3, Google Cloud Storage, DigitalOcean Spaces, or Azure Blob Storage.
  • Stable re-hosted links — Every downloaded video is re-hosted to your chosen storage, so you get a permanent link instead of TikTok's own short-lived signed URL.
  • Regional CDN targeting — An optional two-letter region code selects which TikTok CDN edge the video is fetched from.
  • Custom output shaping — Apply a customMapFunction to transform each output item before it's saved.
  • Automatic deduplication — The same post is only downloaded and charged once per run, even if it appears twice in your input.

Supported TikTok Sources

TikTok SourceHow to Target ItWhat It Covers
Video postCanonical URL tiktok.com/@user/video/{id} in startUrlsThe post's video, re-hosted to your storage, along with its title and cover image
Photo-mode postCanonical URL tiktok.com/@user/photo/{id} in startUrlsRecognized as a valid post; reported with no video since it holds a slideshow of images rather than a video, and is never charged
Short linkvt.tiktok.com/..., vm.tiktok.com/..., or tiktok.com/t/... in startUrlsResolved to the underlying post automatically — no need to expand it yourself

Who Can Use This TikTok Downloader

The TikTok Video Downloader is applicable wherever raw TikTok video files carry operational or analytical value. Typical adopters include:

Content and social media teams. Pull down owned or licensed TikTok clips as stable files for repurposing across other channels, without relying on TikTok's own share links.

Brand and communications functions. Archive campaign, influencer, or executive content as it's published, so a copy exists independent of the original post's availability.

Legal and compliance teams. Preserve a downloaded copy of specific TikTok posts as evidence, with an explicit per-item status showing exactly what was and wasn't retrievable.

Academic and social science researchers. Assemble reproducible video datasets from a fixed list of post URLs, with maxItems for controlled sample sizes.

AI and machine learning teams. Collect raw video files from TikTok posts for model training, evaluation, or benchmarking pipelines.

Media monitoring teams. Retrieve the video behind a URL flagged during monitoring, without manually opening and saving it from the app.

Developers building downstream pipelines. Get a direct, stable download link per post instead of a temporary signed URL, ready to hand to the next stage of an automated workflow.

Pricing: Transparent Event-Based Costs

Pay only for what you download. No subscriptions, no hidden fees.

Event TypePriceWhat's Included
Video Download$0.003 per videoCharged once per post whose video was successfully downloaded and re-hosted to your storage

Cost Examples

ScenarioChargesCalculationTotal Cost
1 video downloaded successfully1 video-download$0.003 × 1$0.003
10 videos downloaded successfully10 video-download$0.003 × 10$0.030
Invalid URL, private/deleted post, photo-mode post, or failed downloadnone$0.000

Controlling TikTok Downloading Costs

The event-based model rewards precise job design. A few principles follow directly from the rate card:

  • You're only ever charged for a delivered video. Nothing is charged for a URL that isn't a TikTok post URL, a post that's private/deleted/never existed, a photo-mode post, or a download/upload that failed.
  • Duplicates are free. The same post — recognized by its post id, or by its own URL for an unresolved short link — is only downloaded and charged once per run, even if it's listed twice in startUrls.
  • Use maxItems to cap spend directly. It sets the maximum number of videos a run will download and charge for.
  • Set a realistic cost ceiling. If your run's maximum cost per run can't cover the price of even one video, the run exits immediately before downloading anything — see the FAQ below for what that means on the Free plan.

Demo Mode

Free-plan users can run this actor without a subscription. Run and per-run item limits on the Free plan are governed by your Apify plan configuration rather than by a fixed number in the actor itself. Subscribe to a paid plan to raise those limits and to use maxItems as your own per-run ceiling.

How to Use the TikTok Video Downloader

  1. Provide your URLs. Fill startUrls with one or more TikTok post URLs or short links. At least one is required.
  2. Optionally set a region. Provide a two-letter country code if you need a specific CDN edge.
  3. Choose your storage. Leave storageType as apify for zero-setup delivery, or set it to aws, gcp, digitalocean, or azure and fill in the matching credentials.
  4. Cap the run. Set maxItems to limit how many videos this run will download and charge for.
  5. Reshape the output, if needed. Provide a customMapFunction to transform each item before it's saved.
  6. Run a small test first. Execute a low-volume run to confirm the output shape and statuses returned.
  7. Scale. Increase your URL list once the output matches your requirements.

Input Parameters

FieldTypeDescriptionDefault
startUrlsarrayTikTok URLs to download — canonical post/photo URLs or short links (vt.tiktok.com, vm.tiktok.com, tiktok.com/t/...), resolved automatically.
regionstringOptional two-letter country code (e.g. US, DE). Selects which TikTok CDN edge the video is fetched from.
storageTypestringWhere downloaded videos are delivered: apify, aws, gcp, digitalocean, or azure. Fill in the matching storage configuration fields below.apify
maxItemsintegerMaximum number of videos to download and charge for in this run.unlimited
customMapFunctionstringFunction applied to each output item before it is saved, e.g. (object) => { return {...object} }.null

Storage Configuration

  • AWS S3: s3AccessKeyId, s3SecretAccessKey, s3Region, s3Bucket, s3Path (optional)
  • Google Cloud: googleCloudProjectId, googleCloudServiceKeyJson, googleCloudBucketName, googleCloudPath (optional)
  • DigitalOcean Spaces: digitalOceanAccessKeyId, digitalOceanSecretAccessKey, digitalOceanRegion, digitalOceanBucketName, digitalOceanEndpoint (optional), digitalOceanAcl (optional), digitalOceanPath (optional)
  • Azure: azureAccountName, azureAccountKey, azureContainerName, azurePath (optional)

Input Examples

Basic download

{
"startUrls": [
"https://www.tiktok.com/@cznburak/video/7120985110991604993",
"https://vt.tiktok.com/ZSDHmaujt/"
],
"storageType": "apify"
}

With a region hint

{
"startUrls": ["https://www.tiktok.com/@example_user/video/7123456789012345678"],
"region": "US",
"storageType": "apify"
}

Deliver to your own S3 bucket

{
"startUrls": ["https://www.tiktok.com/@example_user/video/7123456789012345678"],
"storageType": "aws",
"s3AccessKeyId": "AKIAEXAMPLE",
"s3SecretAccessKey": "example-secret-key",
"s3Region": "us-east-1",
"s3Bucket": "my-tiktok-downloads"
}

Capped run with output reshaping

{
"startUrls": [
"https://www.tiktok.com/@example_user/video/7123456789012345678",
"https://www.tiktok.com/@example_user/video/7123456789012345679"
],
"maxItems": 1,
"customMapFunction": "(object) => { return { url: object.downloadUrl, status: object.status } }"
}

Output Examples

Every dataset row corresponds to one entry in startUrls. The exact shape depends on the outcome for that post.

Succeeded

{
"title": "Example TikTok video caption #fyp",
"sourceUrl": "https://www.tiktok.com/@example_user/video/7123456789012345678",
"downloadUrl": "https://api.apify.com/v2/key-value-stores/example-store-id/records/tt-7123456789012345678.mp4",
"cover": "https://p16-sign.tiktokcdn-us.com/example-cover-image.jpeg",
"storageType": "apify",
"status": "succeeded",
"jobId": "job_a1b2c3d4",
"error": null,
"inputSource": {
"queryIndex": 0,
"url": "https://www.tiktok.com/@example_user/video/7123456789012345678"
}
}

Failed

{
"title": "Example TikTok video caption #fyp",
"sourceUrl": "https://www.tiktok.com/@example_user/video/7123456789012345679",
"downloadUrl": null,
"status": "failed",
"error": "The download job failed.",
"inputSource": {
"queryIndex": 1,
"url": "https://www.tiktok.com/@example_user/video/7123456789012345679"
}
}

Invalid URL

{
"title": null,
"sourceUrl": "https://example.com/not-a-tiktok-url",
"downloadUrl": null,
"cover": null,
"status": "invalidUrl",
"jobId": null,
"error": "The URL is not a supported TikTok post URL.",
"inputSource": {
"queryIndex": 2,
"url": "https://example.com/not-a-tiktok-url"
}
}

Unavailable

{
"title": null,
"sourceUrl": "https://www.tiktok.com/@example_user/video/7999999999999999999",
"downloadUrl": null,
"cover": null,
"status": "unavailable",
"jobId": null,
"error": "The post does not exist, or it is private or deleted.",
"inputSource": {
"queryIndex": 3,
"url": "https://www.tiktok.com/@example_user/video/7999999999999999999"
}
}

No Video Content

{
"title": "Example photo-mode post caption",
"sourceUrl": "https://www.tiktok.com/@example_user/photo/7123456780000000000",
"downloadUrl": null,
"cover": "https://p16-sign.tiktokcdn-us.com/example-cover-image.jpeg",
"status": "noVideoContent",
"jobId": null,
"error": "The post contains no video.",
"inputSource": {
"queryIndex": 4,
"url": "https://www.tiktok.com/@example_user/photo/7123456780000000000"
}
}

Timed Out

{
"title": "Example TikTok video caption #fyp",
"sourceUrl": "https://www.tiktok.com/@example_user/video/7123456789000000000",
"downloadUrl": null,
"cover": "https://p16-sign.tiktokcdn-us.com/example-cover-image.jpeg",
"storageType": "apify",
"status": "timedOut",
"jobId": null,
"error": "The run ran out of time before this video was downloaded.",
"inputSource": {
"queryIndex": 5,
"url": "https://www.tiktok.com/@example_user/video/7123456789000000000"
}
}

During the Run

The actor logs its progress as it resolves and downloads each post. If you provide incorrect input, such as leaving startUrls empty, the actor stops immediately with an explanation of what went wrong.

Frequently Asked Questions

What can the TikTok Video Downloader collect? A single TikTok post's video per URL you provide, re-hosted to your chosen storage, sourced from canonical post URLs or short links.

Does it work with short links? Yes. vt.tiktok.com, vm.tiktok.com, and tiktok.com/t/... links are resolved to the underlying post automatically — no need to expand them yourself.

Can I deliver videos to my own cloud storage instead of Apify's? Yes. Set storageType to aws, gcp, digitalocean, or azure and fill in the matching credentials.

Am I charged for posts that are private, deleted, or not TikTok URLs? No. You're only charged once a video is successfully downloaded and re-hosted.

What happens with photo-mode (slideshow) posts? They're recognized as valid posts but reported with no video, since they hold images rather than a video — and are never charged.

What happens if the same post appears twice in my input? It's only downloaded and charged once per run.

What happens if my configured max cost per run can't cover a single video? The run exits immediately without downloading anything. On the Free plan, this still charges you for 10 video-download events; on a paid plan, nothing is charged in this case.

Can I customize the output shape? Yes. customMapFunction takes each output object as an argument and returns the object that gets saved instead.

Is there a free way to test the actor? Yes. Demo Mode allows Free-plan users to run the actor without a subscription, subject to the run and item limits set by your Apify plan.

What happens if my input is invalid? The actor stops immediately and returns an explanation of the problem. Leaving startUrls empty is one such case.

Support and Custom Integrations

Please visit us through epctex.com to see all available products. For custom integrations, reach out via the chat box on epctex.com. For support: business@epctex.com.