ZA TikTok DownloaderZaky Apps · REST API

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.

Base URL https://tiktok-downloader.zakyapps.my.id Format JSON Autentikasi tidak perlu Versi 1.0.0
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

MetodeEndpointFungsi
GET/api/v1/healthStatus 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/fetchSama 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/docsHalaman ini
Setiap permintaan /api/v1/* menyertakan header X-RateLimit-Limit, X-RateLimit-Remaining, dan X-RateLimit-Reset (detik sampai kuota direset).
GET

02 · Status layanan

/api/v1/health

Tanpa 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 }
}
GET

03 · Ekstrak & unduh

/api/v1/extract

Endpoint utama. Menerima tautan video maupun carousel TikTok, mengunduh berkasnya ke server, lalu mengembalikan URL domain ini untuk setiap berkas.

Parameter

NamaWajibNilaiKeterangan
urlYatautan TikTokDomain yang diterima: tiktok.com, www.tiktok.com, m.tiktok.com, vt.tiktok.com, vm.tiktok.com. Tautan pendek (vt/vm) diikuti pengalihannya.
downloadTidaktrue (bawaan) / falsefalse = mode metadata: hanya informasi & URL CDN TikTok, berkas tidak disalin ke server.
include_rawTidaktrue / 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"
Untuk mengunduh hasilnya, ambil nilai 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.
GETPOST

04 · Kirim tautan lewat JSON

/api/v1/fetch

Perilakunya 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

FieldWajibKeterangan
urlYaTautan TikTok (sama seperti parameter url)
downloadTidaktrue (bawaan) atau false
include_rawTidaktrue untuk menyertakan URL CDN TikTok

05 · Endpoint berkas hasil

EndpointIsiKeterangan
/dl/{token}/{nama}Berkas hasilHeader Content-Disposition: attachment; mendukung Range. Tambahkan ?inline=1 agar tampil langsung di peramban (mis. untuk pemutar video).
/zip/{token}ZIP carouselSemua gambar dalam satu ZIP, urut sesuai nomor foto.
/thumb/{token}SampulGambar sampul post, berguna untuk kartu pratinjau.
token hanya berlaku untuk satu post dan satu sesi pengunduhan, serta mengikuti masa simpan yang sama (6 jam). Setelah kedaluwarsa, kirim ulang tautannya — berkasnya akan disalin lagi.

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

FieldTipeKeterangan
typestringvideo atau carousel
cachedbooleantrue = berkas sudah ada di server, balasan nyaris instan
expires_at / expires_inangkaWaktu habis masa simpan (epoch detik / sisa detik)
elapsed_msangkaLama proses di server (milidetik)
filesize / bytesangkaUkuran berkas hasil
slides / imageslarikDaftar 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.

KodeHTTPArti
invalid_url400Parameter url kosong atau bukan URL yang sah
unsupported_host400Domain di luar daftar TikTok yang diizinkan
not_found404Post tidak ada, privat, atau sudah dihapus
no_media404Post tidak memuat video atau gambar
rate_limited429Kuota 20 permintaan / 10 menit terlampaui; lihat header Retry-After
too_large413Berkas melampaui batas 300 MB
extract_failed502TikTok menolak/mengubah balasannya sehingga data tidak terbaca
download_failed502Gagal menyalin berkas media ke server
upstream_blocked502Permintaan ke TikTok dibatasi (tantangan/verifikasi)
sibuk503Permintaan post yang sama sedang berjalan; coba lagi sesaat
internal500Galat 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).

AspekPerilaku
Kunci cacheID post + jenis (video/carousel)
Permintaan ulangDilayani dari berkas yang sudah ada (cached: true), biasanya di bawah 100 ms
Masa simpan6 jam sejak pengunduhan (dapat diubah lewat TIKTOKDL_TTL_SECONDS)
PembersihanOtomatis tiap 5 menit; menyapu entri kedaluwarsa
Batasi ruangKuota 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