Included in every subscription

Build the interactive nobody has made yet.

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.

What you get

One connection. Everything that happens in your live, as it happens.

Raw events

Gifts with their real coin value, follows, shares, likes and comments — the same feed our own games run on, not a summary.

Any language

It's a plain WebSocket with JSON frames. Python, Node, C#, Godot, Unity — if it can open a socket, it works.

A stable contract

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.

Quick start

Three steps, about five minutes.

  1. Create a developer key

    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.

  2. Install one dependency

    pip install websocket-client

  3. Connect and read

    Point it at the socket below and start handling frames.

wss://tiktok.shibalabs.live/ws/events?k=YOUR_DEV_KEY

Print every event

# 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']}")

A real interactive: a countdown your viewers control

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.

Reference

The full contract. Also machine-readable at /events/schema.

Query parameters

kYour developer key. Can also be sent as an X-API-Key header.
kindsComma-separated filter, e.g. kinds=gift,follow. Omit for everything.
last_idResume after an event id you already handled. Omit to receive only new events.

Frame types

readySent once on connect, with the current last_id.
eventsOne or more events. The one you care about.
keepaliveEvery ~20s while nothing is happening. Ignore it.

An event

{
  "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
      }
    }
  ]
}

Things worth knowing

ConnectionEvents only flow while your TikTok stream is connected on the dashboard's Connection tab.
ReconnectsThe server keeps the last 512 events per account. Reconnect with last_id to catch up.
Multiple clientsNothing is consumed — run as many clients on the same stream as you like.
SubscriptionKeys stop working if your subscription lapses.
SecrecyTreat a developer key like a password. Revoke it from the dashboard if it leaks.

The desktop app

Not code, but the same audience: things that keep an unattended stream alive.

AI co-host

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.

Anti-AFK

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.

Both are included in your subscription. Grab the app from the dashboard's TTS tab, paste your API key, and flip the switches. Windows only.

Ready to build something?

Create a key and you're connected in five minutes.