Files
chanora/docs/references/respeak-protocol-reference.md
T
Edison Jwa 328776622f docs(references): fix formatting issues (TODO-074,075,076,077,078,082)
Fix malformed MIFCOM badge table row, replace section numbering
placeholder, split respeak reference into Part I/II, add version
notes for teaspeak contradictions, fix truncated YaTQA error codes.
2026-06-11 09:40:03 +09:00

2036 lines
100 KiB
Markdown

# ReSpeak TeamSpeak Protocol Reference
> Comprehensive offline reference compiled from [ReSpeak/tsdeclarations](https://github.com/ReSpeak/tsdeclarations) and [ReSpeak/tsclientlib](https://github.com/ReSpeak/tsclientlib).
---
## Table of Contents
### Part I — TS3 Protocol Specification
1. [TS3 Protocol Specification](#1-ts3-protocol-specification)
### Part II — Reference Data
2. [Error Codes](#2-error-codes)
3. [Permissions](#3-permissions)
4. [Client Versions](#4-client-versions)
5. [Badges](#5-badges)
6. [Enums](#6-enums)
7. [Book (State Tracking) Definitions](#7-book-state-tracking-definitions)
8. [Packet Definitions](#8-packet-definitions)
9. [tsdeclarations README](#9-tsdeclarations-readme)
10. [tsclientlib Architecture & API](#10-tsclientlib-architecture--api)
---
# Part I — TS3 Protocol Specification
# 1. TS3 Protocol Specification
## 0. Naming Conventions
- `(Client -> Server)` denotes packets from client to server.
- `(Client <- Server)` denotes packets from server to client.
- All datatypes are sent in network order (Big Endian) unless otherwise specified.
- Datatypes are declared with a prefixing `u` or `i` for unsigned and signed and a number for the bitlength.
For example `u8` would be the C equivalent of `uint8` or `unsigned char`
- Arrays are represented by the underlying datatype in square brackets, additionally if the length is known it is added in the brackets, separated by a semicolon. Eg: `[u8]`, `[i32; 16]`
- Array ranges (parts of an array) are specified in square brackets with the included lower bound, two points (`..`) and the excluded upper bound. Eg: `[0..10]`
## 1. Low-Level Packets
### 1.1 Packet structure
- The packets are build in a fixed scheme, though have differences depending in which direction.
- Every column here represents 1 byte.
- The entire packet size must be at max 500 bytes.
#### 1.1.1 (Client -> Server)
```
+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//----------+
| MAC | PId | CId |PT| Data |
+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//----------+
| \ Meta |
\ Header /
```
| Name | Size | Datatype | Explanation |
|------|-------------|----------|---------------------------------|
| MAC | 8 bytes | [u8] | EAX Message Authentication Code |
| PId | 2 bytes | u16 | Packet Id |
| CId | 2 bytes | u16 | Client Id |
| PT | 1 byte | u8 | Packet Type + Flags |
| Data | ≤487 bytes | [u8] | The packet payload |
#### 1.1.2 (Client <- Server)
```
+--+--+--+--+--+--+--+--+--+--+--+------------//-------------+
| MAC | PId |PT| Data |
+--+--+--+--+--+--+--+--+--+--+--+------------//-------------+
| \ Meta |
\ Header /
```
| Name | Size | Datatype | Explanation |
|------|-------------|----------|---------------------------------|
| MAC | 8 bytes | [u8] | EAX Message Authentication Code |
| PId | 2 bytes | u16 | Packet Id |
| PT | 1 byte | u8 | Packet Type + Flags |
| Data | ≤489 bytes | [u8] | The packet payload |
### 1.2 Packet Types
- `0x00` Voice
- `0x01` VoiceWhisper
- `0x02` Command
- `0x03` CommandLow
- `0x04` Ping
- `0x05` Pong
- `0x06` Ack
- `0x07` AckLow
- `0x08` Init1
### 1.3 Packet Type + Flags byte
The final byte then looks like this:
```
MSB LSB
+--+--+--+--+--+--+--+--+
|UE|CP|NP|FR| Type |
+--+--+--+--+--+--+--+--+
```
| Name | Size | Hex | Explanation |
|------|-------|------|-----------------|
| UE | 1 bit | 0x80 | Unencrypted |
| CP | 1 bit | 0x40 | Compressed |
| NP | 1 bit | 0x20 | Newprotocol |
| FR | 1 bit | 0x10 | Fragmented |
| Type | 4 bit | 0-8 | The packet type |
### 1.4 Packet Compression
To reduce packet size, the data can be compressed. When the data is compressed the `Compressed` flag must be set. The algorithm "QuickLZ" with Level 1 is used for compression.
### 1.5 Packet Splitting
When the packet payload exceeds the maximum datablock size the data can be split up across multiple packets.
The current protocol only allows `Command` and `CommandLow` to be split and/or compressed.
When splitting occurs, the `Fragmented` flag must be set on the first and the last packet.
The `Unencrypted` and `Compressed` flag, if set in the original packet, are only set on the first packet. (Though commands always have to be encrypted)
The `Newprotocol` flag has to be set on all commands and therefore also has to be applied on all splitted command packets.
The data can additionally be compressed *before* splitting.
*Example*: The packet to split has the following flags:
```
[__|CP|NP|__] Packet Id: 42
```
it must be split into:
```
[__|CP|NP|FR] Packet Id: 42
[__|__|NP|__] Packet Id: 43
[__|__|NP|FR] Packet Id: 44
```
### 1.6 Packet Encryption
When a packet is not encrypted the `Unencrypted` flag is set. For encrypted packets the flag gets cleared.
Packets get encrypted with EAX mode (AES_128_CTR with OMAC).
The en/decryption parameters are generated for each packet as follows:
#### 1.6.1 Inputs
| Name | Type | Explanation |
|------|----------|---------------------------------|
| PT | u8 | Packet Type |
| PId | u16 | Packet Id |
| PGId | u32 | Packet GenerationId (see 1.9.2) |
| PD | bool | Packet Direction |
| SIV | [u8; 20] | Shared IV (see 3.2) |
#### 1.6.2 Generation pseudocode
Note that the `temporary` variable will have a different length depending on the result from the crypto init handshake. The old protocol SharedIV (see 3.2.1) will be 20 bytes long, since it is generated with sha1, while the new protocol SharedIV (see 3.2.2) will have 64 bytes, since it is generated with sha512.
```
let temporary: [u8; 26] OR [u8; 70]
temporary[0] = 0x30 if (Client <- Server)
0x31 if (Client -> Server)
temporary[1] = PT
temporary[2..6] = (PGId in network order)[0..4]
if SIV.length == 20
temporary[6..26] = SIV[0..20]
else
temporary[6..70] = SIV[0..64]
let keynonce: [u8; 32]
keynonce = sha256(temporary)
key: [u8; 16] = keynonce[ 0..16]
nonce: [u8; 16] = keynonce[16..32]
key[0] = key[0] xor ((PId & 0xFF00) >> 8)
key[1] = key[1] xor ((PId & 0x00FF) >> 0)
```
> Note: The key and nonce can be cached for each tuple of (PT, PD, PGId) which will require 8 * 2 = 16 entries. And must only be recalculated each time the PG changes. For each packet to encrypt only the first 2 bytes must be xor'd with the PId as shown in the pseudocode.
#### 1.6.3 Encryption
The data can now be encrypted with the `key` and `nonce` from (see 1.6.2) as the EAX key and nonce and the packet `Meta` as defined in (see 1.1) as the EAX header (sometimes called "Associated Text"). The resulting EAX mac (sometimes called "Tag") will be stored in the `MAC` field as defined in (see 1.1.1).
#### 1.6.4 Not encrypted packets
When a packet is not encrypted, no MAC can be generated by EAX. In this case the SharedMac (see 3.2) will be used instead.
### 1.7 Packet Stack Wrap-up
This stack is a reference for the execution order of the set data operations. For incoming packets the stack is executed bot to top, for outgoing packets top to bot.
```
Send Receive
+-----------+ +-----------+
| Data | | Λ | Data |
+-----------+ | | +-----------+
| Compress | | | | Decompress|
+-----------+ | | +-----------+
| Split | | | | Merge |
+-----------+ | | +-----------+
| Encrypt | V | | Decrypt |
+-----------+ +-----------+
```
### 1.8 Packet Types Data Structures
#### 1.8.1.1 Voice (Client -> Server)
```
+--+--+--+---------//---------+
| VId |C | Data |
+--+--+--+---------//---------+
```
| Name | Type | Explanation |
|------|------|-----------------|
| VId | u16 | Voice Packet Id |
| C | u8 | Codec Type |
| Data | var | Voice Data |
#### 1.8.1.2 Voice (Client <- Server)
```
+--+--+--+--+--+---------//---------+
| VId | CId |C | Data |
+--+--+--+--+--+---------//---------+
```
| Name | Type | Explanation |
|------|------|-----------------|
| VId | u16 | Voice Packet Id |
| CId | u16 | Talking Client |
| C | u8 | Codec Type |
| Data | var | Voice Data |
#### 1.8.2.1 VoiceWhisper (Client -> Server)
For direct user/channel targeting (The `Newprotocol` Flag must be *unset*):
```
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//---------+
| VId |C |N |M | U* | T* | Data |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//---------+
```
| Name | Type | Explanation |
|------|-------|---------------------------------------|
| VId | u16 | Voice Packet Id |
| C | u8 | Codec Type |
| N | u8 | Count of ChannelIds to send to |
| M | u8 | Count of ClientIds to send to |
| U | [u64] | Targeted ChannelIds, repeated N times |
| T | [u16] | Targeted ClientIds, repeated M times |
| Data | var | Voice Data |
For targeting special groups (The `Newprotocol` Flag must be *set*):
```
+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//---------+
| VId |C |TY|TA| U | Data |
+--+--+--+--+--+--+--+--+--+--+--+--+--+---------//---------+
```
| Name | Type | Explanation |
|------|-------|---------------------------------------------------------|
| VId | u16 | Voice Packet Id |
| C | u8 | Codec Type |
| TY | u8 | GroupWhisperType (see below) |
| TA | u8 | GroupWhisperTarget (see below) |
| U | u64 | the targeted channelId or groupId (0 if not applicable) |
| Data | var | Voice Data |
```c
enum GroupWhisperType : u8
{
ServerGroup = 0, /* U = servergroup targetId */
ChannelGroup = 1, /* U = channelgroup targetId */
ChannelCommander = 2, /* U = 0 (ignored) */
AllClients = 3, /* U = 0 (ignored) */
}
enum GroupWhisperTarget : u8
{
AllChannels = 0,
CurrentChannel = 1,
ParentChannel = 2,
AllParentChannel = 3,
ChannelFamily = 4,
CompleteChannelFamily = 5,
Subchannels = 6,
}
```
#### 1.8.2.2 VoiceWhisper (Client <- Server)
```
+--+--+--+--+--+---------//---------+
| VId | CId |C | Data |
+--+--+--+--+--+---------//---------+
```
| Name | Type | Explanation |
|------|------|-----------------|
| VId | u16 | Voice Packet Id |
| CId | u16 | Talking Client |
| C | u8 | Codec Type |
| Data | var | Voice Data |
#### 1.8.3-4 Command and CommandLow
The TeamSpeak3 Query like command string encoded in UTF-8.
#### 1.8.5 Ping
Empty.
#### 1.8.6-8 Pong, Ack and AckLow
```
+--+--+
| PId |
+--+--+
```
| Name | Type | Explanation |
|------|------|------------------------------------|
| PId | u16 | The packet id that is acknowledged |
- In case of `Pong` a matching ping packet id is acknowledged.
- In case of `Ack` or `AckLow` a matching `Command` or `CommandLow` packet id respectively is acknowledged.
#### 1.8.9 Init1
(see 2.1)-(see 2.5)
### 1.9 Packet Ids and Generations
#### 1.9.1 Packet Ids
Each packet type and packet direction must be maintained by an own packet id counter. This means the client has 9 different packet id counter for outgoing packets. For each new packet the counter gets increased by 1. This also applies to split packets. The client must also maintain packet ids for incoming packets in case of packets arriving out of order. All Packet Ids start at 1 unless otherwise specified.
#### 1.9.2 Generations
Packet Ids are stored as u16, this means they range from 0 up to 65535 included. When the packet id overflows from 65535 to 0 at a packet, the generation counter for this packet type gets increased by 1. Note that the new generation id immediately applies to the 'overflowing' packet. The generation id counter is solely used for encryption (see 1.6).
### 1.10 Packet Acknowledgement / Packet Loss
In order to reliably send packets over UDP some packet types must get acknowledged when received (see 1.11). The protocol uses selective repeat for lost packets. This means each packet has its own timeout. Already acknowledged later packets must not be resent. When a packet times out, the exact same packet should be resent until properly acknowledged by the server. If after 30 seconds no resent packet gets acknowledged the connection should be closed. Packet resend timeouts should be calculated with an exponential backoff to prevent network congestion.
### 1.11 Wrap-up
| Type | Acknowledged (by) | Resend | Encrypted | Splittable | Compressible |
|--------------|-------------------|--------|-----------|------------|--------------|
| Voice | ✗ | ✗ | Optional | ✗ | ✗ |
| VoiceWhisper | ✗ | ✗ | Optional | ✗ | ✗ |
| Command | ✓ (Ack) | ✓ | ✓ | ✓ | ✓ |
| CommandLow | ✓ (AckLow) | ✓ | ✓ | ✓ | ✓ |
| Ping | ✓ (Pong) | ✗ | ✗ | ✗ | ✗ |
| Pong | ✗ | ✗ | ✗ | ✗ | ✗ |
| Ack | ✗ | ✓ | ✓ | ✗ | ✗ |
| AckLow | ✗ | ✓ | ✓ | ✗ | ✗ |
| Init1 | ✓ (next Init1) | ✓ | ✗ | ✗ | ✗ |
## 2. The (Low-Level) Initiation/Handshake
A connection is started from the client by sending the first handshake packet. The handshake process consists of 5 different init packets. This includes the so called RSA puzzle to prevent DOS attacks.
The packet header values are set as following for all packets here:
| Parameter | Value |
|-----------|--------------------------------------------------------|
| MAC | [u8]{ 0x54, 0x53, 0x33, 0x49, 0x4E, 0x49, 0x54, 0x31 } |
| key | N/A |
| nonce | N/A |
| Type | Init1 |
| Encrypted | ✗ |
| Packet Id | u16: 101 |
| Client Id | u16: 0 |
Init packets from the client contain a version field, which is the build timestamp of the client. This is a unix timestamp subtracted with 1356998400. The unix timestamp 1461588969 (date 2016-04-25) is encoded as 1461588969 - 1356998400 = 0x063bece9 = { 0x06, 0x3b, 0xec, 0xe9 }.
### 2.1 Packet 0 (Client -> Server)
```
04 bytes : Version of the TeamSpeak client as timestamp
Example: { 0x06, 0x3b, 0xec, 0xe9 }
01 bytes : Init-packet step number
Const: 0x00
04 bytes : Current timestamp in unix format
04 bytes : Random bytes := [A0]
08 bytes : Zeros, reserved.
```
### 2.2 Packet 1 (Client <- Server)
```
01 bytes : Init-packet step number
Const: 0x01
16 bytes : Server stuff := [A1]
04 bytes : The bytes from [A0] in reversed order (not always) := [A0r]
```
This packets usually contains the bytes from [A0] in reversed order, except when connecting from some networks for a yet unknown reason.
### 2.3 Packet 2 (Client -> Server)
```
04 bytes : Version of the TeamSpeak client as timestamp
01 bytes : Init-packet step number
Const: 0x02
16 bytes : The bytes from [A1]
04 bytes : The bytes from [A0r]
```
### 2.4 Packet 3 (Client <- Server)
```
01 bytes : Init-packet step number
Const: 0x03
64 bytes : 'x', an unsigned BigInteger
64 bytes : 'n', an unsigned BigInteger
04 bytes : 'level' a u32
100 bytes : Server stuff := [A2]
```
Note: Sometimes, instead of sending an init with step 3, the server responds with an init that contains 127 as step number. In that case, the client has to restart the connection by sending packet 0 again.
### 2.5 Packet 4 (Client -> Server)
```
04 bytes : Version of the TeamSpeak client as timestamp
01 bytes : Init-packet step number
Const: 0x04
64 bytes : the received 'x'
64 bytes : the received 'n'
04 bytes : the received 'level'
100 bytes : The bytes from [A2]
64 bytes : 'y' which is the result of x ^ (2 ^ level) % n as an unsigned
BigInteger. Padded from the lower side with '0x00' when shorter
than 64 bytes.
Example: { 0x00, 0x00, data ... data}
var bytes : The clientinitiv command data as explained in (see 3.1)
```
Note:
- `^` in this context means 'power to'
- To calculate the power of such a high number use a language integrated function like `ModPow` or similar, when available. If you don't have this function available you can multiply x iteratively and apply the modulo operation after each multiplication.
## 3. The (High-Level) Initiation/Handshake
In this phase the client and server exchange basic information and agree on/calculate the symmetric AES encryption key with the ECDH public/private key exchange technique.
Both the client and the server will need a EC public/private key. This key is also the identity which the server uses to recognize a user again. The curve used is 'prime256v1'.
All high level packets specified in this chapter are sent as `Command` Type packets as explained in (see 2.8.3). Additionally the `Newprotocol` flag (see 2.3) must be set on all `Command`, `CommandLow` and `Init1` packets.
All commands are specified in the `Messages.txt` file.
The packet header/encryption values for (see 3.1) and (see 3.2) are as following:
| Parameter | Value |
|-----------|------------------------------------------------------------------------------------------------------|
| MAC | (Generated by EAX) |
| key | [u8]{0x63, 0x3A, 0x5C, 0x77, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x73, 0x5C, 0x73, 0x79, 0x73, 0x74, 0x65} |
| nonce | [u8]{0x6D, 0x5C, 0x66, 0x69, 0x72, 0x65, 0x77, 0x61, 0x6C, 0x6C, 0x33, 0x32, 0x2E, 0x63, 0x70, 0x6C} |
| Type | Command |
| Encrypted | ✓ |
| Packet Id | u16: 0 |
| Client Id | u16: 0 |
The acknowledgement packets use the same parameters as the commands, except with the Type `Ack`.
### 3.1 clientinitiv (Client -> Server)
The first packet is sent (Client -> Server) although this is only sent for legacy reasons since newer servers (at least 3.0.13.0?) use the data part embedded in the last `Init1` packet from the low-level handshake (see 2.5).
```
clientinitiv alpha={alpha} omega={omega} ot={ot} ip={ip}
```
- `alpha` is set to `base64(random[u8; 10])` which are 10 random bytes for entropy.
- `omega` is set to `base64(publicKey[u8])` omega is an ASN.1-DER encoded public key from the ECDH parameters as following:
| Type | Value | Explanation |
|------------|----------------|-------------------------------------------|
| BIT STRING | 1bit, Value: 0 | LibTomCrypt uses 0 for a public key |
| INTEGER | 32 | The LibTomCrypt used keysize |
| INTEGER | publicKey.x | The affine X-Coordinate of the public key |
| INTEGER | publicKey.y | The affine Y-Coordinate of the public key |
- `ot` should always be `1`
- `ip` should be set to the final resolved ip address of the server you are actually connecting to.
### 3.2 initivexpand/initivexpand2 (Client <- Server)
Depending on the server version the server will send a different init request.
- TS3 server <3.1 will send `initivexpand`. Continue with (see 3.2.1)
- TS3 server ≥3.1 will send `initivexpand2`. Continue with (see 3.2.2)
If you want to support both protocol standards you don't need to check/know the server version. The client just has to act accordingly depending on which packet the server sends.
#### 3.2.1 initivexpand (Client <- Server)
The server responds with this command.
```
initivexpand alpha={alpha} beta={beta} omega={omega}
```
- `alpha` must have the same value as sent to the server in the previous step.
- `beta` is set to `base64(random[u8; 10])` by the server.
- `omega` is set to `base64(publicKey[u8])` with the public key from the server, encoded same as in (see 3.1)
With this information the client now must calculate the shared secret.
```
let sharedSecret: ECPoint
let x: [u8]
let sharedData: [u8; 32]
let SharedIV: [u8; 20]
let SharedMac: [u8; 8]
let ECDH(A, B) := (A * B).Normalize
sharedSecret = ECDH(serverPublicKey, ownPrivateKey)
x = sharedSecret.x.AsByteArray()
if x.length < 32
sharedData[ 0..(32-x.length)] = [0..0]
sharedData[(32-x.length)..32] = x[0..x.length]
elseif x.length == 32
sharedData[0..32] = x[0..32]
elseif x.length > 32
sharedData[0..32] = x[(x.length-32)..x.length]
SharedIV = sha1(sharedData)
SharedIV[0..10] = SharedIV[0..10] xor alpha.decode64()
SharedIV[10..20] = SharedIV[10..20] xor beta.decode64()
SharedMac[0..8] = sha1(SharedIV)[0..8]
```
#### 3.2.2 initivexpand2 (Client <- Server)
The server responds with this command.
```
initivexpand2 l={l} beta={beta} omega={omega} ot={ot} proof={proof} tvd={tvd}
```
- `l` the server license (see 3.2.2.2)
- `beta` is set to `base64(random[u8; 54])` by the server.
- `omega` is a `base64(publicKey[u8])` with the public key from the server, encoded same as in (see 3.1)
- `ot` should always be `1`
- `proof` is a `base64(ecdh_sign(l))`
- `tvd` (base64, unknown; only set on servers with a license)
##### 3.2.2.1 Verify integrity
This step **must** be done to verify the integrity of the connection.
The `proof` parameter is the sign of the `l` parameter (*not* base64 encoded). The client can verify the `l` parameter with the public key of the server which is sent in `omega`.
Both proofs which are exchanged (the one you received in (see 3.2.2), and the one sent in (see 3.2.2.5)) use 'prime256v1 with sha256, DER encoded'.
Note that the identity keys from client/server already should be keys on 'prime256v1' as noted in (see 3).
##### 3.2.2.2 Parsing the license
The license has a small header continued by a list of blocks. Each block may vary in length and must be parsed sequentially therefore.
The license header:
```
01 bytes : License version
Const: 0x01
```
The block base layout:
```
01 bytes : Key type
Const: 0x00 (public key)
32 bytes : Block public key
01 bytes : License block type
04 bytes : Not valid before date
04 bytes : Not valid after date
var bytes : (Content from the block type)
```
There are currently 4 different `License block type`s used:
- `00` Intermediate.
`content`:
```
04 bytes : Unknown
var bytes : A null terminated string, which describes the issuer of this certificate.
```
- `01` Website/`03` Code
`content`:
```
var bytes : A null terminated string, which describes the issuer of this certificate.
```
- `02` TS3 Server
`content`:
```
01 bytes : Server License Type
04 bytes : Max clients allowed on the server
var bytes : A null terminated string, which describes the issuer of this certificate.
```
- `08` TS5 Server
`content`:
```
01 bytes : Server License Type
01 bytes : Property count
var bytes : Properties, see following description on how each property is encoded
Per property:
01 bytes : Length of following data
01 bytes : Property Id
01 bytes : Data Type
var bytes : Content depending on data type, see below
```
Data Types:
- `00`: Null-terminated string
- `01`/`03`: 4 byte data
- `02`/`04`: 8 byte data
Property Id:
- `01` (type `01`): Unknown
- `02` (type `00`): Issuer of the certificate
- `03` (type `01`): Max clients allowed on the server, defaults to 32 if not present
- `32` Ephemeral
`content`: none
Both dates are stored in BigEndian, when read you must add `0x50e22700` to the number and import as a unix timestamp.
Each `Not valid before` and `Not valid after` timespan must be within the range of the parent license block.
The license must consist of `2 ≤ count ≤ 8` blocks. The second to last block must be of type `Server` and the last block must be of type `Ephemeral`.
##### 3.2.2.4 Calculating the shared secret
All elliptic curve operations for this step are done on the Curve25519. You might find more tools looking for Ed25519 but keep in mind that Ed25519 describes an EdDsa signing/verify operation and is not the curve itself.
To calculate the shared secret each license block now must be processed sequentially the following way:
```
next_key = public_key * clamp(sha512(block[1..])[0..32]) + parent
```
Where:
- `public_key` is the `Block public key` taken from the current license block. This array must be imported as a compressed Curve25519 EC point.
- `sha512(block[1..])[0..32]` is the sha512 of the current license block. Note that the first byte (`Key type`) is skipped for the sha calculation. For the result only the first 32 bytes are used. This resulting array must be imported as a Curve25519 private key.
- `parent` which is the resulting `next_key` from the previous block. This is a compressed Curve25519 EC point.
- `clamp(num)` is a function describing `abs(num) mod B` where `B` is the base point of Curve25519. This function can usually be implemented conveniently on the number buffer like this:
```
let buffer: [u8; 32]
buffer[0] &= 0xF8
buffer[31] &= 0x3F
buffer[31] |= 0x40
```
Since the first block has no predecessor, a fixed 'root' key is used as `parent`. This key must be imported as a compressed Curve25519 EC point.
```
[u8; 32] {0xcd, 0x0d, 0xe2, 0xae, 0xd4, 0x63, 0x45, 0x50, 0x9a, 0x7e, 0x3c,
0xfd, 0x8f, 0x68, 0xb3, 0xdc, 0x75, 0x55, 0xb2, 0x9d, 0xcc, 0xec,
0x73, 0xcd, 0x18, 0x75, 0x0f, 0x99, 0x38, 0x12, 0x40, 0x8a}
```
The last `next_key` is now used as the public key from the server (see pseudocode below).
The client now has to create a temporary Curve25519 public/private keypair. We will call them `client_public_key` and `client_private_key`.
Now the `SharedIV` and `SharedMac` which will be used in the encryption, just as in the old protocol, can be calculated.
```
let SharedIV: [u8; 64]
let SharedMac: [u8; 8]
let sharedData: [u8; 32]
sharedData = next_key * client_private_key
SharedIV = sha512(sharedData[0..32])
SharedIV[ 0..10] = SharedIV[ 0..10] xor alpha.decode64()
SharedIV[10..64] = SharedIV[10..64] xor beta.decode64()
SharedMac[0..8] = sha1(SharedIV)[0..8]
```
##### 3.2.2.5 clientek (Client -> Server)
```
clientek ek={ek} proof={proof}
```
- `ek` is `base64(client_public_key)` which the ephemeral (temporary) key created in (see 3.2.2.4) by the client. This should obviously be the public key part only.
- `proof` is `base64(client_public_key + beta)` which is a sign of the client_public_key (the `ek`) concatenated with the `beta` parameter from the `initivexpand2` command. The sign must be done with the private key from the identity keypair.
The normal packet id counting starts with this packet. This means that `clientek` already has the packet id `1` and the next command will continue with `2`.
### 3.2.3 Notes
- Only `SharedIV` and `SharedMac` are needed. The other values can (and should) be discarded.
- The crypto handshake is now completed. The normal encryption scheme (see 1.6) is from now on used.
- All `Command`, `CommandLow`, `Ack` and `AckLow` packets must get encrypted.
- `Voice` packets (and `VoiceWhisper` when wanted) should be encrypted when the channel encryption or server wide encryption flag is set.
- `Ping` and `Pong` must not be encrypted.
### 3.3 clientinit (Client -> Server)
```
clientinit client_nickname client_version client_platform client_input_hardware client_output_hardware client_default_channel client_default_channel_password client_server_password client_meta_data client_version_sign client_key_offset client_nickname_phonetic client_default_token hwid
```
- `client_nickname` the desired nickname
- `client_version` the client version
- `client_platform` the client platform
- `client_input_hardware` whether an input device is available
- `client_output_hardware` whether an output device is available
- `client_default_channel` the default channel to join. This can be a channel path or `/<id>` (eg `/1`) for a channel id.
- `client_default_channel_password` the password for the join channel, prepared the following way `base64(sha1(password))`
- `client_server_password` the password to enter the server, prepared the following way `base64(sha1(password))`
- `client_meta_data` (can be left empty)
- `client_version_sign` a cryptographic sign to verify the genuinity of the client
- `client_key_offset` the number offset used to calculate the hashcash (see 4.1) value of the used identity
- `client_nickname_phonetic` the phonetic nickname for text-to-speech
- `client_default_token` permission token to be used when connecting to a server
- `hwid` hardware identification string
**Notes**:
- Since client signs are only generated and distributed by TeamSpeak systems, this is the recommended client triple, as it is the reference for this paper:
- Version: `3.0.19.3 [Build: 1466672534]`
- Platform: `Windows`
- Sign: `a1OYzvM18mrmfUQBUgxYBxYz2DUU6y5k3/mEL6FurzU0y97Bd1FL7+PRpcHyPkg4R+kKAFZ1nhyzbgkGphDWDg==`
- The `hwid` usually consists of two 32 char strings concatenated with `,` and looks like `87056c6e1268aaf5055abf8256415e0e,408978b6d98810cc03f0aa16a4c75600` but even empty strings are accepted.
On windows the hwid seems to be generated from a registry key (`HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId`).
On linux and macOS it seems to derive from the MAC address of the primary Ethernet/Wifi adapter.
- Parameters which are empty or not used must be declared but left without value and the `=` character
### 3.4 initserver (Client <- Server)
The server sends the `initserver` command.
Note: From this point on the client knows his client id, therefore it must be set in the header of each packet. Newer versions of the server send parts of the `clientinit` command in the `initserver` command.
### 3.5 Further notifications
The server will now send all needed information to display the entire server properly. Those notifications are in no fixed order, although they are most of the time sent in the here declared order.
#### 3.5.1 channellist and channellistfinished
The `channellist` notification type will be sent multiple times as needed to transfer the entire server structure. After the last `channellist` notification the server will send `channellistfinished`.
#### 3.5.2 notifycliententerview
The `notifycliententerview` notification will be sent multiple times as needed for each client currently connected. This is the same notification as when a new client connects.
## 4. Further Concepts
### 4.1 Hashcash
To prevent client spamming (connecting to a server with many different clients) the server requires a certain hashcash level on each identity. This level has a exponentially growing calculation time with increasing level. This ensures that a user wanting to spam a certain server needs to invest some time into calculating the required level.
- The publicKey is a string encoded as in (see 3.1) the omega value.
- The key offset is a u64 number, which gets converted to a string when concatenated.
The first step is to calculate a hash as following:
```
let data: [u8; 20] = sha1(publicKey + keyOffset)
```
The level can now be calculated by counting the continuous leading zero bits in the data array. The bytes in the array get counted from 0 to 20 and the bits in each byte from least significant to most significant.
### 4.2 Uid
To calculate the uid of an identity the public key is required. Therefore you can only calculate the uid of your own identity and the servers identity you are connecting to.
The publicKey is a string encoded as in (see 3.1) the omega value.
The uid can be calculated as following:
```
let uid: string = base64(sha1(publicKey))
```
### 4.3 Ping/Pong
The server will regularly send ping packets to check if a client is still alive. The client must answer them with the according pong packet. The client should also send ping packets to the server to check for connection. They will be answered with according pong packets. Sending ping packets from the client side should not be started before the crypto handshake has been completed (see 3.3).
### 4.4 Passwords
All passwords when sent are hashed and encoded with `base64(sha1(password))`
### 4.5 Importing/Deobfuscating Identities from the TeamSpeak3 Client
The TeamSpeak3 Client exports identities the following way:
```
<key_offset> + 'V' + <obfuscaded_identity>
```
(For an explanation of the key offset (see 4.1))
```ts
const staticObfucationKey = b"b9dfaa7bee6ac57ac7b65f1094a1c155e747327bc2fe5d51c512023fe54a280201004e90ad1daaae1075d53b7d571c30e063b5a62a4a017bb394833aa0983e6e"
let ident = obfuscaded_identity.decode64()
let sha_part = ident[20..]
let idx = sha_part.indexof('\0') // where '\0' is the null-byte
let sha = sha1(sha_part[..idx])
ident[0..20] = ident[0..20] xor sha[0..20]
let xorlen = min(ident.length, 100)
ident[0..xorlen] = ident[0..xorlen] xor staticObfucationKey[0..xorlen]
```
### 4.6 Audio
When the Opus codec is used, Voice and VoiceWhisper packets are using a sampling rate of 48 kHz. A voice packet without audio data signals the end of a stream.
### 4.7 Permissions
`permissionlist` requests the list of all permissions of the server. `notifypermissionlist` returns the list of permissions and a grouping as a list of `group_id_end`s. The end ids are excluding, so a `group_id_end=6` for the first group means the first 6 permissions (`perms[0..6]`) are in this group.
### 4.8 Channel Subscription
Clients can subscribe channels, so they get notifications when someone enters or leaves from a subscribed channel. If a new channel is subscribed, the server usually sends a notification, except in some cases:
- If the client server groups or permissions change, it stays subscribed, even if it does not have the power anymore
- If the channel permissions change, the server sends a notification if the subscription status changed
- If a client enters a channel, it gets subscribed but there is no notification
- If a client leaves a channel, there is a notification that it unsubscribed
- If a new channel is created, clients are not automatically subscribed
### 4.9 Differences between Query and Full Client
- notifyconnectioninforequest
- => setconnectioninfo
---
# Part II — Reference Data
# 2. Error Codes
| Name | Doc | Hex |
|------|-----|-----|
| ok | unknown error code | 0x0000 |
| undefined | undefined error | 0x0001 |
| not_implemented | not implemented | 0x0002 |
| ok_no_update | | 0x0003 |
| dont_notify | | 0x0004 |
| lib_time_limit_reached | library time limit reached | 0x0005 |
| command_not_found | command not found | 0x0100 |
| unable_to_bind_network_port | unable to bind network port | 0x0101 |
| no_network_port_available | no network port available | 0x0102 |
| client_invalid_id | invalid clientID | 0x0200 |
| client_nickname_inuse | nickname is already in use | 0x0201 |
| client_invalid_error_code | invalid error code | 0x0202 |
| client_protocol_limit_reached | max clients protocol limit reached | 0x0203 |
| client_invalid_type | invalid client type | 0x0204 |
| client_already_subscribed | already subscribed | 0x0205 |
| client_not_logged_in | not logged in | 0x0206 |
| client_could_not_validate_identity | could not validate client identity | 0x0207 |
| client_invalid_password | invalid loginname or password | 0x0208 |
| client_too_many_clones_connected | too many clones already connected | 0x0209 |
| client_version_outdated | client version outdated, please update | 0x020a |
| client_is_online | client is online | 0x020b |
| client_is_flooding | client is flooding | 0x020c |
| client_hacked | client is modified | 0x020d |
| client_cannot_verify_now | can not verify client at this moment | 0x020e |
| client_login_not_permitted | client is not permitted to log in | 0x020f |
| client_not_subscribed | client is not subscribed to the channel | 0x0210 |
| channel_invalid_id | invalid channelID | 0x0300 |
| channel_protocol_limit_reached | max channels protocol limit reached | 0x0301 |
| channel_already_in | already member of channel | 0x0302 |
| channel_name_inuse | channel name is already in use | 0x0303 |
| channel_not_empty | channel not empty | 0x0304 |
| channel_can_not_delete_default | can not delete default channel | 0x0305 |
| channel_default_require_permanent | default channel requires permanent | 0x0306 |
| channel_invalid_flags | invalid channel flags | 0x0307 |
| channel_parent_not_permanent | permanent channel can not be child of non permanent channel | 0x0308 |
| channel_maxclients_reached | channel maxclient reached | 0x0309 |
| channel_maxfamily_reached | channel maxfamily reached | 0x030a |
| channel_invalid_order | invalid channel order | 0x030b |
| channel_no_filetransfer_supported | channel does not support filetransfers | 0x030c |
| channel_invalid_password | invalid channel password | 0x030d |
| channel_is_private_channel | channel is private channel | 0x030e |
| channel_invalid_security_hash | invalid security hash supplied by client | 0x030f |
| server_invalid_id | invalid serverID | 0x0400 |
| server_running | server is running | 0x0401 |
| server_is_shutting_down | server is shutting down | 0x0402 |
| server_maxclients_reached | server maxclient reached | 0x0403 |
| server_invalid_password | invalid server password | 0x0404 |
| server_deployment_active | deployment active | 0x0405 |
| server_unable_to_stop_own_server | unable to stop own server in your connection class | 0x0406 |
| server_is_virtual | server is virtual | 0x0407 |
| server_wrong_machineid | server wrong machineID | 0x0408 |
| server_is_not_running | server is not running | 0x0409 |
| server_is_booting | server is booting up | 0x040a |
| server_status_invalid | server got an invalid status for this operation | 0x040b |
| server_modal_quit | server modal quit | 0x040c |
| server_version_outdated | server version is too old for command | 0x040d |
| database | database error | 0x0500 |
| database_empty_result | database empty result set | 0x0501 |
| database_duplicate_entry | database duplicate entry | 0x0502 |
| database_no_modifications | database no modifications | 0x0503 |
| database_constraint | database invalid constraint | 0x0504 |
| database_reinvoke | database reinvoke command | 0x0505 |
| parameter_quote | invalid quote | 0x0600 |
| parameter_invalid_count | invalid parameter count | 0x0601 |
| parameter_invalid | invalid parameter | 0x0602 |
| parameter_not_found | parameter not found | 0x0603 |
| parameter_convert | convert error | 0x0604 |
| parameter_invalid_size | invalid parameter size | 0x0605 |
| parameter_missing | missing required parameter | 0x0606 |
| parameter_checksum | invalid checksum | 0x0607 |
| vs_critical | virtual server got a critical error | 0x0700 |
| connection_lost | Connection lost | 0x0701 |
| not_connected | not connected | 0x0702 |
| no_cached_connection_info | no cached connection info | 0x0703 |
| currently_not_possible | currently not possible | 0x0704 |
| failed_connection_initialisation | failed connection initialization | 0x0705 |
| could_not_resolve_hostname | could not resolve hostname | 0x0706 |
| invalid_server_connection_handler_id | invalid server connection handler ID | 0x0707 |
| could_not_initialise_input_manager | could not initialize Input Manager | 0x0708 |
| clientlibrary_not_initialised | client library not initialized | 0x0709 |
| serverlibrary_not_initialised | server library not initialized | 0x070a |
| whisper_too_many_targets | too many whisper targets | 0x070b |
| whisper_no_targets | no whisper targets found | 0x070c |
| file_invalid_name | invalid file name | 0x0800 |
| file_invalid_permissions | invalid file permissions | 0x0801 |
| file_already_exists | file already exists | 0x0802 |
| file_not_found | file not found | 0x0803 |
| file_io_error | file input/output error | 0x0804 |
| file_invalid_transfer_id | invalid file transfer ID | 0x0805 |
| file_invalid_path | invalid file path | 0x0806 |
| file_no_files_available | no files available | 0x0807 |
| file_overwrite_excludes_resume | overwrite excludes resume | 0x0808 |
| file_invalid_size | invalid file size | 0x0809 |
| file_already_in_use | file already in use | 0x080a |
| file_could_not_open_connection | could not open file transfer connection | 0x080b |
| file_no_space_left_on_device | no space left on device (disk full?) | 0x080c |
| file_exceeds_file_system_maximum_size | file exceeds file system's maximum file size | 0x080d |
| file_transfer_connection_timeout | file transfer connection timeout | 0x080e |
| file_connection_lost | lost file transfer connection | 0x080f |
| file_exceeds_supplied_size | file exceeds supplied file size | 0x0810 |
| file_transfer_complete | file transfer complete | 0x0811 |
| file_transfer_canceled | file transfer canceled | 0x0812 |
| file_transfer_interrupted | file transfer interrupted | 0x0813 |
| file_transfer_server_quota_exceeded | file transfer server quota exceeded | 0x0814 |
| file_transfer_client_quota_exceeded | file transfer client quota exceeded | 0x0815 |
| file_transfer_reset | file transfer reset | 0x0816 |
| file_transfer_limit_reached | file transfer limit reached | 0x0817 |
| sound_preprocessor_disabled | preprocessor disabled | 0x0900 |
| sound_internal_preprocessor | internal preprocessor | 0x0901 |
| sound_internal_encoder | internal encoder | 0x0902 |
| sound_internal_playback | internal playback | 0x0903 |
| sound_no_capture_device_available | no capture device available | 0x0904 |
| sound_no_playback_device_available | no playback device available | 0x0905 |
| sound_could_not_open_capture_device | could not open capture device | 0x0906 |
| sound_could_not_open_playback_device | could not open playback device | 0x0907 |
| sound_handler_has_device | ServerConnectionHandler has a device registered | 0x0908 |
| sound_invalid_capture_device | invalid capture device | 0x0909 |
| sound_invalid_playback_device | invalid playback device | 0x090a |
| sound_invalid_wave | invalid wave file | 0x090b |
| sound_unsupported_wave | wave file type not supported | 0x090c |
| sound_open_wave | could not open wave file | 0x090d |
| sound_internal_capture | internal capture | 0x090e |
| sound_device_in_use | device still in use | 0x090f |
| sound_device_already_registerred | device already registerred | 0x0910 |
| sound_unknown_device | device not registered/known | 0x0911 |
| sound_unsupported_frequency | unsupported frequency | 0x0912 |
| sound_invalid_channel_count | invalid channel count | 0x0913 |
| sound_read_wave | read error in wave | 0x0914 |
| sound_need_more_data | sound need more data | 0x0915 |
| sound_device_busy | sound device was busy | 0x0916 |
| sound_no_data | there is no sound data for this period | 0x0917 |
| sound_channel_mask_mismatch | Channelmask set bits count (speakers) is not the same as (count) | 0x0918 |
| permission_invalid_group_id | invalid group ID | 0x0a00 |
| permission_duplicate_entry | duplicate entry | 0x0a01 |
| permission_invalid_perm_id | invalid permission ID | 0x0a02 |
| permission_empty_result | empty result set | 0x0a03 |
| permission_default_group_forbidden | access to default group is forbidden | 0x0a04 |
| permission_invalid_size | invalid size | 0x0a05 |
| permission_invalid_value | invalid value | 0x0a06 |
| permissions_group_not_empty | group is not empty | 0x0a07 |
| permissions_client_insufficient | insufficient client permissions | 0x0a08 |
| permissions_insufficient_group_power | insufficient group modify power | 0x0a09 |
| permissions_insufficient_permission_power | insufficient permission modify power | 0x0a0a |
| permission_template_group_is_used | template group is currently used | 0x0a0b |
| permissions | permission error | 0x0a0c |
| accounting_virtualserver_limit_reached | virtualserver limit reached | 0x0b00 |
| accounting_slot_limit_reached | max slot limit reached | 0x0b01 |
| accounting_license_file_not_found | license file not found | 0x0b02 |
| accounting_license_date_not_ok | license date not ok | 0x0b03 |
| accounting_unable_to_connect_to_server | unable to connect to accounting server | 0x0b04 |
| accounting_unknown_error | unknown accounting error | 0x0b05 |
| accounting_server_error | accounting server error | 0x0b06 |
| accounting_instance_limit_reached | instance limit reached | 0x0b07 |
| accounting_instance_check_error | instance check error | 0x0b08 |
| accounting_license_file_invalid | license file invalid | 0x0b09 |
| accounting_running_elsewhere | virtualserver is running elsewhere | 0x0b0a |
| accounting_instance_duplicated | virtualserver running in same instance already | 0x0b0b |
| accounting_already_started | virtualserver already started | 0x0b0c |
| accounting_not_started | virtualserver not started | 0x0b0d |
| accounting_to_many_starts | | 0x0b0e |
| message_invalid_id | invalid message id | 0x0c00 |
| ban_invalid_id | invalid ban id | 0x0d00 |
| connect_failed_banned | connection failed, you are banned | 0x0d01 |
| rename_failed_banned | rename failed, new name is banned | 0x0d02 |
| ban_flooding | flood ban | 0x0d03 |
| tts_unable_to_initialize | unable to initialize tts | 0x0e00 |
| privilege_key_invalid | invalid privilege key | 0x0f00 |
| voip_pjsua | | 0x1000 |
| voip_already_initialized | | 0x1001 |
| voip_too_many_accounts | | 0x1002 |
| voip_invalid_account | | 0x1003 |
| voip_internal_error | | 0x1004 |
| voip_invalid_connectionId | | 0x1005 |
| voip_cannot_answer_initiated_call | | 0x1006 |
| voip_not_initialized | | 0x1007 |
| provisioning_invalid_password | invalid password | 0x1100 |
| provisioning_invalid_request | invalid request | 0x1101 |
| provisioning_no_slots_available | no(more) slots available | 0x1102 |
| provisioning_pool_missing | pool missing | 0x1103 |
| provisioning_pool_unknown | pool unknown | 0x1104 |
| provisioning_unknown_ip_location | unknown ip location(perhaps LAN ip?) | 0x1105 |
| provisioning_internal_tries_exceeded | internal error(tried exceeded) | 0x1106 |
| provisioning_too_many_slots_requested | too many slots requested | 0x1107 |
| provisioning_too_many_reserved | too many reserved | 0x1108 |
| provisioning_could_not_connect | could not connect to provisioning server | 0x1109 |
| provisioning_auth_server_not_connected | authentication server not connected | 0x1110 |
| provisioning_auth_data_too_large | authentication data too large | 0x1111 |
| provisioning_already_initialized | already initialized | 0x1112 |
| provisioning_not_initialized | not initialized | 0x1113 |
| provisioning_connecting | already connecting | 0x1114 |
| provisioning_already_connected | already connected | 0x1115 |
| provisioning_not_connected | | 0x1116 |
| provisioning_io_error | io_error | 0x1117 |
| provisioning_invalid_timeout | | 0x1118 |
| provisioning_ts3server_not_found | | 0x1119 |
| provisioning_no_permission | unknown permissionID | 0x111A |
---
# 3. Permissions
| Name | Doc |
|------|-----|
| unknown | May occur on error returns with no associated permission |
| b_serverinstance_help_view | Retrieve information about ServerQuery commands |
| b_serverinstance_version_view | Retrieve global server version (including platform and build number) |
| b_serverinstance_info_view | Retrieve global server information |
| b_serverinstance_virtualserver_list | List virtual servers stored in the database |
| b_serverinstance_binding_list | List active IP bindings on multi-homed machines |
| b_serverinstance_permission_list | List permissions available on the server instance |
| b_serverinstance_permission_find | Search permission assignments by name or ID |
| b_virtualserver_create | Create virtual servers |
| b_virtualserver_delete | Delete virtual servers |
| b_virtualserver_start_any | Start any virtual server in the server instance |
| b_virtualserver_stop_any | Stop any virtual server in the server instance |
| b_virtualserver_change_machine_id | Change a virtual servers machine ID |
| b_virtualserver_change_template | Edit virtual server default template values |
| b_serverquery_login | Login to ServerQuery |
| b_serverinstance_textmessage_send | Send text messages to all virtual servers at once |
| b_serverinstance_log_view | Retrieve global server log |
| b_serverinstance_log_add | Write to global server log |
| b_serverinstance_stop | Shutdown the server process |
| b_serverinstance_modify_settings | Edit global settings |
| b_serverinstance_modify_querygroup | Edit global ServerQuery groups |
| b_serverinstance_modify_templates | Edit global template groups |
| b_virtualserver_select | Select a virtual server |
| b_virtualserver_info_view | Retrieve virtual server information |
| b_virtualserver_connectioninfo_view | Retrieve virtual server connection information |
| b_virtualserver_channel_list | List channels on a virtual server |
| b_virtualserver_channel_search | Search for channels on a virtual server |
| b_virtualserver_client_list | List clients online on a virtual server |
| b_virtualserver_client_search | Search for clients online on a virtual server |
| b_virtualserver_client_dblist | List client identities known by the virtual server |
| b_virtualserver_client_dbsearch | Search for client identities known by the virtual server |
| b_virtualserver_client_dbinfo | Retrieve client information |
| b_virtualserver_permission_find | Find permissions |
| b_virtualserver_custom_search | Find custom fields |
| b_virtualserver_start | Start own virtual server |
| b_virtualserver_stop | Stop own virtual server |
| b_virtualserver_token_list | List privilege keys available |
| b_virtualserver_token_add | Create new privilege keys |
| b_virtualserver_token_use | Use a privilege keys to gain access to groups |
| b_virtualserver_token_delete | Delete a privilege key |
| b_virtualserver_log_view | Retrieve virtual server log |
| b_virtualserver_log_add | Write to virtual server log |
| b_virtualserver_join_ignore_password | Join virtual server ignoring its password |
| b_virtualserver_notify_register | Register for server notifications |
| b_virtualserver_notify_unregister | Unregister from server notifications |
| b_virtualserver_snapshot_create | Create server snapshots |
| b_virtualserver_snapshot_deploy | Deploy server snapshots |
| b_virtualserver_permission_reset | Reset the server permission settings to default values |
| b_virtualserver_modify_name | Modify server name |
| b_virtualserver_modify_welcomemessage | Modify welcome message |
| b_virtualserver_modify_maxclients | Modify servers max clients |
| b_virtualserver_modify_reserved_slots | Modify reserved slots |
| b_virtualserver_modify_password | Modify server password |
| b_virtualserver_modify_default_servergroup | Modify default Server Group |
| b_virtualserver_modify_default_channelgroup | Modify default Channel Group |
| b_virtualserver_modify_default_channeladmingroup | Modify default Channel Admin Group |
| b_virtualserver_modify_channel_forced_silence | Modify channel force silence value |
| b_virtualserver_modify_complain | Modify individual complain settings |
| b_virtualserver_modify_antiflood | Modify individual antiflood settings |
| b_virtualserver_modify_ft_settings | Modify file transfer settings |
| b_virtualserver_modify_ft_quotas | Modify file transfer quotas |
| b_virtualserver_modify_hostmessage | Modify individual hostmessage settings |
| b_virtualserver_modify_hostbanner | Modify individual hostbanner settings |
| b_virtualserver_modify_hostbutton | Modify individual hostbutton settings |
| b_virtualserver_modify_port | Modify server port |
| b_virtualserver_modify_autostart | Modify server autostart |
| b_virtualserver_modify_needed_identity_security_level | Modify required identity security level |
| b_virtualserver_modify_priority_speaker_dimm_modificator | Modify priority speaker dimm modificator |
| b_virtualserver_modify_log_settings | Modify log settings |
| b_virtualserver_modify_min_client_version | Modify min client version |
| b_virtualserver_modify_icon_id | Modify server icon |
| b_virtualserver_modify_weblist | Modify web server list reporting settings |
| b_virtualserver_modify_codec_encryption_mode | Modify codec encryption mode |
| b_virtualserver_modify_temporary_passwords | Modify temporary serverpasswords |
| b_virtualserver_modify_temporary_passwords_own | Modify own temporary serverpasswords |
| b_virtualserver_modify_channel_temp_delete_delay_default | Modify default temporary channel delete delay |
| b_virtualserver_modify_nickname | Modify server nicknames |
| b_virtualserver_modify_integrations | Modify integrations |
| i_channel_min_depth | Min channel creation depth in hierarchy |
| i_channel_max_depth | Max channel creation depth in hierarchy |
| b_channel_group_inheritance_end | Stop inheritance of channel group permissions |
| i_channel_permission_modify_power | Modify channel permission power |
| i_channel_needed_permission_modify_power | Needed modify channel permission power |
| b_channel_info_view | Retrieve channel information |
| b_channel_create_child | Create sub-channels |
| b_channel_create_permanent | Create permanent channels |
| b_channel_create_semi_permanent | Create semi-permanent channels |
| b_channel_create_temporary | Create temporary channels |
| b_channel_create_private | Create private channel |
| b_channel_create_with_topic | Create channels with a topic |
| b_channel_create_with_description | Create channels with a description |
| b_channel_create_with_password | Create password protected channels |
| b_channel_create_modify_with_codec_speex8 | Create channels using Speex Narrowband (8 kHz) codecs |
| b_channel_create_modify_with_codec_speex16 | Create channels using Speex Wideband (16 kHz) codecs |
| b_channel_create_modify_with_codec_speex32 | Create channels using Speex Ultra-Wideband (32 kHz) codecs |
| b_channel_create_modify_with_codec_celtmono48 | Create channels using the CELT Mono (48 kHz) codec |
| b_channel_create_modify_with_codec_opusvoice | Create channels using OPUS (voice) codec |
| b_channel_create_modify_with_codec_opusmusic | Create channels using OPUS (music) codec |
| i_channel_create_modify_with_codec_maxquality | Create channels with custom codec quality |
| i_channel_create_modify_with_codec_latency_factor_min | Create channels with minimal custom codec latency factor |
| b_channel_create_with_maxclients | Create channels with custom max clients |
| b_channel_create_with_maxfamilyclients | Create channels with custom max family clients |
| b_channel_create_with_sortorder | Create channels with custom sort order |
| b_channel_create_with_default | Create default channels |
| b_channel_create_with_needed_talk_power | Create channels with needed talk power |
| b_channel_create_modify_with_force_password | Create new channels only with password |
| i_channel_create_modify_with_temp_delete_delay | Max delete delay for temporary channels |
| b_channel_modify_parent | Move channels |
| b_channel_modify_make_default | Make channel default |
| b_channel_modify_make_permanent | Make channel permanent |
| b_channel_modify_make_semi_permanent | Make channel semi-permanent |
| b_channel_modify_make_temporary | Make channel temporary |
| b_channel_modify_name | Modify channel name |
| b_channel_modify_topic | Modify channel topic |
| b_channel_modify_description | Modify channel description |
| b_channel_modify_password | Modify channel password |
| b_channel_modify_codec | Modify channel codec |
| b_channel_modify_codec_quality | Modify channel codec quality |
| b_channel_modify_codec_latency_factor | Modify channel codec latency factor |
| b_channel_modify_maxclients | Modify channels max clients |
| b_channel_modify_maxfamilyclients | Modify channels max family clients |
| b_channel_modify_sortorder | Modify channel sort order |
| b_channel_modify_needed_talk_power | Change needed channel talk power |
| i_channel_modify_power | Channel modify power |
| i_channel_needed_modify_power | Needed channel modify power |
| b_channel_modify_make_codec_encrypted | Make channel codec encrypted |
| b_channel_modify_temp_delete_delay | Modify temporary channel delete delay |
| b_channel_delete_permanent | Delete permanent channels |
| b_channel_delete_semi_permanent | Delete semi-permanent channels |
| b_channel_delete_temporary | Delete temporary channels |
| b_channel_delete_flag_force | Force channel delete |
| i_channel_delete_power | Delete channel power |
| i_channel_needed_delete_power | Needed delete channel power |
| b_channel_join_permanent | Join permanent channels |
| b_channel_join_semi_permanent | Join semi-permanent channels |
| b_channel_join_temporary | Join temporary channels |
| b_channel_join_ignore_password | Join channel ignoring its password |
| b_channel_join_ignore_maxclients | Ignore channels max clients limit |
| i_channel_join_power | Channel join power |
| i_channel_needed_join_power | Needed channel join power |
| i_channel_subscribe_power | Channel subscribe power |
| i_channel_needed_subscribe_power | Needed channel subscribe power |
| i_channel_description_view_power | Channel description view power |
| i_channel_needed_description_view_power | Channel needed description view power |
| i_icon_id | Group icon identifier |
| i_max_icon_filesize | Max icon filesize in bytes |
| b_icon_manage | Enables icon management |
| b_group_is_permanent | Group is permanent |
| i_group_auto_update_type | Group auto-update type |
| i_group_auto_update_max_value | Group auto-update max value |
| i_group_sort_id | Group sort id |
| i_group_show_name_in_tree | Show group name in tree depending on selected mode |
| b_virtualserver_servergroup_list | List server groups |
| b_virtualserver_servergroup_permission_list | List server group permissions |
| b_virtualserver_servergroup_client_list | List clients from a server group |
| b_virtualserver_channelgroup_list | List channel groups |
| b_virtualserver_channelgroup_permission_list | List channel group permissions |
| b_virtualserver_channelgroup_client_list | List clients from a channel group |
| b_virtualserver_client_permission_list | List client permissions |
| b_virtualserver_channel_permission_list | List channel permissions |
| b_virtualserver_channelclient_permission_list | List channel client permissions |
| b_virtualserver_servergroup_create | Create server groups |
| b_virtualserver_channelgroup_create | Create channel groups |
| i_group_modify_power | Group modify power |
| i_group_needed_modify_power | Needed group modify power |
| i_group_member_add_power | Group member add power |
| i_group_needed_member_add_power | Needed group member add power |
| i_group_member_remove_power | Group member delete power |
| i_group_needed_member_remove_power | Needed group member delete power |
| i_permission_modify_power | Permission modify power |
| b_permission_modify_power_ignore | Ignore needed permission modify power |
| b_virtualserver_servergroup_delete | Delete server groups |
| b_virtualserver_channelgroup_delete | Delete channel groups |
| i_client_permission_modify_power | Client permission modify power |
| i_client_needed_permission_modify_power | Needed client permission modify power |
| i_client_max_clones_uid | Max additional connections per client identity |
| i_client_max_idletime | Max idle time in seconds |
| i_client_max_avatar_filesize | Max avatar filesize in bytes |
| i_client_max_channel_subscriptions | Max channel subscriptions |
| b_client_is_priority_speaker | Client is priority speaker |
| b_client_skip_channelgroup_permissions | Ignore channel group permissions |
| b_client_force_push_to_talk | Force Push-To-Talk capture mode |
| b_client_ignore_bans | Ignore bans |
| b_client_ignore_antiflood | Ignore antiflood measurements |
| b_client_issue_client_query_command | Issue query commands from client |
| b_client_use_reserved_slot | Use an reserved slot |
| b_client_use_channel_commander | Use channel commander |
| b_client_request_talker | Allow to request talk power |
| b_client_avatar_delete_other | Allow deletion of avatars from other clients |
| b_client_is_sticky | Client will be sticked to current channel |
| b_client_ignore_sticky | Client ignores sticky flag |
| b_client_info_view | Retrieve client information |
| b_client_permissionoverview_view | Retrieve client permissions overview |
| b_client_permissionoverview_own | Retrieve clients own permissions overview |
| b_client_remoteaddress_view | View client IP address and port |
| i_client_serverquery_view_power | ServerQuery view power |
| i_client_needed_serverquery_view_power | Needed ServerQuery view power |
| b_client_custom_info_view | View custom fields |
| i_client_kick_from_server_power | Client kick power from server |
| i_client_needed_kick_from_server_power | Needed client kick power from server |
| i_client_kick_from_channel_power | Client kick power from channel |
| i_client_needed_kick_from_channel_power | Needed client kick power from channel |
| i_client_ban_power | Client ban power |
| i_client_needed_ban_power | Needed client ban power |
| i_client_move_power | Client move power |
| i_client_needed_move_power | Needed client move power |
| i_client_complain_power | Complain power |
| i_client_needed_complain_power | Needed complain power |
| b_client_complain_list | Show complain list |
| b_client_complain_delete_own | Delete own complains |
| b_client_complain_delete | Delete complains |
| b_client_ban_list | Show banlist |
| b_client_ban_create | Add a ban |
| b_client_ban_delete_own | Delete own bans |
| b_client_ban_delete | Delete bans |
| i_client_ban_max_bantime | Max bantime |
| i_client_private_textmessage_power | Client private message power |
| i_client_needed_private_textmessage_power | Needed client private message power |
| b_client_server_textmessage_send | Send text messages to virtual server |
| b_client_channel_textmessage_send | Send text messages to channel |
| b_client_offline_textmessage_send | Send offline messages to clients |
| i_client_talk_power | Client talk power |
| i_client_needed_talk_power | Needed client talk power |
| i_client_poke_power | Client poke power |
| i_client_needed_poke_power | Needed client poke power |
| b_client_set_flag_talker | Set the talker flag for clients and allow them to speak |
| i_client_whisper_power | Client whisper power |
| i_client_needed_whisper_power | Client needed whisper power |
| b_client_modify_description | Edit a clients description |
| b_client_modify_own_description | Allow client to edit own description |
| b_client_modify_dbproperties | Edit a clients properties in the database |
| b_client_delete_dbproperties | Delete a clients properties in the database |
| b_client_create_modify_serverquery_login | Create or modify own ServerQuery account |
| b_ft_ignore_password | Browse files without channel password |
| b_ft_transfer_list | Retrieve list of running filetransfers |
| i_ft_file_upload_power | File upload power |
| i_ft_needed_file_upload_power | Needed file upload power |
| i_ft_file_download_power | File download power |
| i_ft_needed_file_download_power | Needed file download power |
| i_ft_file_delete_power | File delete power |
| i_ft_needed_file_delete_power | Needed file delete power |
| i_ft_file_rename_power | File rename power |
| i_ft_needed_file_rename_power | Needed file rename power |
| i_ft_file_browse_power | File browse power |
| i_ft_needed_file_browse_power | Needed file browse power |
| i_ft_directory_create_power | Create directory power |
| i_ft_needed_directory_create_power | Needed create directory power |
| i_ft_quota_mb_download_per_client | Download quota per client in MByte |
| i_ft_quota_mb_upload_per_client | Upload quota per client in MByte |
---
# 4. Client Versions
Format: `version,platform,hash`
This list contains 1536 known client version entries with their version hashes. Below is a representative sample spanning major releases from 3.0.11 through 5.0.0-alpha:
| Version | Platform | Hash |
|---------|----------|------|
| 3.0.11 [Build: 1374563791] | Windows | hQCwiLP5f4GIcDG5KQ1T+CNFGqRxyw5MXCHE8KjWRIgkjCuGSryK4vpPy70EURH3blQ8TKrax8BEorHlpnpdAQ== |
| 3.0.11.1 [Build: 1375773286] | Linux | JMTTCSHw+ibyhqCDCWRgby/oJ5uAYHk0/QOwqqI5rNHCKTkb+ce6N+4J38WXAnRmtcEaMb0s30s3ipQBokrqDw== |
| 3.0.11.1 [Build: 1375773286] | OS X | BngQ1112epNzhND5v7uDdbClbP9dSWczXKxvi1iRQo+xWt7WLYKJu/05MrW/CtPVtKwlT4PnbfI0Trvw+HvUCA== |
| 3.0.16 [Build: 1407159763] | Linux | 8776GitHAgkFPfOLxEh5x+Luuh4NrYPEJUdsUzNKndcAuWMYjwQTZkmeZOeG/swdn/p2Cg2pRfZfsIFSOAUWCQ== |
| 3.0.16 [Build: 1407159763] | OS X | vLAH2cYjkF/3sQCgr/zSmtffXcH2flI2vOnUP3uNIDSm8gKO61Q2hOdQaUzXE1yekLSMx2E9RYz+OQjQ868KAw== |
| 3.0.18.2 [Build: 1445516611] | iOS | TEC965pHLJhoiNA2N95xBjQfh2n6uasS3BRFraucFv/+WgAKCKeoUYb3tu6feO5zvTEEiH6YCsedQdhbU1FFCw== |
| 3.0.19.3 [Build: 1466672534] | Windows | a1OYzvM18mrmfUQBUgxYBxYz2DUU6y5k3/mEL6FurzU0y97Bd1FL7+PRpcHyPkg4R+kKAFZ1nhyzbgkGphDWDg== |
| 3.0.19.4 [Build: 1468491418] | Linux | jvhhk75EV3nCGeewx4Y5zZmiZSN07q5ByKZ9Wlmg85aAbnw7c1jKq5/Iq0zY6dfGwCEwuKod0I5lQcVLf2NTCg== |
| 3.0.19.4 [Build: 1468491418] | OS X | Pvcizdk3HRQMzTLt7goUYBmmS5nbAS1g2E6HIypLU+9eXTqGTBLim0UUtKc0s867TFHbK91GroDrTtv0aMUGAw== |
| 3.1 [Build: 1471417187] | Windows | Vr9F7kbVorcrkV5b/Iw+feH9qmDGvfsW8tpa737zhc1fDpK5uaEo6M5l2DzgaGqqOr3GKl5A7PF9Sj6eTM26Aw== |
| 3.1 [Build: 1475158080] | Linux | G0j7r7DswTMF+Fuqroy6/BR+tn02AOy0IZPlg9ZIW6r2m79yudZgrbm1TB4XoUpiFfex3ImdjOQnaFRQPONpBg== |
| 3.1 [Build: 1481641346] | iOS | SDH0QNTA1wDQdfIU0HbcRugD3qkkPHnvlSq/IeW/I4A2myFQnDbzm8ilEGR0vOU4NoTae8CH5XsBmRqwyPIeBA== |
| 3.1.0 [Build: 1481889010] | Android | eH8svg9XpltTbw+UYkQ4ixfqpbEAhwO9nmDDUWuI11swEU3Ye5HKGlFv70LxHZSgYlEqEH/N1J9U4ygptbPIDg== |
| 3.1.7 [Build: 1512665843] | Android | J04O7RCgM3ZlecpZz5H8IgWggyCJQB5KG4/MEEB5/mrW6XJEK4J5IpU3jKztkvy54B8Nrj9tbwMaRujZfILSAg== |
| 3.2.0 [Build: 1530859847] | Android | pjvK4iy+bB5X90mQI/Rzbkes27EokJjSOoGSXCqpjuPFj8Pe6BXt3M2E9VH/1Ec2hf8h51mr3D+cycGQpHq+DA== |
| 3.2.0 [Build: 1533739581] | Linux | Vt+iPp952TU4uKwGXY0L61mXgBNfXg+1+16fnS0snPU9fhkfOKzdPN4rBELOwJ5XzZc33KdVC8rzZGYzlQceBg== |
| 3.2.2 [Build: 1536587534] | iOS | 4rsRo3H9Uw0kui/cQkaBiqYy8ox6/gC6jDUVktcB6I71m1TeqUYy/IYMYbNSBtv0bmKntvcA0ZU79+zoXUkSAg== |
| 3.2.5 [Build: 1555517253] | Linux | +nqAMBv2NxHYfPwHyRmleALMU/2gpiv1LAV6dmrLjNXaTS3BwLBVuysSuqHsuiK3/Xff0IRRFANz8qT1ztJqDQ== |
| 3.3.0 [Build: 1555590310] | OS X | 4K5QbIPYfu42+ytMNgJOvYHB0kY/S+su1vsJ7zuLVlMs+XHbNhJEtjMANjDJAxfJ+fJ77VLBHf1Jo6Q5pSJFBA== |
| 3.3.0 [Build: 1559834030] | Android | Ux59iejFFnEANHPjL4dmwUgXKhvnV7dPqjzAIqYMNs0RoF9RyhsgxEaJO72IgNt7D3yaD+4lGtYfcEFG8WDKCg== |
| 3.3.1 [Build: 1561236585] | Linux | 2WaGpMt2Ky110SIh+byPcwkS+Dn9U2l7VffcJsoq2PNy0ZQ+o+N2i9wR4/7kEgtgB4SHIdoA7W8rQW2LLqUaAA== |
| 5.0.0-alpha206 [Build: 1556530824] | Linux | jIng2diWQpiV/D0tMDJSoA24IB2kB1weMJi16NdXRVKaULISROJHhbZKVZwOvl7Dm2yQFneUXguxzUE5bHWXAA== |
| 5.0.0-alpha206 [Build: 1556530824] | macOS | AaYqqXfOM9YSHTCNw/dVBrLUx8e/Kb+m7WmcRfEOrI+gqxS+EyqINxPQxpohpf7SW3OU2p2ic3BqaR89AFCqDQ== |
| 5.0.0-alpha293 [Build: 1564586764] | Windows | ZT9k6ShVBg3ZF/koi55DJttu1vcI8AmZcULRfN8YhGQa9fEkS9qIpj3gP6HKq7fh9dESvoKksRORq59RiH8xBQ== |
> **Note**: The complete list contains 1536 entries covering versions from 3.0.11 through 5.0.0-alpha293+ across Windows, Linux, OS X, macOS, Android, and iOS platforms. See the original `Versions.csv` in the [tsdeclarations repository](https://github.com/ReSpeak/tsdeclarations/blob/master/Versions.csv) for the full list.
---
# 5. Badges
| UID | Name | Description | Filename | Codes |
|-----|------|-------------|----------|-------|
| 4b27be5a-b92a-4b30-8b2d-14b59653f427 | 20th Anniversary | Celebrating 20 Years of TeamSpeak | 20_years | |
| f81ad44d-e931-47d1-a3ef-5fd160217cf8 | 4Netplayers | 4Netplayers customer | 4netplayers | |
| b78a0f3e-8758-4572-b102-42a79b4a0342 | ???? | Reads between the line | hat | |
| 2bf80270-8efe-46dc-a472-3280a0479145 | Alpha Tester | Helped to test our software. THANK YOU! | Alpha | |
| 05114019-6b46-4b13-b5a1-e5179ef69fb5 | April Fools! | Roses are red, gaming is fun, you are carrying too much to be able to run :( | rpg | |
| 1a518885-520c-4f54-9f49-8b1acb674771 | Braindance | I'm chippin' in | Braindance | P4TEKZ80PZ |
| cbf5aafd-2554-4053-80bb-0cf82ec0a430 | Bright Idea | TeamSpeak took my idea on board | FeatureBadge_Lightbulb | |
| d6062d9c-42a3-49c9-91dd-8c43a5a46805 | Bug Catcher | I found a bug! | BugBadge_Splat | |
| dfc70674-0fd0-431e-b3a1-edc32d7b09b2 | Challenge Accepted | Unlocked at SCILL Play — Challenges, tournaments and more! | scill | |
| afed63f4-82f1-4479-ab02-0ef053f55723 | Communities Early Adopter | Thank you for your Support! | communities_early_adopter | |
| 54be472d-3163-4076-9059-7f46128d937e | Communities Purchase | Purchased a TeamSpeak Community | communities_purchase | |
| f85f7e21-753a-4566-b26a-4e3e9155d2ef | Cyberpunk | We have a city to burn | Cyberpunk | |
| c028298c-84ff-4e22-be4e-b8c17552b4bb | Digi | Digi joined your channel #DIGWIN | digi | |
| 56df5ce2-6c5a-4a24-90e2-29e497e26170 | Drone Champions League | I follow the Drone Champions League | DCL_Badge | DRONECHAMP |
| 935e5a2a-954a-44ca-aa7a-55c79285b601 | E3 2018 - Winner | Discovered at E3 2018 | E3-2018 | |
| 61723e54-3da2-4f19-a33f-fcdc8ef5eaa0 | Father's Day 2022 | Not all heroes wear capes | fathersday2022 | |
| b9c7d6ad-5b99-40fb-988c-1d02ab6cc130 | Found Tim Speak | Found Tim Speak at Gamescom 2018 | met_tim | XJN4WJZEJN |
| 809bdd5a-2601-4152-82ff-a21d23d8fd46 | G2 Esports | Aged 20 years being a G2 fan | G2_Esports | |
| 62444179-0d99-42ba-a45c-c6b1557d079a | Gamescom 2014 | Registered at Gamescom 2014 | gamescom_2014 | |
| 50bbdbc8-0f2a-46eb-9808-602225b49627 | Gamescom 2016 | Registered during Gamescom 2016 | gamescom_2016 | |
| 534c9582-ab02-4267-aec6-2d94361daa2a | Gamescom 2017 | Visited TeamSpeak at Gamescom 2017 | gamescom_2017 | DK9JGRJH1Q |
| 4eef1ecf-a0ea-423d-bfd0-496543a00305 | Gamescom 2018 | Visited TeamSpeak at Gamescom 2018 | gamescom_2018 | 8CXB49KPJ4 |
| b82a45a5-b235-4926-be77-de102222e5eb | Gamescom 2019 | Visited TeamSpeak at Gamescom 2019 | Gamescom19 | PNKCB76VZ8 |
| 34dbfa8f-bd27-494c-aa08-a312fc0bb240 | Gamescom Hero 2017 | Gaming Hero at Gamescom 2017 | hero_2017 | |
| 24512806-f886-4440-b579-9e26e4219ef6 | Gamescom Hero 2018 | Gamescom Exclusive Gaming Hero 2018 | gamescom_2018_played | BJCFQBU53C |
| d49fd07e-99fb-41de-8d7b-c98064713171 | GommeHD.net | Your #1 Minecraft Network for over 10 years | GMHD | |
| c565972a-3912-457b-826f-84820c1ba6ca | Halloween 2021 | Happy Halloween 2021 | halloween21 | |
| 133595e7-950f-4ef2-b113-f91a68b5770d | Halloween 2021 Special | Earned by participating in our Halloween 2021 special stream | halloween21_special | |
| fb154277-5fe7-428a-85a4-43c0bdcdda3d | Halloween 2022 | Spooky_Scary_Skeletons.mp4 | halloween22 | |
| e6679ce2-d458-493c-8ffb-5660e47ac99f | Happy Hanami | Enjoy the view | hanami2023 | |
| de7bd960-eb02-47e1-9ce2-a44f6e255d8f | Happy Holidays 2019 | Happy holidays from everyone at TeamSpeak! | Happy_Holidays | |
| d4ea0251-ba46-4c1a-83b7-59db3f89e52c | Happy New Year 2021 | Survived the great toilet paper crisis of 2020 | firework_2020 | |
| 1519e001-06a0-458c-9195-a8a6d0ec87fc | Happy New Year 2023 | Aw man, here we go again | 2023_NewYear | |
| 834d4cc1-cd80-48d6-96c4-23d131d78649 | Happy Summer 2023 | heat death of the universe | happy_summer_2023 | |
| c68bcc52-7aeb-4868-b4d2-e7b20716f9ba | Heatwave 2022 | I'm melting... help | summer_icecream | |
| 94242c4e-6742-4540-8b66-ce951ed57159 | Helping Hand | pushed some buttons *beep* *bop* ~ thanks! | homebase | |
| 288a56c6-4da3-48de-9c9f-bd9eede5d832 | Immortal Roleplay | This is your life. | Immortal_Roleplay | |
| 69bfffc8-e9c0-4f70-8a37-47cb8c73fb1d | International Peace Day | United we stand, divided we fall | peaceday2022 | |
| 9ea23c77-8755-4d82-b30c-92f4aac109ef | International Women's Day 2021 | To all the mums, sisters, aunties, nieces and beyond, Happy Women's Day! | wft | |
| 7d9fa2b1-b6fa-47ad-9838-c239a4ddd116 | MIFCOM | MIFCOM — Entered Performance | mifcom | |
| ed85bdff-2a2b-4bea-a1a5-4d06fcc0d776 | Merry Christmas 2019 | It's the most wonderful 'Tim' of the Year | Christmas | |
| c6480fe2-ee25-4ee8-9853-243652c8ec54 | Merry Christmas 2020 | Let it snow, let it snow, let it snow! | Christmas2020 | |
| 0581aa0f-8c2d-4681-bb9f-8492fec49977 | Merry Christmas 2021 | Look what Santa's left under the server tree! | christmas2021 | |
| d4875b30-9908-43cb-a1eb-1a958e226078 | Merry Christmas 2022 | There's snow place like home | christmas2022 | |
| 87ccf9ea-67c9-45e5-adbc-77e210e6128a | Met Tim | Met Tim Speak IRL | tim_irl | |
| 0d98391c-ecdf-4f26-931a-49bfd669cda7 | Mind Egg | Found in the TeamSpeak 2020 Easter Egg Hunt | E_MindEgg | |
| 2fdda3c6-20e0-48f1-9c12-f39239a2ed02 | Mother's Day 2022 | Thanks for bearing with us | rose | |
| c3f823eb-5d5c-40f9-9dbd-3437d59a539d | Official TeamSpeak Gamer | New myTeamSpeak member | TS-2018 | |
| 8dfa37ac-b40d-4466-b393-ff2184a9adf3 | Overwatch League | I follow the Overwatch League | OWL_Badge | |
| 4ce435d1-6ac5-4530-b81d-6d14ddaaa1ac | PGL Antwerp 2022 | Watched the PGL CS:GO Major | PGLant | |
| fa3ece28-64df-431f-b1b3-90844bfdd2d9 | Paris Games Week 2014 | Registered at Paris Games Week 2014 | paris_gamesweek_2014 | |
| d95f9901-c42d-4bac-8849-7164fd9e2310 | Paris Games Week 2016 | Registered during Paris Games Week 2016 | paris_gamesweek_2016 | |
| 0005232e-538e-4cb2-93b6-d7d83e873829 | PietSmiet | Werde Snob auf PietSmiet.de ;) | PietSmiet | |
| be932556-dfa9-4dc6-afd0-98de0ab25777 | PolTeamgeist | WooOOHoohOOHooo | PolTeamgeist | |
| 5f6d49e4-35c8-4809-8c81-6e71f7f749e9 | Power Egg | Found in the TeamSpeak 2020 Easter Egg Hunt | E_PowerEgg | |
| ceee2445-4fbf-4f06-9421-286f0f4e875a | Pride | Never be afraid to show your colors. | pride | |
| 1aa375e8-7207-45bf-8b80-556bafafc834 | Reality Egg | Found in the TeamSpeak 2020 Easter Egg Hunt | E_RealityEgg | |
| f22c22f1-8e2d-4d99-8de9-f352dc26ac5b | Rocket Beans TV | Rocket Beans TV Community | rbtv | RWGE2NURJZ |
| 2c9698c1-1fec-4baa-a28f-4845f045f42f | Soul Egg | Found in the TeamSpeak 2020 Easter Egg Hunt | E_SoulEgg | |
| 641a4d85-2351-482c-97a1-02fc3b6abbb5 | Space Egg | Found in the TeamSpeak 2020 Easter Egg Hunt | E_SpaceEgg | |
| 63261116-4359-4842-873e-56820afbe068 | SpartaTheOriginal | Olaf Toast @ twitch.tv/SpartaTheOriginal | Toast | |
| ef567ec5-f46e-4520-be07-6021023cf6bd | Sponsorship License | Sponsored by TeamSpeak | Sponsorship | |
| 7a627d47-5496-4d68-83b5-2c4eafff9b30 | Stay Home, Stay Safe | Playing Apart, Staying Connected | StaySafeStayHome | |
| 7262a528-c7df-4369-bc2c-d34bf5853d7b | TS Chat Alpha Tester | Helped us test our new mobile app, thanks! | slim_golden | |
| 6eee759e-b1e9-4937-b023-07fc778532a2 | TS Gameday Participant | At least i tried... | silvered | |
| e1447b99-53b0-448a-98b7-ee7bad8bd268 | TS Gameday Winner | As shiny as the golden frying pan | goldenjoystick | |
| 1cb07348-34a4-4741-b50f-c41e584370f7 | TeamSpeak Addon Author | Creator of TeamSpeak Addons | addon_author | |
| 450f81c1-ab41-4211-a338-222fa94ed157 | TeamSpeak Addon Developer (Bronze) | Creator of at least 1 TeamSpeak Addon | addon_author_bronze | |
| 94ec66de-5940-4e38-b002-970df0cf6c94 | TeamSpeak Addon Developer (Gold) | Creator of at least 5 TeamSpeak Addons | addon_author_gold | |
| c9e97536-5a2d-4c8e-a135-af404587a472 | TeamSpeak Addon Developer (Silver) | Creator of at least 3 TeamSpeak Addons | addon_author_silver | |
| 9cd152a7-bf65-4ece-aeba-62d27678f79a | TeamSpeak Competition Winner Badge | TeamSpeak Competition Winner | CompWinnerBadge | |
| 64221fd1-706c-4bb2-ba55-996c39effa79 | TeamSpeak Jedi | myTeamSpeak early adopter | TS-OG | |
| 6b187e83-873b-46b0-b2c2-a31af15e76a4 | TeamSpeak Merch Badge | TeamSpeak Merch Owner - 1st Edition | cap_red | |
| 22b9ec39-7694-453e-864c-dfc7b1b0d7c7 | TeamSpeak Merch Badge 2.0 | TeamSpeak Merch Owner - 2nd Edition | topper | |
| 205916f3-a953-4754-8905-bc15069b1f91 | TeamSpeak Merch Badge 3.0 | TeamSpeak Merch Owner — 3rd Edition | Merch3 | |
| 8d843dfa-c51a-407f-87b3-94cfc8f03e96 | TeamSpeak Staff | Official Staff Member | teamspeak_staff | |
| c2368518-3728-4260-bcd1-8b85e9f8984c | Test | Testing, Testing. | Testing | |
| 4086a249-a503-4f31-9e83-8a0a8e3089bd | Tim-o'-Lantern | Mwuhaahaahaahaahaa | Tim-O-Lantern | JQGCTAQWHT |
| 089c7295-3aa2-48b0-b2f1-2dd1bec12caf | Time Egg | Found in the TeamSpeak 2020 Easter Egg Hunt | E_TimeEgg | |
| 904e232c-f369-44db-87f7-5142e15620cc | Time Machine | Worked like a machine to update addons in super-quick time. | time_machine | |
| 4c61af66-22ef-4897-b0bb-25fcef2acf60 | Undead Nightmare | I'm the last of my kind | undead_nightmare | |
| b0a36aea-3e46-4e83-a455-6e92ae1b9d94 | Undead Nightmare | I'm the last of my kind | undead_nightmare | |
| 0cd924ed-c5ea-459e-b60a-4f1bc0b65f07 | Up, Up and Away! | Find me on Mount Chiliad | up,_up_and_away! | |
| 4b0fd4f5-d456-4294-973d-853a1db5c7d8 | Valentim's Day 2019 | Valentim's Day 2019 | Valentines_Badge | |
| 92801833-e721-4b7e-84d4-6c02dbb332b9 | Valentim's Day 2020 | Valentim's Day 2020 | Valentim2020 | |
| 958f904b-8260-48a4-a961-f786cbd39411 | Valentine's Day 2023 | Love you like my Tamagotchi | ValentinesDay23 | |
| a676c708-da67-4784-ba7f-3fb7e8d2e865 | Valentines Day 2021 | Roses are red, TS is blue, Servers are Sweet and so are you. | valentine21 | |
| c54a9f92-07f7-4214-90f3-eafeea8005da | World Backup Day | Don't be an April Fool. Back up your data! | backupday_2023 | |
| 448a6d13-4e08-46a1-aafa-b4ff6d6c2d06 | World Bonsai Day | harmony, balance, patience | bonsai_day | |
| 0f976a27-ddf5-447c-b79c-0644a8e8a297 | Year of the Dragon 2024 | Arise, Shenron! | year_of_the_dragon_2024 | |
| 8c22fe26-30ac-4231-8b31-67d8a75c808a | Year of the Ox 2021 | Only listen to the fortune cookie; disregard all other fortune telling units. | ox21 | |
| 970c70e6-00a1-41c1-ac5c-81c89a06c7a6 | Year of the Rabbit 2023 | Do a barrel roll! | chineseNY2023 | |
| 92356386-0451-4a97-87d9-10ff4f43260c | Year of the Tiger 2022 | Rocky sends his regards | tiger | |
---
# 6. Enums
## PermissionType
| Variant | Doc |
|---------|-----|
| ServerGroup | Server group permission. (id1: ServerGroupId, id2: 0) |
| GlobalClient | Client specific permission. (id1: ClientDbId, id2: 0) |
| Channel | Channel specific permission. (id1: ChannelId, id2: 0) |
| ChannelGroup | Channel group permission. (id1: ChannelId, id2: ChannelGroupId) |
| ChannelClient | Channel-client specific permission. (id1: ChannelId, id2: ClientDbId) |
## TextMessageTargetMode
| Variant | Doc |
|---------|-----|
| Unknown | Maybe to all servers? |
| Client | Send to specific client |
| Channel | Send to current channel |
| Server | Send to server chat |
## HostMessageMode
| Variant | Doc |
|---------|-----|
| None | Dont display anything |
| Log | Display message inside log |
| Modal | Display message inside a modal dialog |
| Modalquit | Display message inside a modal dialog and quit/close server/connection |
## HostBannerMode
| Variant | Doc |
|---------|-----|
| NoAdjust | Do not adjust |
| AdjustIgnoreAspect | Adjust and ignore aspect ratio |
| AdjustKeepAspect | Adjust and keep aspect ratio |
## Codec
| Variant | Doc |
|---------|-----|
| SpeexNarrowband | Mono, 16bit, 8kHz, bitrate dependent on the quality setting |
| SpeexWideband | Mono, 16bit, 16kHz, bitrate dependent on the quality setting |
| SpeexUltrawideband | Mono, 16bit, 32kHz, bitrate dependent on the quality setting |
| CeltMono | Mono, 16bit, 48kHz, bitrate dependent on the quality setting |
| OpusVoice | Mono, 16bit, 48kHz, bitrate dependent on the quality setting, optimized for voice |
| OpusMusic | Stereo, 16bit, 48kHz, bitrate dependent on the quality setting, optimized for music |
## CodecEncryptionMode
| Variant | Doc |
|---------|-----|
| PerChannel | Voice encryption is configured per channel |
| ForcedOff | Voice encryption is globally off |
| ForcedOn | Voice encryption is globally on |
## Reason
| Variant | Doc |
|---------|-----|
| None | No reason data |
| Moved | Has invoker |
| Subscription | No reason data |
| LostConnection | Timeout |
| KickChannel | Has invoker |
| KickServer | Has invoker |
| KickServerBan | Has invoker, bantime |
| Serverstop | |
| Clientdisconnect | |
| Channelupdate | No reason data |
| Channeledit | Has invoker |
| ClientdisconnectServerShutdown | |
## GroupNamingMode
| Variant | Doc |
|---------|-----|
| None | No group name is displayed. |
| Before | Group name is displayed before the client name. |
| After | Group name is displayed after the client name. |
## GroupType
| Variant | Doc |
|---------|-----|
| Template | Template group (used for new virtual servers). |
| Regular | Regular group (used for regular clients). |
| Query | Global query group (used for server query clients). |
## LicenseType
| Variant | Doc |
|---------|-----|
| NoLicense | No licence |
| Offline | Offline/LAN license |
| Sdk | TeamSpeak SDK license |
| SdkOffline | TeamSpeak SDK offline license |
| Npl | Non-Profit License (NPL) |
| Athp | Authorised TeamSpeak Host Provider License (ATHP) |
| Aal | Annual activation license (AAL) |
| Default | Default license with 32 slots |
| Gamer | Gamer license |
| Sponsorship | Licenses sponsored by TeamSpeak |
| Commercial | For use inside corporates |
## ChannelType
| Variant | Doc |
|---------|-----|
| Permanent | Normal channel |
| SemiPermanent | Deleted when the server restarts |
| Temporary | Deleted when empty |
## TokenType
| Variant | Doc |
|---------|-----|
| ServerGroup | Server group token (`id1={groupId}, id2=0`) |
| ChannelGroup | Channel group token (`id1={groupId}, id2={channelId}`) |
## PluginTargetMode
| Variant | Doc |
|---------|-----|
| CurrentChannel | Send to all clients in the current channel. |
| Server | Send to all clients on the server. |
| Client | Send to all given clients ids. |
| CurrentChannelSubsribedClients | Send to all given clients which are subscribed to the current channel (i.e. which see the this client). |
## LogLevel
| Variant | Value | Doc |
|---------|-------|-----|
| Error | 1 | Everything that is really bad. |
| Warning | | Everything that might be bad. |
| Debug | | Output that might help find a problem. |
| Info | | Informational output. |
## ChannelPermissionHint (Bitflag)
| Variant | Value | Doc |
|---------|-------|-----|
| Join | 1 | b_channel_join_* |
| Modify | 2 | i_channel_modify_power |
| ForceDelete | 4 | b_channel_delete_flag_force |
| Delete | 8 | b_channel_delete_* |
| Subscribe | 16 | i_channel_subscribe_power |
| ViewDescription | 32 | i_channel_description_view_power |
| FileUpload | 64 | i_ft_file_upload_power |
| FileDownload | 128 | i_ft_needed_file_download_power |
| FileDelete | 256 | i_ft_file_delete_power |
| FileRename | 512 | i_ft_file_rename_power |
| FileBrowse | 1024 | i_ft_file_browse_power |
| FileDirectoryCreate | 2048 | i_ft_directory_create_power |
| ModifyPermissions | 4096 | i_channel_permission_modify_power |
## ClientPermissionHint (Bitflag)
| Variant | Value | Doc |
|---------|-------|-----|
| KickServer | 1 | i_client_kick_from_server_power |
| KickChannel | 2 | i_client_kick_from_channel_power |
| Ban | 4 | i_client_ban_power |
| MoveClient | 8 | i_client_move_power |
| PrivateMessage | 16 | i_client_private_textmessage_power |
| Poke | 32 | i_client_poke_power |
| Whisper | 64 | i_client_whisper_power |
| Complain | 128 | i_client_complain_power |
| ModifyPermissions | 256 | i_client_permission_modify_power |
---
# 7. Book (State Tracking) Definitions
The Book defines structures for keeping track of all things which happen on a server.
## ServerGroup
- **Doc**: Get in notifyservergrouplist
- **ID**: ServerGroup.Id
| Property | Type | Doc |
|----------|------|-----|
| Id | ServerGroupId | |
| Name | str | |
| GroupType | GroupType | |
| Icon | IconId | |
| IsPermanent | bool | If the group is saved to the server database |
| SortId | i32 | |
| NamingMode | GroupNamingMode | |
| NeededModifyPower | i32 | |
| NeededMemberAddPower | i32 | |
| NeededMemberRemovePower | i32 | (optional) |
## ChannelGroup
- **Doc**: Get in notifychannelgrouplist
- **ID**: ChannelGroup.Id
| Property | Type | Doc |
|----------|------|-----|
| Id | ChannelGroupId | |
| Name | str | |
| GroupType | GroupType | |
| Icon | IconId | |
| IsPermanent | bool | If the group is saved to the server database |
| SortId | i32 | |
| NamingMode | GroupNamingMode | |
| NeededModifyPower | i32 | |
| NeededMemberAddPower | i32 | |
| NeededMemberRemovePower | i32 | (optional) |
## OptionalChannelData
- **Doc**: Get in notifychanneledited by channelgetdescription
- **ID**: Channel.Id
- **Optional**: Yes
| Property | Type |
|----------|------|
| Description | str |
## Channel
- **Doc**: Get in channellist
- **ID**: Channel.Id
| Property | Type | Doc |
|----------|------|-----|
| Id | ChannelId | |
| Guid | str | (optional) |
| Parent | ChannelId | 0 means root channel |
| Name | str | |
| Topic | str | (optional) |
| Codec | Codec | |
| CodecQuality | u8 | (optional) |
| MaxClients | MaxClients | (optional) The maximum number of clients in the channel. |
| MaxFamilyClients | MaxClients | (optional) Maximum number of clients in this and all child channels. |
| Order | ChannelId | The preceding channel id. |
| ChannelType | ChannelType | |
| IsDefault | bool | (optional) Whether it is the default channel |
| HasPassword | bool | (optional) Whether this channel has a password |
| CodecLatencyFactor | i32 | (optional) |
| IsUnencrypted | bool | (optional) |
| DeleteDelay | Duration | (optional) |
| NeededTalkPower | i32 | (optional) |
| ForcedSilence | bool | |
| PhoneticName | str | (optional) |
| Icon | IconId | (optional) |
| IsPrivate | bool | (optional) |
| StorageQuota | u32 | (optional) |
| Subscribed | bool | |
| PermissionHints | ChannelPermissionHint | (optional) |
| OptionalData | OptionalChannelData | (optional) |
## OptionalClientData
- **Doc**: Get in notifyclientupdated by clientgetvariables
- **ID**: Client.Id
- **Optional**: Yes
| Property | Type |
|----------|------|
| Version | str |
| VersionSign | str | (optional) |
| Platform | str |
| LoginName | str | (optional) Set only for server queries |
| Created | DateTime |
| LastConnected | DateTime |
| ConnectionsTotal | u32 |
| BytesUploadedMonth | u64 |
| BytesDownloadedMonth | u64 |
| BytesUploadedTotal | u64 |
| BytesDownloadedTotal | u64 |
## ConnectionClientData
- **Doc**: Get in notifyconnectioninfo by getconnectioninfo
- **ID**: Client.Id
- **Optional**: Yes
| Property | Type | Doc |
|----------|------|-----|
| Ping | Duration | (optional) |
| PingDeviation | Duration | (optional) |
| ConnectedTime | Duration | (optional) |
| ClientAddress | SocketAddr | (optional) Only available if we have the permission to view it |
| PacketsSentSpeech | u64 | (optional) |
| PacketsSentKeepalive | u64 | (optional) |
| PacketsSentControl | u64 | (optional) |
| BytesSentSpeech | u64 | (optional) |
| BytesSentKeepalive | u64 | (optional) |
| BytesSentControl | u64 | (optional) |
| PacketsReceivedSpeech | u64 | (optional) |
| PacketsReceivedKeepalive | u64 | (optional) |
| PacketsReceivedControl | u64 | (optional) |
| BytesReceivedSpeech | u64 | (optional) |
| BytesReceivedKeepalive | u64 | (optional) |
| BytesReceivedControl | u64 | (optional) |
| ServerToClientPacketlossSpeech | f32 | (optional) |
| ServerToClientPacketlossKeepalive | f32 | (optional) |
| ServerToClientPacketlossControl | f32 | (optional) |
| ServerToClientPacketlossTotal | f32 | (optional) |
| ClientToServerPacketlossSpeech | f32 | |
| ClientToServerPacketlossKeepalive | f32 | |
| ClientToServerPacketlossControl | f32 | |
| ClientToServerPacketlossTotal | f32 | |
| BandwidthSentLastSecondSpeech | u64 | (optional) |
| BandwidthSentLastSecondKeepalive | u64 | (optional) |
| BandwidthSentLastSecondControl | u64 | (optional) |
| BandwidthSentLastMinuteSpeech | u64 | (optional) |
| BandwidthSentLastMinuteKeepalive | u64 | (optional) |
| BandwidthSentLastMinuteControl | u64 | (optional) |
| BandwidthReceivedLastSecondSpeech | u64 | (optional) |
| BandwidthReceivedLastSecondKeepalive | u64 | (optional) |
| BandwidthReceivedLastSecondControl | u64 | (optional) |
| BandwidthReceivedLastMinuteSpeech | u64 | (optional) |
| BandwidthReceivedLastMinuteKeepalive | u64 | (optional) |
| BandwidthReceivedLastMinuteControl | u64 | (optional) |
| FiletransferBandwidthSent | u64 | (optional) |
| FiletransferBandwidthReceived | u64 | (optional) |
| IdleTime | Duration | |
## Client
- **Doc**: Get in notifycliententerview
- **ID**: Client.Id
| Property | Type | Doc |
|----------|------|-----|
| Id | ClientId | |
| Channel | ChannelId | |
| Uid | Uid | (optional) Unique Identifier |
| Name | str | |
| InputMuted | bool | `true` if muted, `false` otherwise |
| OutputMuted | bool | `true` if muted, `false` otherwise |
| OutputOnlyMuted | bool | `true` if muted, `false` otherwise |
| InputHardwareEnabled | bool | `true` if enabled, `false` if disabled |
| OutputHardwareEnabled | bool | `true` if enabled, `false` if disabled |
| TalkPowerGranted | bool | If the client is granted talk power |
| Metadata | str | Set by client |
| IsRecording | bool | Whether the client is recording |
| DatabaseId | ClientDbId | |
| ChannelGroup | ChannelGroupId | |
| ServerGroups | ServerGroupId | (set) |
| AwayMessage | str | (optional) Contains the away message if the client is away |
| ClientType | ClientType | If this client is a server query or not |
| AvatarHash | str | MD5 hash of the avatar, used to retrieve the avatar |
| TalkPower | i32 | |
| TalkPowerRequest | TalkPowerRequest | (optional) Contains a message and timestamp from the client if he requests talk power |
| Description | str | |
| IsPrioritySpeaker | bool | |
| UnreadMessages | u32 | |
| PhoneticName | str | |
| NeededServerqueryViewPower | i32 | |
| Icon | IconId | |
| IsChannelCommander | bool | |
| CountryCode | str | Like US, DE |
| InheritedChannelGroupFromChannel | ChannelId | |
| Badges | str | |
| UserTag | str | (optional) |
| PermissionHints | ClientPermissionHint | (optional) |
| OptionalData | OptionalClientData | (optional) |
| ConnectionData | ConnectionClientData | (optional) |
## OptionalServerData
- **Doc**: Get by notifyserverupdated after requested by servergetvariables
- **Optional**: Yes
| Property | Type | Doc |
|----------|------|-----|
| Uptime | Duration | |
| HasPassword | bool | |
| DefaultChannelAdminGroup | ChannelGroupId | The channel group which will be given to channel creators |
| MaxDownloadBandwidthTotal | u64 | |
| MaxUploadBandwidthTotal | u64 | |
| ComplainAutobanCount | u32 | |
| ComplainAutobanTime | Duration | |
| ComplainRemoveTime | Duration | |
| MinClientsInChannelBeforeForcedSilence | u32 | How many clients can be in a server before silence is forced |
| AntifloodPointsTickReduce | u32 | |
| AntifloodPointsToCommandBlock | u32 | |
| AntifloodPointsToIpBlock | u32 | |
| AntifloodPointsToPluginBlock | u32 | |
| ConnectionCountTotal | u64 | The amount of connections on this server. |
| ChannelCount | u64 | The amount of channels on the server |
| ClientCount | u16 | The amount of clients which are online on the server |
| QueryCountTotal | u64 | Amount of server queries connected to the server |
| QueryCount | u32 | Amount of server queries connected and online/visible on the server |
| DownloadQuota | u64 | |
| UploadQuota | u64 | |
| BytesDownloadedMonth | u64 | |
| BytesUploadedMonth | u64 | |
| BytesDownloadedTotal | u64 | |
| BytesUploadedTotal | u64 | |
| Port | u16 | |
| Autostart | bool | |
| MachineId | str | |
| NeededIdentitySecurityLevel | u8 | |
| LogClient | bool | |
| LogQuery | bool | |
| LogChannel | bool | |
| LogPermissions | bool | |
| LogServer | bool | |
| LogFiletransfer | bool | |
| MinClientVersion | DateTime | |
| ReservedSlots | u16 | |
| TotalPacketlossSpeech | f32 | |
| TotalPacketlossKeepalive | f32 | |
| TotalPacketlossControl | f32 | |
| TotalPacketloss | f32 | |
| TotalPing | Duration | |
| WeblistEnabled | bool | |
| MinAndroidVersion | DateTime | |
| MinIosVersion | DateTime | |
## ConnectionServerData
- **Doc**: Get by notifyserverconnectioninfo after serverrequestconnectioninfo
- **Optional**: Yes
| Property | Type |
|----------|------|
| FiletransferBandwidthSent | u64 |
| FiletransferBandwidthReceived | u64 |
| FiletransferBytesSentTotal | u64 |
| FiletransferBytesReceivedTotal | u64 |
| PacketsSentTotal | u64 |
| BytesSentTotal | u64 |
| PacketsReceivedTotal | u64 |
| BytesReceivedTotal | u64 |
| BandwidthSentLastSecondTotal | u64 |
| BandwidthSentLastMinuteTotal | u64 |
| BandwidthReceivedLastSecondTotal | u64 |
| BandwidthReceivedLastMinuteTotal | u64 |
| ConnectedTimeTotal | Duration |
| PacketlossTotal | f32 |
| Ping | Duration |
## Server
- **Doc**: Get in initserver
| Property | Type | Doc |
|----------|------|-----|
| PublicKey | EccKeyPubP256 | |
| Id | u64 | The virtual server id |
| Name | str | |
| Nickname | str | (optional) |
| WelcomeMessage | str | Welcome message when connecting to a server |
| Platform | str | |
| Version | str | |
| MaxClients | u16 | The maximum number of clients on the server |
| Created | DateTime | Seems to be always 0 |
| CodecEncryptionMode | CodecEncryptionMode | |
| Hostmessage | str | |
| HostmessageMode | HostMessageMode | |
| DefaultServerGroup | ServerGroupId | |
| DefaultChannelGroup | ChannelGroupId | |
| HostbannerUrl | str | |
| HostbannerGfxUrl | str | |
| HostbannerGfxInterval | Duration | How often the hostbanner should be updated |
| PrioritySpeakerDimmModificator | f32 | |
| HostbuttonTooltip | str | |
| HostbuttonUrl | str | |
| HostbuttonGfxUrl | str | |
| PhoneticName | str | |
| Icon | IconId | Should be an u32, sometimes the server sends an u64 or an i32 for reasons which has to be cut to 32 bit |
| Ips | IpAddr | (array) A list of listen ips, can be empty |
| AskForPrivilegekey | bool | |
| HostbannerMode | HostBannerMode | |
| TempChannelDefaultDeleteDelay | Duration | |
| ProtocolVersion | u16 | |
| License | LicenseType | |
| AdministrativeDomain | str | (optional) |
| OptionalData | OptionalServerData | (optional) |
| ConnectionData | ConnectionServerData | (optional) |
## Connection
- **Doc**: A connection from our client to a server
| Property | Type | Doc |
|----------|------|-----|
| OwnClient | ClientId | The id of our own client on the server |
| Server | Server | The server of this connection |
| Clients | Client | (map, key=ClientId) All clients which are visible for us |
| Channels | Channel | (map, key=ChannelId) All channels on the server |
| ServerGroups | ServerGroup | (map, key=ServerGroupId) All server groups on the server |
| ChannelGroups | ChannelGroup | (map, key=ChannelGroupId) All channel groups on the server |
---
# 8. Packet Definitions
Formal packet structure definitions from `Packets.txt`:
## Header
```
Packet
Header
mac [u8; 8] // EAX Message Authentication Code
p_id u16 // Packet id
?c_id u16 // Client id (only from_client)
flags - // 0x80 Unencrypted, 0x40 Compressed, 0x20 Newprotocol, 0x10 Fragmented
p_type u8 // Packet type (lower nibble) + flags (upper nibble)
```
## Packet Types
- 0x0 Voice
- 0x1 Voice whisper
- 0x2 Command
- 0x3 Command low
- 0x4 Ping
- 0x5 Pong
- 0x6 Ack
- 0x7 Ack low
- 0x8 Init
## C2SInit
```
C2SInit
Init0
version u32 // Teamspeak version as timestamp
- u8 0 // Init packet step number
timestamp u32 // Current timestamp
random0 [u8; 4]
- [u8; 8] [0; 8] // Reserved
Init2
version u32
- u8 2
random1 [u8; 16]
random0_r [u8; 4]
Init4
version u32
- u8 4
x [u8; 64]
n [u8; 64]
level u32
random2 [u8; 100]
y [u8; 64] // y = x ^ (2 ^ level) % n
command Command // Must be "clientinitiv" with alpha and omega args
```
## S2CInit
```
S2CInit
Init1
- u8 1
random1 [u8; 16]
random0_r [u8; 4] // Reversed random0
Init3
- u8 3
x [u8; 64]
n [u8; 64]
level u32
random2 [u8; 100]
Init127
- u8 127
- u8 0
```
## Voice Packets
```
VoiceC2S
id u16
codec_type u8
voice_data Vec<u8>
VoiceS2C
id u16
from_id u16 // The id of the talking client
codec_type u8
voice_data Vec<u8>
```
## VoiceWhisper Packets
```
VoiceWhisperC2S (legacy, !newprotocol)
id u16
codec_type u8
channel_count u8
client_count u8
data Vec<u8> // [u64; channel_count], [u16; client_count], voice_data
VoiceWhisperNewC2S (newprotocol)
id u16
codec_type u8
whisper_type u8
whisper_target u8
target_id u64 // The targeted channel or group id (or 0 if not applicable)
voice_data Vec<u8>
VoiceWhisperS2C
id u16
from_id u16 // The id of the talking client
codec_type u8
voice_data Vec<u8>
```
## Command/Ack Packets
```
Command Command // PacketType::Command
CommandLow Command // PacketType::CommandLow
Ping // PacketType::Ping (empty)
Pong u16 // PacketType::Pong (acknowledged packet id)
Ack u16 // PacketType::Ack (acknowledged packet id)
AckLow u16 // PacketType::AckLow (acknowledged packet id)
```
---
# 9. tsdeclarations README
This repository contains all kind of data which is related to TeamSpeak. This data is used for code generation in various projects, therefore all the data is machine readable.
**Files**:
- `Errors.csv`: The error codes of TeamSpeak
- `Permissions.csv`: The permissions in TeamSpeak
- `Messages.toml`: Commands, sent over TeamSpeak connections
- `Book.toml`: Declarations for keeping track of all things which happen on a server
- `Enums.toml`: Various enums used in commands
- `MessagesToBook.toml`: Mappings from commands to book structs that allow to automatically update the tracked state
- `BookToMessages.toml`: Functions that can be called on book structs and generate commands
- `Versions.csv`: A bunch of client versions where the versionHash is known
- `Badges.csv`: List of known badges
- `ts3protocol.md`: The low level TeamSpeak protocol description
**License**: Apache License, Version 2.0 OR MIT license
---
# 10. tsclientlib Architecture & API
TsClientlib is a library that enables you to write voip clients and bots using the TeamSpeak protocol.
## Dependencies
- Rust (preferred installation method is rustup)
- OpenSSL 1.1 (linux only)
## Getting Started
An example of a simple chat bot can be found at https://github.com/ReSpeak/SimpleBot
## Clone
This repository embeds the declarations as submodule:
```
git clone https://github.com/ReSpeak/tsclientlib.git --recurse-submodules
```
## Build and run examples
```
cd tsclientlib
cargo run --example simple
cd tsclientlib
cargo run --example audio
```
## Projects
- `tsclientlib`: The main product — a simple to use TeamSpeak library
- `tsproto`: The low level library that does the network part
### Utils
- `ts-bookkeeping`: Keeps book of the currently connected clients and channels of a server
- `tsproto-packets`: Parse packets and commands
- `tsproto-structs`: Contains parsed versions of the tsdeclarations
- `tsproto-types`: Contains basic types for TeamSpeak, e.g. versions and error codes
## How this works
`tsproto` implements the basic TeamSpeak protocol stuff — creating a connection, making sure that UDP packets are delivered, encrypting and compressing the communication and giving access to all these low-level things.
The convenient client library on top is `tsclientlib`. It uses all the versions, messages, structures and errors which are written down in a machine readable format and provides a nice and safe API.
## Performance
On an i7-5280K with 6 cores/12 threads @3.6 GHz (single thread):
- 199 ms for creating one connection (6.5 connections/sec) — bottleneck is RSA puzzle solving
- 189 µs for sending a message (5300 messages/sec)
## License
Apache License, Version 2.0 OR MIT license
---
*Compiled from ReSpeak repositories on 2026-06-11. Source: https://github.com/ReSpeak/tsdeclarations, https://github.com/ReSpeak/tsclientlib*