Skip to main content

Unofficial TikTok LIVE API Client - Real-time chat, gifts, viewers, battles, and live captions from any TikTok livestream via the TikTool managed API.

Project description

tiktok-live-api Python

TikTok LIVE API - Python

The managed TikTok Live connector for Python - receive chat, gifts, viewers, battles & 18+ events from any TikTok LIVE stream. Zero maintenance, zero breakages.

PyPI version PyPI downloads Python Stars License: MIT

TikTok Live API Demo - real-time chat, gifts, and viewer events

99.9% uptime - Never breaks when TikTok updates. No protobuf, no reverse engineering, no maintenance required. Powered by the TikTool managed WebSocket API.


TikTool Logo

TikTool offers a fully managed TikTok LIVE API - real-time events, AI captions, CAPTCHA solving, and more. Free Community tier (forever). No credit card required.

๐ŸŽค Exclusive: Real-Time Live Captions - AI-powered speech-to-text with translation & speaker diarization. No other TikTok library offers this.

๐Ÿš€ One-Command Quick Start

Instantly connect to a live TikTok stream and print real-time events to your terminal.

pip install tiktok-live-api
python -m tiktok_live_api

Or connect to a specific stream: python -m tiktok_live_api @username


Table of Contents


๐Ÿ†š Why tiktok-live-api?

tiktok-live-api TikTokLive (isaackogan) TikTok-Live-Connector (Node.js)
Stability โœ… Managed API, 99.9% uptime โŒ Breaks on TikTok updates โŒ Breaks on TikTok updates
Setup โœ… 3 lines of code โŒ Protobuf + reverse engineering โŒ Protobuf + signing server
Live Captions (AI STT) โœ… Real-time speech-to-text โŒ Not available โŒ Not available
Translation โœ… 50+ languages โŒ Not available โŒ Not available
CAPTCHA Solving โœ… Built-in (Pro+) โŒ Manual โŒ Manual
Feed Discovery โœ… See who's live โŒ Not available โŒ Not available
Maintenance โœ… Zero - we handle everything โŒ You fix breakages โŒ You fix breakages
Multi-Language โœ… Python, Node.js, Java, Go, C# Python only Node.js only
Free Tier โœ… 2,500 req/day, 15 WS, 2h per WS โœ… Free (when it works) โœ… Free (when it works)

โšก Getting Started

1. Install

pip install tiktok-live-api

2. Get your free API key

Go to tik.tools โ†’ Sign up โ†’ Copy your API key. No credit card required.

3. Connect

from tiktok_live_api import TikTokLive

client = TikTokLive("streamer_username", api_key="YOUR_API_KEY")

@client.on("chat")
def on_chat(event):
    print(f"{event['user']['uniqueId']}: {event['comment']}")

@client.on("gift")
def on_gift(event):
    print(f"{event['user']['uniqueId']} sent {event['giftName']} ({event['diamondCount']} ๐Ÿ’Ž)")

@client.on("roomUserSeq")
def on_viewers(event):
    print(f"Viewers: {event['viewerCount']}")

client.run()

That's it. No protobuf, no signing servers, no reverse engineering, no breakages.


๐Ÿš€ Try It Now - Live Demo

Copy-paste, run, see real-time TikTok events in your terminal. Works on the free Community tier - 2h per WS, runs as long as the stream is live.

# demo.py - TikTok LIVE in real time
# pip install tiktok-live-api
from tiktok_live_api import TikTokLive

API_KEY       = "YOUR_API_KEY"        # Get free key โ†’ https://tik.tools
LIVE_USERNAME = "tv_asahi_news"       # Any live TikTok username

client = TikTokLive(LIVE_USERNAME, api_key=API_KEY)
events = 0

@client.on("connected")
def on_connected(event):
    print(f"\nโœ… Connected to @{LIVE_USERNAME} - streaming events...\n")

@client.on("chat")
def on_chat(event):
    global events; events += 1
    print(f"๐Ÿ’ฌ {event['user']['uniqueId']}: {event['comment']}")

@client.on("gift")
def on_gift(event):
    global events; events += 1
    print(f"๐ŸŽ {event['user']['uniqueId']} sent {event['giftName']} ({event.get('diamondCount', 0)}๐Ÿ’Ž)")

@client.on("like")
def on_like(event):
    global events; events += 1
    print(f"โค๏ธ  {event['user']['uniqueId']} liked ร— {event.get('likeCount', 0)}")

@client.on("member")
def on_member(event):
    global events; events += 1
    print(f"๐Ÿ‘‹ {event['user']['uniqueId']} joined")

@client.on("roomUserSeq")
def on_viewers(event):
    global events; events += 1
    print(f"๐Ÿ‘€ Viewers: {event['viewerCount']}")

@client.on("disconnected")
def on_disconnect(event):
    print(f"\n๐Ÿ“Š Disconnected. Received {events} events.\n")

# Press Ctrl+C to stop. Community tier caps each WebSocket at 2 hours.
client.run()
๐Ÿ”Œ Pure WebSocket version (no SDK)
# ws-demo.py - Pure WebSocket, zero dependencies
# pip install websockets
import asyncio, websockets, json

API_KEY       = "YOUR_API_KEY"
LIVE_USERNAME = "tv_asahi_news"

async def listen():
    url = f"wss://api.tik.tools?uniqueId={LIVE_USERNAME}&apiKey={API_KEY}"
    events = 0
    async with websockets.connect(url) as ws:
        print(f"\nโœ… Connected to @{LIVE_USERNAME} - streaming events...\n")
        async for message in ws:
            msg = json.loads(message)
            events += 1
            data = msg.get("data", {})
            user = data.get("user", {}).get("uniqueId", "")
            event = msg.get("event", "")
            if event == "chat":        print(f"๐Ÿ’ฌ {user}: {data.get('comment', '')}")
            elif event == "gift":      print(f"๐ŸŽ {user} sent {data.get('giftName', '')}")
            elif event == "like":      print(f"โค๏ธ  {user} liked ร— {data.get('likeCount', 0)}")
            elif event == "member":    print(f"๐Ÿ‘‹ {user} joined")
            elif event == "roomUserSeq": print(f"๐Ÿ‘€ Viewers: {data.get('viewerCount', 0)}")
            else:                      print(f"๐Ÿ“ฆ {event}")
    print(f"\n๐Ÿ“Š Disconnected. Received {events} events.\n")

asyncio.run(listen())

๐Ÿ“‹ Events

Event Description Key Fields
chat Chat message user, comment, emotes, starred?
gift Virtual gift user, giftName, diamondCount, repeatCount
like Like event user, likeCount, totalLikes
follow New follower user
share Stream share user
member Viewer joined user
subscribe New subscriber user
roomUserSeq Viewer count update viewerCount, topViewers
battle PK start / end / status change battleId, status (1=ACTIVE / 2=STARTING / 3=ENDED / 4=PREPARING), battleDuration, teams
battleArmies Live PK score update battleId, status, matchId, sessionId, durationSec, secsRemaining, hosts[] - each host has teamTotalScore + contributors[] (MVP first)
battleItemCard Booster multipliers, gloves, mist, match-guide, thunder, extra-time effect ('gloves' / 'mist' / 'booster_x2' / 'booster_x3' / 'match_guide' / ...), multiplier (2 or 3), senderUserId, senderNickname, activatedAtSec, durationSec, endsAtSec, commentTemplate
roomPin Pinned/starred message user, comment, action, durationSeconds
envelope Treasure chest diamonds, user
streamEnd Stream ended reason
connected WebSocket connected uniqueId
disconnected WebSocket disconnected uniqueId
error Error occurred error
event Catch-all (every event) Full raw event payload

All events include the full raw TikTok payload, giving you access to every field TikTok provides.

Battle / PK example

from tiktok_live_api import TikTokLive

client = TikTokLive(unique_id="creator_username", api_key="tk_...")

@client.on("battle")
def on_battle(e):
    print(f"PK status={e['status']} id={e['battleId']} duration={e['battleDuration']}s")

@client.on("battleArmies")
def on_armies(e):
    print(f"Countdown: {e.get('secsRemaining')}s")
    for host in e.get("hosts", []):
        print(f"  @{host['hostUserId']} total={host['teamTotalScore']}")
        if host["contributors"]:
            mvp = host["contributors"][0]
            print(f"    MVP {mvp['nickname']} score={mvp['score']}")

@client.on("battleItemCard")
def on_card(e):
    if e["multiplier"] > 0:
        print(f"x{e['multiplier']} booster from @{e['senderUniqueId']}")
    else:
        print(f"Effect {e['effect']} from @{e['senderUniqueId']} ({e['durationSec']}s)")

client.connect()

๐ŸŽค Live Captions (Speech-to-Text)

Transcribe and translate any TikTok LIVE stream in real-time. This feature is unique to TikTool - no other TikTok library offers it.

from tiktok_live_api import TikTokCaptions

captions = TikTokCaptions(
    "streamer_username",
    api_key="YOUR_API_KEY",
    translate="en",       # translate to English (50+ languages)
    diarization=True,     # identify who is speaking
)

@captions.on("caption")
def on_caption(event):
    speaker = event.get("speaker", "")
    text = event["text"]
    is_final = event.get("isFinal", False)
    print(f"[{speaker}] {text}{'  โœ“' if is_final else '...'}")

@captions.on("translation")
def on_translation(event):
    print(f"  โ†’ {event['text']}")

captions.run()

Caption Events

Event Description Key Fields
caption Real-time caption text text, speaker, isFinal, language
translation Translated caption text, sourceLanguage, targetLanguage
credits Credit balance update total, used, remaining

๐Ÿ”„ Async Usage

For integration with async frameworks (FastAPI, Django Channels, etc.):

import asyncio
from tiktok_live_api import TikTokLive

async def main():
    client = TikTokLive("streamer_username", api_key="YOUR_API_KEY")

    @client.on("chat")
    async def on_chat(event):
        print(f"{event['user']['uniqueId']}: {event['comment']}")

    await client.connect()

asyncio.run(main())

๐Ÿค– Chat Bot Example

from tiktok_live_api import TikTokLive

client = TikTokLive("streamer_username", api_key="YOUR_API_KEY")
gift_leaderboard = {}
message_count = 0

@client.on("chat")
def on_chat(event):
    global message_count
    message_count += 1
    msg = event["comment"].lower().strip()
    user = event["user"]["uniqueId"]

    if msg == "!hello":
        print(f">> BOT: Welcome {user}! ๐Ÿ‘‹")
    elif msg == "!stats":
        print(f">> BOT: {message_count} messages, {len(gift_leaderboard)} gifters")
    elif msg == "!top":
        top = sorted(gift_leaderboard.items(), key=lambda x: -x[1])[:5]
        for i, (name, diamonds) in enumerate(top):
            print(f"  {i+1}. {name} - {diamonds} ๐Ÿ’Ž")

@client.on("gift")
def on_gift(event):
    user = event["user"]["uniqueId"]
    diamonds = event.get("diamondCount", 0)
    gift_leaderboard[user] = gift_leaderboard.get(user, 0) + diamonds

client.run()

๐ŸŒ Other Languages

TikTool Live is available in every major language:

Language Package Install
Python tiktok-live-api pip install tiktok-live-api
Node.js / TypeScript @tiktool/live npm install @tiktool/live
Any Language WebSocket API wss://api.tik.tools?uniqueId=USERNAME&apiKey=KEY

Full documentation with examples in Java, Go, C#, cURL โ†’ tik.tools/docs


Environment Variable

Instead of passing api_key directly, set it as an environment variable:

# Linux / macOS
export TIKTOOL_API_KEY=your_api_key_here

# Windows (PowerShell)
$env:TIKTOOL_API_KEY="your_api_key_here"
from tiktok_live_api import TikTokLive

# Automatically reads TIKTOOL_API_KEY from environment
client = TikTokLive("streamer_username")
client.on("chat", lambda e: print(e["comment"]))
client.run()

๐Ÿ’ฐ Pricing

Tier Requests/Day WS Connections WS Duration Price
Community 2,500 15 2h per WS Free forever
Pro 75,000 50 8 hours from $19/wk +tax
Ultra 300,000 250 8 hours from $69/wk +tax
Global Agency 300,000 500 + Firehose 8 hours $149/wk or $549/mo +tax

Full plan details at tik.tools/pricing. Highlights:

  • Community ($0 forever): 2,500 req/day ยท 15 WS ยท 2h per WS ยท masked leaderboards. Build apps with masked names - upgrade when you need real identities. No datacenter proxies; requests run from your own IP.
  • Pro ($19/wk): 75K req/day ยท 50 WS ยท unmasked leaderboards ยท Feed Discovery ยท 5 AI caption streams ยท priority routing ยท chat support
  • Ultra ($69/wk): 300K req/day ยท 250 WS ยท 20 AI caption streams ยท League Rankings API unmasked ยท 99.5% uptime SLA ยท priority chat support
  • Global Agency ($149/wk or $549/mo): Everything in Ultra + Live Gifter Firehose WS (region/league/global filters + min-diamond threshold) + VIP Telegram alerts + VIP Web Vault (unmasked historical visual access)

Live Gifter Firehose - Global Agency

Real-time gift event stream from our Dragonfly fan-out. Filter by region, league, or globally; cap by minimum diamond threshold.

import asyncio, json, websockets

API_KEY = "tk_..."
URL = f"wss://api.tik.tools/firehose/gifters?apiKey={API_KEY}&mode=region&region=US%2B&min_diamonds=1000"

async def main():
    async with websockets.connect(URL) as ws:
        async for raw in ws:
            evt = json.loads(raw)
            # evt: { type:'gifter_alert', ts, gifter:{username,displayName,isAnonymous},
            #        creator:{uniqueId}, gift:{name,totalDiamonds}, region }
            print(evt)

asyncio.run(main())

Modes: global (all regions), region (single region code), league (region + league class, e.g. B2). Update the filter mid-stream by sending {"type":"update_filter","mode":"global","min_diamonds":5000} - no reconnect needed.

Get your free API key โ†’ tik.tools


Star History

If this project helps you, please consider giving it a โญ - it helps others discover it!

Star History Chart


Links


License

This project is licensed under the MIT License - see the LICENSE file for details.

Contributors

See also the full list of contributors who have participated in this project.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tiktok_live_api-1.4.5.tar.gz (2.0 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tiktok_live_api-1.4.5-py3-none-any.whl (18.2 kB view details)

Uploaded Python 3

File details

Details for the file tiktok_live_api-1.4.5.tar.gz.

File metadata

  • Download URL: tiktok_live_api-1.4.5.tar.gz
  • Upload date:
  • Size: 2.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for tiktok_live_api-1.4.5.tar.gz
Algorithm Hash digest
SHA256 bb8d46c1a98dcfca9884ef1dde3182d8676479ea043b27cbf41dc1a7e8e44dec
MD5 824b1c8ccbc0d8050c94ef50983aae93
BLAKE2b-256 4b2897463eee5c28958ad7ca48be1d5c46573f966d3e38989dc868822211dc74

See more details on using hashes here.

File details

Details for the file tiktok_live_api-1.4.5-py3-none-any.whl.

File metadata

File hashes

Hashes for tiktok_live_api-1.4.5-py3-none-any.whl
Algorithm Hash digest
SHA256 7e1b32f9945190162ba4b209e86a6cfa6e55c68ecc55b1866452ed44aa84b362
MD5 0faa0d7f6aad96221ab985ae3deb2243
BLAKE2b-256 b602f73267b10cee3a8bc44e7d84f2d86bb41f9059f8fc245790ca1f4c526be7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page