tiktok-live-recorder
Record any TikTok LIVE stream to MP4 in one command.
CLI + Python SDK. HLS + FLV input. Uses ffmpeg under the hood. Schedule, monitor, auto-archive. 2026 edition.
Install
pip install tiktok-live-recorder
ffmpeg must be on PATH:
- Windows: download from https://www.gyan.dev/ffmpeg/builds/ and add
binto PATH. - macOS:
brew install ffmpeg - Linux:
sudo apt install ffmpeg(Debian/Ubuntu) orsudo dnf install ffmpeg(Fedora).
CLI
tiktok-live-recorder streamer_username
No key. No config. Just run it.
tiktok-live-recorder <username> [options]
Options:
-o, --out <file> Output file (default: <username>-<timestamp>.mp4)
-q, --quality <q> origin | FULL_HD1 | HD1 | SD1 | SD2 (default: origin)
-c, --container <ext> mp4 | flv | ts | mkv (default: mp4)
--max <seconds> Stop after N seconds
-v, --verbose Print ffmpeg output
Examples:
# Record at best quality
tiktok-live-recorder streamer
# Cap at 2 hours, save to a named file
tiktok-live-recorder streamer --out 2026-06-07.mp4 --max 7200
# Save as FLV (no remux)
tiktok-live-recorder streamer -q origin -c flv
# Run as a module
python -m tiktok_live_recorder streamer
The CLI exits with code 2 when the user is offline so you can chain it in a watcher script:
while ! tiktok-live-recorder streamer; do sleep 30; done
SDK
Quick start
from tiktok_live_recorder import TikTokLiveRecorder
rec = TikTokLiveRecorder("streamer")
out_file, duration = rec.record(quality="origin")
print(f"Wrote {out_file} ({duration}s)")
Constructor
TikTokLiveRecorder(unique_id, *, endpoint=STREAM_URL_ENDPOINT, api_key="")
| Argument | Type | Default | Description |
|---|---|---|---|
unique_id |
str |
- | TikTok username (with or without @). |
endpoint |
str |
https://api.tik.tools/webcast/stream_url |
Override the URL resolver. |
api_key |
str |
"" |
Optional API key for higher-quality endpoints. |
rec.resolve() -> StreamSources
Return the available HLS / FLV URLs for the user without starting a recording.
sources = rec.resolve()
if not sources.live:
print("offline")
else:
print("HLS origin:", sources.hls.get("origin"))
rec.record(...) -> tuple[str, int]
Capture to disk. Returns (out_file, duration_sec). Resolves when the stream goes offline, max_duration_sec hits, or the user hits Ctrl+C.
| Argument | Type | Default | Description |
|---|---|---|---|
out_file |
`str | None` | <uniqueId>-<timestamp>.mp4 |
quality |
str |
"origin" |
Preferred quality. Falls back to next available. |
container |
str |
"mp4" |
mp4 / flv / ts / mkv. |
ffmpeg_path |
str |
"ffmpeg" |
Override the ffmpeg binary location. |
max_duration_sec |
`int | None` | - |
verbose |
bool |
False |
Print ffmpeg stderr. |
on_segment_start |
Callable[[str], None] |
- | Callback when a new segment file starts. |
on_segment_end |
Callable[[str], None] |
- | Callback when a segment file closes. |
Errors
from tiktok_live_recorder import (
TikTokLiveRecorder,
StreamOfflineError,
FfmpegMissingError,
)
rec = TikTokLiveRecorder("streamer")
try:
rec.record()
except StreamOfflineError:
print("not live")
except FfmpegMissingError:
print("install ffmpeg")
Recipes
Watch + record
import time
from tiktok_live_recorder import TikTokLiveRecorder, StreamOfflineError
rec = TikTokLiveRecorder("streamer")
while True:
try:
out_file, duration = rec.record()
print(f"captured {out_file} ({duration}s)")
except StreamOfflineError:
print("offline, retry in 30s")
time.sleep(30)
Batch record multiple creators concurrently
import concurrent.futures
from tiktok_live_recorder import TikTokLiveRecorder, StreamOfflineError
USERNAMES = ["a", "b", "c"]
def record_one(u: str) -> str:
try:
out_file, _ = TikTokLiveRecorder(u).record(out_file=f"{u}.mp4")
return f"{u} -> {out_file}"
except StreamOfflineError:
return f"{u} offline"
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as ex:
for r in ex.map(record_one, USERNAMES):
print(r)
Time-capped clip
from tiktok_live_recorder import TikTokLiveRecorder
rec = TikTokLiveRecorder("streamer")
out_file, _ = rec.record(max_duration_sec=60, out_file="clip.mp4")
Custom ffmpeg pipeline (split into 10-min segments)
import subprocess
from tiktok_live_recorder import TikTokLiveRecorder
sources = TikTokLiveRecorder("streamer").resolve()
input_url = sources.hls.get("origin")
if not input_url:
raise SystemExit("no hls available")
subprocess.run([
"ffmpeg", "-i", input_url,
"-c", "copy",
"-f", "segment",
"-segment_time", "600",
"-reset_timestamps", "1",
"streamer-%03d.mp4",
])
More ready-to-run recipes in examples/.
How it works
- The recorder asks
https://api.tik.tools/webcast/stream_url?uniqueId=Xfor the user's current HLS / FLV URLs. - The server checks live status + returns the URLs as JSON.
- The recorder spawns local
ffmpeg, passes the URL as input, copies the bytes to disk. No re-encoding.
All bandwidth flows directly from TikTok's CDN to your disk - none of it touches our servers. We only handle the lightweight URL resolution.
Compatibility
- Python >= 3.9.
- Works on Windows, macOS, Linux, Docker.
- Requires
ffmpegon PATH.
License
MIT
This is an independent third-party project. Not affiliated with, endorsed by, or in any way officially connected to TikTok or ByteDance Ltd. "TikTok" is a trademark of ByteDance Ltd; the name appears here for search discoverability.
Metadata
Release files for tiktok-live-recorder 1.0.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| tiktok_live_recorder-1.0.6.tar.gz | 9.8 kB | Without provenance | Details for tiktok_live_recorder-1.0.6.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| tiktok_live_recorder-1.0.6-py3-none-any.whl | Python 3 | none | any | Details for tiktok_live_recorder-1.0.6-py3-none-any.whl |
Total release size: 21.5 kB
Release files / tiktok_live_recorder-1.0.6.tar.gz
| Download URL | tiktok_live_recorder-1.0.6.tar.gz |
|---|---|
| Size | 9.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b2df01185cab93d01cad53a03eacc8599f70535cc3aff93969cc7348a7110dd8
|
|
BLAKE2b-256 checksum How to use checksums |
b4afcead348d39bd0742de98a65fe4cde2eb65aff37d0464d777b1389fe86aea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Release files / tiktok_live_recorder-1.0.6-py3-none-any.whl
| Download URL | tiktok_live_recorder-1.0.6-py3-none-any.whl |
|---|---|
| Size | 11.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
837009f23f140a7e26570544c819efe064c0498ef2f5513cbdf26b532c65df6d
|
|
BLAKE2b-256 checksum How to use checksums |
82bee4e09a96dd122210975142acf19d6f54b15b0b62827b32a66ddb7fd9556d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Security for tiktok-live-recorder 1.0.6
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.