Repository navigation
Setup Same Machine
Both TS6 Manager and your TeamSpeak server run on one host. This is the common setup for a home server or a single VPS.
If your TeamSpeak server lives somewhere else, use Setup: TeamSpeak elsewhere instead.
WebQuery is the HTTP query interface, and on TeamSpeak 6 it is off by default. It is not the old raw/telnet ServerQuery on port 10011.
If TeamSpeak runs in Docker, recreate the container with the query interface enabled and its port published:
docker run -d --name ts6 \
-e TSSERVER_LICENSE_ACCEPTED=accept \
-e TSSERVER_QUERY_HTTP_ENABLED=1 \
-e TSSERVER_QUERY_HTTP_PORT=10080 \
-p 10080:10080/tcp \
-p 9987:9987/udp \
-p 30033:30033/tcp \
-v ts6-data:/var/tsserver \
teamspeaksystems/teamspeak6-server:latestUse a named volume (
-v ts6-data:/var/tsserverabove). If the server's data lives in an anonymous volume and the container is ever removed, the volume is orphaned and a laterdocker volume prunewill delete it — along with the API key, which is only ever printed on a fresh volume's first start.
If TeamSpeak is installed natively, enable it in tsserver.yaml (keep the rest of your file as it is):
server:
query:
http:
enable: 1
port: 10080ip sits next to port if the interface should listen on a specific address only. The same exists as command-line flags: --query-http-enable, --query-http-port, --query-http-ip. Restart the server afterwards.
WebQuery authenticates with an API key, not a password.
Your server prints a serveradmin key once, on its very first startup ever, in a log block titled "Server Query Admin Account created":
docker logs ts6 2>&1 | grep -i apikeyIf that key is gone, generate a new one with the apikeyadd query command.
Treat it like a root password. It grants full server administration.
TeamSpeak keeps an allowlist (query_ip_allowlist.txt) that by default contains only the loopback address. Even on the same host, the manager's connection does not arrive as loopback — it comes through Docker's networking, from the bridge gateway, typically 172.17.0.1.
Without this step you get the most confusing failure mode there is: the connection is accepted and then immediately dropped, with nothing useful in any log.
docker exec ts6 sh -c 'echo 172.17.0.0/16 >> /var/tsserver/query_ip_allowlist.txt'
docker restart ts6The server confirms it on startup with a [CIDRManager] updated query_ip_allowlist ips: ... line.
In the manager: Settings → Connections → Add.
| Field | Value |
|---|---|
| Host |
Not localhost — see below |
| WebQuery port | 10080 |
| API key | From step 2 |
The host field is resolved from inside the backend container, so localhost there means the backend itself, not your machine. Two options that work:
-
The host's LAN address, e.g.
192.168.1.50. Simplest, works immediately -
A shared Docker network — put both containers on one network and use the TeamSpeak container's name (
ts6) as the host. Tidier, and survives the host's IP changing. Deployment shows how to attach an external network
Press Test Connection before saving. It reports the actual reason for a failure — a refused connection, or TeamSpeak's own error message — rather than just "failed".
Only needed if you want bot flows that react to server events or chat commands — a client joining, leaving, or moving channel — the live event feed in the Query Console, or the Files page and icon picker. Everything else, including scheduled and webhook-triggered flows, works over WebQuery alone.
WebQuery is request/response only: the server cannot push events back over it, and it has no file-transfer commands. Event subscriptions need a persistent connection, which SSH ServerQuery provides.
Enable it on the TeamSpeak server (TSSERVER_QUERY_SSH_ENABLED=1, default port 10022, published like the others), then fill in the SSH fields on the same connection. If you don't know the serveradmin ServerQuery password, reset it through the already-working WebQuery connection with clientsetserverquerylogin client_login_name=serveradmin — the response contains the new password.
-
Create your admin account at
/setup. There are no default credentials by design - Consider a Bot Identity (Settings → Connections → Bot Identity) if you plan to use bot flows, so automated actions appear under their own name in TeamSpeak's logs instead of sharing yours. Optional, and changes nothing until you create one
- Enable two-factor authentication under Settings → Account if this is reachable from the internet
| Symptom | Likely cause |
|---|---|
| Connection accepted, then immediately reset | WebQuery not actually enabled inside the container — Docker's port forwarding answers, nothing listens behind it |
| Connection refused | Wrong port, or the port isn't published |
| Connects, then drops silently | The IP allowlist (step 3) |
invalid apikey (error 5122) |
The stored key doesn't match this server's current data volume — re-fetch it from the logs |
v0.7, last edited 14.10.2026
Getting started
Using the app
Running it
When something is odd
Contributing