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
The managed TikTok Live connector for Python - receive chat, gifts, viewers, battles & 18+ events from any TikTok LIVE stream. Zero maintenance, zero breakages.
99.9% uptime - Never breaks when TikTok updates. No protobuf, no reverse engineering, no maintenance required. Powered by the TikTool managed WebSocket API.
| 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?
- Getting Started
- Try It Now - Live Demo
- Events
- Live Captions (AI STT)
- Async Usage
- Chat Bot Example
- Other Languages
- Pricing
- Star History
- License
๐ 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 ยท CAPTCHA Solver ยท 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®ion=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!
Links
- ๐ Website: tik.tools
- ๐ Documentation: tik.tools/docs
- ๐ฆ Node.js SDK: @tiktool/live on npm
- ๐ PyPI: tiktok-live-api
- ๐ป GitHub (Node.js): tiktool/tiktok-live-api
License
This project is licensed under the MIT License - see the LICENSE file for details.
Contributors
- TikTool - Creator & Maintainer - tik.tools
See also the full list of contributors who have participated in this project.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tiktok_live_api-1.4.4.tar.gz.
File metadata
- Download URL: tiktok_live_api-1.4.4.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bf84aa8278a821583e78547a2c157e4fbb191c2d148656bf32179e7f0a47c0ad
|
|
| MD5 |
db087a28ba5882aa33ac4e656977df4e
|
|
| BLAKE2b-256 |
35097d04a75a563f3f01f00ff607d409461fb65517efdd19e77b08667e0a27fa
|
File details
Details for the file tiktok_live_api-1.4.4-py3-none-any.whl.
File metadata
- Download URL: tiktok_live_api-1.4.4-py3-none-any.whl
- Upload date:
- Size: 18.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91c0f2c08288d984941a2cbf44c74fecbd8d790c1fb82442bdce7e011aa4afaf
|
|
| MD5 |
73771cc68cda7eb9bb859ce9f017b019
|
|
| BLAKE2b-256 |
fc25c2c2107c3a429d07e6b75211aa64da438dac2554e60f5d056c32f5d78463
|