Dokumentasi API TikTok Downloader
Kirim satu tautan TikTok — video maupun carousel (post foto) — dan layanan ini akan menyalin
medianya ke servernya sendiri, lalu mengembalikan URL milik domain ini yang bisa langsung
diunduh. Tidak ada pemutar, tidak ada halaman perantara: tautan hasilnya sudah berisi berkasnya
dan dikirim dengan header Content-Disposition: attachment.
- Rate limit
- 20 permintaan / 10 menit per IP
- Masa simpan berkas
- 6 jam sejak diunduh ke server
- Batas ukuran berkas
- 300 MB per media (sampul 8 MB)
- Kuota media
- 8 GB, pembersihan otomatis LRU
01 · Ringkasan endpoint
| Metode | Endpoint | Fungsi |
|---|---|---|
| GET | /api/v1/health | Status layanan, statistik cache, sisa kuota rate limit |
| GET | /api/v1/extract?url=… | Ekstrak tautan TikTok, unduh medianya, kembalikan URL siap unduh |
| GET/POST | /api/v1/fetch | Sama seperti extract, tapi tautan dikirim lewat badan JSON |
| GET | /dl/{token}/{nama} | Menyajikan berkas hasil (video/gambar/sampul), ?inline=1 untuk pratinjau |
| GET | /zip/{token} | Semua gambar carousel dalam satu berkas ZIP |
| GET | /thumb/{token} | Sampul (thumbnail) hasil |
| GET | /api/docs | Halaman ini |
/api/v1/* menyertakan header X-RateLimit-Limit,
X-RateLimit-Remaining, dan X-RateLimit-Reset (detik sampai kuota direset).
02 · Status layanan
/api/v1/healthTanpa parameter. Dipakai untuk memantau layanan sebelum mengirim tautan.
Contoh permintaan
curl -s https://tiktok-downloader.zakyapps.my.id/api/v1/health
Contoh respons
{
"ok": true,
"versi": "1.0.0",
"uptime_detik": 509.2,
"cache": { "item_aktif": 4, "berkas": 18, "bytes": 5121100 },
"rate_limit": { "limit": 20, "window_detik": 600, "sisa": 16, "reset_detik": 93 }
}
03 · Ekstrak & unduh
/api/v1/extractEndpoint utama. Menerima tautan video maupun carousel TikTok, mengunduh berkasnya ke server, lalu mengembalikan URL domain ini untuk setiap berkas.
Parameter
| Nama | Wajib | Nilai | Keterangan |
|---|---|---|---|
url | Ya | tautan TikTok | Domain yang diterima: tiktok.com, www.tiktok.com, m.tiktok.com, vt.tiktok.com, vm.tiktok.com. Tautan pendek (vt/vm) diikuti pengalihannya. |
download | Tidak | true (bawaan) / false | false = mode metadata: hanya informasi & URL CDN TikTok, berkas tidak disalin ke server. |
include_raw | Tidak | true / false (bawaan) | true = sertakan URL CDN asal beserta daftar varian kualitas. |
Contoh permintaan
Video
curl -s "https://tiktok-downloader.zakyapps.my.id/api/v1/extract?url=https://www.tiktok.com/@mutamtour.official/video/7633346713532763412"
Carousel (post foto)
curl -s "https://tiktok-downloader.zakyapps.my.id/api/v1/extract?url=https://www.tiktok.com/@mutamtour.nganjuk/photo/7693181323791338759"
Metadata saja (tanpa menyalin berkas)
curl -s "https://tiktok-downloader.zakyapps.my.id/api/v1/extract?url=<tautan>&download=false"
download.url (video) atau slides[].url
dan zip (carousel). URL itu milik domain ini, jadi langsung tersimpan saat dibuka —
tidak perlu header tambahan, tidak kedaluwarsa dalam hitungan menit seperti URL CDN TikTok.
04 · Kirim tautan lewat JSON
/api/v1/fetchPerilakunya sama dengan /api/v1/extract; bedanya tautan dikirim sebagai badan JSON.
Praktis untuk n8n, Make, atau backend yang enggan menaruh tautan di query string.
Contoh permintaan
curl -s -X POST https://tiktok-downloader.zakyapps.my.id/api/v1/fetch \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.tiktok.com/@mutamtour.nganjuk/photo/7693181323791338759",
"download": true
}'
Badan JSON
| Field | Wajib | Keterangan |
|---|---|---|
url | Ya | Tautan TikTok (sama seperti parameter url) |
download | Tidak | true (bawaan) atau false |
include_raw | Tidak | true untuk menyertakan URL CDN TikTok |
05 · Endpoint berkas hasil
| Endpoint | Isi | Keterangan |
|---|---|---|
/dl/{token}/{nama} | Berkas hasil | Header Content-Disposition: attachment; mendukung Range. Tambahkan ?inline=1 agar tampil langsung di peramban (mis. untuk pemutar video). |
/zip/{token} | ZIP carousel | Semua gambar dalam satu ZIP, urut sesuai nomor foto. |
/thumb/{token} | Sampul | Gambar sampul post, berguna untuk kartu pratinjau. |
06 · Bentuk respons
Post video
{
"ok": true,
"type": "video",
"id": "7633346713532763412",
"title": "“Selamat datang di Tanah Suci… tamu-tamu Allah yang dimuliakan.” …",
"author": { "username": "mutamtour.official", "nickname": "Mutamtour" },
"duration_s": 60,
"music": "suara asli - Mutamtour",
"stats": { "playCount": 950, "diggCount": 67, "commentCount": 2, "shareCount": 0 },
"source": "https://www.tiktok.com/@mutamtour.official/video/7633346713532763412",
"cover": "https://…/dl/a8f047257578454a9eb7/cover.jpg?inline=1",
"video": {
"url": "https://…/dl/a8f047257578454a9eb7/mutamtour.official-Selamat-…-7633346713532763412.mp4",
"filename": "mutamtour.official-Selamat-…-7633346713532763412.mp4",
"filesize": 3266765, "bytes": 3266765,
"format": "mp4", "content_type": "video/mp4",
"width": null, "height": null
},
"download": { "url": "https://…/dl/…mp4", "filename": "….mp4",
"bytes": 3266765, "mime": "video/mp4", "expires_at": 1791370004 },
"cached": true,
"expires_at": 1791370004,
"expires_in": 19651,
"elapsed_ms": 0
}
Post carousel (foto)
{
"ok": true,
"type": "carousel",
"id": "7693181323791338759",
"title": "Umrah Bersama Mutamtour Amanah Mendampingi…",
"author": { "username": "mutamtour.nganjuk", "nickname": "Mutamtour Nganjuk" },
"music": "original sound",
"stats": { "playCount": 478, "diggCount": 28, "commentCount": 1, "shareCount": 1 },
"cover": "https://…/dl/c948f532a91747f49a15/cover.jpg?inline=1",
"slides": [
{ "index": 1,
"url": "https://…/dl/c948f532a91747f49a15/…-7693181323791338759-01.jpg",
"filename": "…-01.jpg",
"filesize": 238426, "bytes": 238426, "width": 960, "height": 1280 },
{ "index": 2, "url": "https://…-02.jpg", "filesize": 219678, "width": 960, "height": 1280 },
{ "index": 3, "url": "https://…-03.jpg", "filesize": 160351, "width": 960, "height": 1280 },
{ "index": 4, "url": "https://…-04.jpg", "filesize": 127769, "width": 960, "height": 1280 }
],
"images": [ "…salinan yang sama dengan slides…" ],
"zip": "https://…/zip/c948f532a91747f49a15",
"zip_info": { "url": "https://…/zip/…", "filename": "….zip", "bytes": 775158 },
"cached": false,
"elapsed_ms": 2474
}
Keterangan field
| Field | Tipe | Keterangan |
|---|---|---|
type | string | video atau carousel |
cached | boolean | true = berkas sudah ada di server, balasan nyaris instan |
expires_at / expires_in | angka | Waktu habis masa simpan (epoch detik / sisa detik) |
elapsed_ms | angka | Lama proses di server (milidetik) |
filesize / bytes | angka | Ukuran berkas hasil |
slides / images | larik | Daftar gambar carousel (urutan sama, images disediakan sebagai alias) |
07 · Kode galat
Galat selalu berbentuk sama: {"ok": false, "error": {"code": "…", "message": "…"}}
dengan kode HTTP yang sesuai.
| Kode | HTTP | Arti |
|---|---|---|
invalid_url | 400 | Parameter url kosong atau bukan URL yang sah |
unsupported_host | 400 | Domain di luar daftar TikTok yang diizinkan |
not_found | 404 | Post tidak ada, privat, atau sudah dihapus |
no_media | 404 | Post tidak memuat video atau gambar |
rate_limited | 429 | Kuota 20 permintaan / 10 menit terlampaui; lihat header Retry-After |
too_large | 413 | Berkas melampaui batas 300 MB |
extract_failed | 502 | TikTok menolak/mengubah balasannya sehingga data tidak terbaca |
download_failed | 502 | Gagal menyalin berkas media ke server |
upstream_blocked | 502 | Permintaan ke TikTok dibatasi (tantangan/verifikasi) |
sibuk | 503 | Permintaan post yang sama sedang berjalan; coba lagi sesaat |
internal | 500 | Galat tak terduga di server |
Contoh respons galat
{ "ok": false, "error": { "code": "unsupported_host",
"message": "Host \"example.com\" tidak diizinkan. Hanya tautan TikTok." } }
08 · Cache & masa simpan
Berkas hasil disimpan di server ini, bukan diteruskan langsung dari CDN TikTok. Karena itu tautan
hasilnya tetap sah tanpa header tambahan (CDN TikTok menolak permintaan tanpa Referer
dan cookie, dan URL-nya cepat kedaluwarsa).
| Aspek | Perilaku |
|---|---|
| Kunci cache | ID post + jenis (video/carousel) |
| Permintaan ulang | Dilayani dari berkas yang sudah ada (cached: true), biasanya di bawah 100 ms |
| Masa simpan | 6 jam sejak pengunduhan (dapat diubah lewat TIKTOKDL_TTL_SECONDS) |
| Pembersihan | Otomatis tiap 5 menit; menyapu entri kedaluwarsa |
| Batasi ruang | Kuota 8 GB, berkas paling lama dipakai dibuang lebih dulu (LRU) |
09 · Contoh integrasi
Python
import requests
r = requests.get(
"https://tiktok-downloader.zakyapps.my.id/api/v1/extract",
params={"url": "https://www.tiktok.com/@mutamtour.nganjuk/photo/7693181323791338759"},
timeout=120,
).json()
if r["ok"]:
for s in r.get("slides", []): # carousel
open(f"foto-{s['index']:02d}.jpg", "wb").write(
requests.get(s["url"], timeout=60).content)
if r.get("video"): # video
open("video.mp4", "wb").write(
requests.get(r["video"]["url"], timeout=300).content)
JavaScript
const DASAR = "https://tiktok-downloader.zakyapps.my.id";
const r = await fetch(
`${DASAR}/api/v1/fetch`,
{ method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ url: tautan }) }
).then(x => x.json());
if (r.ok) {
const url = r.video ? r.video.url : r.slides[0].url;
window.open(url, "_blank"); // langsung terunduh
}
n8n
Pakai node HTTP Request: metode POST, URL
https://tiktok-downloader.zakyapps.my.id/api/v1/fetch, aktifkan
Send Body → JSON, isi badan {"url": "{{ $json.link }}"}.
Ambil {{ $json.download.url }} kalau video, atau
{{ $json.zip }} untuk carousel, lalu teruskan ke node Google Drive/Telegram.
Terminal (unduh langsung)
URL=$(curl -s "https://tiktok-downloader.zakyapps.my.id/api/v1/extract?url=<tautan>" \
| python3 -c "import json,sys; print(json.load(sys.stdin)['download']['url'])")
curl -L -o hasil.mp4 "$URL"
10 · Catatan penggunaan
- Layanan ini untuk penggunaan pribadi dan operasional internal; hak cipta setiap video atau gambar tetap milik pemilik kontennya.
- Berkas disimpan sementara (6 jam) untuk keperluan pengunduhan, lalu dibersihkan otomatis.
- Rate limit dihitung per alamat IP. Untuk kebutuhan berkala, sebaiknya simpan hasilnya di sisi Anda daripada memanggil ulang.
- Permintaan ke domain yang tidak diizinkan ditolak lebih awal, dan tautan pengguna tidak pernah dieksekusi sebagai perintah sistem.
- Layanan berjalan di VPS pribadi; pemantauan otomatis menyalakan ulang proses bila berhenti.