Every gift, follow, share, like and comment from your TikTok Live, streamed to your own code over one WebSocket. No revenue share, no separate plan, no approval process.
One connection. Everything that happens in your live, as it happens.
Gifts with their real coin value, follows, shares, likes and comments — the same feed our own games run on, not a summary.
It's a plain WebSocket with JSON frames. Python, Node, C#, Godot, Unity — if it can open a socket, it works.
Fields get added, never renamed or removed. Code you write today keeps working. The live schema is at /events/schema.
People use it for overlays we don't ship, chat bots, tying gifts into a game we don't support yet, logging to their own database, or driving physical hardware. Your gifts, your rules.
Three steps, about five minutes.
Dashboard → Developer API → Create developer
key. It starts with tik_dev_ and is shown once. It only reads this event
stream — it can't touch your games, overlays or account, which is what makes it safe
to paste into a script. Needs an active subscription.
pip install websocket-client
Point it at the socket below and start handling frames.
wss://tiktok.shibalabs.live/ws/events?k=YOUR_DEV_KEY
# pip install websocket-client
import json, sys, websocket
ws = websocket.create_connection(
f"wss://tiktok.shibalabs.live/ws/events?k={sys.argv[1]}")
while True:
frame = json.loads(ws.recv())
if frame["type"] != "events":
continue # skip "ready" / "keepalive"
for event in frame["events"]:
who = event["user"]["nick"]
if event["kind"] == "gift":
g = event["gift"]
print(f"{who} sent {event['count']}x {g['name']} ({g['value']} coins)")
elif event["kind"] == "comment":
print(f"{who}: {event['message']}")
else:
print(f"{who} — {event['kind']}")
Every gift adds time, every follow adds fifteen seconds, and the clock is written to
timer.txt — point an OBS Text source at it with "Read from file" and it's
on stream. That's a complete, working interactive.
deadline = time.time() + 300 # 5 minute timer
SECONDS_PER_COIN = 1.0
for event in frame["events"]:
if event["kind"] == "gift":
# "value" is already diamonds x count, so a 10-Rose combo counts as 10
deadline = max(deadline, time.time()) + event["gift"]["value"] * SECONDS_PER_COIN
elif event["kind"] == "follow":
deadline = max(deadline, time.time()) + 15
left = max(0, deadline - time.time())
open("timer.txt", "w").write(f"{int(left)//60}:{int(left)%60:02d}")
Swap those last few lines for anything — move a character, play a sound, fire a webhook at your own game server. The event loop is the only part that has to look like this.
The full contract. Also machine-readable at /events/schema.
| k | Your developer key. Can also be sent as an X-API-Key header. |
| kinds | Comma-separated filter, e.g. kinds=gift,follow. Omit for everything. |
| last_id | Resume after an event id you already handled. Omit to receive only new events. |
| ready | Sent once on connect, with the current last_id. |
| events | One or more events. The one you care about. |
| keepalive | Every ~20s while nothing is happening. Ignore it. |
{
"type": "events",
"last_id": 42,
"events": [
{
"kind": "gift", // gift | follow | share | comment | like
"id": 42, // monotonic; pass back as last_id to resume
"ts": 1734029481.22, // unix seconds
"user": { "uid": "someviewer", "nick": "Some Viewer", "pfp": "https://…" },
"count": 3, // gifts in the combo / likes in the batch
"message": null, // comment text on "comment" events
"gift": { // present on "gift" events only
"name": "Rose",
"diamonds": 1, // value of ONE
"value": 3 // diamonds x count — use this one
}
}
]
}
| Connection | Events only flow while your TikTok stream is connected on the dashboard's Connection tab. |
| Reconnects | The server keeps the last 512 events per account. Reconnect with last_id to catch up. |
| Multiple clients | Nothing is consumed — run as many clients on the same stream as you like. |
| Subscription | Keys stop working if your subscription lapses. |
| Secrecy | Treat a developer key like a password. Revoke it from the dashboard if it leaks. |
Not code, but the same audience: things that keep an unattended stream alive.
An AI voice that reacts to your stream out loud — thanks gifters by name, welcomes follows, answers chat, and fills dead air when the room goes quiet. It runs entirely on your PC on an 82M-parameter voice model, so there's no per-message cost and no cloud service to go down mid-stream. It never says a line the same way twice: the wording rotates and every single utterance is synthesised as a fresh take, so it doesn't develop the recorded-clip feeling that gives bots away.
Roblox disconnects you after about twenty idle minutes — right when an unattended stream is most valuable. The app taps a key often enough to stay connected, and it's careful about it: key presses only ever go to the game window, never to whatever you alt-tabbed to. Works for Roblox out of the box, and for BO2, Rust or Terraria by changing one field.
Create a key and you're connected in five minutes.