mrkeyoor.com_
Fri 11 Sept 06:46 UTC
Self-Hostedevaluationupdated 11 Sept 2026

Douyin_TikTok_Download_API review

Douyin_TikTok_Download_API is a self-hosted service that turns Douyin and TikTok links into structured data, downloads, scheduled collections, and an archive exposed through REST, MCP, a CLI, and a web console. Its default documentation is English, and the project also maintains a full Chinese edition. It solves a bigger job than saving one clip: keeping identities healthy and making repeated collection observable.

Verdict

Our run installed 98 packages and built in 9 seconds, but pytest still ended with 7 failures and 19 errors because the required 32-character secret was missing. Douyin_TikTok_Download_API is worth deploying when REST, MCP, access control, archives, and identity health justify a real database stack and ongoing platform maintenance. For one-off downloads, yt-dlp or a narrower Douyin tool asks much less of its operator.

We ran it

Lab card: what happened when we ran Douyin_TikTok_Download_APIScreenshot of Douyin_TikTok_Download_API (douyin.wtf)
Install✓ · 52s98 packages · 219 MB
Build✓ · 9s
Tests✗ · 36s2472 passed · 7 failed · 465 skipped · 19 errors of 2498 (pytest)
Known vulns0(pip-audit)
Repo590 files~132,327 lines of source · 12.6 MB · 3 CI workflows · tests dir

Answers from our run

Does Douyin_TikTok_Download_API build from source?

Dependencies installed in 52 seconds (98 packages), and the build succeeded in 9 seconds. We cloned commit bcbbfa1 into a clean Debian container with 3 CPUs and no project-specific setup.

Do Douyin_TikTok_Download_API's tests pass?

Not all of them: 2472 of 2498 passed and 7 failed when we ran the project's own test command (pytest), with 19 collection errors. Some failures need services or credentials a bare container does not have.

Does Douyin_TikTok_Download_API have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use Douyin_TikTok_Download_API?

People who only want to save a few public videos: v5 brings PostgreSQL, TimescaleDB, Redis, workers, and optional browser and downloader services.

What are the alternatives to Douyin_TikTok_Download_API?

yt-dlp, TikTokDownload, TikTokDownloader. Our run installed 98 packages and built in 9 seconds, but pytest still ended with 7 failures and 19 errors because the required 32-character secret was missing.

Setup3/552-second install; tests stop without a required 32-character secret
Docs5/517 bilingual pages cover setup, operations, security, REST, and MCP
Community5/520,064 stars, a same-day push and release, and one open issue
Maturity3/5v5.0.1 is active; a configured rerun is needed after 19 errors

Who it’s for

Teams that need a private Douyin and TikTok data API rather than an occasional command-line download.
Operators who want REST, MCP, scheduled collection, media storage, and a searchable archive on one host.
Researchers and archivists who have permission to collect the content and can manage retention responsibly.
Self-hosters comfortable operating PostgreSQL, TimescaleDB, Redis, Docker Compose, secrets, and a TLS proxy.

Who it’s NOT for

People who only want to save a few public videos: v5 brings PostgreSQL, TimescaleDB, Redis, workers, and optional browser and downloader services.
v4 operators expecting an in-place upgrade: the security policy says v4 and v5 have different schemas, configuration, and container layouts, with no upgrade path.
Anyone who still needs Bilibili support: the README says the v5 rewrite dropped it and keeps that code on the frozen v4 branch.
Collectors who require Douyin follower or following lists: those endpoints are not registered because Douyin serves them only to a signed-in session.
Administrators who cannot put TLS in front of a public instance: the application container does not terminate TLS, redirect HTTP, or send HSTS.
Buyers who need an upstream-supported interface: the security policy treats changed signatures, platform risk controls, and dead endpoints as platform breakage rather than product vulnerabilities.

Setup reality

Our sandbox installed commit bcbbfa1 in 52 seconds, adding 98 packages and using 219 MB. The build succeeded in 9 seconds. Tests failed after 36 seconds: pytest reported 2,472 passed, 7 failed, 465 skipped, and 19 collection or setup errors of 2,498. Pip-audit found 0 known vulnerabilities.

Every failure and error shown in the supplied log tail raised SecretKeyMissing: DTK_SECRET_KEY was absent, and the run intentionally had no secrets. The log requires at least 32 characters and does not show whether any other cases would fail after configuration.

A real deployment needs PostgreSQL with TimescaleDB, Redis, a master secret, database and Redis passwords, and usually Docker Compose. Public access also needs a TLS reverse proxy. The optional browser identity service and downloader add more containers, while a manual install adds Python 3.12, uv, and Node 22 for the console.

Version 5 turns a downloader into a self-hosted data service

Version 5 accepts Douyin and TikTok posts, profiles, playlists, comments, short links, and share text, then places 93 REST operations over the resulting service layer. Requests are asynchronous by default, returning HTTP 202 and a task identifier, while a wait option restores a synchronous call. Parsed records can enter a PostgreSQL archive, and the same host can schedule repeat collection, save media, expose a CLI, and serve a React console.

The current default README is English, and the documentation directory contains 17 pages in both English and Chinese. This matters because older impressions of the project no longer describe main accurately. The v5 branch is a rewrite with an identity pool, API keys, roles, Redis work queues, and stored content. It also removed Bilibili, and Douyin follower and following endpoints are absent because they require a signed-in session.

Four signing methods still depend on changing upstream behavior

Douyin_TikTok_Download_API implements a_bogus, X-Bogus, X-Gnarly, and X-Dynosaur signing in Python, with a browser fallback. Guest identities can be minted through a headless browser, checked for health, rotated by the scheduler, and retired when they stop working. Imported signed-in cookies can widen access. The security policy still treats changed signatures and dead endpoints as upstream breakage.

What happened when we ran it

Our sandbox installed commit bcbbfa1 in 52 seconds, adding 98 packages and occupying 219 MB. The build succeeded in 9 seconds. The run used a fresh unprivileged Debian container with 3 CPUs, 8 GB of RAM, no secrets, and a Python 3.12 uv image. Pip-audit reported 0 known vulnerabilities in the installed packages.

Pytest exited with code 1 after 36 seconds. It reported 2,472 passed, 7 failed, 465 skipped, and 19 collection or setup errors of 2,498. The supplied summary names failures in internationalization, public-endpoint rules, and demo access checks, but every shown line ends with dtk.core.crypto.SecretKeyMissing. Our scan also found 3 CI workflow files, a tests directory, and no Dockerfile.

A missing 32-character secret stopped the test suite

DTK_SECRET_KEY must be present and at least 32 characters, according to both the test log and the current security documentation. The lab deliberately supplied no secrets, so the observed result is straightforward: the checkout built, then its test command did not pass in that environment. The log does not establish that adding a key would clear all 7 failures and 19 errors, so a configured rerun belongs in any adoption check.

The guided installer and manual example both generate credentials rather than shipping defaults. A deployment needs the master key, a PostgreSQL password, and a Redis password before its services start. Changing the master key later makes stored cookies and proxy credentials unreadable. That makes secret backup part of ordinary operations, not a one-time setup detail, especially when the archive and identity pool are meant to survive upgrades.

Docker Compose adds databases and a TLS boundary

The current README recommends Docker Compose and documents application, worker, migration, database, Redis, browser, and downloader responsibilities. PostgreSQL 17 must include TimescaleDB, while Redis 8 carries queues and short-lived state. Published images cover linux/amd64 and linux/arm64; the optional browser image is built locally from a pinned CloakBrowser commit. The lab signal that found no Dockerfile describes commit bcbbfa1, while the current README describes container files under docker/.

A manual install needs Python 3.12 and uv, plus Node 22 when the console is built. It also makes the operator recreate the container controls and service supervision. Public exposure requires another layer: the application does not provide TLS, redirect HTTP to HTTPS, or set HSTS. The security guide recommends leaving port 8000 on loopback and placing a configured reverse proxy in front, with trusted forwarded-address handling.

MCP keeps all 93 operations behind an API key

MCP always requires an API key, even when an operator opens selected REST endpoints publicly. It shares parsing, tasks, archive searches, and downloads with REST and the CLI. Roles run from demo through viewer and operator to admin, while key scopes narrow what a caller may do. Two sensitive options can return an identity's cookies or a signed upstream URL, so v5.0.1 keeps them operator-only and disables them in the demo playground.

Version 5.0.1 fixed demo controls and shipped the same day

Release v5.0.1 arrived on September 11, 2026. Its main user-facing fix cut the demo navigation from 20 visible entries to the 11 that a read-only visitor could use, instead of showing pages that answered 403. The release also corrected a mobile drawer, a 62-pixel overflow on the tools page, and two console code defects. Those details show active attention to the public demo.

GitHub recorded the last push on September 11, 2026, and listed 20,064 stars with 1 open issue and pull request combined. That remaining item asks for collection details and a collection identifier parameter, rather than reporting a system-wide failure. Same-day code and release activity support a healthy maintenance judgment. The low open count is still only a queue snapshot, not proof that every upstream endpoint currently works.

The 2,472 passing tests justify a configured trial

Our run got 2,472 tests through before pytest finished with 7 failures and 19 errors tied in the visible log to the absent master secret. That is substantial exercised code, yet the exit status matters. Teams that need the full REST, MCP, archive, and scheduling stack should rerun with an isolated test secret, exercise their own Douyin and TikTok requests, and plan for upstream repairs. Anyone who mainly wants media files should choose the smaller operational surface of yt-dlp or a focused downloader.

Alternatives

ProjectWhat it isPick it when
yt-dlp gh↗A broad command-line media downloader with support for many sites.pick this instead when you need files or a scriptable CLI, not an identity pool, database, web console, or MCP service.
TikTokDownloadA Python downloader for batches of Douyin profile posts, likes, collections, images, and audio.pick this instead when the task is centered on downloading Douyin media and a narrower Chinese-language project is acceptable.
TikTokDownloaderA Douyin and TikTok project focused on media downloads and data collection.pick this instead when collection and downloads matter more than operating a persistent multi-user API stack.

What people are saying

  1. [velocity-scout] Evil0ctal/Douyin_TikTok_Download_API

Sources

  1. Douyin TikTok Download API repository
  2. Douyin TikTok Download API README
  3. Installation and deployment guide
  4. MCP and AI agents guide
  5. Security guide
  6. Security policy and supported versions
  7. v5.0.1 release
  8. Issue 740: collection details endpoint request

More self-hosted reviews

halo · server · gpustack · ground-station · mastodon · changedetection.io · the whole board →