Skip to main content

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.

pypi downloads python license


Install

pip install tiktok-live-recorder

ffmpeg must be on PATH:

  • Windows: download from https://www.gyan.dev/ffmpeg/builds/ and add bin to PATH.
  • macOS: brew install ffmpeg
  • Linux: sudo apt install ffmpeg (Debian/Ubuntu) or sudo 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 (poll every 30s)

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

  1. The recorder asks https://api.tik.tools/webcast/stream_url?uniqueId=X for the user's current HLS / FLV URLs.
  2. The server checks live status + returns the URLs as JSON.
  3. 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 ffmpeg on 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.

Release files for tiktok-live-recorder 1.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for tiktok-live-recorder 1.0.3
File Size Uploaded
tiktok_live_recorder-1.0.3.tar.gz 9.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for tiktok-live-recorder 1.0.3
File Interpreter ABI Platform
tiktok_live_recorder-1.0.3-py3-none-any.whl Python 3 none any Details

Total release size: 19.1 kB

Release files / tiktok_live_recorder-1.0.3.tar.gz

Download URL tiktok_live_recorder-1.0.3.tar.gz
Size 9.1 kB
Tags Source
SHA-256 checksum
How to use checksums
71117c755988c7a297052bf810ec491f1e1ce85215e945ef87a31e224a408436
BLAKE2b-256 checksum
How to use checksums
fc869d86c55565205dbd1714fee122deb602f2b791d4a2ef31203f2d129ddb22
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.9

Release files / tiktok_live_recorder-1.0.3-py3-none-any.whl

Download URL tiktok_live_recorder-1.0.3-py3-none-any.whl
Size 10.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4ae1ed36702628d7871c906bbc3dbcf44e9b45e09a87d7618d6359cd5f870e2c
BLAKE2b-256 checksum
How to use checksums
dd24efc3779904115346a872b7685d0adbec22cd608e8bf04f76f11a1b0f0cab
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.9

Release history Release notifications | RSS feed

This release

1.0.3 This release

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page